~exprez135/cryptomator-libre

8a3c1017643a0cb2eeece4bb09fbfd17785188a7 — Ralph Plawetzki 1 year, 1 month ago 3bf2b49 + 8f5c499
Merge remote branch 'cryptomator/develop' into access-kde-wallets
57 files changed, 389 insertions(+), 163 deletions(-)

M .idea/codeStyles/Project.xml
M main/commons/pom.xml
M main/commons/src/main/java/org/cryptomator/common/CommonsModule.java
M main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java
M main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java
M main/keychain/src/main/java/org/cryptomator/keychain/LinuxSecretServiceKeychainAccessImpl.java
M main/pom.xml
M main/ui/pom.xml
M main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java
M main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
M main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
M main/ui/src/main/java/org/cryptomator/ui/common/NewPasswordController.java
M main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java
M main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java
M main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java
M main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailMissingVaultController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java
M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java
M main/ui/src/main/java/org/cryptomator/ui/preferences/DonationKeyPreferencesController.java
M main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java
M main/ui/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java
M main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java
M main/ui/src/main/resources/css/dark_theme.css
M main/ui/src/main/resources/css/light_theme.css
M main/ui/src/main/resources/fxml/main_window_title.fxml
M main/ui/src/main/resources/fxml/new_password.fxml
M main/ui/src/main/resources/fxml/vault_detail_missing.fxml
M main/ui/src/main/resources/i18n/strings.properties
M main/ui/src/main/resources/i18n/strings_ar.properties
M main/ui/src/main/resources/i18n/strings_ca.properties
M main/ui/src/main/resources/i18n/strings_cs.properties
M main/ui/src/main/resources/i18n/strings_de.properties
M main/ui/src/main/resources/i18n/strings_el.properties
M main/ui/src/main/resources/i18n/strings_es.properties
M main/ui/src/main/resources/i18n/strings_fr.properties
M main/ui/src/main/resources/i18n/strings_it.properties
M main/ui/src/main/resources/i18n/strings_ja.properties
M main/ui/src/main/resources/i18n/strings_ko.properties
M main/ui/src/main/resources/i18n/strings_lv.properties
M main/ui/src/main/resources/i18n/strings_nb.properties
M main/ui/src/main/resources/i18n/strings_nl.properties
M main/ui/src/main/resources/i18n/strings_nn.properties
M main/ui/src/main/resources/i18n/strings_pl.properties
M main/ui/src/main/resources/i18n/strings_pt.properties
M main/ui/src/main/resources/i18n/strings_pt_BR.properties
M main/ui/src/main/resources/i18n/strings_ru.properties
M main/ui/src/main/resources/i18n/strings_sk.properties
M main/ui/src/main/resources/i18n/strings_sv.properties
M main/ui/src/main/resources/i18n/strings_tr.properties
M main/ui/src/main/resources/i18n/strings_zh.properties
M main/ui/src/main/resources/i18n/strings_zh_TW.properties
M main/ui/src/main/resources/license/THIRD-PARTY.txt
M .idea/codeStyles/Project.xml => .idea/codeStyles/Project.xml +3 -0
@@ 36,6 36,9 @@
      <indentOptions>
        <option name="USE_TAB_CHARACTER" value="true" />
      </indentOptions>
      <arrangement>
        <rules />
      </arrangement>
    </codeStyleSettings>
    <codeStyleSettings language="JSON">
      <indentOptions>

M main/commons/pom.xml => main/commons/pom.xml +1 -1
@@ 44,7 44,7 @@

		<!-- EasyBind -->
		<dependency>
			<groupId>org.fxmisc.easybind</groupId>
			<groupId>com.tobiasdiez</groupId>
			<artifactId>easybind</artifactId>
		</dependency>


M main/commons/src/main/java/org/cryptomator/common/CommonsModule.java => main/commons/src/main/java/org/cryptomator/common/CommonsModule.java +1 -1
@@ 5,6 5,7 @@
 *******************************************************************************/
package org.cryptomator.common;

import com.tobiasdiez.easybind.EasyBind;
import dagger.Module;
import dagger.Provides;
import javafx.beans.binding.Binding;


@@ 17,7 18,6 @@ import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultComponent;
import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


M main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java => main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java +14 -4
@@ 1,11 1,21 @@
package org.cryptomator.common.settings;

import org.apache.commons.lang3.SystemUtils;

public enum UiTheme {
	LIGHT("preferences.general.theme.light"),
	DARK("preferences.general.theme.dark");
	// CUSTOM("Custom (%s)");
	LIGHT("preferences.general.theme.light"), //
	DARK("preferences.general.theme.dark"), //
	AUTOMATIC("preferences.general.theme.automatic");

	public static UiTheme[] applicableValues() {
		if (SystemUtils.IS_OS_MAC) {
			return values();
		} else {
			return new UiTheme[]{LIGHT, DARK};
		}
	}

	private String displayName;
	private final String displayName;

	UiTheme(String displayName) {
		this.displayName = displayName;

M main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java => main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java +1 -1
@@ 7,6 7,7 @@ package org.cryptomator.common.settings;

import com.google.common.base.Strings;
import com.google.common.io.BaseEncoding;
import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;


@@ 17,7 18,6 @@ import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import org.apache.commons.lang3.StringUtils;
import org.fxmisc.easybind.EasyBind;

import java.nio.file.Path;
import java.util.Objects;

M main/keychain/src/main/java/org/cryptomator/keychain/LinuxSecretServiceKeychainAccessImpl.java => main/keychain/src/main/java/org/cryptomator/keychain/LinuxSecretServiceKeychainAccessImpl.java +3 -0
@@ 28,6 28,9 @@ class LinuxSecretServiceKeychainAccessImpl implements KeychainAccessStrategy {
			if (list == null) {
				keyring.createItem(LABEL_FOR_SECRET_IN_KEYRING, passphrase, createAttributes(key));
			}
			else {
				changePassphrase(key, passphrase);
			}
		} catch (IOException e) {
			throw new KeychainAccessException(e);
		}

M main/pom.xml => main/pom.xml +6 -6
@@ 25,18 25,18 @@

		<!-- cryptomator dependencies -->
		<cryptomator.cryptofs.version>1.9.12</cryptomator.cryptofs.version>
		<cryptomator.jni.version>2.2.2</cryptomator.jni.version>
		<cryptomator.jni.version>2.2.3</cryptomator.jni.version>
		<cryptomator.fuse.version>1.2.3</cryptomator.fuse.version>
		<cryptomator.dokany.version>1.1.15</cryptomator.dokany.version>
		<cryptomator.webdav.version>1.0.11</cryptomator.webdav.version>
		<cryptomator.webdav.version>1.0.12</cryptomator.webdav.version>

		<!-- 3rd party dependencies -->
		<javafx.version>14</javafx.version>
		<commons-lang3.version>3.10</commons-lang3.version>
		<secret-service.version>1.0.0</secret-service.version>
		<commons-lang3.version>3.11</commons-lang3.version>
		<secret-service.version>1.1.0</secret-service.version>
		<kdewallet.version>1.0.1</kdewallet.version>
		<jwt.version>3.10.3</jwt.version>
		<easybind.version>1.0.3</easybind.version>
		<easybind.version>2.1.0</easybind.version>
		<guava.version>29.0-jre</guava.version>
		<dagger.version>2.22</dagger.version>
		<gson.version>2.8.6</gson.version>


@@ 184,7 184,7 @@

			<!-- EasyBind -->
			<dependency>
				<groupId>org.fxmisc.easybind</groupId>
				<groupId>com.tobiasdiez</groupId>
				<artifactId>easybind</artifactId>
				<version>${easybind.version}</version>
			</dependency>

M main/ui/pom.xml => main/ui/pom.xml +1 -1
@@ 35,7 35,7 @@

		<!-- EasyBind -->
		<dependency>
			<groupId>org.fxmisc.easybind</groupId>
			<groupId>com.tobiasdiez</groupId>
			<artifactId>easybind</artifactId>
		</dependency>


M main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java => main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultLocationController.java +4 -3
@@ 1,5 1,6 @@
package org.cryptomator.ui.addvaultwizard;

import com.tobiasdiez.easybind.EasyBind;
import dagger.Lazy;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;


@@ 83,11 84,11 @@ public class CreateNewVaultLocationController implements FxController {
	public void initialize() {
		predefinedLocationToggler.selectedToggleProperty().addListener(this::togglePredefinedLocation);
		usePresetPath.bind(predefinedLocationToggler.selectedToggleProperty().isNotEqualTo(customRadioButton));
		vaultPath.addListener(this::vaultPathDidChange);
		EasyBind.subscribe(vaultPath, this::vaultPathDidChange);
	}

	private void vaultPathDidChange(@SuppressWarnings("unused") ObservableValue<? extends Path> observable, @SuppressWarnings("unused") Path oldValue, Path newValue) {
		if (!Files.notExists(newValue)) {
	private void vaultPathDidChange(Path newValue) {
		if ( newValue != null && !Files.notExists(newValue)) {
			warningText.set(resourceBundle.getString("addvaultwizard.new.fileAlreadyExists"));
		} else {
			warningText.set(null);

M main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java => main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java +0 -1
@@ 32,7 32,6 @@ import javax.inject.Named;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.channels.WritableByteChannel;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;

M main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java => main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java +5 -4
@@ 53,9 53,10 @@ public class ChangePasswordController implements FxController {

	@FXML
	public void initialize() {
		BooleanBinding hasNotConfirmedCheckbox = finalConfirmationCheckbox.selectedProperty().not();
		BooleanBinding isInvalidNewPassword = Bindings.createBooleanBinding(() -> newPassword.get() == null || newPassword.get().length() == 0, newPassword); 
		finishButton.disableProperty().bind(hasNotConfirmedCheckbox.or(isInvalidNewPassword));
		BooleanBinding checkboxNotConfirmed = finalConfirmationCheckbox.selectedProperty().not();
		BooleanBinding oldPasswordFieldEmpty = oldPasswordField.textProperty().isEmpty();
		BooleanBinding newPasswordInvalid = Bindings.createBooleanBinding(() -> newPassword.get() == null || newPassword.get().length() == 0, newPassword);
		finishButton.disableProperty().bind(checkboxNotConfirmed.or(oldPasswordFieldEmpty).or(newPasswordInvalid));
	}

	@FXML


@@ 96,5 97,5 @@ public class ChangePasswordController implements FxController {
	public Vault getVault() {
		return vault;
	}
	

}

M main/ui/src/main/java/org/cryptomator/ui/common/NewPasswordController.java => main/ui/src/main/java/org/cryptomator/ui/common/NewPasswordController.java +24 -7
@@ 1,5 1,6 @@
package org.cryptomator.ui.common;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;


@@ 10,7 11,6 @@ import javafx.fxml.FXML;
import javafx.scene.control.Label;
import org.cryptomator.ui.controls.FontAwesome5IconView;
import org.cryptomator.ui.controls.NiceSecurePasswordField;
import org.fxmisc.easybind.EasyBind;

import java.util.ResourceBundle;



@@ 24,9 24,12 @@ public class NewPasswordController implements FxController {
	public NiceSecurePasswordField passwordField;
	public NiceSecurePasswordField reenterField;
	public Label passwordStrengthLabel;
	public FontAwesome5IconView passwordStrengthCheckmark;
	public FontAwesome5IconView passwordStrengthWarning;
	public FontAwesome5IconView passwordStrengthCross;
	public Label passwordMatchLabel;
	public FontAwesome5IconView checkmark;
	public FontAwesome5IconView cross;
	public FontAwesome5IconView passwordMatchCheckmark;
	public FontAwesome5IconView passwordMatchCross;

	public NewPasswordController(ResourceBundle resourceBundle, PasswordStrengthUtil strengthRater, ObjectProperty<CharSequence> password) {
		this.resourceBundle = resourceBundle;


@@ 36,19 39,33 @@ public class NewPasswordController implements FxController {

	@FXML
	public void initialize() {
		BooleanBinding passwordsMatch = Bindings.createBooleanBinding(this::hasSamePasswordInBothFields, passwordField.textProperty(), reenterField.textProperty());
		BooleanBinding reenterFieldNotEmpty = reenterField.textProperty().isNotEmpty();
		passwordStrength.bind(Bindings.createIntegerBinding(() -> strengthRater.computeRate(passwordField.getCharacters()), passwordField.textProperty()));

		passwordStrengthLabel.graphicProperty().bind(Bindings.createObjectBinding(this::getIconViewForPasswordStrengthLabel, passwordField.textProperty(), passwordStrength));
		passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
		

		BooleanBinding passwordsMatch = Bindings.createBooleanBinding(this::hasSamePasswordInBothFields, passwordField.textProperty(), reenterField.textProperty());
		BooleanBinding reenterFieldNotEmpty = reenterField.textProperty().isNotEmpty();
		passwordMatchLabel.visibleProperty().bind(reenterFieldNotEmpty);
		passwordMatchLabel.graphicProperty().bind(Bindings.when(passwordsMatch.and(reenterFieldNotEmpty)).then(checkmark).otherwise(cross));
		passwordMatchLabel.graphicProperty().bind(Bindings.when(passwordsMatch.and(reenterFieldNotEmpty)).then(passwordMatchCheckmark).otherwise(passwordMatchCross));
		passwordMatchLabel.textProperty().bind(Bindings.when(passwordsMatch.and(reenterFieldNotEmpty)).then(resourceBundle.getString("newPassword.passwordsMatch")).otherwise(resourceBundle.getString("newPassword.passwordsDoNotMatch")));

		passwordField.textProperty().addListener(this::passwordsDidChange);
		reenterField.textProperty().addListener(this::passwordsDidChange);
	}

	private FontAwesome5IconView getIconViewForPasswordStrengthLabel() {
		if (passwordField.getCharacters().length() == 0) {
			return null;
		} else if (passwordStrength.intValue() <= -1) {
			return passwordStrengthCross;
		} else if (passwordStrength.intValue() < 3) {
			return passwordStrengthWarning;
		} else {
			return passwordStrengthCheckmark;
		}
	}

	private void passwordsDidChange(@SuppressWarnings("unused") Observable observable) {
		if (hasSamePasswordInBothFields() && strengthRater.fulfillsMinimumRequirements(passwordField.getCharacters())) {
			password.set(passwordField.getCharacters());

M main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java => main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java +1 -1
@@ 8,6 8,7 @@
 *******************************************************************************/
package org.cryptomator.ui.controls;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.SnapshotParameters;


@@ 18,7 19,6 @@ import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import org.fxmisc.easybind.EasyBind;

import java.util.List;


M main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java => main/ui/src/main/java/org/cryptomator/ui/controls/FontAwesome5Icon.java +3 -0
@@ 6,11 6,13 @@ package org.cryptomator.ui.controls;
public enum FontAwesome5Icon {
	ANCHOR("\uF13D"), //
	ARROW_UP("\uF062"), //
	BUG("\uF188"), //
	CHECK("\uF00C"), //
	COG("\uF013"), //
	COGS("\uF085"), //
	COPY("\uF0C5"), //
	CROWN("\uF521"), //
	EDIT("\uF044"), //
	EXCLAMATION("\uF12A"), //
	EXCLAMATION_CIRCLE("\uF06A"), //
	EXCLAMATION_TRIANGLE("\uF071"), //


@@ 37,6 39,7 @@ public enum FontAwesome5Icon {
	SPINNER("\uF110"), //
	SYNC("\uF021"), //
	TIMES("\uF00D"), //
	TRASH("\uF1F8"), //
	UNLINK("\uf127"), //
	WRENCH("\uF0AD"), //
	WINDOW_MINIMIZE("\uF2D1"), //

M main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java => main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java +1 -1
@@ 1,12 1,12 @@
package org.cryptomator.ui.controls;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import org.fxmisc.easybind.EasyBind;

public class PasswordStrengthIndicator extends HBox {


M main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java => main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +35 -10
@@ 1,12 1,12 @@
package org.cryptomator.ui.fxapp;

import com.tobiasdiez.easybind.EasyBind;
import dagger.Lazy;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableSet;
import javafx.stage.Stage;
import org.cryptomator.common.LicenseHolder;


@@ 46,6 46,8 @@ public class FxApplication extends Application {
	private final LicenseHolder licenseHolder;
	private final BooleanBinding hasVisibleStages;

	private Optional<String> macApperanceObserverIdentifier = Optional.empty();

	@Inject
	FxApplication(Settings settings, Lazy<MainWindowComponent> mainWindow, Lazy<PreferencesComponent> preferencesWindow, Provider<UnlockComponent.Builder> unlockWindowBuilderProvider, Provider<QuitComponent.Builder> quitWindowBuilderProvider, Optional<MacFunctions> macFunctions, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet<Stage> visibleStages) {
		this.settings = settings;


@@ 63,7 65,7 @@ public class FxApplication extends Application {
		LOG.trace("FxApplication.start()");
		Platform.setImplicitExit(false);

		hasVisibleStages.addListener(this::hasVisibleStagesChanged);
		EasyBind.subscribe(hasVisibleStages, this::hasVisibleStagesChanged);

		settings.theme().addListener(this::themeChanged);
		loadSelectedStyleSheet(settings.theme().get());


@@ 74,7 76,7 @@ public class FxApplication extends Application {
		throw new UnsupportedOperationException("Use start() instead.");
	}

	private void hasVisibleStagesChanged(@SuppressWarnings("unused") ObservableValue<? extends Boolean> observableValue, @SuppressWarnings("unused") boolean oldValue, boolean newValue) {
	private void hasVisibleStagesChanged(boolean newValue) {
		if (newValue) {
			macFunctions.map(MacFunctions::uiState).ifPresent(MacApplicationUiState::transformToForegroundApplication);
		} else {


@@ 115,21 117,44 @@ public class FxApplication extends Application {
	}

	private void themeChanged(@SuppressWarnings("unused") ObservableValue<? extends UiTheme> observable, @SuppressWarnings("unused") UiTheme oldValue, UiTheme newValue) {
		if (macApperanceObserverIdentifier.isPresent()) {
			macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> uiAppearance.removeListener(macApperanceObserverIdentifier.get()));
			macApperanceObserverIdentifier = Optional.empty();
		}
		loadSelectedStyleSheet(newValue);
	}

	private void loadSelectedStyleSheet(UiTheme desiredTheme) {
		UiTheme theme = licenseHolder.isValidLicense() ? desiredTheme : UiTheme.LIGHT;
		switch (theme) {
			case DARK -> {
				Application.setUserAgentStylesheet(getClass().getResource("/css/dark_theme.css").toString());
				macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToDarkAqua));
			}
			case LIGHT -> {
				Application.setUserAgentStylesheet(getClass().getResource("/css/light_theme.css").toString());
				macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToAqua));
			case LIGHT -> setToLightTheme();
			case DARK -> setToDarkTheme();
			case AUTOMATIC -> {
				macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> {
					macApperanceObserverIdentifier = Optional.of(uiAppearance.addListener(this::macInterfaceThemeChanged));
				});
				macInterfaceThemeChanged();
			}
		}
	}

	private void macInterfaceThemeChanged() {
		macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> {
			switch (uiAppearance.getCurrentInterfaceStyle()) {
				case LIGHT -> setToLightTheme();
				case DARK -> setToDarkTheme();
			}
		});
	}

	private void setToLightTheme() {
		Application.setUserAgentStylesheet(getClass().getResource("/css/light_theme.css").toString());
		macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToAqua));
	}

	private void setToDarkTheme() {
		Application.setUserAgentStylesheet(getClass().getResource("/css/dark_theme.css").toString());
		macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToDarkAqua));
	}

}

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +20 -1
@@ 1,10 1,12 @@
package org.cryptomator.ui.mainwindow;

import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.fxml.FXML;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import org.cryptomator.common.LicenseHolder;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.fxapp.FxApplication;
import org.cryptomator.ui.fxapp.UpdateChecker;


@@ 30,12 32,14 @@ public class MainWindowTitleController implements FxController {
	private final UpdateChecker updateChecker;
	private final BooleanBinding updateAvailable;
	private final LicenseHolder licenseHolder;
	private final Settings settings;
	private final BooleanBinding debugModeEnabled;

	private double xOffset;
	private double yOffset;

	@Inject
	MainWindowTitleController(AppLifecycleListener appLifecycle, @MainWindow Stage window, FxApplication application, @Named("trayMenuSupported") boolean minimizeToSysTray, UpdateChecker updateChecker, LicenseHolder licenseHolder) {
	MainWindowTitleController(AppLifecycleListener appLifecycle, @MainWindow Stage window, FxApplication application, @Named("trayMenuSupported") boolean minimizeToSysTray, UpdateChecker updateChecker, LicenseHolder licenseHolder, Settings settings) {
		this.appLifecycle = appLifecycle;
		this.window = window;
		this.application = application;


@@ 43,6 47,8 @@ public class MainWindowTitleController implements FxController {
		this.updateChecker = updateChecker;
		this.updateAvailable = updateChecker.latestVersionProperty().isNotNull();
		this.licenseHolder = licenseHolder;
		this.settings = settings;
		this.debugModeEnabled = Bindings.createBooleanBinding(this::isDebugModeEnabled, settings.debugMode());
	}

	@FXML


@@ 83,6 89,11 @@ public class MainWindowTitleController implements FxController {
	}

	@FXML
	public void showGeneralPreferences() {
		application.showPreferencesWindow(SelectedPreferencesTab.GENERAL);
	}

	@FXML
	public void showDonationKeyPreferences() {
		application.showPreferencesWindow(SelectedPreferencesTab.DONATION_KEY);
	}


@@ 104,4 115,12 @@ public class MainWindowTitleController implements FxController {
	public boolean isMinimizeToSysTray() {
		return minimizeToSysTray;
	}

	public BooleanBinding debugModeEnabledProperty() {
		return debugModeEnabled;
	}

	public boolean isDebugModeEnabled() {
		return settings.debugMode().get();
	}
}

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java +14 -8
@@ 1,5 1,6 @@
package org.cryptomator.ui.mainwindow;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.Binding;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ObjectProperty;


@@ 10,7 11,6 @@ import org.cryptomator.common.vaults.VaultState;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.controls.FontAwesome5Icon;
import org.cryptomator.ui.fxapp.FxApplication;
import org.fxmisc.easybind.EasyBind;

import javax.inject.Inject;



@@ 26,17 26,23 @@ public class VaultDetailController implements FxController {
	VaultDetailController(ObjectProperty<Vault> vault, FxApplication application) {
		this.vault = vault;
		this.application = application;
		this.glyph = EasyBind.select(vault).selectObject(Vault::stateProperty).map(this::getGlyphForVaultState).orElse(FontAwesome5Icon.EXCLAMATION_TRIANGLE);
		this.glyph = EasyBind.select(vault) //
				.selectObject(Vault::stateProperty) //
				.map(this::getGlyphForVaultState);
		this.anyVaultSelected = vault.isNotNull();
	}

	private FontAwesome5Icon getGlyphForVaultState(VaultState state) {
		return switch (state) {
			case LOCKED -> FontAwesome5Icon.LOCK;
			case PROCESSING -> FontAwesome5Icon.SPINNER;
			case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
			case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
		};
		if (state != null) {
			return switch (state) {
				case LOCKED -> FontAwesome5Icon.LOCK;
				case PROCESSING -> FontAwesome5Icon.SPINNER;
				case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
				case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
			};
		} else {
			return FontAwesome5Icon.EXCLAMATION_TRIANGLE;
		}
	}

	@FXML

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java +1 -1
@@ 1,5 1,6 @@
package org.cryptomator.ui.mainwindow;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.BooleanExpression;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectProperty;


@@ 11,7 12,6 @@ import org.cryptomator.keychain.KeychainManager;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.fxapp.FxApplication;
import org.cryptomator.ui.vaultoptions.VaultOptionsComponent;
import org.fxmisc.easybind.EasyBind;

import javax.inject.Inject;
import java.util.Optional;

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailMissingVaultController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailMissingVaultController.java +32 -3
@@ 1,26 1,55 @@
package org.cryptomator.ui.mainwindow;

import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.fxml.FXML;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.removevault.RemoveVaultComponent;

import javax.inject.Inject;
import java.io.File;
import java.util.ResourceBundle;

@MainWindowScoped
public class VaultDetailMissingVaultController implements FxController {

	private final ReadOnlyObjectProperty<Vault> vault;
	private final ObjectProperty<Vault> vault;
	private final RemoveVaultComponent.Builder removeVault;
	private final ResourceBundle resourceBundle;
	private final Stage window;


	@Inject
	public VaultDetailMissingVaultController(ObjectProperty<Vault> vault) {
	public VaultDetailMissingVaultController(ObjectProperty<Vault> vault, RemoveVaultComponent.Builder removeVault, ResourceBundle resourceBundle, @MainWindow Stage window) {
		this.vault = vault;
		this.removeVault = removeVault;
		this.resourceBundle = resourceBundle;
		this.window = window;
	}

	@FXML
	public void recheck() {
		VaultListManager.redetermineVaultState(vault.get());
	}

	@FXML
	void didClickRemoveVault() {
		removeVault.vault(vault.get()).build().showRemoveVault();
	}

	@FXML
	void changeLocation() {
		// copied from ChooseExistingVaultController class
		FileChooser fileChooser = new FileChooser();
		fileChooser.setTitle(resourceBundle.getString("addvaultwizard.existing.filePickerTitle"));
		fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Cryptomator Masterkey", "*.cryptomator"));
		File masterkeyFile = fileChooser.showOpenDialog(window);
		if (masterkeyFile != null) {
			vault.get().getVaultSettings().path().setValue(masterkeyFile.toPath().toAbsolutePath().getParent());
			recheck();
		}
	}
}

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailUnknownErrorController.java +11 -5
@@ 1,10 1,10 @@
package org.cryptomator.ui.mainwindow;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.Binding;
import javafx.beans.property.ObjectProperty;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.common.FxController;
import org.fxmisc.easybind.EasyBind;

import javax.inject.Inject;
import java.io.ByteArrayOutputStream;


@@ 18,14 18,20 @@ public class VaultDetailUnknownErrorController implements FxController {

	@Inject
	public VaultDetailUnknownErrorController(ObjectProperty<Vault> vault) {
		this.stackTrace = EasyBind.select(vault).selectObject(Vault::lastKnownExceptionProperty).map(this::provideStackTrace).orElse("");
		this.stackTrace = EasyBind.select(vault) //
				.selectObject(Vault::lastKnownExceptionProperty) //
				.map(this::provideStackTrace);
	}

	private String provideStackTrace(Throwable cause) {
		// TODO deduplicate ErrorModule.java
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		cause.printStackTrace(new PrintStream(baos));
		return baos.toString(StandardCharsets.UTF_8);
		if (cause != null) {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			cause.printStackTrace(new PrintStream(baos));
			return baos.toString(StandardCharsets.UTF_8);
		} else {
			return "";
		}
	}

	/* Getter/Setter */

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java +14 -8
@@ 1,5 1,6 @@
package org.cryptomator.ui.mainwindow;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.Binding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;


@@ 7,7 8,6 @@ import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultState;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.controls.FontAwesome5Icon;
import org.fxmisc.easybind.EasyBind;

import javax.inject.Inject;



@@ 19,16 19,22 @@ public class VaultListCellController implements FxController {

	@Inject
	VaultListCellController() {
		this.glyph = EasyBind.select(vault).selectObject(Vault::stateProperty).map(this::getGlyphForVaultState).orElse(FontAwesome5Icon.EXCLAMATION_TRIANGLE);
		this.glyph = EasyBind.select(vault) //
				.selectObject(Vault::stateProperty) //
				.map(this::getGlyphForVaultState);
	}

	private FontAwesome5Icon getGlyphForVaultState(VaultState state) {
		return switch (state) {
			case LOCKED -> FontAwesome5Icon.LOCK;
			case PROCESSING -> FontAwesome5Icon.SPINNER;
			case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
			case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
		};
		if(state != null){
			return switch (state) {
				case LOCKED -> FontAwesome5Icon.LOCK;
				case PROCESSING -> FontAwesome5Icon.SPINNER;
				case UNLOCKED -> FontAwesome5Icon.LOCK_OPEN;
				case NEEDS_MIGRATION, MISSING, ERROR -> FontAwesome5Icon.EXCLAMATION_TRIANGLE;
			};
		} else {
			return FontAwesome5Icon.EXCLAMATION_TRIANGLE;
		}
	}

	/* Getter/Setter */

M main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java => main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +5 -8
@@ 1,16 1,15 @@
package org.cryptomator.ui.mainwindow;

import com.tobiasdiez.easybind.EasyBind;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.common.vaults.VaultState;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.removevault.RemoveVaultComponent;


@@ 18,7 17,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.io.IOException;

@MainWindowScoped
public class VaultListController implements FxController {


@@ 43,7 41,7 @@ public class VaultListController implements FxController {
		this.removeVault = removeVault;
		this.noVaultSelected = selectedVault.isNull();
		this.emptyVaultList = Bindings.isEmpty(vaults);
		selectedVault.addListener(this::selectedVaultDidChange);
		EasyBind.subscribe(selectedVault, this::selectedVaultDidChange);
	}

	public void initialize() {


@@ 60,11 58,10 @@ public class VaultListController implements FxController {
		});
	}

	private void selectedVaultDidChange(@SuppressWarnings("unused") ObservableValue<? extends Vault> observableValue, @SuppressWarnings("unused") Vault oldValue, Vault newValue) {
		if (newValue == null) {
			return;
	private void selectedVaultDidChange(Vault newValue) {
		if (newValue != null) {
			VaultListManager.redetermineVaultState(newValue);
		}
		VaultListManager.redetermineVaultState(newValue);
	}

	@FXML

M main/ui/src/main/java/org/cryptomator/ui/preferences/DonationKeyPreferencesController.java => main/ui/src/main/java/org/cryptomator/ui/preferences/DonationKeyPreferencesController.java +9 -2
@@ 5,23 5,27 @@ import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import org.cryptomator.common.LicenseHolder;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.UiTheme;
import org.cryptomator.ui.common.FxController;

import javax.inject.Inject;

@PreferencesScoped
public class DonationKeyPreferencesController implements FxController {
	

	private static final String DONATION_URI = "https://store.cryptomator.org/desktop";

	private final Application application;
	private final LicenseHolder licenseHolder;
	private final Settings settings;
	public TextArea donationKeyField;

	@Inject
	DonationKeyPreferencesController(Application application, LicenseHolder licenseHolder) {
	DonationKeyPreferencesController(Application application, LicenseHolder licenseHolder, Settings settings) {
		this.application = application;
		this.licenseHolder = licenseHolder;
		this.settings = settings;
	}

	@FXML


@@ 32,6 36,9 @@ public class DonationKeyPreferencesController implements FxController {

	private void registrationKeyChanged(@SuppressWarnings("unused") ObservableValue<? extends String> observable, @SuppressWarnings("unused") String oldValue, String newValue) {
		licenseHolder.validateAndStoreLicense(newValue);
		if (!licenseHolder.isValidLicense()) {
			settings.theme().set(UiTheme.LIGHT);
		}
	}

	@FXML

M main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java => main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java +7 -4
@@ 1,5 1,6 @@
package org.cryptomator.ui.preferences;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.ObjectProperty;
import javafx.beans.value.ObservableValue;


@@ 12,11 13,10 @@ import javafx.scene.control.RadioButton;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
import javafx.util.StringConverter;
import javafx.application.Application;
import org.cryptomator.common.Environment;
import org.cryptomator.common.LicenseHolder;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.UiTheme;
import org.cryptomator.common.Environment;
import org.cryptomator.ui.common.FxController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@@ 64,7 64,10 @@ public class GeneralPreferencesController implements FxController {

	@FXML
	public void initialize() {
		themeChoiceBox.getItems().addAll(UiTheme.values());
		themeChoiceBox.getItems().addAll(UiTheme.applicableValues());
		if (!themeChoiceBox.getItems().contains(settings.theme().get())) {
			settings.theme().set(UiTheme.LIGHT);
		}
		themeChoiceBox.valueProperty().bindBidirectional(settings.theme());
		themeChoiceBox.setConverter(new UiThemeConverter(resourceBundle));



@@ 122,7 125,7 @@ public class GeneralPreferencesController implements FxController {
	}

	@FXML
	public void showLogfileDirectory(){
	public void showLogfileDirectory() {
		environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
	}


M main/ui/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java => main/ui/src/main/java/org/cryptomator/ui/preferences/VolumePreferencesController.java +1 -3
@@ 3,7 3,6 @@ package org.cryptomator.ui.preferences;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;


@@ 40,9 39,8 @@ public class VolumePreferencesController implements FxController {

	public void initialize() {
		volumeTypeChoiceBox.getItems().addAll(Volume.getCurrentSupportedAdapters());
		//If the in the settings specified preferredVolumeImplementation isn't available, overwrite the settings to use the default VolumeImpl.WEBDAV
		if (!volumeTypeChoiceBox.getItems().contains(settings.preferredVolumeImpl().get())) {
			settings.preferredVolumeImpl().bind(new SimpleObjectProperty<>(VolumeImpl.WEBDAV));
			settings.preferredVolumeImpl().set(VolumeImpl.WEBDAV);
		}
		volumeTypeChoiceBox.valueProperty().bindBidirectional(settings.preferredVolumeImpl());
		volumeTypeChoiceBox.setConverter(new VolumeImplConverter());

M main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java => main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java +1 -1
@@ 47,7 47,7 @@ public class TrayIconController {
		trayMenuController.initTrayMenu();
	}

	public void macInterfaceThemeChanged() {
	private void macInterfaceThemeChanged() {
		trayIcon.setImage(imageFactory.loadImage());
	}


M main/ui/src/main/resources/css/dark_theme.css => main/ui/src/main/resources/css/dark_theme.css +4 -0
@@ 143,6 143,10 @@
	-fx-fill: RED_5;
}

.glyph-icon-orange {
	-fx-fill: ORANGE_5;
}

/*******************************************************************************
 *                                                                             *
 * Main Window                                                                 *

M main/ui/src/main/resources/css/light_theme.css => main/ui/src/main/resources/css/light_theme.css +4 -0
@@ 143,6 143,10 @@
	-fx-fill: RED_5;
}

.glyph-icon-orange {
	-fx-fill: ORANGE_5;
}

/*******************************************************************************
 *                                                                             *
 * Main Window                                                                 *

M main/ui/src/main/resources/fxml/main_window_title.fxml => main/ui/src/main/resources/fxml/main_window_title.fxml +8 -0
@@ 32,6 32,14 @@
				<Tooltip text="%main.donationKeyMissing.tooltip"/>
			</tooltip>
		</Button>
		<Button contentDisplay="GRAPHIC_ONLY" mnemonicParsing="false" onAction="#showGeneralPreferences" focusTraversable="false" visible="${controller.debugModeEnabled}">
			<graphic>
				<FontAwesome5IconView glyph="BUG" glyphSize="16"/>
			</graphic>
			<tooltip>
				<Tooltip text="%main.debugModeEnabled.tooltip"/>
			</tooltip>
		</Button>
		<Button contentDisplay="GRAPHIC_ONLY" mnemonicParsing="false" onAction="#showPreferences" focusTraversable="false">
			<graphic>
				<StackPane>

M main/ui/src/main/resources/fxml/new_password.fxml => main/ui/src/main/resources/fxml/new_password.fxml +8 -5
@@ 12,19 12,22 @@
	  spacing="6"
	  alignment="CENTER_LEFT">
	<fx:define>
		<FontAwesome5IconView fx:id="checkmark" styleClass="glyph-icon-primary" glyph="CHECK"/>
		<FontAwesome5IconView fx:id="cross" styleClass="glyph-icon-red" glyph="TIMES"/>
		<FontAwesome5IconView fx:id="passwordStrengthCheckmark" styleClass="glyph-icon-primary" glyph="CHECK"/>
		<FontAwesome5IconView fx:id="passwordStrengthWarning" styleClass="glyph-icon-orange" glyph="EXCLAMATION_TRIANGLE"/>
		<FontAwesome5IconView fx:id="passwordStrengthCross" styleClass="glyph-icon-red" glyph="TIMES"/>
		<FontAwesome5IconView fx:id="passwordMatchCheckmark" styleClass="glyph-icon-primary" glyph="CHECK"/>
		<FontAwesome5IconView fx:id="passwordMatchCross" styleClass="glyph-icon-red" glyph="TIMES"/>
	</fx:define>
	<children>
		<Label text="%newPassword.promptText" labelFor="$passwordField"/>
		<NiceSecurePasswordField fx:id="passwordField"/>
		<PasswordStrengthIndicator spacing="6" prefHeight="6" strength="${controller.passwordStrength}"/>
		<Label fx:id="passwordStrengthLabel" styleClass="label-muted" alignment="CENTER_RIGHT" maxWidth="Infinity"/>
	
		<Label fx:id="passwordStrengthLabel" styleClass="label-muted" alignment="CENTER_RIGHT" maxWidth="Infinity" graphicTextGap="6"/>

		<Region/>

		<Label text="%newPassword.reenterPassword" labelFor="$reenterField"/>
		<NiceSecurePasswordField fx:id="reenterField"/>
		<Label fx:id="passwordMatchLabel" styleClass="label-muted" alignment="CENTER_RIGHT" maxWidth="Infinity" graphicTextGap="6" contentDisplay="LEFT" />
		<Label fx:id="passwordMatchLabel" styleClass="label-muted" alignment="CENTER_RIGHT" maxWidth="Infinity" graphicTextGap="6"/>
	</children>
</VBox>

M main/ui/src/main/resources/fxml/vault_detail_missing.fxml => main/ui/src/main/resources/fxml/vault_detail_missing.fxml +31 -17
@@ 1,30 1,44 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
<?import javafx.scene.control.Button?>
<VBox xmlns="http://javafx.com/javafx"
	  xmlns:fx="http://javafx.com/fxml"
	  fx:controller="org.cryptomator.ui.mainwindow.VaultDetailMissingVaultController"
	  alignment="TOP_CENTER"
	  spacing="9">
	  spacing="24">
	<children>
		<StackPane alignment="CENTER">
			<Circle styleClass="glyph-icon-primary" radius="48"/>
			<FontAwesome5IconView styleClass="glyph-icon-white" glyph="FILE" glyphSize="48"/>
			<FontAwesome5IconView styleClass="glyph-icon-primary" glyph="SEARCH" glyphSize="24">
				<StackPane.margin>
					<Insets top="12"/>
				</StackPane.margin>
			</FontAwesome5IconView>
		</StackPane>
		<Label text="%main.vaultDetail.missing.info" wrapText="true"/>
		<Button text="%main.vaultDetail.missing.recheck" minWidth="120" onAction="#recheck">
			<graphic>
				<FontAwesome5IconView glyph="REDO"/>
			</graphic>
		</Button>
		<VBox spacing="9" alignment="CENTER">
			<StackPane alignment="CENTER">
				<Circle styleClass="glyph-icon-primary" radius="48"/>
				<FontAwesome5IconView styleClass="glyph-icon-white" glyph="FILE" glyphSize="48"/>
				<FontAwesome5IconView styleClass="glyph-icon-primary" glyph="SEARCH" glyphSize="24">
					<StackPane.margin>
						<Insets top="12"/>
					</StackPane.margin>
				</FontAwesome5IconView>
			</StackPane>
			<Label text="%main.vaultDetail.missing.info" wrapText="true"/>
		</VBox>
		<VBox spacing="6" alignment="CENTER">
			<Button text="%main.vaultDetail.missing.recheck" minWidth="120" onAction="#recheck">
				<graphic>
					<FontAwesome5IconView glyph="REDO"/>
				</graphic>
			</Button>
			<Button text="%main.vaultDetail.missing.changeLocation" minWidth="120" onAction="#changeLocation">
				<graphic>
					<FontAwesome5IconView glyph="EDIT"/>
				</graphic>
			</Button>
			<Button text="%main.vaultDetail.missing.remove" minWidth="120" onAction="#didClickRemoveVault">
				<graphic>
					<FontAwesome5IconView glyph="TRASH"/>
				</graphic>
			</Button>
		</VBox>
	</children>
</VBox>
\ No newline at end of file

M main/ui/src/main/resources/i18n/strings.properties => main/ui/src/main/resources/i18n/strings.properties +5 -1
@@ 131,6 131,7 @@ preferences.title=Preferences
## General
preferences.general=General
preferences.general.theme=Look & Feel
preferences.general.theme.automatic=Automatic
preferences.general.theme.light=Light
preferences.general.theme.dark=Dark
preferences.general.unlockThemes=Unlock dark mode


@@ 164,13 165,14 @@ preferences.about=About
main.closeBtn.tooltip=Close
main.minimizeBtn.tooltip=Minimize
main.preferencesBtn.tooltip=Preferences
main.debugModeEnabled.tooltip=Debug mode is enabled
main.donationKeyMissing.tooltip=Please consider donating
## Drag 'n' Drop
main.dropZone.dropVault=Add this vault
main.dropZone.unknownDragboardContent=If you want to add a vault, drag it to this window
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Click here to add a vault
main.vaultlist.contextMenu.remove=Remove Vault
main.vaultlist.contextMenu.remove=Remove Vault…
main.vaultlist.addVaultBtn=Add Vault
## Vault Detail
### Welcome


@@ 194,6 196,8 @@ main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator could not find a vault at this path.
main.vaultDetail.missing.recheck=Recheck
main.vaultDetail.missing.remove=Remove from Vault List…
main.vaultDetail.missing.changeLocation=Change Vault Location…
### Needs Migration
main.vaultDetail.migrateButton=Upgrade Vault
main.vaultDetail.migratePrompt=Your vault needs to be upgraded to a new format, before you can access it

M main/ui/src/main/resources/i18n/strings_ar.properties => main/ui/src/main/resources/i18n/strings_ar.properties +2 -1
@@ 169,7 169,6 @@ main.dropZone.dropVault=أضف هذا المخزن
main.dropZone.unknownDragboardContent=إذا كنت ترغب في إضافة مخزن، قم بسحبه إلى هذه النافذة
## Vault List
main.vaultlist.emptyList.onboardingInstruction=انقر هنا لإضافة خزنة
main.vaultlist.contextMenu.remove=احذف الحافظة
main.vaultlist.addVaultBtn=أضِف مخزنًا
## Vault Detail
### Welcome


@@ 192,6 191,8 @@ main.vaultDetail.throughput.kbps=%.1f كيلوبايت/ث
main.vaultDetail.throughput.mbps=%.1f ميجابايت/ث
### Missing
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
main.vaultDetail.missing.recheck=إعادة الفحص
main.vaultDetail.missing.changeLocation=تغيير موقع الخزنة…
### Needs Migration
main.vaultDetail.migrateButton=ترقية الحافظة
main.vaultDetail.migratePrompt=يجب ترقية المخزن الخاص بك إلى تنسيق جديد، قبل أن تتمكن من الوصول إليه

M main/ui/src/main/resources/i18n/strings_ca.properties => main/ui/src/main/resources/i18n/strings_ca.properties +0 -1
@@ 168,7 168,6 @@ main.dropZone.dropVault=Afegeix aquesta caixa forta
main.dropZone.unknownDragboardContent=Si voleu afegir una caixa forta, arrossegueu-la a aquesta finestra
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Feu clic aquí per afegir una caixa forta
main.vaultlist.contextMenu.remove=Elimina la caixa forta
main.vaultlist.addVaultBtn=Afegir una caixa forta
## Vault Detail
### Welcome

M main/ui/src/main/resources/i18n/strings_cs.properties => main/ui/src/main/resources/i18n/strings_cs.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Nastavení
## General
preferences.general=Obecné
preferences.general.theme=Vzhled
preferences.general.theme.automatic=Automaticky
preferences.general.theme.light=Světlý
preferences.general.theme.dark=Tmavý
preferences.general.unlockThemes=Odemknout tmavý režim


@@ 169,7 170,7 @@ main.dropZone.dropVault=Přidat tento trezor
main.dropZone.unknownDragboardContent=Pokud chcete přidat trezor, přetáhněte jej do tohoto okna
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikněte zde pro přidání nového trezoru
main.vaultlist.contextMenu.remove=Odstranit trezor
main.vaultlist.contextMenu.remove=Odstranit trezor…
main.vaultlist.addVaultBtn=Přidat trezor
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator nemohl najít trezor na této cestě.
main.vaultDetail.missing.recheck=Znovu zkontrolovat
main.vaultDetail.missing.remove=Odebrat ze seznamu trezorů…
main.vaultDetail.missing.changeLocation=Změnit umístění trezoru…
### Needs Migration
main.vaultDetail.migrateButton=Upgrade trezoru
main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup

M main/ui/src/main/resources/i18n/strings_de.properties => main/ui/src/main/resources/i18n/strings_de.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Einstellungen
## General
preferences.general=Allgemein
preferences.general.theme=Erscheinungsbild
preferences.general.theme.automatic=Automatisch
preferences.general.theme.light=Hell
preferences.general.theme.dark=Dunkel
preferences.general.unlockThemes=Dunklen Modus freischalten


@@ 169,7 170,7 @@ main.dropZone.dropVault=Diesen Tresor hinzufügen
main.dropZone.unknownDragboardContent=Wenn Sie einen Tresor hinzufügen möchten, ziehen Sie ihn in dieses Fenster
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klicke hier, um einen Tresor hinzuzufügen
main.vaultlist.contextMenu.remove=Tresor entfernen
main.vaultlist.contextMenu.remove=Tresor entfernen…
main.vaultlist.addVaultBtn=Tresor hinzufügen
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Mit diesem Pfad konnte Cryptomator keinen Tresor finden.
main.vaultDetail.missing.recheck=Erneut prüfen
main.vaultDetail.missing.remove=Aus Tresorliste entfernen…
main.vaultDetail.missing.changeLocation=Speicherort des Tresors ändern…
### Needs Migration
main.vaultDetail.migrateButton=Tresor aktualisieren
main.vaultDetail.migratePrompt=Dein Tresor muss auf ein neues Format aktualisiert werden, bevor du auf ihn zugreifen kannst

M main/ui/src/main/resources/i18n/strings_el.properties => main/ui/src/main/resources/i18n/strings_el.properties +9 -5
@@ 39,7 39,7 @@ addvaultwizard.new.locationInstruction=Που θα αποθηκεύσει το C
addvaultwizard.new.locationLabel=Θέση αποθήκευσης
addvaultwizard.new.locationPrompt=…
addvaultwizard.new.directoryPickerLabel=Προσαρμοσμένη τοποθεσία
addvaultwizard.new.directoryPickerButton=Επιλογή
addvaultwizard.new.directoryPickerButton=Επιλογή…
addvaultwizard.new.directoryPickerTitle=Επιλογή φακέλου
addvaultwizard.new.fileAlreadyExists=Το vault δεν μπορεί να δημιουργηθεί σε αυτό το μονοπάτι καθώς κάποια αντικείμενα υπάρχουν ήδη.
addvaultwizard.new.locationDoesNotExist=Το vault δεν μπορεί να δημιουργηθεί σε αυτό το μονοπάτι καθώς τουλάχιστον ένα στοιχείο του μονοπατιού δεν υπάρχει.


@@ 68,7 68,7 @@ addvault.new.readme.accessLocation.3=Κάθε αρχείο που θα προσ
addvault.new.readme.accessLocation.4=Μπορείτε ελεύθερα να αφαιρέσετε το αρχείο.
## Existing
addvaultwizard.existing.instruction=Επιλέξτε το αρχείο "masterkey.cryptomator" του υπάρχοντος vault σας.
addvaultwizard.existing.chooseBtn=Επιλογή
addvaultwizard.existing.chooseBtn=Επιλογή…
addvaultwizard.existing.filePickerTitle=Επιλέξτε το αρχείο Masterkey
## Success
addvaultwizard.success.nextStepsInstructions=Προστέθηκε το vault "%s".\nΠρέπει να ξεκλειδώσετε αυτό το vault για να έχετε πρόσβαση ή να προσθέσετε περιεχόμενο. Εναλλακτικά μπορείτε να το ξεκλειδώσετε κάποια άλλη στιγμή.


@@ 130,6 130,7 @@ preferences.title=Προτιμήσεις
## General
preferences.general=Γενικά
preferences.general.theme=Εμφάνιση
preferences.general.theme.automatic=Αυτόματα
preferences.general.theme.light=Ανοιχτό
preferences.general.theme.dark=Σκούρο
preferences.general.unlockThemes=Ξεκλείδωσε το σκούρο θέμα


@@ 166,10 167,10 @@ main.preferencesBtn.tooltip=Προτιμήσεις
main.donationKeyMissing.tooltip=Παρακαλώ σκεφτείτε τη δωρεά
## Drag 'n' Drop
main.dropZone.dropVault=Προσθήκη vault
main.dropZone.unknownDragboardContent=Αν θέλετε να προσθέσετε ένα vault, σύρτε το σε αυτό το παράθυρο
main.dropZone.unknownDragboardContent=Αν θέλετε να προσθέσετε ένα vault, σύρετε το σε αυτό το παράθυρο
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Κάντε κλικ εδώ για να προσθέσετε ένα vault
main.vaultlist.contextMenu.remove=Διαγραφή Vault
main.vaultlist.contextMenu.remove=Διαγραφή Vault…
main.vaultlist.addVaultBtn=Προσθήκη Vault
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator δεν βρήκε vault σε αυτόν τον κατάλογο.
main.vaultDetail.missing.recheck=Επανέλεγχος
main.vaultDetail.missing.remove=Κατάργηση από την λίστα των Vault…
main.vaultDetail.missing.changeLocation=Αλλαγή τοποθεσίας Vault…
### Needs Migration
main.vaultDetail.migrateButton=Αναβάθμιση Vault
main.vaultDetail.migratePrompt=Το vault σας πρέπει να αναβαθμιστεί σε νέα μορφή, προτού να έχετε πρόσβαση σε αυτό


@@ 224,7 228,7 @@ vaultOptions.mount.mountPoint=Σημείο προσάρτησης
vaultOptions.mount.mountPoint.auto=Επιλογή κατάλληλης τοποθεσίας αυτόματα
vaultOptions.mount.mountPoint.driveLetter=Χρήση επιλεγμένου γράμματος δίσκου
vaultOptions.mount.mountPoint.custom=Προσαρμοσμένη διαδρομή
vaultOptions.mount.mountPoint.directoryPickerButton=Επιλογή
vaultOptions.mount.mountPoint.directoryPickerButton=Επιλογή…
vaultOptions.mount.mountPoint.directoryPickerTitle=Επιλέξτε ένα άδειο φάκελο
## Master Key
vaultOptions.masterkey=Κωδικός πρόσβασης

M main/ui/src/main/resources/i18n/strings_es.properties => main/ui/src/main/resources/i18n/strings_es.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Preferencias
## General
preferences.general=General
preferences.general.theme=Apariencia
preferences.general.theme.automatic=Automático
preferences.general.theme.light=Claro
preferences.general.theme.dark=Oscuro
preferences.general.unlockThemes=Desbloquear el modo oscuro


@@ 169,7 170,7 @@ main.dropZone.dropVault=Añadir esta bóveda
main.dropZone.unknownDragboardContent=Si desea añadir una bóveda, arrástrela a esta ventana
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Hacer clic aquí para añadir una bóveda
main.vaultlist.contextMenu.remove=Eliminar bóveda
main.vaultlist.contextMenu.remove=Eliminar bóveda…
main.vaultlist.addVaultBtn=Añadir bóveda
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator no pudo encontrar una bóveda en esta ruta.
main.vaultDetail.missing.recheck=Volver a comprobar
main.vaultDetail.missing.remove=Eliminar de la lista de bóveda…
main.vaultDetail.missing.changeLocation=Cambiar ubicación de la bóveda…
### Needs Migration
main.vaultDetail.migrateButton=Mejorar bóveda
main.vaultDetail.migratePrompt=Su bóveda necesita ser actualizada a un formato nuevo antes de poder acceder a ella

M main/ui/src/main/resources/i18n/strings_fr.properties => main/ui/src/main/resources/i18n/strings_fr.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Préférences
## General
preferences.general=Général
preferences.general.theme=Apparence
preferences.general.theme.automatic=Automatique
preferences.general.theme.light=Clair
preferences.general.theme.dark=Sombre
preferences.general.unlockThemes=Débloquer le mode nuit


@@ 169,7 170,7 @@ main.dropZone.dropVault=Ajouter ce coffre
main.dropZone.unknownDragboardContent=Si vous voulez ajouter un coffre, faites-le glisser dans cette fenêtre
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Cliquez ici pour ajouter un coffre
main.vaultlist.contextMenu.remove=Supprimer le coffre
main.vaultlist.contextMenu.remove=Supprimer le coffre…
main.vaultlist.addVaultBtn=Ajouter un coffre
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1fkB/s
main.vaultDetail.throughput.mbps=%.1fMB/s
### Missing
main.vaultDetail.missing.info=Cryptomateur n'a pas pu trouver de coffre-fort dans ce chemin d'accès.
main.vaultDetail.missing.recheck=Revérifier
main.vaultDetail.missing.remove=Retirer de la liste des coffres…
main.vaultDetail.missing.changeLocation=Changer l'Emplacement du Coffre…
### Needs Migration
main.vaultDetail.migrateButton=Mettre à jour le coffre
main.vaultDetail.migratePrompt=Votre coffre doit être converti dans un nouveau format avant d'y accéder

M main/ui/src/main/resources/i18n/strings_it.properties => main/ui/src/main/resources/i18n/strings_it.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Impostazioni
## General
preferences.general=Generali
preferences.general.theme=Aspetto
preferences.general.theme.automatic=Automatico
preferences.general.theme.light=Chiaro
preferences.general.theme.dark=Scuro
preferences.general.unlockThemes=Sblocca modalità scura


@@ 169,7 170,7 @@ main.dropZone.dropVault=Aggiungi questa cassaforte
main.dropZone.unknownDragboardContent=Se vuoi aggiungere una cassaforte, trascinala in questa finestra
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Clicca qui per aggiungere una cassaforte
main.vaultlist.contextMenu.remove=Rimuovi Cassaforte
main.vaultlist.contextMenu.remove=Rimuovi Cassaforte…
main.vaultlist.addVaultBtn=Aggiungi Cassaforte
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator non ha potuto trovare una cassaforte in questo percorso.
main.vaultDetail.missing.recheck=Ricontrollare
main.vaultDetail.missing.remove=Rimuovi dalla Lista Cassaforte…
main.vaultDetail.missing.changeLocation=Cambia posizione della Cassaforte…
### Needs Migration
main.vaultDetail.migrateButton=Aggiorna la cassaforte
main.vaultDetail.migratePrompt=Prima di potervi accedere la tua cassaforte deve essere aggiornata al nuovo formato

M main/ui/src/main/resources/i18n/strings_ja.properties => main/ui/src/main/resources/i18n/strings_ja.properties +3 -1
@@ 130,6 130,7 @@ preferences.title=設定
## General
preferences.general=基本設定
preferences.general.theme=外見 & 操作性
preferences.general.theme.automatic=自動
preferences.general.theme.light=ライト
preferences.general.theme.dark=ダーク
preferences.general.unlockThemes=ダークモードの解錠


@@ 169,7 170,6 @@ main.dropZone.dropVault=この金庫を追加
main.dropZone.unknownDragboardContent=このウィンドウにドラッグして、金庫を追加
## Vault List
main.vaultlist.emptyList.onboardingInstruction=ここをクリックして金庫を追加
main.vaultlist.contextMenu.remove=金庫を削除
main.vaultlist.addVaultBtn=金庫を追加
## Vault Detail
### Welcome


@@ 192,6 192,8 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator はこのパスの金庫を見つけることができませんでした。
main.vaultDetail.missing.recheck=再確認
main.vaultDetail.missing.changeLocation=金庫の場所を変更...
### Needs Migration
main.vaultDetail.migrateButton=金庫をアップグレード
main.vaultDetail.migratePrompt=金庫にアクセスする前に、 金庫を新しい形式にアップグレードする必要があります

M main/ui/src/main/resources/i18n/strings_ko.properties => main/ui/src/main/resources/i18n/strings_ko.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=환경설정
## General
preferences.general=일반
preferences.general.theme=테마설정
preferences.general.theme.automatic=자동
preferences.general.theme.light=밝게
preferences.general.theme.dark=어둡게
preferences.general.unlockThemes=다크모드 해제


@@ 169,7 170,7 @@ main.dropZone.dropVault=이 Vault를 추가
main.dropZone.unknownDragboardContent=Vault를 추가하려면, 이 창에 드래그 하십시요.
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Vault를 추가하기 위해 이곳을 클릭합니다.
main.vaultlist.contextMenu.remove=Vault 제거
main.vaultlist.contextMenu.remove=Vault 제거...
main.vaultlist.addVaultBtn=Vault 추가
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator가 이 경로에 있는 Vault를 찾지 못했습니다.
main.vaultDetail.missing.recheck=다시 시도
main.vaultDetail.missing.remove=Vault 목록에서 제거...
main.vaultDetail.missing.changeLocation=Vault 위치 변경
### Needs Migration
main.vaultDetail.migrateButton=Vault 업그레이드
main.vaultDetail.migratePrompt=Vault에 접근하기 전, 새로운 포멧으로 업그레이드가 필요합니다.

M main/ui/src/main/resources/i18n/strings_lv.properties => main/ui/src/main/resources/i18n/strings_lv.properties +0 -1
@@ 162,7 162,6 @@ main.dropZone.dropVault=Pievienot šo glabātuvi
main.dropZone.unknownDragboardContent=Ja jūs vēlaties pievienot glabātuvi, velciet to uz šo logu
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Spied šeit, lai pievienotu glabātuvi
main.vaultlist.contextMenu.remove=Noņemt glabātuvi
main.vaultlist.addVaultBtn=Pievienot glabātuvi
## Vault Detail
### Welcome

M main/ui/src/main/resources/i18n/strings_nb.properties => main/ui/src/main/resources/i18n/strings_nb.properties +1 -1
@@ 169,7 169,6 @@ main.dropZone.dropVault=Legg til dette hvelvet
main.dropZone.unknownDragboardContent=Hvis du vil legge til et hvelv, kan du dra det til dette vinduet
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikk her for å legge til et hvelv
main.vaultlist.contextMenu.remove=Fjern hvelvet
main.vaultlist.addVaultBtn=Legg til hvelv
## Vault Detail
### Welcome


@@ 192,6 191,7 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator kunne ikke finne et hvelv på denne søkestien.
main.vaultDetail.missing.recheck=Kontroller igjen
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader hvelv
main.vaultDetail.migratePrompt=Hvelvet ditt må oppgraderes til et nytt format før du kan få tilgang til det

M main/ui/src/main/resources/i18n/strings_nl.properties => main/ui/src/main/resources/i18n/strings_nl.properties +0 -1
@@ 158,7 158,6 @@ main.dropZone.dropVault=Voeg deze kluis toe
main.dropZone.unknownDragboardContent=Als u een kluis wilt toevoegen, sleep deze dan naar dit venster
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klik hier om een kluis toe te voegen
main.vaultlist.contextMenu.remove=Verwijder Kluis
main.vaultlist.addVaultBtn=Kluis toevoegen
## Vault Detail
### Welcome

M main/ui/src/main/resources/i18n/strings_nn.properties => main/ui/src/main/resources/i18n/strings_nn.properties +1 -1
@@ 169,7 169,6 @@ main.dropZone.dropVault=Legg til denne kvelven
main.dropZone.unknownDragboardContent=Viss du vil legga til ein kvelv, kan du dra det til dette vindauget
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klikk her for å legga til ein kvelv
main.vaultlist.contextMenu.remove=Fjern kvelv
main.vaultlist.addVaultBtn=Legg til kvelv
## Vault Detail
### Welcome


@@ 192,6 191,7 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator kunne ikkje finna ein kvelv på denne søkastien.
main.vaultDetail.missing.recheck=Kontroller igjen
### Needs Migration
main.vaultDetail.migrateButton=Oppgrader kvelv
main.vaultDetail.migratePrompt=Kvelven din må oppgraderast til eit nytt format før du kan få tilgang til det

M main/ui/src/main/resources/i18n/strings_pl.properties => main/ui/src/main/resources/i18n/strings_pl.properties +6 -2
@@ 111,7 111,7 @@ migration.run.enterPassword=Wprowadź hasło dla "%s"
migration.run.startMigrationBtn=Aktualizuj sejf
migration.run.progressHint=To może chwilę potrwać…
## Sucess
migration.success.nextStepsInstructions=Aktualizacja "%s" zakończona pomyślnie. Możesz już odblokować swój sejf.
migration.success.nextStepsInstructions=Aktualizacja "%s" zakończona pomyślnie.\nMożesz już odblokować swój sejf.
migration.success.unlockNow=Odblokuj teraz
## Missing file system capabilities
migration.error.missingFileSystemCapabilities.title=Nieobsługiwany system plików


@@ 130,6 130,7 @@ preferences.title=Ustawienia
## General
preferences.general=Ogólne
preferences.general.theme=Interfejs
preferences.general.theme.automatic=Automatycznie
preferences.general.theme.light=Jasny
preferences.general.theme.dark=Ciemny
preferences.general.unlockThemes=Odblokuj tryb ciemny


@@ 169,7 170,7 @@ main.dropZone.dropVault=Dodaj ten sejf
main.dropZone.unknownDragboardContent=Jeśli chcesz dodać sejf, przeciągnij go do tego okna
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Kliknij tutaj, aby dodać sejf
main.vaultlist.contextMenu.remove=Usuń sejf
main.vaultlist.contextMenu.remove=Usuń sejf…
main.vaultlist.addVaultBtn=Dodaj sejf
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator nie mógł znaleźć sejfu w tej lokalizacji.
main.vaultDetail.missing.recheck=Ponów próbę
main.vaultDetail.missing.remove=Usuń z listy sejfów…
main.vaultDetail.missing.changeLocation=Zmień lokalizację sejfu…
### Needs Migration
main.vaultDetail.migrateButton=Aktualizuj sejf
main.vaultDetail.migratePrompt=Twój sejf musi zostać zaktualizowany do nowego formatu, zanim będziesz mógł go używać

M main/ui/src/main/resources/i18n/strings_pt.properties => main/ui/src/main/resources/i18n/strings_pt.properties +1 -0
@@ 69,6 69,7 @@ addvaultwizard.success.nextStepsInstructions=Adicionado cofre "%s".\nPrecisa de 
addvaultwizard.success.unlockNow=Destrancar agora

# Remove Vault
removeVault.title=Remover Cofre
removeVault.confirmBtn=Remover Cofre

# Change Password

M main/ui/src/main/resources/i18n/strings_pt_BR.properties => main/ui/src/main/resources/i18n/strings_pt_BR.properties +5 -1
@@ 129,6 129,7 @@ preferences.title=Preferências
## General
preferences.general=Geral
preferences.general.theme=Aparência
preferences.general.theme.automatic=Automático
preferences.general.theme.light=Claro
preferences.general.theme.dark=Escuro
preferences.general.unlockThemes=Desbloquear o modo escuro


@@ 168,7 169,7 @@ main.dropZone.dropVault=Adicionar este cofre
main.dropZone.unknownDragboardContent=Se você quer adicionar um cofre, arraste-o para esta janela
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Clique aqui para adicionar um cofre
main.vaultlist.contextMenu.remove=Remover Cofre
main.vaultlist.contextMenu.remove=Remover Cofre…
main.vaultlist.addVaultBtn=Adicionar Cofre
## Vault Detail
### Welcome


@@ 189,6 190,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste caminho.
main.vaultDetail.missing.recheck=Verificar novamente
main.vaultDetail.missing.remove=Remover da lista de Cofres…
main.vaultDetail.missing.changeLocation=Alterar Localização do Cofre…
### Needs Migration
main.vaultDetail.migrateButton=Atualizar Cofre
main.vaultDetail.migratePrompt=Seu cofre precisa ser atualizado para um novo formato antes de poder acessá-lo

M main/ui/src/main/resources/i18n/strings_ru.properties => main/ui/src/main/resources/i18n/strings_ru.properties +8 -4
@@ 7,7 7,7 @@ generic.button.back=Назад
generic.button.cancel=Отмена
generic.button.change=Изменить
generic.button.close=Закрыть
generic.button.copy=Скопировать
generic.button.copy=Копировать
generic.button.copied=Скопировано!
generic.button.done=Готово
generic.button.next=Далее


@@ 130,9 130,10 @@ preferences.title=Настройки
## General
preferences.general=Общие
preferences.general.theme=Внешний вид
preferences.general.theme.automatic=Автоматически
preferences.general.theme.light=Светлая
preferences.general.theme.dark=Тёмная
preferences.general.unlockThemes=Разблокировать темный режим
preferences.general.unlockThemes=Разблокировать тёмный режим
preferences.general.startHidden=Скрывать окно при запуске Cryptomator
preferences.general.debugLogging=Вести журнал отладки
preferences.general.debugDirectory=Показать файлы журнала


@@ 169,11 170,11 @@ main.dropZone.dropVault=Добавить это хранилище
main.dropZone.unknownDragboardContent=Если вы хотите добавить хранилище, перетащите его в это окно
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Нажмите здесь, чтобы добавить хранилище
main.vaultlist.contextMenu.remove=Удалить хранилище
main.vaultlist.contextMenu.remove=Удалить хранилище…
main.vaultlist.addVaultBtn=Добавить хранилище
## Vault Detail
### Welcome
main.vaultDetail.welcomeOnboarding=Спасибо, что выбрали Cryptomator для защиты ваших файлов. Если вам нужна помощь, ознакомьтесь с нашими руководствами по началу работы:
main.vaultDetail.welcomeOnboarding=Благодарим за выбор Cryptomator для защиты ваших файлов. Если требуется помощь, ознакомьтесь с документацией по началу работы:
### Locked
main.vaultDetail.lockedStatus=ЗАБЛОКИРОВАНО
main.vaultDetail.unlockBtn=Разблокировка…


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f КиБ/с
main.vaultDetail.throughput.mbps=%.1f МиБ/с
### Missing
main.vaultDetail.missing.info=Cryptomator не смог найти хранилище по этому пути.
main.vaultDetail.missing.recheck=Перепроверить
main.vaultDetail.missing.remove=Удалить из списка хранилищ…
main.vaultDetail.missing.changeLocation=Изменить расположение хранилища…
### Needs Migration
main.vaultDetail.migrateButton=Обновить хранилище
main.vaultDetail.migratePrompt=Чтобы получить доступ к хранилищу, его нужно преобразовать в новый формат

M main/ui/src/main/resources/i18n/strings_sk.properties => main/ui/src/main/resources/i18n/strings_sk.properties +4 -1
@@ 108,6 108,7 @@ migration.success.unlockNow=Odomknúť teraz
# Preferences
preferences.title=Predvoľby
## General
preferences.general.theme.automatic=Automaticky
## Volume
## Updates
## Donation Key


@@ 118,7 119,7 @@ main.closeBtn.tooltip=Zavrieť
main.preferencesBtn.tooltip=Predvoľby
## Drag 'n' Drop
## Vault List
main.vaultlist.contextMenu.remove=Odstrániť trezor
main.vaultlist.contextMenu.remove=Odstrániť peňaženku…
main.vaultlist.addVaultBtn=Pridať trezor
## Vault Detail
### Welcome


@@ 129,6 130,8 @@ main.vaultDetail.passwordSavedInKeychain=Heslo uložené
### Unlocked
main.vaultDetail.lockBtn=Uzamknúť
### Missing
main.vaultDetail.missing.recheck=Prekontrolovať
main.vaultDetail.missing.remove=Odstrániť zo zoznamu peňaženky…
### Needs Migration

# Wrong File Alert

M main/ui/src/main/resources/i18n/strings_sv.properties => main/ui/src/main/resources/i18n/strings_sv.properties +3 -1
@@ 42,6 42,7 @@ addvaultwizard.new.directoryPickerLabel=Anpassad plats
addvaultwizard.new.directoryPickerButton=Välj…
addvaultwizard.new.directoryPickerTitle=Välj katalog
addvaultwizard.new.fileAlreadyExists=Valvet kan inte skapas på denna plats då vissa filer redan existerar.
addvaultwizard.new.locationDoesNotExist=Valvet kan inte skapas på den här platsen då åtminstone en komponent inte finns.
addvaultwizard.new.invalidName=Felaktigt namn på valvet. Vänligen ange ett vanligt katalognamn.
### Password
addvaultwizard.new.createVaultBtn=Skapa Valv


@@ 168,7 169,6 @@ main.dropZone.dropVault=Lägg till detta valv
main.dropZone.unknownDragboardContent=Om du vill lägga till ett valv, dra in det till detta fönster
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Klicka här för att lägga till valv
main.vaultlist.contextMenu.remove=Ta bort valv
main.vaultlist.addVaultBtn=Lägg till valv
## Vault Detail
### Welcome


@@ 191,6 191,8 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator kunde inte hitta ett valv i denna sökväg.
main.vaultDetail.missing.recheck=Kontrollera igen
main.vaultDetail.missing.changeLocation=Ändra valvets plats…
### Needs Migration
main.vaultDetail.migrateButton=Uppgradera valv
main.vaultDetail.migratePrompt=Ditt valv behöver uppgraderas till ett nytt format innan du kan använda det

M main/ui/src/main/resources/i18n/strings_tr.properties => main/ui/src/main/resources/i18n/strings_tr.properties +5 -1
@@ 130,6 130,7 @@ preferences.title=Seçenekler
## General
preferences.general=Genel
preferences.general.theme=Görünüş ve Davranış
preferences.general.theme.automatic=Otomatik
preferences.general.theme.light=Açık
preferences.general.theme.dark=Koyu
preferences.general.unlockThemes=Koyu modun kilidini aç


@@ 169,7 170,7 @@ main.dropZone.dropVault=Bu kasayı ekle
main.dropZone.unknownDragboardContent=Bir kasa eklemek istiyorsanız, onu bu pencereye sürükleyin
## Vault List
main.vaultlist.emptyList.onboardingInstruction=Kasa eklemek için buraya tıklayın
main.vaultlist.contextMenu.remove=Kasayı Sil
main.vaultlist.contextMenu.remove=Kasayı Sil…
main.vaultlist.addVaultBtn=Kasa Ekle
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Şifreleyici bu dosya yolunda bir kasa bulamadı.
main.vaultDetail.missing.recheck=Yeniden denetle
main.vaultDetail.missing.remove=Kasa Listesinden Sil…
main.vaultDetail.missing.changeLocation=Kasa Yerini Değiştir…
### Needs Migration
main.vaultDetail.migrateButton=Kasayı Güncelle
main.vaultDetail.migratePrompt=Kasaya erişmeden önce kasanızın yeni bir formata yükseltilmesi gerekiyor

M main/ui/src/main/resources/i18n/strings_zh.properties => main/ui/src/main/resources/i18n/strings_zh.properties +4 -2
@@ 130,13 130,14 @@ preferences.title=首选项
## General
preferences.general=常规​​​​​
preferences.general.theme=界面外观
preferences.general.theme.automatic=自动
preferences.general.theme.light=亮色
preferences.general.theme.dark=暗色
preferences.general.unlockThemes=解锁暗黑模式
preferences.general.startHidden=最小化启动 Cryptomator 到系统托盘
preferences.general.debugLogging=启用调试日志
preferences.general.debugDirectory=显示日志文件
preferences.general.autoStart=开机运行 Cryptomator
preferences.general.autoStart=开机自动启动
preferences.general.interfaceOrientation=界面方向
preferences.general.interfaceOrientation.ltr=从左到右
preferences.general.interfaceOrientation.rtl=从右到左


@@ 169,7 170,6 @@ main.dropZone.dropVault=添加此保险库
main.dropZone.unknownDragboardContent=如果您想要添加一个保险库,将其拖动到此窗口
## Vault List
main.vaultlist.emptyList.onboardingInstruction=点击此处添加一个保险库
main.vaultlist.contextMenu.remove=删除保险库
main.vaultlist.addVaultBtn=添加保险库
## Vault Detail
### Welcome


@@ 192,6 192,8 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator在此路径找不到保险库
main.vaultDetail.missing.recheck=重新检查
main.vaultDetail.missing.changeLocation=更改保险库位置…
### Needs Migration
main.vaultDetail.migrateButton=升级保险库
main.vaultDetail.migratePrompt=您的保险库需要升级到新格式,然后才能访问

M main/ui/src/main/resources/i18n/strings_zh_TW.properties => main/ui/src/main/resources/i18n/strings_zh_TW.properties +6 -2
@@ 60,7 60,7 @@ addvault.new.readme.storageLocation.6=如果您想加密檔案並檢視加密檔
addvault.new.readme.storageLocation.7=1.  把這個加密檔案庫加進 Cryptomator。
addvault.new.readme.storageLocation.8=2.  在 Cryptomator 中解鎖加密檔案庫。
addvault.new.readme.storageLocation.9=3.  按「顯示」按鈕存取資料。
addvault.new.readme.storageLocation.10=如果您需邀幫助,請參照這份文件:%s
addvault.new.readme.storageLocation.10=如果您需要幫助,請參閱這份文件:%s
addvault.new.readme.accessLocation.fileName=歡迎.rtf
addvault.new.readme.accessLocation.1=🔐️  加密磁區  🔐️
addvault.new.readme.accessLocation.2=這是您加密檔案庫的存取位置。


@@ 130,6 130,7 @@ preferences.title=偏好
## General
preferences.general=一般
preferences.general.theme=外觀
preferences.general.theme.automatic=自動
preferences.general.theme.light=亮色
preferences.general.theme.dark=暗色
preferences.general.unlockThemes=解鎖暗色模式


@@ 169,7 170,7 @@ main.dropZone.dropVault=加入這個加密檔案庫
main.dropZone.unknownDragboardContent=如果您想加入一個加密檔案庫,請將他拖到這個視窗裡
## Vault List
main.vaultlist.emptyList.onboardingInstruction=點擊此處以加入加密檔案庫
main.vaultlist.contextMenu.remove=移除加密檔案庫
main.vaultlist.contextMenu.remove=移除加密檔案庫…
main.vaultlist.addVaultBtn=新增加密檔案庫
## Vault Detail
### Welcome


@@ 192,6 193,9 @@ main.vaultDetail.throughput.kbps=%.1f kiB/s
main.vaultDetail.throughput.mbps=%.1f MiB/s
### Missing
main.vaultDetail.missing.info=Cryptomator 無法在指定位置找到加密檔案庫。
main.vaultDetail.missing.recheck=重新檢查
main.vaultDetail.missing.remove=從加密檔案庫列表中移除…
main.vaultDetail.missing.changeLocation=更改加密檔案庫位置…
### Needs Migration
main.vaultDetail.migrateButton=升級加密檔案庫
main.vaultDetail.migratePrompt=您必須先更新加密檔案庫才能存取內容

M main/ui/src/main/resources/license/THIRD-PARTY.txt => main/ui/src/main/resources/license/THIRD-PARTY.txt +23 -23
@@ 17,9 17,9 @@ Cryptomator uses 52 third-party dependencies under the following licenses:
		- jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi)
		- jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm)
		- jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants)
		- jnr-enxio (com.github.jnr:jnr-enxio:0.21 - http://github.com/jnr/jnr-enxio)
		- jnr-enxio (com.github.jnr:jnr-enxio:0.28 - http://github.com/jnr/jnr-enxio)
		- jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi)
		- jnr-unixsocket (com.github.jnr:jnr-unixsocket:0.23 - http://github.com/jnr/jnr-unixsocket)
		- jnr-unixsocket (com.github.jnr:jnr-unixsocket:0.33 - http://github.com/jnr/jnr-unixsocket)
		- FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - http://findbugs.sourceforge.net/)
		- Gson (com.google.code.gson:gson:2.8.6 - https://github.com/google/gson/gson)
		- Dagger (com.google.dagger:dagger:2.22 - https://github.com/google/dagger)


@@ 33,17 33,17 @@ Cryptomator uses 52 third-party dependencies under the following licenses:
		- javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/)
		- Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna)
		- Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna)
		- Apache Commons Lang (org.apache.commons:commons-lang3:3.10 - https://commons.apache.org/proper/commons-lang/)
		- Apache Commons Lang (org.apache.commons:commons-lang3:3.11 - https://commons.apache.org/proper/commons-lang/)
		- Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.13 - http://hc.apache.org/httpcomponents-core-ga)
		- Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.0 - http://jackrabbit.apache.org/jackrabbit-webdav/)
		- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.3 - http://jackrabbit.apache.org/jackrabbit-webdav/)
		- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty)
	BSD:
		- asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/)
		- asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/)


@@ 51,14 51,14 @@ Cryptomator uses 52 third-party dependencies under the following licenses:
		- asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/)
		- asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/)
	Eclipse Public License - Version 1.0:
		- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.28.v20200408 - http://www.eclipse.org/jetty)
		- Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty)
		- Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty)
	Eclipse Public License - v 2.0:
		- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
	GPLv2:


@@ 70,7 70,7 @@ Cryptomator uses 52 third-party dependencies under the following licenses:
		- javafx-fxml (org.openjfx:javafx-fxml:14 - https://openjdk.java.net/projects/openjfx/javafx-fxml/)
		- javafx-graphics (org.openjfx:javafx-graphics:14 - https://openjdk.java.net/projects/openjfx/javafx-graphics/)
	LGPL 2.1:
		- dbus-java (com.github.hypfvieh:dbus-java:3.2.1 - https://github.com/hypfvieh/dbus-java/dbus-java)
		- dbus-java (com.github.hypfvieh:dbus-java:3.2.3 - https://github.com/hypfvieh/dbus-java/dbus-java)
		- jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix)
		- Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna)
		- Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna)


@@ 80,11 80,11 @@ Cryptomator uses 52 third-party dependencies under the following licenses:
		- jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm)
		- jnr-fuse (com.github.serceman:jnr-fuse:0.5.4 - no url defined)
		- zxcvbn4j (com.nulab-inc:zxcvbn:1.3.0 - https://github.com/nulab/zxcvbn4j)
		- secret-service (de.swiesend:secret-service:1.0.0 - https://github.com/swiesend/secret-service)
		- secret-service (de.swiesend:secret-service:1.1.0 - https://github.com/swiesend/secret-service)
		- Checker Qual (org.checkerframework:checker-qual:2.11.1 - https://checkerframework.org)
		- SLF4J API Module (org.slf4j:slf4j-api:1.7.30 - http://www.slf4j.org)
	The BSD 2-Clause License:
		- EasyBind (org.fxmisc.easybind:easybind:1.0.3 - http://www.fxmisc.org/easybind/)
		- EasyBind (com.tobiasdiez:easybind:2.1.0 - https://github.com/tobiasdiez/EasyBind)

Cryptomator uses other third-party assets under the following licenses:
	SIL OFL 1.1 License: