Skip to content

Commit

Permalink
Merge pull request #569 from Piwigo/3.1.4
Browse files Browse the repository at this point in the history
v3.1.4
  • Loading branch information
EddyLB authored Feb 27, 2024
2 parents 475d1f8 + 391a080 commit 99c84b9
Show file tree
Hide file tree
Showing 31 changed files with 184 additions and 80 deletions.
30 changes: 21 additions & 9 deletions piwigo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,12 @@
AD2058972B77DF8400CF7E0B /* AVKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058962B77DF8400CF7E0B /* AVKit.framework */; };
AD2058992B77DFB700CF7E0B /* LinkPresentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058982B77DFB700CF7E0B /* LinkPresentation.framework */; };
AD20589B2B77DFD600CF7E0B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589A2B77DFD600CF7E0B /* AVFoundation.framework */; };
AD20589D2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589C2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework */; };
AD20589D2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589C2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
AD20589E2B77E0D200CF7E0B /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2913B32669440000403026 /* Intents.framework */; };
AD2058A02B77E15700CF7E0B /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589F2B77E15700CF7E0B /* LocalAuthentication.framework */; };
AD2058A22B77E1B700CF7E0B /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A12B77E1B600CF7E0B /* CoreHaptics.framework */; };
AD2058A42B77E1EF00CF7E0B /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A32B77E1EF00CF7E0B /* Vision.framework */; };
AD2058A62B77E22000CF7E0B /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A52B77E22000CF7E0B /* BackgroundTasks.framework */; };
AD2058A62B77E22000CF7E0B /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A52B77E22000CF7E0B /* BackgroundTasks.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
AD2058A72B77E27700CF7E0B /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20588A2B77DDEA00CF7E0B /* CoreData.framework */; };
AD2058A82B77E28000CF7E0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20588C2B77DE0B00CF7E0B /* Foundation.framework */; };
AD2058A92B77E29D00CF7E0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20588C2B77DE0B00CF7E0B /* Foundation.framework */; };
Expand All @@ -79,13 +79,13 @@
AD2058AC2B77E2CA00CF7E0B /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058942B77DF6A00CF7E0B /* MobileCoreServices.framework */; };
AD2058AD2B77E2E900CF7E0B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058882B779BC500CF7E0B /* UIKit.framework */; };
AD2058AE2B77E31200CF7E0B /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589A2B77DFD600CF7E0B /* AVFoundation.framework */; };
AD2058AF2B77E32500CF7E0B /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A52B77E22000CF7E0B /* BackgroundTasks.framework */; };
AD2058AF2B77E32500CF7E0B /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058A52B77E22000CF7E0B /* BackgroundTasks.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
AD2058B02B77E34A00CF7E0B /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058922B77DF5C00CF7E0B /* ImageIO.framework */; };
AD2058B12B77E36F00CF7E0B /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20588A2B77DDEA00CF7E0B /* CoreData.framework */; };
AD2058B22B77E37600CF7E0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20588C2B77DE0B00CF7E0B /* Foundation.framework */; };
AD2058B32B77E3E700CF7E0B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058882B779BC500CF7E0B /* UIKit.framework */; };
AD2058B42B77E40900CF7E0B /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058942B77DF6A00CF7E0B /* MobileCoreServices.framework */; };
AD2058B52B77E41400CF7E0B /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589C2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework */; };
AD2058B52B77E41400CF7E0B /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD20589C2B77E03F00CF7E0B /* UniformTypeIdentifiers.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
AD2058B62B77E43B00CF7E0B /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058902B77DED300CF7E0B /* CoreMedia.framework */; };
AD2058B82B77E45900CF7E0B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058B72B77E45800CF7E0B /* CoreLocation.framework */; };
AD2058B92B77E47E00CF7E0B /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2058822B779AF500CF7E0B /* Photos.framework */; };
Expand Down Expand Up @@ -175,6 +175,7 @@
AD3DB4112773957A00017542 /* ImageViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AD3DB4102773957A00017542 /* ImageViewController.storyboard */; };
AD3DB4132773958200017542 /* ImageDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3DB4122773958200017542 /* ImageDetailViewController.swift */; };
AD3DB4152773958A00017542 /* ImageDescriptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3DB4142773958A00017542 /* ImageDescriptionView.swift */; };
AD3EE6012B811349002B5CDB /* pwg.image.rotate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3EE6002B811349002B5CDB /* pwg.image.rotate.swift */; };
AD3FF5F42682908000D2F52A /* UIImage+AppTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADCC996425B452670034CB4A /* UIImage+AppTools.swift */; };
AD41530F27C6D35D00DE01CB /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD41530E27C6D35D00DE01CB /* LoginViewController.swift */; };
AD41531527C6D37D00DE01CB /* LoginNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD41531427C6D37C00DE01CB /* LoginNavigationController.swift */; };
Expand Down Expand Up @@ -748,6 +749,7 @@
AD3DB4102773957A00017542 /* ImageViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ImageViewController.storyboard; sourceTree = "<group>"; };
AD3DB4122773958200017542 /* ImageDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageDetailViewController.swift; sourceTree = "<group>"; };
AD3DB4142773958A00017542 /* ImageDescriptionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageDescriptionView.swift; sourceTree = "<group>"; };
AD3EE6002B811349002B5CDB /* pwg.image.rotate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = pwg.image.rotate.swift; sourceTree = "<group>"; };
AD3FDDE81F2E23F700F71C81 /* da */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = "<group>"; };
AD3FDDE91F2E23F700F71C81 /* da */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/About.strings; sourceTree = "<group>"; };
AD3FDDEA1F2E23F700F71C81 /* da */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/ReleaseNotes.strings; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1489,6 +1491,7 @@
AD211A7B27BAD844005D5E4F /* reflection */,
ADF2329C26D40619002ACEC9 /* pwg */,
AD5A31652847F85F00948FEE /* pwg.categories */,
AD3EE5FF2B811154002B5CDB /* pwg.image */,
AD9A1BE424E03AC700D22C86 /* pwg.images */,
ADD485BE2B139EB900C7E30E /* pwg.history */,
AD211A8427BAFD51005D5E4F /* pwg.session */,
Expand Down Expand Up @@ -1543,6 +1546,14 @@
path = community;
sourceTree = "<group>";
};
AD3EE5FF2B811154002B5CDB /* pwg.image */ = {
isa = PBXGroup;
children = (
AD3EE6002B811349002B5CDB /* pwg.image.rotate.swift */,
);
path = pwg.image;
sourceTree = "<group>";
};
AD41BEC8223E9BB200A5DEE3 /* Location Data */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -2245,9 +2256,9 @@
children = (
ADEA269F285F962800B6C9A0 /* ImageViewController+Menus.swift */,
ADEA26A3285FA0E800B6C9A0 /* ImageViewController+Buttons.swift */,
ADEA269D285F909F00B6C9A0 /* ImageViewController+Edit.swift */,
ADEA26A1285F9E2400B6C9A0 /* ImageViewController+CopyMove.swift */,
ADEA26A7285FA2C300B6C9A0 /* ImageViewController+AlbumThumnail.swift */,
ADEA269D285F909F00B6C9A0 /* ImageViewController+Edit.swift */,
ADEA26A5285FA1EB00B6C9A0 /* ImageViewController+Delete.swift */,
ADEA2699285F8D5F00B6C9A0 /* ImageViewController+Share.swift */,
ADEA269B285F8F2E00B6C9A0 /* ImageViewController+Favorites.swift */,
Expand Down Expand Up @@ -3066,6 +3077,7 @@
ADF72E9D2670D73E0027E2CC /* pwg.images.uploadAsync.swift in Sources */,
ADFA2BD227411E8200CC60BF /* pwg.images.uploadCompleted.swift in Sources */,
AD807F0A26E530ED00008162 /* pwg.images.delete.swift in Sources */,
AD3EE6012B811349002B5CDB /* pwg.image.rotate.swift in Sources */,
AD673C1C2A4B81C60080BC0B /* PwgSession+Images.swift in Sources */,
AD211A8927BAFE2E005D5E4F /* pwg.session.login.swift in Sources */,
AD98DEB427C2375C00FAC983 /* pwg.session.getStatus.swift in Sources */,
Expand Down Expand Up @@ -4283,7 +4295,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development: Eddy Lelievre-Berna (QWTTGCZPSN)";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(CURRENT_PROJECT_VERSION)";
CURRENT_PROJECT_VERSION = 558;
DEAD_CODE_STRIPPING = YES;
"DEBUG_INFORMATION_FORMAT[sdk=*]" = "dwarf-with-dsym";
"DEBUG_INFORMATION_FORMAT[sdk=iphonesimulator*]" = dwarf;
Expand All @@ -4305,7 +4317,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = "$(MARKETING_VERSION)";
MARKETING_VERSION = 3.1.4;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
OTHER_LDFLAGS = (
"$(inherited)",
Expand Down Expand Up @@ -4356,7 +4368,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution: Pierrick Le Gall (ZU5THW8T5W)";
CODE_SIGN_STYLE = Manual;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = "$(CURRENT_PROJECT_VERSION)";
CURRENT_PROJECT_VERSION = 558;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = ZU5THW8T5W;
Expand All @@ -4375,7 +4387,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = "$(MARKETING_VERSION)";
MARKETING_VERSION = 3.1.4;
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++20";
OTHER_LDFLAGS = (
"$(inherited)",
Expand Down
22 changes: 0 additions & 22 deletions piwigo.xcodeproj/xcshareddata/xcschemes/piwigo.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -76,28 +76,6 @@
isEnabled = "YES">
</CommandLineArgument>
</CommandLineArguments>
<AdditionalOptions>
<AdditionalOption
key = "MallocStackLogging"
value = ""
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "DYLD_INSERT_LIBRARIES"
value = "/usr/lib/libgmalloc.dylib"
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "MallocGuardEdges"
value = ""
isEnabled = "YES">
</AdditionalOption>
<AdditionalOption
key = "MallocScribble"
value = ""
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
<LocationScenarioReference
identifier = "com.apple.dt.IDEFoundation.CurrentLocationScenarioIdentifier"
referenceType = "1">
Expand Down
27 changes: 14 additions & 13 deletions piwigo/Image/Download/ImageSession.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ import AVFoundation
import MobileCoreServices
import Foundation
import piwigoKit
import UniformTypeIdentifiers

#if canImport(UniformTypeIdentifiers)
import UniformTypeIdentifiers // Requires iOS 14
#endif

class ImageSession: NSObject {

Expand Down Expand Up @@ -83,7 +86,7 @@ class ImageSession: NSObject {

// MARK: - Asynchronous Methods
func getImage(withID imageID: Int64?, ofSize imageSize: pwgImageSize, atURL imageURL: URL?,
fromServer serverID: String?, fileSize: Int64 = .zero,
fromServer serverID: String?, fileSize: Int64 = NSURLSessionTransferSizeUnknown,
placeHolder: UIImage, progress: ((Float) -> Void)? = nil,
completion: @escaping (URL) -> Void, failure: @escaping (Error) -> Void) {
// Check arguments
Expand All @@ -102,7 +105,7 @@ class ImageSession: NSObject {

// Create Download instance
let download = ImageDownload(imageID: imageID, ofSize: imageSize, atURL: imageURL,
fromServer: serverID, placeHolder: placeHolder,
fromServer: serverID, fileSize: fileSize, placeHolder: placeHolder,
progress: progress, completion: completion, failure: failure)

// Do we already have this image or video in cache?
Expand All @@ -129,8 +132,7 @@ class ImageSession: NSObject {
// debugPrint("••> Launch download of image: \(imageURL)")
download.task = self.dataSession.downloadTask(with: request)
download.task?.countOfBytesClientExpectsToSend = Int64((request.allHTTPHeaderFields ?? [:]).count)
let expectedSize: Int64 = fileSize == .zero ? NSURLSessionTransferSizeUnknown : fileSize
download.task?.countOfBytesClientExpectsToReceive = expectedSize
download.task?.countOfBytesClientExpectsToReceive = download.fileSize
download.task?.resume()
self.activeDownloads[imageURL] = download
return
Expand Down Expand Up @@ -288,7 +290,6 @@ extension ImageSession: URLSessionTaskDelegate {
}
} else {
// Return cached image with completionHandler
// debugPrint("••> Did complete task #\(task.taskIdentifier)")
if let completion = download.completionHandler,
let fileURL = download.fileURL {
completion(fileURL)
Expand All @@ -300,15 +301,15 @@ extension ImageSession: URLSessionTaskDelegate {
}


// MARK: Session Download Delegate
// MARK: - Session Download Delegate
extension ImageSession: URLSessionDownloadDelegate {

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64) {
// Retrieve the original URL of this task
// debugPrint("••> Progress task #\(downloadTask.taskIdentifier) -> \(String(describing: downloadTask.currentRequest?.url))")
// debugPrint(" amongst \(activeDownloads.count) active downloads.")
// debugPrint("••> Progress task #\(downloadTask.taskIdentifier) i.e. \(String(describing: downloadTask.originalRequest?.url ?? downloadTask.currentRequest?.url))")
// activeDownloads.forEach { (key, _) in debugPrint(" Key: \(key)") }
guard let imageURL = downloadTask.originalRequest?.url ?? downloadTask.currentRequest?.url,
let download = activeDownloads[imageURL] else {
return
Expand All @@ -317,15 +318,15 @@ extension ImageSession: URLSessionDownloadDelegate {
// Update progress bar if any
if let progressHandler = download.progressHandler {
download.progress = Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
// debugPrint("••> Progress task #\(downloadTask.taskIdentifier) -> \(download.progress)")
// debugPrint("••> Progress task #\(downloadTask.taskIdentifier) -> written: \(bytesWritten), totalWritten: \(totalBytesWritten), expected: \(totalBytesExpectedToWrite), progress: \(download.progress)")
progressHandler(download.progress)
}
}

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didFinishDownloadingTo location: URL) {
// Retrieve the URL of this task
// debugPrint("••> Task #\(downloadTask.taskIdentifier) did finish downloading.")
// debugPrint("••> Task #\(downloadTask.taskIdentifier) did finish downloading to \(location)")
guard let imageURL = downloadTask.originalRequest?.url ?? downloadTask.currentRequest?.url,
let download = activeDownloads[imageURL],
let fileURL = download.fileURL else {
Expand All @@ -344,10 +345,10 @@ extension ImageSession: URLSessionDownloadDelegate {

// Delete existing file if it exists (incomplete previous attempt?)
try? fm.removeItem(at: fileURL)

// Store image
try fm.copyItem(at: location, to: fileURL)
// debugPrint("••> Image \(fileURL.lastPathComponent) stored in cache (downloaded at \(String(describing: download.imageURL)))")
// debugPrint("••> Image \(fileURL.lastPathComponent) stored in cache (URL: \(imageURL)")
} catch {
// Return error with failureHandler
if let failure = download.failureHandler {
Expand Down
6 changes: 3 additions & 3 deletions piwigo/Image/ImageDetailViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class ImageDetailViewController: UIViewController
@IBOutlet weak var progressView: PieProgressView!

// Variable used to remember the position of the image on the screen
private var imagePosition = CGPoint(x: 0.5, y: 0.5)
// private var imagePosition = CGPoint(x: 0.5, y: 0.5)

// Variable used to dismiss the view when the scale is reduced
// from less than 1.1 x miminumZoomScale to less than 0.9 x miminumZoomScale
Expand Down Expand Up @@ -213,7 +213,7 @@ class ImageDetailViewController: UIViewController

// Calc zoom scale change
var zoomFactor = 1.0
if scrollView.minimumZoomScale != 0 {
if scrollView.minimumZoomScale > 1e-6 {
zoomFactor = scrollView.zoomScale / scrollView.minimumZoomScale
}

Expand All @@ -239,7 +239,7 @@ class ImageDetailViewController: UIViewController
imageSize.width != 0, imageSize.height != 0,
scrollView.zoomScale != 0
else {
imagePosition = CGPoint.zero
// imagePosition = CGPoint.zero
return
}

Expand Down
4 changes: 3 additions & 1 deletion piwigo/Resources/ar.lproj/ReleaseNotes.strings
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
Copyright © 2017 Piwigo.org. All rights reserved.
*/

"v3.1.3_text" = "Version 3.1.3\n\n• Bug fixes";
"v3.1.4_text" = "Version 3.1.4\n\n• Fixes a crash occurring on iOS 12";

"v3.1.3_text" = "Version 3.1.3\nFebruary 11, 2024\n\n• Bug fixes";

"v3.1.2_text" = "الإصدار 3.1.2\n\n• طلبات تحديث خادم Piwigo إذا لزم الأمر\n• إصلاحات الشوائب";

Expand Down
6 changes: 4 additions & 2 deletions piwigo/Resources/da.lproj/ReleaseNotes.strings
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
Copyright © 2017 Piwigo.org. All rights reserved.
*/

"v3.1.3_text" = "Version 3.1.3\n\n• Fejlrettelser";
"v3.1.4_text" = "Version 3.1.4\n\n• Retter et nedbrud på iOS 12";

"v3.1.2_text" = "Version 3.1.2\n1 februar 2024\n\n• Anmodninger om opdatering af Piwigo server om nødvendigt\n• Fejlrettelser";
"v3.1.3_text" = "Version 3.1.3\n11 februar 2024\n\n• Fejlrettelser";

"v3.1.2_text" = "Version 3.1.2\n1 februar 2024\n\n• Anmoder om opdatering af Piwigo server om nødvendigt\n• Fejlrettelser";

"v3.1.1_text" = "Version 3.1.1\n1 december 2023\n\n• Opdaterer serverstatistikker (kræver Piwigo 14)\n• Fejlrettelser";

Expand Down
2 changes: 1 addition & 1 deletion piwigo/Resources/de.lproj/About.strings
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Copyright (c) 2015 bakercrew. All rights reserved.
*/

"authors1" = "Von Spencer Baker, Olaf Greck ";
"authors1" = "Von Spencer Baker, Olaf Greck";
"authors2" = "und Eddy Lelièvre-Berna";
"version" = "Version:";

Expand Down
Loading

0 comments on commit 99c84b9

Please sign in to comment.