diff options
| author | Mojgan <mojgan.jelodar@mullvad.net> | 2026-04-22 16:26:07 +0200 |
|---|---|---|
| committer | Mojgan <mojgan.jelodar@mullvad.net> | 2026-04-22 16:26:07 +0200 |
| commit | a9687a17a0009ff12331f99c62e18562654b4b95 (patch) | |
| tree | 26956e35bc68298b3d09cc21665454e2b10f2b40 | |
| parent | 2a608f18e0c2caa7668535464c731e65f1e9cfc2 (diff) | |
| download | mullvadvpn-implement-migration-wizard-ui-ios-1547.tar.xz mullvadvpn-implement-migration-wizard-ui-ios-1547.zip | |
Implement empty state viewimplement-migration-wizard-ui-ios-1547
14 files changed, 856 insertions, 46 deletions
diff --git a/ios/Assets/Localizable.xcstrings b/ios/Assets/Localizable.xcstrings index bd526a0ae6..8ac073efdc 100644 --- a/ios/Assets/Localizable.xcstrings +++ b/ios/Assets/Localizable.xcstrings @@ -256,6 +256,10 @@ } } }, + "“Direct only” removed" : { + "comment" : "Description of a settings update when the \"Direct only\" option is removed from the DAITA sub-setting.", + "isCommentAutoGenerated" : true + }, "**Attention: This increases network traffic and will also negatively affect speed, latency, and battery usage. Use with caution on limited plans.**" : { "localizations" : { "da" : { @@ -10744,6 +10748,7 @@ } }, "By enabling “%@” you will have to manually select a server that is %@-enabled. %@ won't automatically be used to enable DAITA with any server." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -40590,6 +40595,10 @@ } } }, + "Multihop entry set to “Automatic”" : { + "comment" : "Description of a settings update when the multihop entry setting is set to \"Automatic\".", + "isCommentAutoGenerated" : true + }, "Multihop is being used to enable DAITA for your selected location." : { "localizations" : { "da" : { @@ -40714,6 +40723,14 @@ } } }, + "Multihop is disabled. Your selected location must support all active settings in order to establish a connection." : { + "comment" : "Text displayed in the settings view when multihop is disabled.", + "isCommentAutoGenerated" : true + }, + "Multihop is enabled. Your connection is routed through an entry server before exiting through the selected location." : { + "comment" : "Description of the multihop setting when it is always enabled.", + "isCommentAutoGenerated" : true + }, "Multihop routes your traffic into one WireGuard server and out another, making it harder to trace. This results in increased latency but increases anonymity online." : { "localizations" : { "da" : { @@ -41837,6 +41854,10 @@ } } }, + "New multihop modes" : { + "comment" : "Title of a settings update descriptor for when the multihop modes have been updated.", + "isCommentAutoGenerated" : true + }, "NEW VERSION INSTALLED" : { "localizations" : { "da" : { @@ -54402,6 +54423,9 @@ } } }, + "Separate filters" : { + + }, "Serbia" : { "localizations" : { "da" : { @@ -63999,6 +64023,10 @@ } } }, + "To ensure your current settings work with your selected location, and to avoid blocking your \\connection, the app might automatically multihop via a different entry server.\nThis will be indicated by the %@ symbol." : { + "comment" : "A description of the state of multihop, including a placeholder for the symbol that indicates when multihop is active.", + "isCommentAutoGenerated" : true + }, "To help you more effectively, your app’s log file will be attached to this message. Your data will remain secure and private, as it is anonymised before being sent over an encrypted channel." : { "localizations" : { "da" : { @@ -75136,6 +75164,18 @@ } } }, + "Your multihop setting was migrated from “%@” to “%@”." : { + "comment" : "A formatted string describing a change in the multihop setting. The first argument is the string “%arg”. The second argument is the string “%arg”.", + "isCommentAutoGenerated" : true, + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Your multihop setting was migrated from “%1$@” to “%2$@”." + } + } + } + }, "Your previous purchases have already been added to this account." : { "localizations" : { "da" : { diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 425342cd1d..94bcc775f4 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -7,12 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - E10A0001000000000000AB01 /* GotaTunActor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0001000000000000AA01 /* GotaTunActor.swift */; }; - E10A0002000000000000AB01 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; - E10A0002000000000000AB02 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; - E10A0002000000000000AB03 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; - E10A0002000000000000AB04 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; - E10A0002000000000000AB05 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; 0107F40B2F5B02580012451B /* WireGuardKitTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 0107F40A2F5B02580012451B /* WireGuardKitTypes */; }; 0107F40D2F5B02840012451B /* MullvadTypes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */; }; 0107F4142F5B02D70012451B /* MullvadLogging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D223F3294C8FF00029F5F8 /* MullvadLogging.framework */; }; @@ -943,6 +937,12 @@ A9E0317F2ACC331C0095D843 /* TunnelStatusBlockObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E0317D2ACC32920095D843 /* TunnelStatusBlockObserver.swift */; }; A9E034642ABB302000E59A5A /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9E034632ABB302000E59A5A /* UIEdgeInsets+Extensions.swift */; }; A9EE85612DF1BE2900F2D769 /* TermsOfServiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9EE85602DF1BE2900F2D769 /* TermsOfServiceView.swift */; }; + E10A0001000000000000AB01 /* GotaTunActor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0001000000000000AA01 /* GotaTunActor.swift */; }; + E10A0002000000000000AB01 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; + E10A0002000000000000AB02 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; + E10A0002000000000000AB03 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; + E10A0002000000000000AB04 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; + E10A0002000000000000AB05 /* PacketTunnelDebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */; }; E1187ABC289BBB850024E748 /* OutOfTimeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */; }; E1187ABD289BBB850024E748 /* OutOfTimeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */; }; E158B360285381C60002F069 /* String+AccountFormatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = E158B35F285381C60002F069 /* String+AccountFormatting.swift */; }; @@ -974,6 +974,15 @@ F04413622BA45CE30018A6EE /* CustomListLocationNodeBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */; }; F04789ED2E3A4FEB0011E3A5 /* ApplicationLanguage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04789EB2E3A4FEB0011E3A5 /* ApplicationLanguage.swift */; }; F048BFA22D31843000251CB9 /* ChangeLogModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F048BFA12D31842B00251CB9 /* ChangeLogModel.swift */; }; + F049087E2F9275F800DEB09C /* MullvadStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F049087C2F9275F800DEB09C /* MullvadStateView.swift */; }; + F049087F2F9275F800DEB09C /* ResizableImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F049087D2F9275F800DEB09C /* ResizableImageView.swift */; }; + F04908822F976AED00DEB09C /* MultihopMigrationWizardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04908812F976AD500DEB09C /* MultihopMigrationWizardView.swift */; }; + F04908832F976AED00DEB09C /* MultihopMigrationWizardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04908812F976AD500DEB09C /* MultihopMigrationWizardView.swift */; }; + F04908852F976AFE00DEB09C /* MultihopMigrationWizardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04908842F976AF800DEB09C /* MultihopMigrationWizardViewModel.swift */; }; + F04908862F976AFE00DEB09C /* MultihopMigrationWizardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04908842F976AF800DEB09C /* MultihopMigrationWizardViewModel.swift */; }; + F04908892F97AA3800DEB09C /* PaginationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04908882F97AA3400DEB09C /* PaginationView.swift */; }; + F049088B2F97AE4C00DEB09C /* SettingsUpdateDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F049088A2F97AE4A00DEB09C /* SettingsUpdateDescriptor.swift */; }; + F049088C2F97AE4C00DEB09C /* SettingsUpdateDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F049088A2F97AE4A00DEB09C /* SettingsUpdateDescriptor.swift */; }; F04AF92D2C466013004A8314 /* EphemeralPeerNegotiationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04AF92C2C466013004A8314 /* EphemeralPeerNegotiationState.swift */; }; F050AE4E2B70D7F8003F4EDB /* LocationCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F050AE4D2B70D7F8003F4EDB /* LocationCellViewModel.swift */; }; F050AE572B7376C6003F4EDB /* CustomListRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = F050AE552B7376C5003F4EDB /* CustomListRepositoryProtocol.swift */; }; @@ -1717,8 +1726,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - E10A0001000000000000AA01 /* GotaTunActor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GotaTunActor.swift; sourceTree = "<group>"; }; - E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelDebugSettings.swift; sourceTree = "<group>"; }; 0107F3F82F56E3ED0012451B /* RelayCacheTrackerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayCacheTrackerTests.swift; sourceTree = "<group>"; }; 0107F4212F5B97F30012451B /* RelayListCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayListCacheTests.swift; sourceTree = "<group>"; }; 014E8C2F2F294FB000837D0A /* relays-test-data.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "relays-test-data.json"; sourceTree = "<group>"; }; @@ -2506,6 +2513,8 @@ A9EC20E72A5D3A8C0040D56E /* CoordinatesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatesTests.swift; sourceTree = "<group>"; }; A9EE85602DF1BE2900F2D769 /* TermsOfServiceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceView.swift; sourceTree = "<group>"; }; A9F360332AAB626300F53531 /* VPNConnectionProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VPNConnectionProtocol.swift; sourceTree = "<group>"; }; + E10A0001000000000000AA01 /* GotaTunActor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GotaTunActor.swift; sourceTree = "<group>"; }; + E10A0002000000000000AA01 /* PacketTunnelDebugSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelDebugSettings.swift; sourceTree = "<group>"; }; E1187ABA289BBB850024E748 /* OutOfTimeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeViewController.swift; sourceTree = "<group>"; }; E1187ABB289BBB850024E748 /* OutOfTimeContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutOfTimeContentView.swift; sourceTree = "<group>"; }; E158B35F285381C60002F069 /* String+AccountFormatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+AccountFormatting.swift"; sourceTree = "<group>"; }; @@ -2543,6 +2552,12 @@ F04413602BA45CD70018A6EE /* CustomListLocationNodeBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomListLocationNodeBuilder.swift; sourceTree = "<group>"; }; F04789EB2E3A4FEB0011E3A5 /* ApplicationLanguage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationLanguage.swift; sourceTree = "<group>"; }; F048BFA12D31842B00251CB9 /* ChangeLogModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeLogModel.swift; sourceTree = "<group>"; }; + F049087C2F9275F800DEB09C /* MullvadStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MullvadStateView.swift; sourceTree = "<group>"; }; + F049087D2F9275F800DEB09C /* ResizableImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResizableImageView.swift; sourceTree = "<group>"; }; + F04908812F976AD500DEB09C /* MultihopMigrationWizardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultihopMigrationWizardView.swift; sourceTree = "<group>"; }; + F04908842F976AF800DEB09C /* MultihopMigrationWizardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultihopMigrationWizardViewModel.swift; sourceTree = "<group>"; }; + F04908882F97AA3400DEB09C /* PaginationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaginationView.swift; sourceTree = "<group>"; }; + F049088A2F97AE4A00DEB09C /* SettingsUpdateDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsUpdateDescriptor.swift; sourceTree = "<group>"; }; F04AF92C2C466013004A8314 /* EphemeralPeerNegotiationState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EphemeralPeerNegotiationState.swift; sourceTree = "<group>"; }; F04DD3D72C130DF600E03E28 /* TunnelSettingsManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelSettingsManager.swift; sourceTree = "<group>"; }; F04FBE602A8379EE009278D7 /* AppPreferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreferences.swift; sourceTree = "<group>"; }; @@ -3364,6 +3379,7 @@ 583FE01629C196E8006E85F9 /* View controllers */ = { isa = PBXGroup; children = ( + F04908802F92763A00DEB09C /* MultihopMigration */, 583FE02029C1A0B1006E85F9 /* Account */, F0E8E4BF2A602C7D00ED26A3 /* AccountDeletion */, 7A2960F72A964A3500389B82 /* Alert */, @@ -3509,7 +3525,7 @@ 583FE01F29C197ED006E85F9 /* Views */ = { isa = PBXGroup; children = ( - F9394EF12DC21D7B009595EA /* List */, + F04908882F97AA3400DEB09C /* PaginationView.swift */, 7ABBE01B2F1E263100AD8176 /* ActionBox.swift */, 7A5869962B32EA4500640D27 /* AppButton.swift */, 7A0EAEA12D033D5A00D3EB8B /* BlurView.swift */, @@ -3527,6 +3543,7 @@ F03580242A13842C00E5DAFD /* IncreasedHitButton.swift */, 7A9F29382CABFAEC005F2089 /* InfoHeaderView.swift */, 7A5869942B32E9C700640D27 /* LinkButton.swift */, + F9394EF12DC21D7B009595EA /* List */, 7AA1309A2D0048D800640DF9 /* MainButton.swift */, 7A0EAE992D01B41500D3EB8B /* MainButtonStyle.swift */, F97C38E72DF025D9006DCB08 /* MullvadAlert.swift */, @@ -3536,7 +3553,9 @@ F90A988B2E1268510020F64F /* MullvadPrimaryTextField.swift */, F91CCBFB2DFAF5E1007F1925 /* MullvadProgressViewStyle.swift */, F90A988D2E13C5490020F64F /* MullvadSecondaryTextField.swift */, + F049087C2F9275F800DEB09C /* MullvadStateView.swift */, F95CDDA72EE07F7F000E9D97 /* PressedExposingButton.swift */, + F049087D2F9275F800DEB09C /* ResizableImageView.swift */, 7A8A190F2CEE3918000BCB5B /* RowSeparator.swift */, 58F19E34228C15BA00C7710B /* SpinnerActivityIndicatorView.swift */, 7AA130A02D01B1E200640DF9 /* SplitMainButton.swift */, @@ -4127,7 +4146,6 @@ 58CE5E62224146200008646E /* MullvadVPN */ = { isa = PBXGroup; children = ( - F0E560D92F7EAF580027B900 /* MultihopMigration */, 01C981E72F43C3410002D284 /* Accessibility */, 5827B0A22B0E068800CCBBA1 /* AccessMethodRepository */, 58D7E3D629C78A130044B058 /* AddressCacheUpdateScheduler */, @@ -4156,14 +4174,6 @@ path = MullvadVPN; sourceTree = "<group>"; }; - E10A0001000000000000AC01 /* GotaTunAdapter */ = { - isa = PBXGroup; - children = ( - E10A0001000000000000AA01 /* GotaTunActor.swift */, - ); - path = GotaTunAdapter; - sourceTree = "<group>"; - }; 58CE5E7A224146470008646E /* PacketTunnel */ = { isa = PBXGroup; children = ( @@ -4819,6 +4829,14 @@ path = MullvadRustRuntimeTests; sourceTree = "<group>"; }; + E10A0001000000000000AC01 /* GotaTunAdapter */ = { + isa = PBXGroup; + children = ( + E10A0001000000000000AA01 /* GotaTunActor.swift */, + ); + path = GotaTunAdapter; + sourceTree = "<group>"; + }; F028A5472A336E1900C0CAA3 /* RedeemVoucher */ = { isa = PBXGroup; children = ( @@ -4833,6 +4851,17 @@ path = RedeemVoucher; sourceTree = "<group>"; }; + F04908802F92763A00DEB09C /* MultihopMigration */ = { + isa = PBXGroup; + children = ( + F0E560D72F7D43D20027B900 /* MultihopMigrationTracker.swift */, + F04908812F976AD500DEB09C /* MultihopMigrationWizardView.swift */, + F04908842F976AF800DEB09C /* MultihopMigrationWizardViewModel.swift */, + F049088A2F97AE4A00DEB09C /* SettingsUpdateDescriptor.swift */, + ); + path = MultihopMigration; + sourceTree = "<group>"; + }; F059197A2C45404500C301F3 /* PostQuantum */ = { isa = PBXGroup; children = ( @@ -5024,14 +5053,6 @@ path = Welcome; sourceTree = "<group>"; }; - F0E560D92F7EAF580027B900 /* MultihopMigration */ = { - isa = PBXGroup; - children = ( - F0E560D72F7D43D20027B900 /* MultihopMigrationTracker.swift */, - ); - path = MultihopMigration; - sourceTree = "<group>"; - }; F0E8CC082A4EE0DC007ED3B4 /* Completed */ = { isa = PBXGroup; children = ( @@ -6183,6 +6204,7 @@ F97C38DF2DEEDB0F006DCB08 /* Color+Mullvad.swift in Sources */, F0AC644D2F3B52F60024427C /* NotificationSettings.swift in Sources */, A9A5FA3A2ACB05910083449F /* UIEdgeInsets+Extensions.swift in Sources */, + F049088B2F97AE4C00DEB09C /* SettingsUpdateDescriptor.swift in Sources */, A9A5FA3B2ACB05910083449F /* UIMetrics.swift in Sources */, 7A9246AB2EB0C765008FE31A /* StorePaymentManagerInteractor.swift in Sources */, 58B07C182AEFDD6C00A09625 /* StoreTransactionLog.swift in Sources */, @@ -6210,6 +6232,7 @@ F9EDB26C2EC4C0480015DE36 /* CustomListInteractorTests.swift in Sources */, A9A5F9F02ACB05160083449F /* String+Search.swift in Sources */, F0E560DD2F865F280027B900 /* MultihopMigrationTracker.swift in Sources */, + F04908862F976AFE00DEB09C /* MultihopMigrationWizardViewModel.swift in Sources */, F09D04C12AF39EA2003D4F89 /* OutgoingConnectionService.swift in Sources */, 7A460FA02F35D05A005A265D /* NewAppVersionInAppNotificationProvider.swift in Sources */, F0FA16152D7F3E16007E2546 /* Collection+Sorting.swift in Sources */, @@ -6294,6 +6317,7 @@ A9A5FA222ACB05160083449F /* TunnelObserver.swift in Sources */, A988A3E22AFE54AC0008D2C7 /* AccountExpiry.swift in Sources */, A9E0317F2ACC331C0095D843 /* TunnelStatusBlockObserver.swift in Sources */, + F04908832F976AED00DEB09C /* MultihopMigrationWizardView.swift in Sources */, 7A9BE5A62B90762F00E2A7D0 /* CustomListsDataSource.swift in Sources */, F09D04C02AF39D63003D4F89 /* OutgoingConnectionServiceTests.swift in Sources */, 7A9BE5A22B8F88C500E2A7D0 /* LocationNodeTests.swift in Sources */, @@ -6527,6 +6551,8 @@ 7AB2B6702BA1EB8C00B03E3B /* ListCustomListViewController.swift in Sources */, 7A9CCCB72A96302800DD6A34 /* RevokedCoordinator.swift in Sources */, 7AD03E1F2E8EB49700270EAE /* RevokedDeviceViewModel.swift in Sources */, + F049087E2F9275F800DEB09C /* MullvadStateView.swift in Sources */, + F049087F2F9275F800DEB09C /* ResizableImageView.swift in Sources */, 7A6389F82B864CDF008E77E1 /* LocationNode.swift in Sources */, 7A8A19142CEF2548000BCB5B /* DAITATunnelSettingsViewModel.swift in Sources */, F0F266692EB3B71A00AAD7DA /* RelayLocationList.swift in Sources */, @@ -6583,6 +6609,7 @@ 7A27E3CB2CAE861D0088BCFF /* SettingsViewModel.swift in Sources */, 588527B2276B3F0700BAA373 /* LoadTunnelConfigurationOperation.swift in Sources */, 7A9F29392CABFAFC005F2089 /* InfoHeaderView.swift in Sources */, + F049088C2F97AE4C00DEB09C /* SettingsUpdateDescriptor.swift in Sources */, 58DFF7D22B0256A300F864E0 /* MarkdownStylingOptions.swift in Sources */, 5867770E29096984006F721F /* OutOfTimeInteractor.swift in Sources */, 7ABBE01C2F1E263400AD8176 /* ActionBox.swift in Sources */, @@ -6694,6 +6721,7 @@ 7AA130A12D01B1E200640DF9 /* SplitMainButton.swift in Sources */, F97C38E82DF025D9006DCB08 /* MullvadAlert.swift in Sources */, 7AA1309F2D007B2500640DF9 /* VisualEffectView.swift in Sources */, + F04908892F97AA3800DEB09C /* PaginationView.swift in Sources */, 7A0C0F632A979C4A0058EFCE /* Coordinator+Router.swift in Sources */, 7A6F2FAB2AFD3097006D0856 /* CustomDNSCellFactory.swift in Sources */, 7A6000FE2B628E9F001CF0D9 /* ListCellContentView.swift in Sources */, @@ -6759,6 +6787,7 @@ 7A6F2FA72AFBB9AE006D0856 /* AccountExpiry.swift in Sources */, 5819C2172729595500D6EC38 /* SettingsAddDNSEntryCell.swift in Sources */, F95CDDA42EE03072000E9D97 /* LineOverlayView.swift in Sources */, + F04908852F976AFE00DEB09C /* MultihopMigrationWizardViewModel.swift in Sources */, 7A81C3F42F6C1F0B008D7ADC /* SettingsNavigationRoute.swift in Sources */, 7A1A26452A29CEF700B978AA /* RelayFilterViewController.swift in Sources */, F947DA002ED5AC9200C9D728 /* CGRect+Properties.swift in Sources */, @@ -6885,6 +6914,7 @@ 58B9EB152489139B00095626 /* RESTError+Display.swift in Sources */, 587B753F2668E5A700DEF7E9 /* NotificationContainerView.swift in Sources */, 58F2E144276A13F300A79513 /* StartTunnelOperation.swift in Sources */, + F04908822F976AED00DEB09C /* MultihopMigrationWizardView.swift in Sources */, F95CDDA82EE07F7F000E9D97 /* PressedExposingButton.swift in Sources */, 58CCA01E2242787B004F3011 /* AccountTextField.swift in Sources */, 586E54FB27A2DF6D0029B88B /* SendTunnelProviderMessageOperation.swift in Sources */, diff --git a/ios/MullvadVPN/Extensions/Image+Assets.swift b/ios/MullvadVPN/Extensions/Image+Assets.swift index 910bee2e6b..31b70b3acf 100644 --- a/ios/MullvadVPN/Extensions/Image+Assets.swift +++ b/ios/MullvadVPN/Extensions/Image+Assets.swift @@ -32,4 +32,7 @@ extension Image { static let mullvadIconEnableRecents = Image("IconEnableRecents") static let mullvadIconDisableRecents = Image("IconDisableRecents") static let mullvadIconFilter = Image("IconFilter") + + static let mullvadAutomaticMultihopBanner = Image("AutomaticMultihopBanner") + static let mullvadUniqueFilterBanner = Image("UniqueFilterBanner") } diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/AutomaticMultihopBanner.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/AutomaticMultihopBanner.svg new file mode 100644 index 0000000000..3599c89e3e --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/AutomaticMultihopBanner.svg @@ -0,0 +1,82 @@ +<svg width="288" height="91" viewBox="0 0 288 91" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_8016_4576)"> +<path d="M0 12C0 5.37258 5.37258 0 12 0H276C282.627 0 288 5.37258 288 12V79C288 85.6274 282.627 91 276 91H12C5.37259 91 0 85.6274 0 79V12Z" fill="#192638"/> +<path d="M29.3711 16.166L28.6582 14.1836H25.9287L25.2305 16.166H24L26.6709 8.99805H27.9404L30.6113 16.166H29.3711ZM28.3506 13.1777L27.6816 11.2344C27.6328 11.1042 27.5645 10.8991 27.4766 10.6191C27.3919 10.3392 27.3333 10.1341 27.3008 10.0039C27.2129 10.4043 27.0843 10.8421 26.915 11.3174L26.2705 13.1777H28.3506ZM32.5791 16.166H31.4316V8.56836H32.5791V16.166ZM35.3721 16.166H34.2246V8.56836H35.3721V16.166ZM40.7627 16.166H39.6152V8.56836H40.7627V16.166ZM47.1982 13.4561C47.1982 14.3382 46.972 15.0267 46.5195 15.5215C46.0671 16.0163 45.4372 16.2637 44.6299 16.2637C44.1253 16.2637 43.6794 16.1497 43.292 15.9219C42.9046 15.694 42.6068 15.3669 42.3984 14.9404C42.1901 14.514 42.0859 14.0192 42.0859 13.4561C42.0859 12.5804 42.3105 11.8968 42.7598 11.4053C43.209 10.9137 43.8421 10.668 44.6592 10.668C45.4404 10.668 46.0589 10.9202 46.5146 11.4248C46.9704 11.9261 47.1982 12.6032 47.1982 13.4561ZM43.2676 13.4561C43.2676 14.7028 43.7282 15.3262 44.6494 15.3262C45.5609 15.3262 46.0166 14.7028 46.0166 13.4561C46.0166 12.2223 45.5576 11.6055 44.6396 11.6055C44.1579 11.6055 43.8079 11.765 43.5898 12.084C43.375 12.403 43.2676 12.8604 43.2676 13.4561ZM50.6992 16.2637C49.8822 16.2637 49.2604 16.026 48.834 15.5508C48.4108 15.0723 48.1992 14.387 48.1992 13.4951C48.1992 12.5869 48.4206 11.8887 48.8633 11.4004C49.3092 10.9121 49.9521 10.668 50.792 10.668C51.3617 10.668 51.8743 10.7738 52.3301 10.9854L51.9834 11.9082C51.4984 11.7194 51.098 11.625 50.7822 11.625C49.848 11.625 49.3809 12.2451 49.3809 13.4854C49.3809 14.0908 49.4964 14.5465 49.7275 14.8525C49.9619 15.1553 50.3037 15.3066 50.7529 15.3066C51.264 15.3066 51.7474 15.1797 52.2031 14.9258V15.9268C51.998 16.0472 51.7783 16.1335 51.5439 16.1855C51.3128 16.2376 51.0312 16.2637 50.6992 16.2637ZM56.8516 16.166L56.6221 15.4141H56.583C56.3226 15.7428 56.0605 15.9674 55.7969 16.0879C55.5332 16.2051 55.1947 16.2637 54.7812 16.2637C54.2507 16.2637 53.8356 16.1204 53.5361 15.834C53.2399 15.5475 53.0918 15.1423 53.0918 14.6182C53.0918 14.0615 53.2985 13.6416 53.7119 13.3584C54.1253 13.0752 54.7552 12.9206 55.6016 12.8945L56.5342 12.8652V12.5771C56.5342 12.2321 56.4528 11.9749 56.29 11.8057C56.1305 11.6331 55.8815 11.5469 55.543 11.5469C55.2663 11.5469 55.001 11.5876 54.7471 11.6689C54.4932 11.7503 54.249 11.8464 54.0146 11.957L53.6436 11.1367C53.9365 10.9837 54.2572 10.8682 54.6055 10.79C54.9538 10.7087 55.2826 10.668 55.5918 10.668C56.2786 10.668 56.7962 10.8177 57.1445 11.1172C57.4961 11.4167 57.6719 11.887 57.6719 12.5283V16.166H56.8516ZM55.1426 15.3848C55.5592 15.3848 55.8929 15.2692 56.1436 15.0381C56.3975 14.8037 56.5244 14.4766 56.5244 14.0566V13.5879L55.8311 13.6172C55.2907 13.6367 54.8968 13.7279 54.6494 13.8906C54.4053 14.0501 54.2832 14.2959 54.2832 14.6279C54.2832 14.8688 54.3548 15.056 54.498 15.1895C54.6413 15.3197 54.8561 15.3848 55.1426 15.3848ZM61.2852 15.3359C61.5651 15.3359 61.8451 15.292 62.125 15.2041V16.0684C61.998 16.1237 61.8337 16.1693 61.6318 16.2051C61.4333 16.2441 61.2266 16.2637 61.0117 16.2637C59.9245 16.2637 59.3809 15.6908 59.3809 14.5449V11.6348H58.6436V11.127L59.4346 10.707L59.8252 9.56445H60.5332V10.7656H62.0713V11.6348H60.5332V14.5254C60.5332 14.8021 60.6016 15.0072 60.7383 15.1406C60.8783 15.2708 61.0605 15.3359 61.2852 15.3359ZM64.3564 16.166H63.209V10.7656H64.3564V16.166ZM63.1406 9.33496C63.1406 9.12988 63.196 8.97201 63.3066 8.86133C63.4206 8.75065 63.5817 8.69531 63.79 8.69531C63.9919 8.69531 64.1481 8.75065 64.2588 8.86133C64.3727 8.97201 64.4297 9.12988 64.4297 9.33496C64.4297 9.53027 64.3727 9.6849 64.2588 9.79883C64.1481 9.90951 63.9919 9.96484 63.79 9.96484C63.5817 9.96484 63.4206 9.90951 63.3066 9.79883C63.196 9.6849 63.1406 9.53027 63.1406 9.33496ZM70.792 13.4561C70.792 14.3382 70.5658 15.0267 70.1133 15.5215C69.6608 16.0163 69.0309 16.2637 68.2236 16.2637C67.7191 16.2637 67.2731 16.1497 66.8857 15.9219C66.4984 15.694 66.2005 15.3669 65.9922 14.9404C65.7839 14.514 65.6797 14.0192 65.6797 13.4561C65.6797 12.5804 65.9043 11.8968 66.3535 11.4053C66.8027 10.9137 67.4359 10.668 68.2529 10.668C69.0342 10.668 69.6527 10.9202 70.1084 11.4248C70.5641 11.9261 70.792 12.6032 70.792 13.4561ZM66.8613 13.4561C66.8613 14.7028 67.3219 15.3262 68.2432 15.3262C69.1546 15.3262 69.6104 14.7028 69.6104 13.4561C69.6104 12.2223 69.1514 11.6055 68.2334 11.6055C67.7516 11.6055 67.4017 11.765 67.1836 12.084C66.9688 12.403 66.8613 12.8604 66.8613 13.4561ZM76.8662 16.166H75.7139V12.8457C75.7139 12.429 75.6292 12.1182 75.46 11.9131C75.2939 11.708 75.0286 11.6055 74.6641 11.6055C74.179 11.6055 73.8242 11.7487 73.5996 12.0352C73.375 12.3216 73.2627 12.8018 73.2627 13.4756V16.166H72.1152V10.7656H73.0137L73.1748 11.4736H73.2334C73.3962 11.2165 73.6273 11.0179 73.9268 10.8779C74.2262 10.738 74.5583 10.668 74.9229 10.668C76.2184 10.668 76.8662 11.3271 76.8662 12.6455V16.166ZM82.0908 14.6279C82.0908 15.1553 81.8988 15.5605 81.5146 15.8438C81.1305 16.1237 80.5804 16.2637 79.8643 16.2637C79.1449 16.2637 78.5671 16.1546 78.1309 15.9365V14.9453C78.7656 15.2383 79.3564 15.3848 79.9033 15.3848C80.6097 15.3848 80.9629 15.1715 80.9629 14.7451C80.9629 14.6084 80.9238 14.4945 80.8457 14.4033C80.7676 14.3122 80.639 14.2178 80.46 14.1201C80.2809 14.0225 80.0319 13.9118 79.7129 13.7881C79.0911 13.5472 78.6696 13.3063 78.4482 13.0654C78.2301 12.8245 78.1211 12.512 78.1211 12.1279C78.1211 11.6657 78.3066 11.3076 78.6777 11.0537C79.0521 10.7965 79.5599 10.668 80.2012 10.668C80.8359 10.668 81.4365 10.7965 82.0029 11.0537L81.6318 11.918C81.0492 11.6771 80.5592 11.5566 80.1621 11.5566C79.5566 11.5566 79.2539 11.7292 79.2539 12.0742C79.2539 12.2435 79.332 12.3867 79.4883 12.5039C79.6478 12.6211 79.9928 12.7822 80.5234 12.9873C80.9694 13.1598 81.2933 13.3177 81.4951 13.4609C81.6969 13.6042 81.8467 13.7702 81.9443 13.959C82.042 14.1445 82.0908 14.3675 82.0908 14.6279Z" fill="white"/> +<path d="M264.001 12.249L264.001 13.0823L89.668 13.0824L89.668 12.249L264.001 12.249Z" fill="white" fill-opacity="0.2"/> +<g clip-path="url(#clip1_8016_4576)"> +<g clip-path="url(#clip2_8016_4576)"> +<g clip-path="url(#clip3_8016_4576)"> +<rect width="198.333" height="40" transform="translate(24 25.999)" fill="#294D73"/> +<path d="M66.9303 43.999L66.0986 41.6862H62.9142L62.0996 43.999H60.6641L63.7801 35.6364H65.2612L68.3773 43.999H66.9303ZM65.7397 40.5127L64.9593 38.2454C64.9023 38.0935 64.8226 37.8543 64.7201 37.5277C64.6213 37.2011 64.553 36.9618 64.515 36.8099C64.4124 37.277 64.2624 37.7878 64.0649 38.3423L63.313 40.5127H65.7397ZM73.7777 43.999L73.5897 43.173H73.5213C73.3352 43.4654 73.0694 43.6952 72.7238 43.8623C72.382 44.0294 71.9908 44.113 71.5503 44.113C70.7869 44.113 70.2173 43.9231 69.8413 43.5433C69.4653 43.1635 69.2773 42.5882 69.2773 41.8172V37.6986H70.6274V41.5837C70.6274 42.066 70.7262 42.4287 70.9237 42.6717C71.1211 42.911 71.4307 43.0306 71.8522 43.0306C72.4143 43.0306 72.8263 42.8635 73.0884 42.5293C73.3542 42.1913 73.4871 41.6273 73.4871 40.8374V37.6986H74.8315V43.999H73.7777ZM79.0869 43.0306C79.4135 43.0306 79.7401 42.9793 80.0667 42.8768V43.8851C79.9186 43.9497 79.7268 44.0028 79.4914 44.0446C79.2597 44.0902 79.0186 44.113 78.7679 44.113C77.4995 44.113 76.8652 43.4446 76.8652 42.1077V38.7126H76.005V38.1201L76.9279 37.6302L77.3836 36.2972H78.2096V37.6986H80.0041V38.7126H78.2096V42.085C78.2096 42.4078 78.2894 42.647 78.4489 42.8027C78.6122 42.9546 78.8249 43.0306 79.0869 43.0306ZM86.9198 40.8374C86.9198 41.8666 86.6558 42.6698 86.1279 43.2471C85.6 43.8243 84.8652 44.113 83.9233 44.113C83.3347 44.113 82.8144 43.98 82.3625 43.7142C81.9105 43.4484 81.563 43.0667 81.32 42.5692C81.0769 42.0717 80.9554 41.4944 80.9554 40.8374C80.9554 39.8158 81.2174 39.0183 81.7415 38.4448C82.2656 37.8714 83.0043 37.5846 83.9575 37.5846C84.869 37.5846 85.5905 37.879 86.1222 38.4676C86.6539 39.0525 86.9198 39.8424 86.9198 40.8374ZM82.334 40.8374C82.334 42.2919 82.8714 43.0192 83.9461 43.0192C85.0095 43.0192 85.5412 42.2919 85.5412 40.8374C85.5412 39.3981 85.0057 38.6784 83.9347 38.6784C83.3727 38.6784 82.9644 38.8645 82.71 39.2367C82.4593 39.6088 82.334 40.1424 82.334 40.8374ZM93.7728 43.999H92.4284V40.1139C92.4284 39.6316 92.3372 39.2727 92.1549 39.0373C91.9727 38.798 91.6878 38.6784 91.3005 38.6784C90.784 38.6784 90.4042 38.8474 90.1611 39.1854C89.9219 39.5196 89.8022 40.0779 89.8022 40.8602V43.999H88.4635V37.6986H89.5117L89.6997 38.5246H89.7681C89.9428 38.2246 90.1953 37.9929 90.5257 37.8296C90.8599 37.6663 91.2264 37.5846 91.6252 37.5846C92.5936 37.5846 93.2354 37.915 93.5506 38.5758H93.6418C93.8279 38.2644 94.0899 38.0214 94.4279 37.8467C94.7659 37.672 95.1533 37.5846 95.59 37.5846C96.342 37.5846 96.8888 37.7745 97.2306 38.1543C97.5762 38.5341 97.749 39.1132 97.749 39.8918V43.999H96.4103V40.1139C96.4103 39.6316 96.3173 39.2727 96.1312 39.0373C95.9489 38.798 95.6641 38.6784 95.2767 38.6784C94.7564 38.6784 94.3747 38.8417 94.1317 39.1683C93.8924 39.4911 93.7728 39.9886 93.7728 40.6608V43.999ZM103.56 43.999L103.292 43.1217H103.246C102.942 43.5053 102.637 43.7674 102.329 43.9079C102.021 44.0446 101.627 44.113 101.144 44.113C100.525 44.113 100.041 43.9459 99.6916 43.6117C99.346 43.2775 99.1732 42.8046 99.1732 42.1932C99.1732 41.5438 99.4143 41.0539 99.8966 40.7235C100.379 40.3931 101.114 40.2127 102.101 40.1823L103.189 40.1481V39.812C103.189 39.4095 103.094 39.1094 102.904 38.9119C102.718 38.7107 102.428 38.61 102.033 38.61C101.71 38.61 101.401 38.6575 101.104 38.7524C100.808 38.8474 100.523 38.9594 100.25 39.0885L99.8169 38.1315C100.159 37.953 100.533 37.8182 100.939 37.7271C101.345 37.6321 101.729 37.5846 102.09 37.5846C102.891 37.5846 103.495 37.7593 103.901 38.1087C104.312 38.4581 104.517 39.0069 104.517 39.755V43.999H103.56ZM101.566 43.0876C102.052 43.0876 102.441 42.9527 102.734 42.6831C103.03 42.4097 103.178 42.028 103.178 41.5381V40.9912L102.369 41.0254C101.739 41.0482 101.279 41.1545 100.99 41.3444C100.706 41.5305 100.563 41.8172 100.563 42.2046C100.563 42.4856 100.647 42.704 100.814 42.8597C100.981 43.0116 101.232 43.0876 101.566 43.0876ZM108.732 43.0306C109.059 43.0306 109.385 42.9793 109.712 42.8768V43.8851C109.564 43.9497 109.372 44.0028 109.137 44.0446C108.905 44.0902 108.664 44.113 108.413 44.113C107.145 44.113 106.51 43.4446 106.51 42.1077V38.7126H105.65V38.1201L106.573 37.6302L107.029 36.2972H107.855V37.6986H109.649V38.7126H107.855V42.085C107.855 42.4078 107.935 42.647 108.094 42.8027C108.257 42.9546 108.47 43.0306 108.732 43.0306ZM112.315 43.999H110.977V37.6986H112.315V43.999ZM110.897 36.0295C110.897 35.7902 110.961 35.606 111.09 35.4769C111.223 35.3478 111.411 35.2832 111.654 35.2832C111.89 35.2832 112.072 35.3478 112.201 35.4769C112.334 35.606 112.401 35.7902 112.401 36.0295C112.401 36.2573 112.334 36.4377 112.201 36.5706C112.072 36.6998 111.89 36.7643 111.654 36.7643C111.411 36.7643 111.223 36.6998 111.09 36.5706C110.961 36.4377 110.897 36.2573 110.897 36.0295ZM116.776 44.113C115.822 44.113 115.097 43.8357 114.6 43.2813C114.106 42.723 113.859 41.9236 113.859 40.883C113.859 39.8234 114.117 39.0088 114.634 38.4391C115.154 37.8695 115.904 37.5846 116.884 37.5846C117.549 37.5846 118.147 37.7081 118.678 37.9549L118.274 39.0316C117.708 38.8113 117.241 38.7012 116.873 38.7012C115.783 38.7012 115.238 39.4246 115.238 40.8716C115.238 41.578 115.372 42.1096 115.642 42.4666C115.916 42.8198 116.314 42.9964 116.838 42.9964C117.435 42.9964 117.999 42.8483 118.53 42.5521V43.7199C118.291 43.8604 118.035 43.961 117.761 44.0218C117.492 44.0826 117.163 44.113 116.776 44.113Z" fill="#44AD4D"/> +<path d="M66.4054 56.999H65.2132L62.2876 52.2586H62.255L62.2754 52.5231C62.3134 53.0277 62.3324 53.4888 62.3324 53.9066V56.999H61.4494V51.0501H62.6294L65.5469 55.7661H65.5713C65.5659 55.7037 65.555 55.4772 65.5387 55.0866C65.5225 54.6933 65.5143 54.3867 65.5143 54.167V51.0501H66.4054V56.999ZM71.866 54.7407C71.866 55.4759 71.6775 56.0496 71.3005 56.4619C70.9234 56.8742 70.3985 57.0804 69.7257 57.0804C69.3053 57.0804 68.9336 56.9855 68.6108 56.7956C68.288 56.6057 68.0398 56.3331 67.8662 55.9777C67.6926 55.6223 67.6058 55.21 67.6058 54.7407C67.6058 54.011 67.793 53.4414 68.1673 53.0317C68.5417 52.6221 69.0693 52.4173 69.7502 52.4173C70.4012 52.4173 70.9166 52.6276 71.2964 53.048C71.6762 53.4658 71.866 54.03 71.866 54.7407ZM68.5905 54.7407C68.5905 55.7797 68.9743 56.2992 69.742 56.2992C70.5016 56.2992 70.8813 55.7797 70.8813 54.7407C70.8813 53.7126 70.4989 53.1986 69.7339 53.1986C69.3324 53.1986 69.0408 53.3315 68.859 53.5973C68.68 53.8632 68.5905 54.2443 68.5905 54.7407ZM75.2515 52.4173C75.4441 52.4173 75.6028 52.4309 75.7275 52.458L75.634 53.3491C75.4983 53.3166 75.3573 53.3003 75.2108 53.3003C74.8283 53.3003 74.5177 53.4251 74.279 53.6746C74.043 53.9242 73.925 54.2484 73.925 54.6471V56.999H72.9687V52.4987H73.7174L73.8436 53.2922H73.8924C74.0416 53.0236 74.2356 52.8107 74.4743 52.6533C74.7157 52.496 74.9748 52.4173 75.2515 52.4173ZM80.2563 56.999L79.6745 54.8994C79.6039 54.677 79.4765 54.1602 79.292 53.3491H79.2554C79.098 54.0815 78.9733 54.601 78.881 54.9076L78.2829 56.999H77.2249L75.9635 52.4987H76.9401L77.5138 54.7163C77.644 55.2643 77.7363 55.7336 77.7905 56.1242H77.8149C77.8421 55.9262 77.8828 55.6997 77.937 55.4447C77.994 55.187 78.0428 54.9944 78.0835 54.8669L78.7671 52.4987H79.8169L80.4801 54.8669C80.5208 54.9998 80.571 55.2032 80.6307 55.4772C80.6931 55.7512 80.7297 55.9641 80.7406 56.116H80.7731C80.8138 55.7824 80.9087 55.3158 81.0579 54.7163L81.6398 52.4987H82.6001L81.3306 56.999H80.2563ZM86.193 56.999L86.0018 56.3724H85.9692C85.7522 56.6464 85.5339 56.8336 85.3141 56.9339C85.0944 57.0316 84.8123 57.0804 84.4678 57.0804C84.0256 57.0804 83.6797 56.961 83.4302 56.7223C83.1833 56.4836 83.0599 56.1459 83.0599 55.7091C83.0599 55.2453 83.2321 54.8953 83.5767 54.6593C83.9212 54.4233 84.4461 54.2945 85.1514 54.2728L85.9285 54.2484V54.0083C85.9285 53.7208 85.8607 53.5065 85.7251 53.3654C85.5922 53.2216 85.3847 53.1497 85.1025 53.1497C84.872 53.1497 84.6509 53.1836 84.4393 53.2515C84.2277 53.3193 84.0242 53.3993 83.8289 53.4915L83.5197 52.8079C83.7638 52.6804 84.031 52.5841 84.3213 52.519C84.6115 52.4512 84.8855 52.4173 85.1432 52.4173C85.7156 52.4173 86.1469 52.5421 86.4372 52.7917C86.7301 53.0412 86.8766 53.4332 86.8766 53.9676V56.999H86.193ZM84.7689 56.348C85.1161 56.348 85.3942 56.2517 85.603 56.0591C85.8146 55.8638 85.9204 55.5911 85.9204 55.2412V54.8506L85.3426 54.875C84.8923 54.8913 84.5641 54.9672 84.3579 55.1029C84.1545 55.2358 84.0527 55.4406 84.0527 55.7173C84.0527 55.918 84.1124 56.074 84.2318 56.1852C84.3511 56.2937 84.5302 56.348 84.7689 56.348ZM87.5277 52.4987H88.5693L89.4849 55.05C89.6232 55.4135 89.7154 55.7553 89.7616 56.0754H89.7941C89.8185 55.9262 89.8633 55.7458 89.9284 55.5342C89.9935 55.3199 90.338 54.3081 90.9619 52.4987H91.9954L90.0708 57.5972C89.7209 58.533 89.1376 59.001 88.3211 59.001C88.1095 59.001 87.9034 58.9779 87.7026 58.9318V58.175C87.8464 58.2075 88.0105 58.2238 88.195 58.2238C88.6561 58.2238 88.9803 57.9566 89.1675 57.4222L89.3343 56.999L87.5277 52.4987ZM93.6719 56.1242C93.5417 56.6287 93.303 57.2784 92.9557 58.0732H92.2518C92.439 57.3408 92.5787 56.6599 92.6709 56.0306H93.6108L93.6719 56.1242ZM100.605 55.3836C100.605 55.9126 100.414 56.3276 100.032 56.6287C99.6492 56.9299 99.1216 57.0804 98.4489 57.0804C97.7761 57.0804 97.2255 56.976 96.7969 56.7671V55.8475C97.0681 55.975 97.3557 56.0754 97.6595 56.1486C97.966 56.2218 98.2509 56.2585 98.514 56.2585C98.8992 56.2585 99.1827 56.1852 99.3644 56.0387C99.5489 55.8923 99.6411 55.6956 99.6411 55.4487C99.6411 55.2263 99.557 55.0378 99.3888 54.8831C99.2206 54.7285 98.8734 54.5454 98.3472 54.3338C97.8046 54.1141 97.4221 53.8632 97.1997 53.5811C96.9773 53.2989 96.866 52.9599 96.866 52.5638C96.866 52.0674 97.0424 51.6768 97.395 51.3919C97.7477 51.1071 98.221 50.9647 98.8151 50.9647C99.3848 50.9647 99.9517 51.0895 100.516 51.339L100.207 52.1325C99.6777 51.91 99.2057 51.7988 98.7907 51.7988C98.476 51.7988 98.2373 51.868 98.0745 52.0063C97.9118 52.142 97.8304 52.3224 97.8304 52.5475C97.8304 52.7021 97.863 52.8351 97.9281 52.9463C97.9932 53.0548 98.1003 53.1579 98.2495 53.2555C98.3987 53.3532 98.6673 53.482 99.0552 53.6421C99.4919 53.8238 99.812 53.9934 100.015 54.1507C100.219 54.3081 100.368 54.4857 100.463 54.6838C100.558 54.8818 100.605 55.1151 100.605 55.3836ZM103.332 56.3073C103.565 56.3073 103.798 56.2707 104.032 56.1974V56.9176C103.926 56.9638 103.789 57.0017 103.621 57.0316C103.455 57.0641 103.283 57.0804 103.104 57.0804C102.198 57.0804 101.745 56.603 101.745 55.6481V53.223H101.13V52.7998L101.79 52.4499L102.115 51.4977H102.705V52.4987H103.987V53.223H102.705V55.6318C102.705 55.8624 102.762 56.0333 102.876 56.1445C102.993 56.253 103.145 56.3073 103.332 56.3073ZM107.751 56.999L107.559 56.3724H107.527C107.31 56.6464 107.091 56.8336 106.872 56.9339C106.652 57.0316 106.37 57.0804 106.025 57.0804C105.583 57.0804 105.237 56.961 104.988 56.7223C104.741 56.4836 104.618 56.1459 104.618 55.7091C104.618 55.2453 104.79 54.8953 105.134 54.6593C105.479 54.4233 106.004 54.2945 106.709 54.2728L107.486 54.2484V54.0083C107.486 53.7208 107.418 53.5065 107.283 53.3654C107.15 53.2216 106.942 53.1497 106.66 53.1497C106.43 53.1497 106.208 53.1836 105.997 53.2515C105.785 53.3193 105.582 53.3993 105.387 53.4915L105.077 52.8079C105.321 52.6804 105.589 52.5841 105.879 52.519C106.169 52.4512 106.443 52.4173 106.701 52.4173C107.273 52.4173 107.705 52.5421 107.995 52.7917C108.288 53.0412 108.434 53.4332 108.434 53.9676V56.999H107.751ZM106.326 56.348C106.674 56.348 106.952 56.2517 107.161 56.0591C107.372 55.8638 107.478 55.5911 107.478 55.2412V54.8506L106.9 54.875C106.45 54.8913 106.122 54.9672 105.916 55.1029C105.712 55.2358 105.61 55.4406 105.61 55.7173C105.61 55.918 105.67 56.074 105.789 56.1852C105.909 56.2937 106.088 56.348 106.326 56.348ZM110.794 56.999L109.085 52.4987H110.094L111.01 55.1151C111.167 55.5545 111.262 55.9099 111.295 56.1812H111.327C111.352 55.9858 111.447 55.6305 111.612 55.1151L112.528 52.4987H113.545L111.828 56.999H110.794ZM117.044 56.999L116.853 56.3724H116.82C116.603 56.6464 116.385 56.8336 116.165 56.9339C115.946 57.0316 115.664 57.0804 115.319 57.0804C114.877 57.0804 114.531 56.961 114.281 56.7223C114.035 56.4836 113.911 56.1459 113.911 55.7091C113.911 55.2453 114.083 54.8953 114.428 54.6593C114.772 54.4233 115.297 54.2945 116.003 54.2728L116.78 54.2484V54.0083C116.78 53.7208 116.712 53.5065 116.576 53.3654C116.443 53.2216 116.236 53.1497 115.954 53.1497C115.723 53.1497 115.502 53.1836 115.291 53.2515C115.079 53.3193 114.875 53.3993 114.68 53.4915L114.371 52.8079C114.615 52.6804 114.882 52.5841 115.173 52.519C115.463 52.4512 115.737 52.4173 115.994 52.4173C116.567 52.4173 116.998 52.5421 117.288 52.7917C117.581 53.0412 117.728 53.4332 117.728 53.9676V56.999H117.044ZM115.62 56.348C115.967 56.348 116.245 56.2517 116.454 56.0591C116.666 55.8638 116.772 55.5911 116.772 55.2412V54.8506L116.194 54.875C115.744 54.8913 115.415 54.9672 115.209 55.1029C115.006 55.2358 114.904 55.4406 114.904 55.7173C114.904 55.918 114.964 56.074 115.083 56.1852C115.202 56.2937 115.381 56.348 115.62 56.348ZM123.022 56.999H122.061V54.2321C122.061 53.8849 121.991 53.6258 121.85 53.4549C121.711 53.284 121.49 53.1986 121.187 53.1986C120.782 53.1986 120.487 53.3179 120.299 53.5566C120.112 53.7954 120.019 54.1955 120.019 54.757V56.999H119.062V52.4987H119.811L119.945 53.0887H119.994C120.13 52.8744 120.323 52.7089 120.572 52.5923C120.822 52.4756 121.098 52.4173 121.402 52.4173C122.482 52.4173 123.022 52.9666 123.022 54.0653V56.999ZM128.153 52.4987V53.0236L127.384 53.166C127.454 53.261 127.512 53.3776 127.559 53.516C127.605 53.6543 127.628 53.8008 127.628 53.9554C127.628 54.4193 127.468 54.7841 127.148 55.05C126.828 55.3158 126.387 55.4487 125.825 55.4487C125.681 55.4487 125.551 55.4379 125.435 55.4162C125.228 55.5437 125.125 55.6929 125.125 55.8638C125.125 55.9669 125.173 56.0442 125.268 56.0957C125.365 56.1472 125.543 56.173 125.801 56.173H126.586C127.083 56.173 127.46 56.2788 127.717 56.4904C127.975 56.702 128.104 57.0072 128.104 57.4059C128.104 57.9159 127.894 58.3092 127.473 58.5859C127.053 58.8626 126.445 59.001 125.65 59.001C125.037 59.001 124.569 58.8925 124.246 58.6755C123.924 58.4584 123.762 58.1492 123.762 57.7477C123.762 57.471 123.849 57.2377 124.023 57.0479C124.199 56.8607 124.444 56.7305 124.759 56.6572C124.632 56.603 124.526 56.5162 124.442 56.3968C124.36 56.2747 124.32 56.1472 124.32 56.0143C124.32 55.8461 124.367 55.7037 124.462 55.5871C124.557 55.4704 124.698 55.3551 124.885 55.2412C124.652 55.1408 124.462 54.9781 124.316 54.7529C124.172 54.5251 124.1 54.2592 124.1 53.9554C124.1 53.4671 124.253 53.0887 124.56 52.8201C124.869 52.5516 125.308 52.4173 125.878 52.4173C126.006 52.4173 126.139 52.4268 126.277 52.4458C126.418 52.4621 126.524 52.4797 126.594 52.4987H128.153ZM124.617 57.6989C124.617 57.9051 124.709 58.0637 124.893 58.175C125.081 58.2862 125.342 58.3418 125.679 58.3418C126.2 58.3418 126.587 58.2672 126.842 58.118C127.097 57.9688 127.225 57.7708 127.225 57.5239C127.225 57.3286 127.154 57.1889 127.013 57.1048C126.875 57.0234 126.616 56.9827 126.236 56.9827H125.512C125.238 56.9827 125.02 57.0465 124.857 57.174C124.697 57.3042 124.617 57.4792 124.617 57.6989ZM125.028 53.9554C125.028 54.2375 125.1 54.4545 125.243 54.6064C125.39 54.7584 125.599 54.8343 125.87 54.8343C126.423 54.8343 126.7 54.5386 126.7 53.9473C126.7 53.6543 126.631 53.4291 126.493 53.2718C126.357 53.1118 126.149 53.0317 125.87 53.0317C125.593 53.0317 125.383 53.1104 125.239 53.2677C125.098 53.4251 125.028 53.6543 125.028 53.9554ZM130.956 57.0804C130.256 57.0804 129.708 56.877 129.312 56.4701C128.919 56.0604 128.722 55.4976 128.722 54.7814C128.722 54.0463 128.905 53.4685 129.272 53.048C129.638 52.6276 130.141 52.4173 130.781 52.4173C131.375 52.4173 131.845 52.5977 132.189 52.9585C132.534 53.3193 132.706 53.8157 132.706 54.4478V54.9645H129.707C129.721 55.4013 129.839 55.7376 130.061 55.9736C130.283 56.2069 130.597 56.3236 131.001 56.3236C131.267 56.3236 131.514 56.2992 131.742 56.2503C131.972 56.1988 132.219 56.1147 132.482 55.998V56.7752C132.249 56.8864 132.013 56.9651 131.774 57.0112C131.535 57.0573 131.263 57.0804 130.956 57.0804ZM130.781 53.1416C130.477 53.1416 130.233 53.2379 130.049 53.4305C129.867 53.6231 129.759 53.9039 129.723 54.2728H131.766C131.761 53.9012 131.671 53.6204 131.497 53.4305C131.324 53.2379 131.085 53.1416 130.781 53.1416ZM136.075 52.4173C136.268 52.4173 136.426 52.4309 136.551 52.458L136.458 53.3491C136.322 53.3166 136.181 53.3003 136.034 53.3003C135.652 53.3003 135.341 53.4251 135.103 53.6746C134.867 53.9242 134.749 54.2484 134.749 54.6471V56.999H133.792V52.4987H134.541L134.667 53.2922H134.716C134.865 53.0236 135.059 52.8107 135.298 52.6533C135.539 52.496 135.798 52.4173 136.075 52.4173Z" fill="white" fill-opacity="0.6"/> +<mask id="mask0_8016_4576" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="37" y="35" width="21" height="21"> +<rect x="37.332" y="35.999" width="20" height="20" fill="white"/> +</mask> +<g mask="url(#mask0_8016_4576)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M53.3367 41.2431C53.6621 41.5685 53.6621 42.0962 53.3367 42.4216L45.8367 49.9216C45.5247 50.2336 45.0235 50.2483 44.6938 49.9552L40.9438 46.6219C40.5998 46.3161 40.5688 45.7894 40.8746 45.4454C41.1803 45.1014 41.7071 45.0704 42.051 45.3762L45.2138 48.1875L52.1581 41.2431C52.4836 40.9177 53.0112 40.9177 53.3367 41.2431Z" fill="#44AD4D"/> +</g> +</g> +<rect width="40" height="40" transform="translate(224 25.999)" fill="#294D73"/> +<mask id="mask1_8016_4576" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="234" y="35" width="20" height="21"> +<path d="M254 35.999H234V55.999H254V35.999Z" fill="white"/> +</mask> +<g mask="url(#mask1_8016_4576)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M244.001 54.3327C248.604 54.3327 252.335 50.6017 252.335 45.9993C252.335 41.397 248.604 37.666 244.001 37.666C239.399 37.666 235.668 41.397 235.668 45.9993C235.668 50.6017 239.399 54.3327 244.001 54.3327ZM244.835 41.8327C244.835 42.2929 244.462 42.666 244.001 42.666C243.541 42.666 243.168 42.2929 243.168 41.8327C243.168 41.3724 243.541 40.9993 244.001 40.9993C244.462 40.9993 244.835 41.3724 244.835 41.8327ZM244.835 50.166C244.835 50.6263 244.462 50.9993 244.001 50.9993C243.541 50.9993 243.168 50.6263 243.168 50.166V45.166C243.168 44.7058 243.541 44.3327 244.001 44.3327C244.462 44.3327 244.835 44.7058 244.835 45.166V50.166Z" fill="white"/> +</g> +</g> +</g> +<g clip-path="url(#clip4_8016_4576)"> +<g clip-path="url(#clip5_8016_4576)"> +<g clip-path="url(#clip6_8016_4576)"> +<rect width="198.333" height="40" transform="translate(24 69.333)" fill="#294D73"/> +<path d="M43.5983 93.833L42.7666 91.5202H39.5822L38.7676 93.833H37.332L40.4481 85.4704H41.9292L45.0452 93.833H43.5983ZM42.4077 90.3467L41.6273 88.0794C41.5703 87.9275 41.4906 87.6883 41.388 87.3617C41.2893 87.035 41.2209 86.7958 41.1829 86.6439C41.0804 87.111 40.9304 87.6218 40.7329 88.1763L39.981 90.3467H42.4077ZM47.341 93.833H46.0023V84.9691H47.341V93.833ZM52.4793 87.4186C53.2655 87.4186 53.8769 87.7035 54.3136 88.2731C54.7542 88.8428 54.9744 89.6422 54.9744 90.6714C54.9744 91.7044 54.7523 92.5095 54.3079 93.0868C53.8636 93.6602 53.2465 93.9469 52.4565 93.9469C51.659 93.9469 51.04 93.6602 50.5994 93.0868H50.5083L50.2633 93.833H49.2607V84.9691H50.5994V87.0768C50.5994 87.2325 50.5919 87.4642 50.5767 87.7718C50.5615 88.0794 50.5501 88.275 50.5425 88.3586H50.5994C51.0248 87.7319 51.6514 87.4186 52.4793 87.4186ZM52.1318 88.5124C51.5926 88.5124 51.2033 88.6719 50.964 88.9909C50.7286 89.3061 50.607 89.8359 50.5994 90.5802V90.6714C50.5994 91.4385 50.721 91.9949 50.964 92.3405C51.2071 92.6823 51.6039 92.8532 52.1546 92.8532C52.6293 92.8532 52.9882 92.6652 53.2313 92.2892C53.4781 91.9132 53.6016 91.3702 53.6016 90.66C53.6016 89.2282 53.1117 88.5124 52.1318 88.5124ZM60.4717 93.833L60.2039 92.9557H60.1584C59.8545 93.3393 59.5488 93.6013 59.2412 93.7419C58.9336 93.8786 58.5386 93.9469 58.0563 93.9469C57.4373 93.9469 56.9531 93.7798 56.6037 93.4456C56.2581 93.1114 56.0853 92.6386 56.0853 92.0272C56.0853 91.3778 56.3264 90.8879 56.8088 90.5575C57.2911 90.2271 58.0259 90.0467 59.0133 90.0163L60.1014 89.9821V89.646C60.1014 89.2434 60.0065 88.9434 59.8166 88.7459C59.6305 88.5447 59.34 88.444 58.945 88.444C58.6222 88.444 58.3127 88.4915 58.0164 88.5864C57.7202 88.6814 57.4354 88.7934 57.1619 88.9225L56.729 87.9655C57.0708 87.787 57.4449 87.6522 57.8512 87.561C58.2576 87.4661 58.6412 87.4186 59.002 87.4186C59.8033 87.4186 60.4071 87.5933 60.8135 87.9427C61.2236 88.2921 61.4287 88.8409 61.4287 89.589V93.833H60.4717ZM58.4779 92.9215C58.964 92.9215 59.3532 92.7867 59.6457 92.5171C59.9419 92.2437 60.09 91.862 60.09 91.3721V90.8252L59.2811 90.8594C58.6507 90.8822 58.1911 90.9885 57.9025 91.1784C57.6177 91.3645 57.4753 91.6512 57.4753 92.0386C57.4753 92.3196 57.5588 92.538 57.7259 92.6937C57.893 92.8456 58.1437 92.9215 58.4779 92.9215ZM68.84 93.833H67.4956V89.9593C67.4956 89.4732 67.3969 89.1105 67.1994 88.8713C67.0057 88.632 66.6962 88.5124 66.2708 88.5124C65.705 88.5124 65.291 88.6795 65.029 89.0137C64.7669 89.3479 64.6359 89.908 64.6359 90.6942V93.833H63.2972V87.5326H64.3454L64.5334 88.3586H64.6017C64.7916 88.0585 65.0613 87.8269 65.4106 87.6636C65.76 87.5003 66.1474 87.4186 66.5728 87.4186C68.0843 87.4186 68.84 88.1877 68.84 89.7257V93.833ZM72.0415 93.833H70.7028V87.5326H72.0415V93.833ZM70.623 85.8634C70.623 85.6242 70.6876 85.44 70.8167 85.3109C70.9497 85.1817 71.1376 85.1172 71.3807 85.1172C71.6162 85.1172 71.7984 85.1817 71.9276 85.3109C72.0605 85.44 72.127 85.6242 72.127 85.8634C72.127 86.0913 72.0605 86.2717 71.9276 86.4046C71.7984 86.5337 71.6162 86.5983 71.3807 86.5983C71.1376 86.5983 70.9497 86.5337 70.8167 86.4046C70.6876 86.2717 70.623 86.0913 70.623 85.8634ZM77.9033 93.833L77.6356 92.9557H77.59C77.2862 93.3393 76.9805 93.6013 76.6729 93.7419C76.3652 93.8786 75.9703 93.9469 75.488 93.9469C74.8689 93.9469 74.3847 93.7798 74.0353 93.4456C73.6897 93.1114 73.5169 92.6386 73.5169 92.0272C73.5169 91.3778 73.7581 90.8879 74.2404 90.5575C74.7227 90.2271 75.4576 90.0467 76.445 90.0163L77.533 89.9821V89.646C77.533 89.2434 77.4381 88.9434 77.2482 88.7459C77.0621 88.5447 76.7716 88.444 76.3766 88.444C76.0538 88.444 75.7443 88.4915 75.4481 88.5864C75.1519 88.6814 74.867 88.7934 74.5936 88.9225L74.1606 87.9655C74.5024 87.787 74.8765 87.6522 75.2829 87.561C75.6892 87.4661 76.0728 87.4186 76.4336 87.4186C77.2349 87.4186 77.8388 87.5933 78.2451 87.9427C78.6553 88.2921 78.8603 88.8409 78.8603 89.589V93.833H77.9033ZM75.9095 92.9215C76.3956 92.9215 76.7849 92.7867 77.0773 92.5171C77.3735 92.2437 77.5216 91.862 77.5216 91.3721V90.8252L76.7127 90.8594C76.0823 90.8822 75.6228 90.9885 75.3341 91.1784C75.0493 91.3645 74.9069 91.6512 74.9069 92.0386C74.9069 92.3196 74.9905 92.538 75.1576 92.6937C75.3247 92.8456 75.5753 92.9215 75.9095 92.9215Z" fill="white"/> +</g> +<rect width="40" height="40" transform="translate(224 69.333)" fill="#294D73"/> +<mask id="mask2_8016_4576" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="234" y="79" width="20" height="21"> +<rect x="234" y="79.333" width="20" height="20" fill="white"/> +</mask> +<g mask="url(#mask2_8016_4576)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M247.924 87.0771C247.598 86.7516 247.071 86.7516 246.745 87.0771L244.001 89.8212L241.257 87.0771C240.932 86.7516 240.404 86.7516 240.079 87.0771C239.753 87.4025 239.753 87.9302 240.079 88.2556L243.412 91.5889C243.737 91.9144 244.265 91.9144 244.591 91.5889L247.924 88.2556C248.249 87.9302 248.249 87.4025 247.924 87.0771Z" fill="white"/> +</g> +</g> +</g> +<g opacity="0.8"> +<circle cx="284" cy="38" r="350" fill="url(#paint0_linear_8016_4576)"/> +<circle cx="350" cy="350" r="350" transform="matrix(1 0 0 -1 -66 404)" fill="url(#paint1_linear_8016_4576)"/> +</g> +</g> +<path d="M12 1H276C282.075 1 287 5.92487 287 12V79C287 85.0751 282.075 90 276 90H12C5.92487 90 1 85.0751 1 79V12C1 5.92487 5.92487 1 12 1Z" stroke="#304358" stroke-width="2"/> +<defs> +<linearGradient id="paint0_linear_8016_4576" x1="284" y1="-71" x2="284" y2="38" gradientUnits="userSpaceOnUse"> +<stop stop-color="#101823"/> +<stop offset="0.745192" stop-color="#101823" stop-opacity="0.5"/> +<stop offset="1" stop-color="#101823" stop-opacity="0"/> +</linearGradient> +<linearGradient id="paint1_linear_8016_4576" x1="350" y1="241" x2="350" y2="350" gradientUnits="userSpaceOnUse"> +<stop stop-color="#101823"/> +<stop offset="0.502414" stop-color="#101823" stop-opacity="0.5"/> +<stop offset="1" stop-color="#101823" stop-opacity="0"/> +</linearGradient> +<clipPath id="clip0_8016_4576"> +<path d="M0 12C0 5.37258 5.37258 0 12 0H276C282.627 0 288 5.37258 288 12V79C288 85.6274 282.627 91 276 91H12C5.37259 91 0 85.6274 0 79V12Z" fill="white"/> +</clipPath> +<clipPath id="clip1_8016_4576"> +<rect width="240" height="40" fill="white" transform="translate(24 25.999)"/> +</clipPath> +<clipPath id="clip2_8016_4576"> +<path d="M24 39.3324C24 31.9686 29.9695 25.999 37.3333 25.999H250.667C258.03 25.999 264 31.9686 264 39.3324V52.6657C264 60.0295 258.03 65.999 250.667 65.999H37.3333C29.9695 65.999 24 60.0295 24 52.6657V39.3324Z" fill="white"/> +</clipPath> +<clipPath id="clip3_8016_4576"> +<rect width="198.333" height="40" fill="white" transform="translate(24 25.999)"/> +</clipPath> +<clipPath id="clip4_8016_4576"> +<rect width="240" height="40" fill="white" transform="translate(24 69.333)"/> +</clipPath> +<clipPath id="clip5_8016_4576"> +<path d="M24 82.6663C24 75.3025 29.9695 69.333 37.3333 69.333H250.667C258.03 69.333 264 75.3025 264 82.6663V95.9997C264 103.363 258.03 109.333 250.667 109.333H37.3333C29.9695 109.333 24 103.363 24 95.9997V82.6663Z" fill="white"/> +</clipPath> +<clipPath id="clip6_8016_4576"> +<rect width="198.333" height="40" fill="white" transform="translate(24 69.333)"/> +</clipPath> +</defs> +</svg> diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/Contents.json new file mode 100644 index 0000000000..7468b337f9 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/AutomaticMultihopBanner.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "AutomaticMultihopBanner.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/Contents.json b/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/Contents.json new file mode 100644 index 0000000000..b32946cea1 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "UniqueFilterBanner.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/UniqueFilterBanner.svg b/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/UniqueFilterBanner.svg new file mode 100644 index 0000000000..e3e2ef3e44 --- /dev/null +++ b/ios/MullvadVPN/Supporting Files/Assets.xcassets/UniqueFilterBanner.imageset/UniqueFilterBanner.svg @@ -0,0 +1,92 @@ +<svg width="288" height="91" viewBox="0 0 288 91" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_8016_495)"> +<path d="M0 12C0 5.37258 5.37258 0 12 0H276C282.627 0 288 5.37258 288 12V79C288 85.6274 282.627 91 276 91H12C5.37259 91 0 85.6274 0 79V12Z" fill="#192638"/> +<mask id="mask0_8016_495" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="22" y="-12" width="14" height="14"> +<rect x="22.125" y="-11.6875" width="13.125" height="13.125" fill="white"/> +</mask> +<g mask="url(#mask0_8016_495)"> +<path d="M28.6875 0.343751C27.9401 0.343751 27.2337 0.200196 26.5684 -0.0869131C25.903 -0.374022 25.3219 -0.765949 24.8252 -1.26269C24.3285 -1.75944 23.9365 -2.34049 23.6494 -3.00586C23.3623 -3.67122 23.2188 -4.3776 23.2188 -5.125C23.2188 -5.88151 23.3623 -6.59017 23.6494 -7.25098C23.9365 -7.91178 24.3285 -8.49056 24.8252 -8.9873C25.3219 -9.48405 25.903 -9.87598 26.5684 -10.1631C27.2337 -10.4502 27.9401 -10.5938 28.6875 -10.5938C29.444 -10.5938 30.1527 -10.4502 30.8135 -10.1631C31.4743 -9.87598 32.0531 -9.48405 32.5498 -8.9873C33.0466 -8.49056 33.4385 -7.91178 33.7256 -7.25098C34.0127 -6.59017 34.1563 -5.88151 34.1563 -5.125C34.1563 -4.3776 34.0127 -3.67122 33.7256 -3.00586C33.4385 -2.34049 33.0466 -1.75944 32.5498 -1.26269C32.0531 -0.765949 31.4743 -0.374022 30.8135 -0.0869131C30.1527 0.200196 29.444 0.343751 28.6875 0.343751ZM28.6875 -0.777342C28.9245 -1.10547 29.1296 -1.44726 29.3027 -1.80273C29.4759 -2.1582 29.6172 -2.53646 29.7266 -2.9375H27.6484C27.7578 -2.53646 27.8991 -2.1582 28.0723 -1.80273C28.2454 -1.44726 28.4505 -1.10547 28.6875 -0.777342ZM27.2656 -0.996092C27.1016 -1.29687 26.958 -1.60905 26.835 -1.93262C26.7119 -2.25618 26.6094 -2.59114 26.5273 -2.9375H24.9141C25.1784 -2.48177 25.5088 -2.08529 25.9053 -1.74804C26.3018 -1.41081 26.7552 -1.16015 27.2656 -0.996092ZM30.1094 -0.996092C30.6198 -1.16015 31.0732 -1.41081 31.4697 -1.74804C31.8662 -2.08529 32.1966 -2.48177 32.4609 -2.9375H30.8477C30.7656 -2.59114 30.6631 -2.25618 30.54 -1.93262C30.417 -1.60905 30.2734 -1.29687 30.1094 -0.996092ZM24.4492 -4.03125H26.3086C26.2813 -4.21354 26.2607 -4.39355 26.2471 -4.57129C26.2334 -4.74902 26.2266 -4.93359 26.2266 -5.125C26.2266 -5.31641 26.2334 -5.50098 26.2471 -5.67871C26.2607 -5.85644 26.2813 -6.03646 26.3086 -6.21875H24.4492C24.4036 -6.03646 24.3695 -5.85644 24.3467 -5.67871C24.3239 -5.50098 24.3125 -5.31641 24.3125 -5.125C24.3125 -4.93359 24.3239 -4.74902 24.3467 -4.57129C24.3695 -4.39355 24.4036 -4.21354 24.4492 -4.03125ZM27.4023 -4.03125H29.9727C30 -4.21354 30.0205 -4.39355 30.0342 -4.57129C30.0479 -4.74902 30.0547 -4.93359 30.0547 -5.125C30.0547 -5.31641 30.0479 -5.50098 30.0342 -5.67871C30.0205 -5.85644 30 -6.03646 29.9727 -6.21875H27.4023C27.375 -6.03646 27.3545 -5.85644 27.3408 -5.67871C27.3271 -5.50098 27.3203 -5.31641 27.3203 -5.125C27.3203 -4.93359 27.3271 -4.74902 27.3408 -4.57129C27.3545 -4.39355 27.375 -4.21354 27.4023 -4.03125ZM31.0664 -4.03125H32.9258C32.9714 -4.21354 33.0055 -4.39355 33.0283 -4.57129C33.0511 -4.74902 33.0625 -4.93359 33.0625 -5.125C33.0625 -5.31641 33.0511 -5.50098 33.0283 -5.67871C33.0055 -5.85644 32.9714 -6.03646 32.9258 -6.21875H31.0664C31.0938 -6.03646 31.1143 -5.85644 31.1279 -5.67871C31.1416 -5.50098 31.1484 -5.31641 31.1484 -5.125C31.1484 -4.93359 31.1416 -4.74902 31.1279 -4.57129C31.1143 -4.39355 31.0938 -4.21354 31.0664 -4.03125ZM30.8477 -7.3125H32.4609C32.1966 -7.76823 31.8662 -8.16471 31.4697 -8.50195C31.0732 -8.83919 30.6198 -9.08984 30.1094 -9.25391C30.2734 -8.95312 30.417 -8.64095 30.54 -8.31738C30.6631 -7.99381 30.7656 -7.65885 30.8477 -7.3125ZM27.6484 -7.3125H29.7266C29.6172 -7.71354 29.4759 -8.0918 29.3027 -8.44727C29.1296 -8.80273 28.9245 -9.14453 28.6875 -9.47266C28.4505 -9.14453 28.2454 -8.80273 28.0723 -8.44727C27.8991 -8.0918 27.7578 -7.71354 27.6484 -7.3125ZM24.9141 -7.3125H26.5273C26.6094 -7.65885 26.7119 -7.99381 26.835 -8.31738C26.958 -8.64095 27.1016 -8.95312 27.2656 -9.25391C26.7552 -9.08984 26.3018 -8.83919 25.9053 -8.50195C25.5088 -8.16471 25.1784 -7.76823 24.9141 -7.3125Z" fill="white" fill-opacity="0.6"/> +</g> +<path d="M29.1563 3.3125C29.1563 3.05362 28.9464 2.84375 28.6875 2.84375C28.4286 2.84375 28.2187 3.05362 28.2187 3.3125H28.6875H29.1563ZM28.6875 3.3125H28.2187V6.125H28.6875H29.1563V3.3125H28.6875Z" fill="white" fill-opacity="0.6"/> +<path d="M9 21.125C9 12.8407 15.7157 6.125 24 6.125H264C272.284 6.125 279 12.8407 279 21.125V69.875C279 78.1593 272.284 84.875 264 84.875H24C15.7157 84.875 9 78.1593 9 69.875V21.125Z" fill="#101823"/> +<path d="M28.6875 6.125V9.875" stroke="white" stroke-opacity="0.6" stroke-width="0.9375"/> +<path d="M28.6875 9.875L28.6875 43.875" stroke="white" stroke-opacity="0.6" stroke-width="0.9375"/> +<mask id="path-11-inside-1_8016_495" fill="white"> +<path d="M12.75 21.125C12.75 14.9118 17.7868 9.875 24 9.875H237.75C243.963 9.875 249 14.9118 249 21.125V32.375C249 38.5882 243.963 43.625 237.75 43.625H24C17.7868 43.625 12.75 38.5882 12.75 32.375V21.125Z"/> +</mask> +<path d="M12.75 21.125C12.75 14.9118 17.7868 9.875 24 9.875H237.75C243.963 9.875 249 14.9118 249 21.125V32.375C249 38.5882 243.963 43.625 237.75 43.625H24C17.7868 43.625 12.75 38.5882 12.75 32.375V21.125Z" fill="#101823"/> +<path d="M24 9.875V10.8125H237.75V9.875V8.9375H24V9.875ZM249 21.125H248.063V32.375H249H249.938V21.125H249ZM237.75 43.625V42.6875H24V43.625V44.5625H237.75V43.625ZM12.75 32.375H13.6875V21.125H12.75H11.8125V32.375H12.75ZM24 43.625V42.6875C18.3046 42.6875 13.6875 38.0704 13.6875 32.375H12.75H11.8125C11.8125 39.106 17.269 44.5625 24 44.5625V43.625ZM249 32.375H248.063C248.063 38.0704 243.445 42.6875 237.75 42.6875V43.625V44.5625C244.481 44.5625 249.938 39.106 249.938 32.375H249ZM237.75 9.875V10.8125C243.445 10.8125 248.063 15.4296 248.063 21.125H249H249.938C249.938 14.394 244.481 8.9375 237.75 8.9375V9.875ZM24 9.875V8.9375C17.269 8.9375 11.8125 14.394 11.8125 21.125H12.75H13.6875C13.6875 15.4296 18.3046 10.8125 24 10.8125V9.875Z" fill="#F8F7F1" fill-opacity="0.4" mask="url(#path-11-inside-1_8016_495)"/> +<path d="M28.2187 16.4375C28.2187 16.6964 28.4286 16.9063 28.6875 16.9063C28.9464 16.9063 29.1563 16.6964 29.1563 16.4375H28.6875H28.2187ZM28.6875 9.875H28.2187V16.4375H28.6875H29.1563V9.875H28.6875Z" fill="white" fill-opacity="0.6"/> +<mask id="mask1_8016_495" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="20" y="18" width="18" height="18"> +<rect x="20.25" y="18.3125" width="16.875" height="16.875" fill="white"/> +</mask> +<g mask="url(#mask1_8016_495)"> +<path d="M28.6875 31.918C30.1172 30.6055 31.1777 29.4131 31.8691 28.3408C32.5605 27.2686 32.9063 26.3164 32.9063 25.4844C32.9063 24.207 32.499 23.1611 31.6846 22.3467C30.8701 21.5322 29.8711 21.125 28.6875 21.125C27.5039 21.125 26.5049 21.5322 25.6904 22.3467C24.876 23.1611 24.4688 24.207 24.4688 25.4844C24.4688 26.3164 24.8145 27.2686 25.5059 28.3408C26.1973 29.4131 27.2578 30.6055 28.6875 31.918ZM28.6875 33.3066C28.5234 33.3066 28.3594 33.2773 28.1953 33.2188C28.0313 33.1602 27.8848 33.0723 27.7559 32.9551C26.9941 32.252 26.3203 31.5664 25.7344 30.8984C25.1484 30.2305 24.6592 29.583 24.2666 28.9561C23.874 28.3291 23.5752 27.7256 23.3701 27.1455C23.165 26.5654 23.0625 26.0117 23.0625 25.4844C23.0625 23.7266 23.6279 22.3262 24.7588 21.2832C25.8896 20.2402 27.1992 19.7188 28.6875 19.7188C30.1758 19.7188 31.4854 20.2402 32.6162 21.2832C33.7471 22.3262 34.3125 23.7266 34.3125 25.4844C34.3125 26.0117 34.21 26.5654 34.0049 27.1455C33.7998 27.7256 33.501 28.3291 33.1084 28.9561C32.7158 29.583 32.2266 30.2305 31.6406 30.8984C31.0547 31.5664 30.3809 32.252 29.6191 32.9551C29.4902 33.0723 29.3438 33.1602 29.1797 33.2188C29.0156 33.2773 28.8516 33.3066 28.6875 33.3066ZM28.6875 26.75C29.0742 26.75 29.4053 26.6123 29.6807 26.3369C29.9561 26.0615 30.0938 25.7305 30.0938 25.3438C30.0938 24.957 29.9561 24.626 29.6807 24.3506C29.4053 24.0752 29.0742 23.9375 28.6875 23.9375C28.3008 23.9375 27.9697 24.0752 27.6943 24.3506C27.4189 24.626 27.2813 24.957 27.2813 25.3438C27.2813 25.7305 27.4189 26.0615 27.6943 26.3369C27.9697 26.6123 28.3008 26.75 28.6875 26.75Z" fill="white" fill-opacity="0.6"/> +</g> +<path d="M29.1563 37.0625C29.1563 36.8036 28.9464 36.5937 28.6875 36.5937C28.4286 36.5937 28.2187 36.8036 28.2187 37.0625H28.6875H29.1563ZM28.6875 37.0625H28.2187V43.625H28.6875H29.1563V37.0625H28.6875Z" fill="white" fill-opacity="0.6"/> +<path d="M47.4439 28.757C47.4439 29.3124 47.3051 29.7867 47.0273 30.1797C46.7539 30.5685 46.3694 30.8655 45.8738 31.0706C45.3782 31.2756 44.795 31.3782 44.1242 31.3782C43.7696 31.3782 43.4342 31.3611 43.118 31.3269C42.8019 31.2927 42.5114 31.2436 42.2465 31.1795C41.9816 31.1154 41.7487 31.0364 41.5479 30.9424V29.8978C41.8683 30.0302 42.2593 30.1541 42.7207 30.2695C43.1821 30.3806 43.6649 30.4361 44.1691 30.4361C44.639 30.4361 45.0364 30.3741 45.3611 30.2502C45.6858 30.1221 45.9315 29.9405 46.0981 29.7055C46.269 29.4662 46.3544 29.18 46.3544 28.8467C46.3544 28.5263 46.2839 28.2593 46.1429 28.0457C46.002 27.8278 45.767 27.6312 45.438 27.4561C45.1133 27.2766 44.6689 27.0865 44.105 26.8857C43.7076 26.7447 43.3573 26.5909 43.054 26.4243C42.7506 26.2534 42.4964 26.0611 42.2913 25.8475C42.0862 25.6338 41.9303 25.386 41.8235 25.1041C41.7209 24.8221 41.6697 24.4995 41.6697 24.1364C41.6697 23.6365 41.7957 23.2092 42.0478 22.8546C42.3041 22.4957 42.6566 22.2223 43.1052 22.0343C43.5581 21.842 44.0772 21.7459 44.6625 21.7459C45.1624 21.7459 45.6238 21.7929 46.0468 21.8869C46.4741 21.9809 46.865 22.1069 47.2196 22.265L46.8799 23.2007C46.5424 23.0597 46.1835 22.9422 45.8033 22.8482C45.4273 22.7542 45.0385 22.7072 44.6369 22.7072C44.2353 22.7072 43.8956 22.767 43.6179 22.8867C43.3445 23.002 43.1351 23.1665 42.9899 23.3801C42.8446 23.5937 42.772 23.848 42.772 24.1428C42.772 24.4717 42.8403 24.7452 42.9771 24.9631C43.118 25.181 43.3402 25.3754 43.6436 25.5463C43.9512 25.7129 44.3571 25.8881 44.8612 26.0718C45.4124 26.2726 45.8802 26.4862 46.2647 26.7126C46.6492 26.9348 46.9419 27.2083 47.1427 27.533C47.3435 27.8534 47.4439 28.2614 47.4439 28.757ZM54.9164 31.2372L53.6667 27.1484C53.6112 26.9733 53.5578 26.8024 53.5065 26.6357C53.4595 26.4648 53.4147 26.3025 53.3719 26.1487C53.3335 25.9906 53.2972 25.8453 53.263 25.7129C53.2331 25.5762 53.2075 25.4587 53.1861 25.3604H53.1412C53.1241 25.4587 53.1006 25.5762 53.0707 25.7129C53.0408 25.8453 53.0045 25.9906 52.9618 26.1487C52.9233 26.3068 52.8806 26.4734 52.8336 26.6486C52.7866 26.8195 52.7332 26.9925 52.6734 27.1677L51.366 31.2372H50.1676L48.2322 24.2133H49.3345L50.347 28.0905C50.4154 28.3469 50.4795 28.6011 50.5393 28.8531C50.6034 29.101 50.6568 29.3359 50.6995 29.5581C50.7465 29.776 50.7807 29.9661 50.8021 30.1285H50.8533C50.879 30.0217 50.9067 29.8935 50.9366 29.744C50.9708 29.5944 51.0071 29.4363 51.0456 29.2697C51.0883 29.0988 51.1332 28.9301 51.1802 28.7634C51.2272 28.5925 51.2742 28.4323 51.3212 28.2828L52.6157 24.2133H53.7629L55.0126 28.2764C55.0767 28.4814 55.1386 28.6951 55.1984 28.9172C55.2625 29.1394 55.3202 29.3552 55.3715 29.5645C55.4227 29.7696 55.459 29.9533 55.4804 30.1157H55.5317C55.5488 29.9704 55.5808 29.791 55.6278 29.5773C55.6748 29.3637 55.7282 29.1287 55.788 28.8724C55.8521 28.616 55.9183 28.3554 55.9867 28.0905L57.0121 24.2133H58.0952L56.1533 31.2372H54.9164ZM62.0814 24.0979C62.6795 24.0979 63.1922 24.2303 63.6194 24.4952C64.0467 24.7601 64.3735 25.1318 64.6 25.6104C64.8264 26.0846 64.9396 26.64 64.9396 27.2766V27.9367H60.0883C60.1011 28.7613 60.3062 29.3893 60.7035 29.8209C61.1008 30.2524 61.6605 30.4681 62.3826 30.4681C62.8269 30.4681 63.22 30.4276 63.5618 30.3464C63.9036 30.2652 64.2582 30.1456 64.6256 29.9875V30.9232C64.271 31.0812 63.9185 31.1966 63.5682 31.2692C63.2221 31.3419 62.812 31.3782 62.3377 31.3782C61.6627 31.3782 61.0731 31.2415 60.5689 30.968C60.069 30.6903 59.6802 30.2844 59.4025 29.7504C59.1248 29.2163 58.986 28.5626 58.986 27.7893C58.986 27.0331 59.112 26.3794 59.3641 25.8282C59.6204 25.2728 59.9793 24.8456 60.4407 24.5465C60.9064 24.2474 61.4533 24.0979 62.0814 24.0979ZM62.0685 24.9695C61.5003 24.9695 61.0474 25.1553 60.7099 25.527C60.3724 25.8987 60.1716 26.4178 60.1075 27.0844H63.8245C63.8203 26.6656 63.754 26.2982 63.6259 25.9821C63.502 25.6616 63.3118 25.4138 63.0555 25.2386C62.7991 25.0592 62.4702 24.9695 62.0685 24.9695ZM69.2463 31.3782C68.3576 31.3782 67.6527 31.0748 67.1314 30.4681C66.6144 29.8615 66.356 28.96 66.356 27.7637C66.356 26.5546 66.6209 25.6424 67.1506 25.0272C67.6804 24.4077 68.3854 24.0979 69.2655 24.0979C69.6372 24.0979 69.9619 24.147 70.2396 24.2453C70.5173 24.3436 70.7566 24.476 70.9574 24.6426C71.1582 24.805 71.327 24.9908 71.4637 25.2002H71.5406C71.5235 25.0677 71.5064 24.8862 71.4893 24.6555C71.4722 24.4247 71.4637 24.2368 71.4637 24.0915V21.2781H72.5275V31.25H71.6688L71.5085 30.2502H71.4637C71.3312 30.4596 71.1625 30.6497 70.9574 30.8206C70.7566 30.9915 70.5152 31.1282 70.2332 31.2308C69.9555 31.329 69.6265 31.3782 69.2463 31.3782ZM69.4129 30.4938C70.1649 30.4938 70.6968 30.2802 71.0087 29.8529C71.3206 29.4257 71.4765 28.7912 71.4765 27.9495V27.7573C71.4765 26.8643 71.327 26.1786 71.0279 25.7001C70.7331 25.2216 70.1948 24.9823 69.4129 24.9823C68.7592 24.9823 68.27 25.2344 67.9453 25.7385C67.6206 26.2384 67.4583 26.922 67.4583 27.7893C67.4583 28.6523 67.6185 29.3188 67.9389 29.7888C68.2636 30.2588 68.7549 30.4938 69.4129 30.4938ZM77.4879 24.0979C78.086 24.0979 78.5987 24.2303 79.0259 24.4952C79.4532 24.7601 79.78 25.1318 80.0065 25.6104C80.2329 26.0846 80.3461 26.64 80.3461 27.2766V27.9367H75.4948C75.5076 28.7613 75.7127 29.3893 76.11 29.8209C76.5073 30.2524 77.067 30.4681 77.7891 30.4681C78.2334 30.4681 78.6265 30.4276 78.9683 30.3464C79.3101 30.2652 79.6647 30.1456 80.0321 29.9875V30.9232C79.6775 31.0812 79.325 31.1966 78.9747 31.2692C78.6286 31.3419 78.2184 31.3782 77.7442 31.3782C77.0692 31.3782 76.4796 31.2415 75.9754 30.968C75.4755 30.6903 75.0867 30.2844 74.809 29.7504C74.5313 29.2163 74.3925 28.5626 74.3925 27.7893C74.3925 27.0331 74.5185 26.3794 74.7706 25.8282C75.0269 25.2728 75.3858 24.8456 75.8472 24.5465C76.3129 24.2474 76.8598 24.0979 77.4879 24.0979ZM77.475 24.9695C76.9068 24.9695 76.4539 25.1553 76.1164 25.527C75.7789 25.8987 75.5781 26.4178 75.514 27.0844H79.231C79.2267 26.6656 79.1605 26.2982 79.0324 25.9821C78.9085 25.6616 78.7183 25.4138 78.462 25.2386C78.2056 25.0592 77.8767 24.9695 77.475 24.9695ZM85.4795 24.0979C86.3126 24.0979 86.9428 24.303 87.3701 24.7131C87.7973 25.119 88.0109 25.7727 88.0109 26.6742V31.25H86.9599V26.7447C86.9599 26.1594 86.8253 25.7214 86.5562 25.4309C86.2913 25.1404 85.8832 24.9951 85.3321 24.9951C84.5545 24.9951 84.0076 25.2151 83.6915 25.6552C83.3753 26.0953 83.2172 26.734 83.2172 27.5714V31.25H82.1534V24.2261H83.0121L83.1724 25.2386H83.23C83.3796 24.9908 83.5697 24.7836 83.8004 24.617C84.0311 24.4461 84.2896 24.3179 84.5759 24.2325C84.8621 24.1428 85.1633 24.0979 85.4795 24.0979Z" fill="white"/> +<g clip-path="url(#clip1_8016_495)"> +<g clip-path="url(#clip2_8016_495)"> +<mask id="mask2_8016_495" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="252" y="15" width="24" height="23"> +<rect x="252.75" y="15.5" width="22.5" height="22.5" fill="#D9D9D9"/> +</mask> +<g mask="url(#mask2_8016_495)"> +<path d="M264.938 30.5C265.203 30.5 265.426 30.5898 265.605 30.7695C265.785 30.9492 265.875 31.1719 265.875 31.4375C265.875 31.7031 265.785 31.9258 265.605 32.1055C265.426 32.2852 265.203 32.375 264.938 32.375H263.062C262.797 32.375 262.574 32.2852 262.395 32.1055C262.215 31.9258 262.125 31.7031 262.125 31.4375C262.125 31.1719 262.215 30.9492 262.395 30.7695C262.574 30.5898 262.797 30.5 263.062 30.5H264.938ZM267.454 25.8125C268.096 26.2391 268.83 26.5367 269.621 26.6699C269.623 26.6962 269.625 26.7228 269.625 26.75C269.625 27.0156 269.535 27.2383 269.355 27.418C269.176 27.5977 268.953 27.6875 268.688 27.6875H259.312C259.047 27.6875 258.824 27.5977 258.645 27.418C258.465 27.2383 258.375 27.0156 258.375 26.75C258.375 26.4844 258.465 26.2617 258.645 26.082C258.824 25.9023 259.047 25.8125 259.312 25.8125H267.454ZM264.938 21.125C264.938 21.7827 265.052 22.4133 265.26 23H256.5C256.234 23 256.012 22.9102 255.832 22.7305C255.652 22.5508 255.562 22.3281 255.562 22.0625C255.563 21.7969 255.652 21.5742 255.832 21.3945C256.012 21.2148 256.234 21.125 256.5 21.125H264.938Z" fill="white"/> +<path d="M273.375 21.125C273.375 22.6783 272.116 23.9375 270.563 23.9375C269.009 23.9375 267.75 22.6783 267.75 21.125C267.75 19.5717 269.009 18.3125 270.563 18.3125C272.116 18.3125 273.375 19.5717 273.375 21.125Z" fill="white"/> +</g> +</g> +</g> +<path d="M28.6875 43.625V47.375" stroke="white" stroke-opacity="0.6" stroke-width="0.9375"/> +<path d="M28.6875 47.375L28.6875 81.375" stroke="white" stroke-opacity="0.6" stroke-width="0.9375"/> +<mask id="path-24-inside-2_8016_495" fill="white"> +<path d="M12.75 58.625C12.75 52.4118 17.7868 47.375 24 47.375H237.75C243.963 47.375 249 52.4118 249 58.625V69.875C249 76.0882 243.963 81.125 237.75 81.125H24C17.7868 81.125 12.75 76.0882 12.75 69.875V58.625Z"/> +</mask> +<path d="M12.75 58.625C12.75 52.4118 17.7868 47.375 24 47.375H237.75C243.963 47.375 249 52.4118 249 58.625V69.875C249 76.0882 243.963 81.125 237.75 81.125H24C17.7868 81.125 12.75 76.0882 12.75 69.875V58.625Z" fill="#1F3A57"/> +<path d="M24 47.375V48.3125H237.75V47.375V46.4375H24V47.375ZM249 58.625H248.063V69.875H249H249.938V58.625H249ZM237.75 81.125V80.1875H24V81.125V82.0625H237.75V81.125ZM12.75 69.875H13.6875V58.625H12.75H11.8125V69.875H12.75ZM24 81.125V80.1875C18.3046 80.1875 13.6875 75.5704 13.6875 69.875H12.75H11.8125C11.8125 76.606 17.269 82.0625 24 82.0625V81.125ZM249 69.875H248.063C248.063 75.5704 243.445 80.1875 237.75 80.1875V81.125V82.0625C244.481 82.0625 249.938 76.606 249.938 69.875H249ZM237.75 47.375V48.3125C243.445 48.3125 248.063 52.9296 248.063 58.625H249H249.938C249.938 51.894 244.481 46.4375 237.75 46.4375V47.375ZM24 47.375V46.4375C17.269 46.4375 11.8125 51.894 11.8125 58.625H12.75H13.6875C13.6875 52.9296 18.3046 48.3125 24 48.3125V47.375Z" fill="#F8F7F1" fill-opacity="0.4" mask="url(#path-24-inside-2_8016_495)"/> +<path d="M28.2187 53.9375C28.2187 54.1964 28.4286 54.4063 28.6875 54.4063C28.9464 54.4063 29.1563 54.1964 29.1563 53.9375H28.6875H28.2187ZM28.6875 47.375H28.2187V53.9375H28.6875H29.1563V47.375H28.6875Z" fill="white" fill-opacity="0.6"/> +<mask id="mask3_8016_495" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="20" y="55" width="18" height="18"> +<rect x="20.25" y="55.8125" width="16.875" height="16.875" fill="white"/> +</mask> +<g mask="url(#mask3_8016_495)"> +<path d="M28.6875 70.8066C28.5234 70.8066 28.3594 70.7773 28.1953 70.7188C28.0313 70.6602 27.8848 70.5723 27.7559 70.4551C26.9941 69.752 26.3203 69.0664 25.7344 68.3984C25.1484 67.7305 24.6592 67.083 24.2666 66.4561C23.874 65.8291 23.5752 65.2256 23.3701 64.6455C23.165 64.0654 23.0625 63.5117 23.0625 62.9844C23.0625 61.7773 23.3672 60.6934 23.9766 59.7324C24.5859 58.7715 25.4473 58.0684 26.5605 57.623C26.8652 57.4941 27.2021 57.3945 27.5713 57.3242C27.9404 57.2539 28.3066 57.2129 28.6699 57.2012C28.8691 57.2012 29.0361 57.2656 29.1709 57.3945C29.3057 57.5234 29.373 57.6875 29.373 57.8867C29.373 58.0859 29.3057 58.2588 29.1709 58.4053C29.0361 58.5518 28.8691 58.625 28.6699 58.625C28.3887 58.625 28.1133 58.6514 27.8438 58.7041C27.5742 58.7568 27.3047 58.8359 27.0352 58.9414C26.2148 59.2813 25.582 59.8203 25.1367 60.5586C24.6914 61.2969 24.4688 62.1055 24.4688 62.9844C24.4688 63.8164 24.8145 64.7686 25.5059 65.8408C26.1973 66.9131 27.2578 68.1055 28.6875 69.418C29.4023 68.7617 30.0234 68.1377 30.5508 67.5459C31.0781 66.9541 31.5176 66.3887 31.8691 65.8496C32.1035 65.4863 32.3086 65.1143 32.4844 64.7334C32.6602 64.3525 32.7832 63.957 32.8535 63.5469C32.9004 63.2773 33.0029 63.0898 33.1611 62.9844C33.3193 62.8789 33.4863 62.8379 33.6621 62.8613C33.8379 62.8848 33.9873 62.9551 34.1104 63.0723C34.2334 63.1895 34.2832 63.3477 34.2598 63.5469C34.166 64.2734 33.958 64.9561 33.6357 65.5947C33.3135 66.2334 32.9355 66.8457 32.502 67.4316C31.998 68.0996 31.4795 68.6943 30.9463 69.2158C30.4131 69.7373 29.9707 70.1504 29.6191 70.4551C29.4902 70.5723 29.3438 70.6602 29.1797 70.7188C29.0156 70.7773 28.8516 70.8066 28.6875 70.8066ZM28.6875 64.25C29.0742 64.25 29.4053 64.1123 29.6807 63.8369C29.9561 63.5615 30.0938 63.2305 30.0938 62.8438C30.0938 62.457 29.9561 62.126 29.6807 61.8506C29.4053 61.5752 29.0742 61.4375 28.6875 61.4375C28.3008 61.4375 27.9697 61.5752 27.6943 61.8506C27.4189 62.126 27.2813 62.457 27.2813 62.8438C27.2813 63.2305 27.4189 63.5615 27.6943 63.8369C27.9697 64.1123 28.3008 64.25 28.6875 64.25ZM32.9063 59.3281V60.7344C32.9063 60.9336 32.9736 61.1006 33.1084 61.2354C33.2432 61.3701 33.4102 61.4375 33.6094 61.4375C33.8086 61.4375 33.9756 61.3701 34.1104 61.2354C34.2451 61.1006 34.3125 60.9336 34.3125 60.7344V59.3281H35.7188C35.918 59.3281 36.085 59.2607 36.2197 59.126C36.3545 58.9912 36.4219 58.8242 36.4219 58.625C36.4219 58.4258 36.3545 58.2588 36.2197 58.124C36.085 57.9893 35.918 57.9219 35.7188 57.9219H34.3125V56.5156C34.3125 56.3164 34.2451 56.1494 34.1104 56.0146C33.9756 55.8799 33.8086 55.8125 33.6094 55.8125C33.4102 55.8125 33.2432 55.8799 33.1084 56.0146C32.9736 56.1494 32.9063 56.3164 32.9063 56.5156V57.9219H31.5C31.3008 57.9219 31.1338 57.9893 30.999 58.124C30.8643 58.2588 30.7969 58.4258 30.7969 58.625C30.7969 58.8242 30.8643 58.9912 30.999 59.126C31.1338 59.2607 31.3008 59.3281 31.5 59.3281H32.9063Z" fill="white"/> +</g> +<path d="M29.1563 74.5625C29.1563 74.3036 28.9464 74.0937 28.6875 74.0937C28.4286 74.0937 28.2187 74.3036 28.2187 74.5625H28.6875H29.1563ZM28.6875 74.5625H28.2187V81.125H28.6875H29.1563V74.5625H28.6875Z" fill="white" fill-opacity="0.6"/> +<path d="M47.4439 66.257C47.4439 66.8124 47.3051 67.2867 47.0273 67.6797C46.7539 68.0685 46.3694 68.3655 45.8738 68.5706C45.3782 68.7756 44.795 68.8782 44.1242 68.8782C43.7696 68.8782 43.4342 68.8611 43.118 68.8269C42.8019 68.7927 42.5114 68.7436 42.2465 68.6795C41.9816 68.6154 41.7487 68.5364 41.5479 68.4424V67.3978C41.8683 67.5302 42.2593 67.6541 42.7207 67.7695C43.1821 67.8806 43.6649 67.9361 44.1691 67.9361C44.639 67.9361 45.0364 67.8741 45.3611 67.7502C45.6858 67.6221 45.9315 67.4405 46.0981 67.2055C46.269 66.9662 46.3544 66.68 46.3544 66.3467C46.3544 66.0263 46.2839 65.7593 46.1429 65.5457C46.002 65.3278 45.767 65.1312 45.438 64.9561C45.1133 64.7766 44.6689 64.5865 44.105 64.3857C43.7076 64.2447 43.3573 64.0909 43.054 63.9243C42.7506 63.7534 42.4964 63.5611 42.2913 63.3475C42.0862 63.1338 41.9303 62.886 41.8235 62.6041C41.7209 62.3221 41.6697 61.9995 41.6697 61.6364C41.6697 61.1365 41.7957 60.7092 42.0478 60.3546C42.3041 59.9957 42.6566 59.7223 43.1052 59.5343C43.5581 59.342 44.0772 59.2459 44.6625 59.2459C45.1624 59.2459 45.6238 59.2929 46.0468 59.3869C46.4741 59.4809 46.865 59.6069 47.2196 59.765L46.8799 60.7007C46.5424 60.5597 46.1835 60.4422 45.8033 60.3482C45.4273 60.2542 45.0385 60.2072 44.6369 60.2072C44.2353 60.2072 43.8956 60.267 43.6179 60.3867C43.3445 60.502 43.1351 60.6665 42.9899 60.8801C42.8446 61.0937 42.772 61.348 42.772 61.6428C42.772 61.9717 42.8403 62.2452 42.9771 62.4631C43.118 62.681 43.3402 62.8754 43.6436 63.0463C43.9512 63.2129 44.3571 63.3881 44.8612 63.5718C45.4124 63.7726 45.8802 63.9862 46.2647 64.2126C46.6492 64.4348 46.9419 64.7083 47.1427 65.033C47.3435 65.3534 47.4439 65.7614 47.4439 66.257ZM54.9164 68.7372L53.6667 64.6484C53.6112 64.4733 53.5578 64.3024 53.5065 64.1357C53.4595 63.9648 53.4147 63.8025 53.3719 63.6487C53.3335 63.4906 53.2972 63.3453 53.263 63.2129C53.2331 63.0762 53.2075 62.9587 53.1861 62.8604H53.1412C53.1241 62.9587 53.1006 63.0762 53.0707 63.2129C53.0408 63.3453 53.0045 63.4906 52.9618 63.6487C52.9233 63.8068 52.8806 63.9734 52.8336 64.1486C52.7866 64.3195 52.7332 64.4925 52.6734 64.6677L51.366 68.7372H50.1676L48.2322 61.7133H49.3345L50.347 65.5905C50.4154 65.8469 50.4795 66.1011 50.5393 66.3531C50.6034 66.601 50.6568 66.8359 50.6995 67.0581C50.7465 67.276 50.7807 67.4661 50.8021 67.6285H50.8533C50.879 67.5217 50.9067 67.3935 50.9366 67.244C50.9708 67.0944 51.0071 66.9363 51.0456 66.7697C51.0883 66.5988 51.1332 66.4301 51.1802 66.2634C51.2272 66.0925 51.2742 65.9323 51.3212 65.7828L52.6157 61.7133H53.7629L55.0126 65.7764C55.0767 65.9814 55.1386 66.1951 55.1984 66.4172C55.2625 66.6394 55.3202 66.8552 55.3715 67.0645C55.4227 67.2696 55.459 67.4533 55.4804 67.6157H55.5317C55.5488 67.4704 55.5808 67.291 55.6278 67.0773C55.6748 66.8637 55.7282 66.6287 55.788 66.3724C55.8521 66.116 55.9183 65.8554 55.9867 65.5905L57.0121 61.7133H58.0952L56.1533 68.7372H54.9164ZM62.0814 61.5979C62.6795 61.5979 63.1922 61.7303 63.6194 61.9952C64.0467 62.2601 64.3735 62.6318 64.6 63.1104C64.8264 63.5846 64.9396 64.14 64.9396 64.7766V65.4367H60.0883C60.1011 66.2613 60.3062 66.8893 60.7035 67.3209C61.1008 67.7524 61.6605 67.9681 62.3826 67.9681C62.8269 67.9681 63.22 67.9276 63.5618 67.8464C63.9036 67.7652 64.2582 67.6456 64.6256 67.4875V68.4232C64.271 68.5812 63.9185 68.6966 63.5682 68.7692C63.2221 68.8419 62.812 68.8782 62.3377 68.8782C61.6627 68.8782 61.0731 68.7415 60.5689 68.468C60.069 68.1903 59.6802 67.7844 59.4025 67.2504C59.1248 66.7163 58.986 66.0626 58.986 65.2893C58.986 64.5331 59.112 63.8794 59.3641 63.3282C59.6204 62.7728 59.9793 62.3456 60.4407 62.0465C60.9064 61.7474 61.4533 61.5979 62.0814 61.5979ZM62.0685 62.4695C61.5003 62.4695 61.0474 62.6553 60.7099 63.027C60.3724 63.3987 60.1716 63.9178 60.1075 64.5844H63.8245C63.8203 64.1656 63.754 63.7982 63.6259 63.4821C63.502 63.1616 63.3118 62.9138 63.0555 62.7386C62.7991 62.5592 62.4702 62.4695 62.0685 62.4695ZM69.2463 68.8782C68.3576 68.8782 67.6527 68.5748 67.1314 67.9681C66.6144 67.3615 66.356 66.46 66.356 65.2637C66.356 64.0546 66.6209 63.1424 67.1506 62.5272C67.6804 61.9077 68.3854 61.5979 69.2655 61.5979C69.6372 61.5979 69.9619 61.647 70.2396 61.7453C70.5173 61.8436 70.7566 61.976 70.9574 62.1426C71.1582 62.305 71.327 62.4908 71.4637 62.7002H71.5406C71.5235 62.5677 71.5064 62.3862 71.4893 62.1555C71.4722 61.9247 71.4637 61.7368 71.4637 61.5915V58.7781H72.5275V68.75H71.6688L71.5085 67.7502H71.4637C71.3312 67.9596 71.1625 68.1497 70.9574 68.3206C70.7566 68.4915 70.5152 68.6282 70.2332 68.7308C69.9555 68.829 69.6265 68.8782 69.2463 68.8782ZM69.4129 67.9938C70.1649 67.9938 70.6968 67.7802 71.0087 67.3529C71.3206 66.9257 71.4765 66.2912 71.4765 65.4495V65.2573C71.4765 64.3643 71.327 63.6786 71.0279 63.2001C70.7331 62.7216 70.1948 62.4823 69.4129 62.4823C68.7592 62.4823 68.27 62.7344 67.9453 63.2385C67.6206 63.7384 67.4583 64.422 67.4583 65.2893C67.4583 66.1523 67.6185 66.8188 67.9389 67.2888C68.2636 67.7588 68.7549 67.9938 69.4129 67.9938ZM77.4879 61.5979C78.086 61.5979 78.5987 61.7303 79.0259 61.9952C79.4532 62.2601 79.78 62.6318 80.0065 63.1104C80.2329 63.5846 80.3461 64.14 80.3461 64.7766V65.4367H75.4948C75.5076 66.2613 75.7127 66.8893 76.11 67.3209C76.5073 67.7524 77.067 67.9681 77.7891 67.9681C78.2334 67.9681 78.6265 67.9276 78.9683 67.8464C79.3101 67.7652 79.6647 67.6456 80.0321 67.4875V68.4232C79.6775 68.5812 79.325 68.6966 78.9747 68.7692C78.6286 68.8419 78.2184 68.8782 77.7442 68.8782C77.0692 68.8782 76.4796 68.7415 75.9754 68.468C75.4755 68.1903 75.0867 67.7844 74.809 67.2504C74.5313 66.7163 74.3925 66.0626 74.3925 65.2893C74.3925 64.5331 74.5185 63.8794 74.7706 63.3282C75.0269 62.7728 75.3858 62.3456 75.8472 62.0465C76.3129 61.7474 76.8598 61.5979 77.4879 61.5979ZM77.475 62.4695C76.9068 62.4695 76.4539 62.6553 76.1164 63.027C75.7789 63.3987 75.5781 63.9178 75.514 64.5844H79.231C79.2267 64.1656 79.1605 63.7982 79.0324 63.4821C78.9085 63.1616 78.7183 62.9138 78.462 62.7386C78.2056 62.5592 77.8767 62.4695 77.475 62.4695ZM85.4795 61.5979C86.3126 61.5979 86.9428 61.803 87.3701 62.2131C87.7973 62.619 88.0109 63.2727 88.0109 64.1742V68.75H86.9599V64.2447C86.9599 63.6594 86.8253 63.2214 86.5562 62.9309C86.2913 62.6404 85.8832 62.4951 85.3321 62.4951C84.5545 62.4951 84.0076 62.7151 83.6915 63.1552C83.3753 63.5953 83.2172 64.234 83.2172 65.0714V68.75H82.1534V61.7261H83.0121L83.1724 62.7386H83.23C83.3796 62.4908 83.5697 62.2836 83.8004 62.117C84.0311 61.9461 84.2896 61.8179 84.5759 61.7325C84.8621 61.6428 85.1633 61.5979 85.4795 61.5979Z" fill="white"/> +<g clip-path="url(#clip3_8016_495)"> +<g clip-path="url(#clip4_8016_495)"> +<mask id="mask4_8016_495" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="252" y="53" width="24" height="23"> +<rect x="252.75" y="53" width="22.5" height="22.5" fill="#D9D9D9"/> +</mask> +<g mask="url(#mask4_8016_495)"> +<path d="M263.063 69.875C262.797 69.875 262.574 69.7852 262.395 69.6055C262.215 69.4258 262.125 69.2031 262.125 68.9375C262.125 68.6719 262.215 68.4492 262.395 68.2695C262.574 68.0898 262.797 68 263.063 68H264.938C265.203 68 265.426 68.0898 265.605 68.2695C265.785 68.4492 265.875 68.6719 265.875 68.9375C265.875 69.2031 265.785 69.4258 265.605 69.6055C265.426 69.7852 265.203 69.875 264.938 69.875H263.063ZM259.313 65.1875C259.047 65.1875 258.824 65.0977 258.645 64.918C258.465 64.7383 258.375 64.5156 258.375 64.25C258.375 63.9844 258.465 63.7617 258.645 63.582C258.824 63.4023 259.047 63.3125 259.313 63.3125H268.688C268.953 63.3125 269.176 63.4023 269.355 63.582C269.535 63.7617 269.625 63.9844 269.625 64.25C269.625 64.5156 269.535 64.7383 269.355 64.918C269.176 65.0977 268.953 65.1875 268.688 65.1875H259.313ZM256.5 60.5C256.234 60.5 256.012 60.4102 255.832 60.2305C255.652 60.0508 255.562 59.8281 255.562 59.5625C255.562 59.2969 255.652 59.0742 255.832 58.8945C256.012 58.7148 256.234 58.625 256.5 58.625H271.5C271.766 58.625 271.988 58.7148 272.168 58.8945C272.348 59.0742 272.438 59.2969 272.438 59.5625C272.438 59.8281 272.348 60.0508 272.168 60.2305C271.988 60.4102 271.766 60.5 271.5 60.5H256.5Z" fill="white"/> +</g> +</g> +</g> +<path d="M28.6875 81.125V84.875" stroke="white" stroke-opacity="0.6" stroke-width="0.9375"/> +<path d="M28.2187 87.6875C28.2187 87.9464 28.4286 88.1563 28.6875 88.1563C28.9464 88.1563 29.1563 87.9464 29.1563 87.6875H28.6875H28.2187ZM28.6875 84.875H28.2187V87.6875H28.6875H29.1563V84.875H28.6875Z" fill="white" fill-opacity="0.6"/> +<circle opacity="0.8" cx="260" cy="43.5" r="300" fill="url(#paint0_radial_8016_495)"/> +</g> +<path d="M12 1H276C282.075 1 287 5.92487 287 12V79C287 85.0751 282.075 90 276 90H12C5.92487 90 1 85.0751 1 79V12C1 5.92487 5.92487 1 12 1Z" stroke="#304358" stroke-width="2"/> +<defs> +<radialGradient id="paint0_radial_8016_495" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(260 43.5) rotate(90) scale(300)"> +<stop stop-color="#101823" stop-opacity="0"/> +<stop offset="0.254808" stop-color="#101823" stop-opacity="0.5"/> +<stop offset="1" stop-color="#101823"/> +</radialGradient> +<clipPath id="clip0_8016_495"> +<path d="M0 12C0 5.37258 5.37258 0 12 0H276C282.627 0 288 5.37258 288 12V79C288 85.6274 282.627 91 276 91H12C5.37259 91 0 85.6274 0 79V12Z" fill="white"/> +</clipPath> +<clipPath id="clip1_8016_495"> +<rect width="22.5" height="33.75" fill="white" transform="translate(252.75 9.875)"/> +</clipPath> +<clipPath id="clip2_8016_495"> +<rect width="22.5" height="22.5" fill="white" transform="translate(252.75 15.5)"/> +</clipPath> +<clipPath id="clip3_8016_495"> +<rect width="22.5" height="33.75" fill="white" transform="translate(252.75 47.375)"/> +</clipPath> +<clipPath id="clip4_8016_495"> +<rect width="22.5" height="22.5" fill="white" transform="translate(252.75 53)"/> +</clipPath> +</defs> +</svg> diff --git a/ios/MullvadVPN/MultihopMigration/MultihopMigrationTracker.swift b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationTracker.swift index 247ca18316..7aba9ad127 100644 --- a/ios/MullvadVPN/MultihopMigration/MultihopMigrationTracker.swift +++ b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationTracker.swift @@ -26,13 +26,8 @@ enum SettingsUpdate { struct Change { let path: SettingsUpdate - let before: Any? - let after: Any? -} - -struct UniqueFilter: Sendable { - let entry: RelayConstraint<RelayFilter> - let exit: RelayConstraint<RelayFilter> + var before: Any? = nil + var after: Any? = nil } struct MultihopActionSuggestion: Sendable { @@ -206,7 +201,7 @@ enum MultihopMigrationTrackerFactory { return MigrationOutput( value: newValue, changes: [ - Change(path: .directOnlyRemoved, before: nil, after: nil), + Change(path: .directOnlyRemoved), Change(path: .updatedMultiHop, before: MultihopStateV1.off, after: newValue), ] ) @@ -261,10 +256,7 @@ enum MultihopMigrationTrackerFactory { value: newValue, changes: [ Change(path: .updatedMultiHop, before: MultihopStateV1.on, after: newValue), - Change( - path: .uniqueFilter, before: input.relayConstraints.filter, - after: UniqueFilter( - entry: input.relayConstraints.entryFilter, exit: input.relayConstraints.exitFilter)), + Change(path: .uniqueFilter), ] ) } @@ -303,10 +295,7 @@ enum MultihopMigrationTrackerFactory { value: newValue, changes: [ Change(path: .updatedMultiHop, before: MultihopStateV1.on, after: newValue), - Change( - path: .uniqueFilter, before: input.relayConstraints.filter, - after: UniqueFilter( - entry: input.relayConstraints.entryFilter, exit: input.relayConstraints.exitFilter)), + Change(path: .uniqueFilter), ], action: MultihopActionSuggestion( name: String( @@ -351,10 +340,7 @@ enum MultihopMigrationTrackerFactory { changes: [ Change(path: .directOnlyRemoved, before: nil, after: nil), Change(path: .updatedMultiHop, before: MultihopStateV1.on, after: newValue), - Change( - path: .uniqueFilter, before: input.relayConstraints.filter, - after: UniqueFilter( - entry: input.relayConstraints.entryFilter, exit: input.relayConstraints.exitFilter)), + Change(path: .uniqueFilter), ], action: MultihopActionSuggestion( name: String( diff --git a/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardView.swift b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardView.swift new file mode 100644 index 0000000000..95e841e733 --- /dev/null +++ b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardView.swift @@ -0,0 +1,73 @@ +// +// MultihopMigrationWizardView.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-21. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// + +import MullvadSettings +import SwiftUI + +struct MultihopMigrationWizardView<ViewModel: MultihopMigrationWizardViewModelProtocol>: View { + @ObservedObject var viewModel: ViewModel + @State private var page = 1 + + var body: some View { + VStack(spacing: 0.0) { + PaginationView( + pages: viewModel.items.map { stateViewModel in + MullvadStateView(viewModel: stateViewModel) + } + ) + + HStack(spacing: 8.0) { + MainButton(text: "Back", style: .default) { + + } + .showIf(page > 1) + MainButton(text: page == viewModel.items.count ? "Got it!" : "Next", style: .default) { + if page < viewModel.items.count { + page = page.advanced(by: 1) + } + } + } + .padding(.horizontal, 16.0) + .padding(.bottom, 24.0) + } + .background(Color.mullvadBackground) + } +} + +#Preview { + MultihopMigrationWizardView( + viewModel: MockMultihopMigrationWizardViewModel() + ) +} + +// MARK: - Mock ViewModel + +final class MockMultihopMigrationWizardViewModel: MultihopMigrationWizardViewModelProtocol { + var items: [StateViewModel] { + let changes: [Change] = [ + Change(path: .automatic), + Change(path: .uniqueFilter), + Change(path: .directOnlyRemoved), + Change(path: .updatedMultiHop, before: MultihopStateV1.on, after: MultihopStateV2.always), + ] + + return changes.map { change in + let descriptor = SettingsUpdateDescriptor(change: change) + + return StateViewModel( + style: .info, + title: TextItem( + text: descriptor.title, + style: .headline + ), + banner: descriptor.banner, + details: descriptor.description + ) + } + } +} diff --git a/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardViewModel.swift b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardViewModel.swift new file mode 100644 index 0000000000..95c7d702bc --- /dev/null +++ b/ios/MullvadVPN/View controllers/MultihopMigration/MultihopMigrationWizardViewModel.swift @@ -0,0 +1,40 @@ +// +// MultihopMigrationWizardViewModel.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-21. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// + +import Combine +import Foundation +import MullvadSettings +import SwiftUI + +protocol MultihopMigrationWizardViewModelProtocol: ObservableObject { + var items: [StateViewModel] { get } +} + +final class MultihopMigrationWizardViewModel: MultihopMigrationWizardViewModelProtocol { + let output: MigrationOutput<MultihopStateV2> + var items: [StateViewModel] = [] + var tunnelManager: TunnelManager + var tunnelObserver: TunnelBlockObserver + + init(tunnelManager: TunnelManager, output: MigrationOutput<MultihopStateV2>) { + self.output = output + self.tunnelManager = tunnelManager + self.items = output.changes.compactMap { + let descriptor = SettingsUpdateDescriptor(change: $0) + return StateViewModel( + style: .info, + title: TextItem(text: descriptor.title, style: .headline), + banner: descriptor.banner, + details: descriptor.description) + } + let tunnelObserver = TunnelBlockObserver(didUpdateTunnelStatus: { tunnelManager, tunnelStatus in + + }) + self.tunnelObserver = tunnelObserver + } +} diff --git a/ios/MullvadVPN/View controllers/MultihopMigration/SettingsUpdateDescriptor.swift b/ios/MullvadVPN/View controllers/MultihopMigration/SettingsUpdateDescriptor.swift new file mode 100644 index 0000000000..7eda2400a9 --- /dev/null +++ b/ios/MullvadVPN/View controllers/MultihopMigration/SettingsUpdateDescriptor.swift @@ -0,0 +1,135 @@ +// +// SettingsUpdateDescriptor.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-21. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import MullvadSettings +import SwiftUI + +struct SettingsUpdateDescriptor { + let change: Change + + var title: String { + switch change.path { + case .none: + "" + case .updatedMultiHop: + NSLocalizedString("New multihop modes", comment: "") + case .uniqueFilter: + NSLocalizedString("Separate filters", comment: "") + case .directOnlyRemoved: + NSLocalizedString("“Direct only” removed", comment: "") + case .automatic: + NSLocalizedString("Multihop entry set to “Automatic”", comment: "") + } + } + + var description: [TextItem] { + switch change.path { + case .none: + [] + case .updatedMultiHop: + [ + TextItem( + text: NSLocalizedString( + "Multihop is now split into three modes: When needed, Always, and Never." + + "This gives you more flexibility with your connection preferences.", comment: ""), + style: .secondary), + TextItem( + text: String( + format: NSLocalizedString("Your multihop setting was migrated from “%@” to “%@”.", comment: ""), + "\(change.before!)", "\(change.after!)"), style: .primary), + TextItem( + text: String(format: NSLocalizedString("%@", comment: ""), "\(change.after!)"), style: .primary), + TextItem(text: (change.after as? MultihopStateV2)?.comment ?? "", style: .secondary), + ] + case .uniqueFilter: + [ + TextItem( + text: NSLocalizedString( + "Filters can now be set separately for entry and exit locations.", comment: ""), + style: .secondary), + TextItem( + text: NSLocalizedString( + "Your current filters were applied to both entry and exit locations.", comment: ""), + style: .primary), + ] + case .directOnlyRemoved: + [ + TextItem( + text: NSLocalizedString( + """ + The DAITA sub-setting “Direct only” has been removed and simplified to avoid blocking connections. + Instead, with DAITA enabled, you make this option with the multihop setting. + """, comment: ""), + style: .secondary), + TextItem( + text: NSLocalizedString( + """ + When multihop is set to “When needed” the app might use an additional server to make sure you connect to your selected location using DAITA. + """, comment: ""), + style: .secondary), + TextItem( + text: NSLocalizedString( + "When multihop is set to “Always” or “Never” you must manually select a DAITA server.", + comment: ""), + style: .secondary), + ] + case .automatic: + [ + TextItem( + text: NSLocalizedString( + """ + The multihop mode “Always” now features an “Automatic” location for the entry server selection. + """, comment: ""), + style: .secondary), + TextItem( + text: NSLocalizedString( + """ + When selected, the app automatically picks a random server, prioritizing those closer to the exit location for better performance. + """, comment: ""), + style: .secondary), + ] + } + } + + var banner: Image? { + switch change.path { + case .automatic: + .mullvadAutomaticMultihopBanner + case .uniqueFilter: + .mullvadUniqueFilterBanner + default: + nil + } + } +} + +extension MultihopStateV2 { + var comment: String { + switch self { + case .never: + NSLocalizedString( + """ + Multihop is disabled. Your selected location must support all active settings in order to establish a connection. + """, comment: "") + + case .always: + NSLocalizedString( + """ + Multihop is enabled. Your connection is routed through an entry server before exiting through the selected location. + """, comment: "") + case .whenNeeded: + NSLocalizedString( + """ + To ensure your current settings work with your selected location, and to avoid blocking your \\\ + connection, the app might automatically multihop via a different entry server. + This will be indicated by the %@ symbol. + """, comment: "") + } + } +} diff --git a/ios/MullvadVPN/Views/MullvadStateView.swift b/ios/MullvadVPN/Views/MullvadStateView.swift new file mode 100644 index 0000000000..87d907f851 --- /dev/null +++ b/ios/MullvadVPN/Views/MullvadStateView.swift @@ -0,0 +1,218 @@ +// +// MullvadStateView.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-10. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// + +import SwiftUI + +enum StateViewStyle { + case idle + case info + case loading + case error + case success +} + +final class StateViewModel: ObservableObject { + @Published var style: StateViewStyle = .idle + @Published var title: TextItem = .init(text: "", style: .headline) + @Published var banner: Image? = nil + @Published var details: [TextItem] = [] + @Published var explanation: TextItem? = nil + @Published var actions: [Action]? = nil + + init( + style: StateViewStyle, + title: TextItem, banner: Image? = nil, + details: [TextItem], + explanation: TextItem? = nil, + actions: [Action]? = nil + ) { + self.style = style + self.title = title + self.banner = banner + self.details = details + self.explanation = explanation + self.actions = actions + } +} + +struct TextStyle { + let font: Font + let color: Color + let alignment: TextAlignment + var isItalic: Bool = false + + static var headline: TextStyle { + TextStyle( + font: .mullvadLarge, + color: .mullvadTextPrimary, + alignment: .center) + } + + static var primary: TextStyle { + TextStyle( + font: .mullvadSmall, + color: .mullvadTextPrimary, + alignment: .leading) + } + + static var secondary: TextStyle { + TextStyle( + font: .mullvadSmall, + color: .mullvadTextSecondary, + alignment: .leading) + } + + static var note: TextStyle { + TextStyle( + font: .mullvadSmall, + color: .mullvadTextSecondary, + alignment: .leading, + isItalic: true) + } +} + +struct TextItem: Identifiable { + let id = UUID() + let text: String + let style: TextStyle +} + +// MARK: - Action Model + +struct Action: Identifiable { + let id = UUID() + let title: String + let style: MainButtonStyle.Style + let onTap: (() -> Void) +} + +// MARK: - StateView + +struct MullvadStateView: View { + @ObservedObject var viewModel: StateViewModel + + init(viewModel: StateViewModel) { + self.viewModel = viewModel + } + + var body: some View { + GeometryReader { geo in + ScrollView { + VStack(spacing: 16.0) { + Spacer() + StateView(state: viewModel.style) + .padding(.bottom, 8.0) + + StyledTextView(item: viewModel.title) + + if let banner = viewModel.banner { + ResizableImageView(image: banner, layout: .banner) + } + + ForEach(viewModel.details, id: \.id) { item in + StyledTextView(item: item) + } + + Spacer() + + if let explanation = viewModel.explanation { + StyledTextView(item: explanation) + } + + ForEach(viewModel.actions ?? [], id: \.id) { action in + MainButton(text: LocalizedStringKey(action.title), style: action.style) { + action.onTap() + } + .padding(.horizontal, 8.0) + } + Spacer() + } + .padding(.horizontal, 16) + .padding(.bottom, 24) + .frame(maxWidth: .infinity) + .frame(minHeight: geo.size.height) + } + } + } +} + +struct StyledTextView: View { + let item: TextItem + + var body: some View { + Text(item.text) + .font(item.style.font) + .multilineTextAlignment(item.style.alignment) + .foregroundStyle(item.style.color) + .frame(width: .infinity) + .if(item.style.isItalic) { view in + view.italic() + } + } +} + +struct StateView: View { + @State var state: StateViewStyle = .idle + @ScaledMetric private var size = 48 + + var body: some View { + content.animation(.default, value: state) + } + + @ViewBuilder + private var content: some View { + switch state { + case .idle: + EmptyView() + case .loading: + ProgressView() + .progressViewStyle(MullvadProgressViewStyle(size: size)) + case .success: + ResizableImageView(image: Image.mullvadIconSuccess, layout: .square(size)) + case .error: + ResizableImageView(image: Image.mullvadIconError, layout: .square(size)) + case .info: + ResizableImageView(image: Image.mullvadIconInfo, layout: .square(size)) + } + } +} + +#Preview { + MullvadStateView( + viewModel: StateViewModel( + style: .info, + title: TextItem(text: NSLocalizedString("Suggested action", comment: ""), style: .headline), + banner: Image(.ianSolutionIllustration), + details: [ + TextItem( + text: NSLocalizedString( + "To avoid getting blocked, we recommend that you set your multihop mode to “When needed”.", + comment: ""), style: .primary), + TextItem( + text: NSLocalizedString( + "To avoid getting blocked, we recommend that you set your multihop mode to “When needed”.", + comment: ""), + style: .secondary), + + TextItem( + text: NSLocalizedString( + "To avoid getting blocked, we recommend that you set your multihop mode to “When needed”.", + comment: ""), + style: .note), + ], + actions: [ + Action( + title: NSLocalizedString("Change to “When needed”", comment: ""), + style: .default, + onTap: { + print("Tapped") + }) + ]) + ) + .background(Color.mullvadBackground) +} diff --git a/ios/MullvadVPN/Views/PaginationView.swift b/ios/MullvadVPN/Views/PaginationView.swift new file mode 100644 index 0000000000..1107c88006 --- /dev/null +++ b/ios/MullvadVPN/Views/PaginationView.swift @@ -0,0 +1,30 @@ +// +// Untitled.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-21. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// + +import SwiftUI + +struct PaginationView: View { + let pages: [AnyView] + + init(pages: [any View]) { + self.pages = pages.map { AnyView($0) } + } + + var body: some View { + TabView { + ForEach(pages.indices, id: \.self) { index in + pages[index] + } + } + .tabViewStyle(.page) + } +} + +#Preview { + PaginationView(pages: [Color.red, Text("Test")]) +} diff --git a/ios/MullvadVPN/Views/ResizableImageView.swift b/ios/MullvadVPN/Views/ResizableImageView.swift new file mode 100644 index 0000000000..e6035021b9 --- /dev/null +++ b/ios/MullvadVPN/Views/ResizableImageView.swift @@ -0,0 +1,51 @@ +// +// ResizableImageView.swift +// MullvadVPN +// +// Created by Mojgan on 2026-04-15. +// Copyright © 2026 Mullvad VPN AB. All rights reserved. +// +import SwiftUI + +struct ResizableImageView: View { + enum Layout { + case square(CGFloat) + case banner + } + + @ScaledMetric private var baseSize: CGFloat = 48 + + let image: Image + let layout: Layout + + var body: some View { + switch layout { + case .square(let size): + image + .resizable() + .aspectRatio(contentMode: .fit) + .frame( + width: scaled(size), + height: scaled(size) + ) + + case .banner: + image + .resizable() + .aspectRatio(contentMode: .fit) + } + } + + private func scaled(_ value: CGFloat) -> CGFloat { + value == 0 ? baseSize : value + } +} +#Preview("ResizableBannerView", traits: .sizeThatFitsLayout) { + VStack(spacing: 0) { + ResizableImageView(image: .mullvadIconInfo, layout: .square(48)) + ResizableImageView( + image: Image(.ianSolutionIllustration), + layout: .banner) + } + .background(Color.gray.opacity(0.2)) +} |
