diff --git a/.gitignore b/.gitignore index 2dd78c5b1..28b294117 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ Modules/litewallet-partner-api-ios litewallet-partner-api-ios /partner-keys.plist partner-keys.plist -GoogleService-Info.plist \ No newline at end of file +GoogleService-Info.plist +*.gpx diff --git a/Dakar, Senegal.gpx b/Dakar, Senegal.gpx new file mode 100644 index 000000000..25366a782 --- /dev/null +++ b/Dakar, Senegal.gpx @@ -0,0 +1,19 @@ + + + + new + + gpx.studio + + + + + new + Cycling + + + 23.1 + + + + \ No newline at end of file diff --git a/PrivacyInfo.xcprivacy b/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..4b94fe8a5 --- /dev/null +++ b/PrivacyInfo.xcprivacy @@ -0,0 +1,104 @@ + + + + + NSPrivacyTracking + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherDiagnosticData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypePerformanceData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeOtherUsageData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeDeviceID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeProductInteraction + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeCrashData + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/litewallet.xcodeproj/project.pbxproj b/litewallet.xcodeproj/project.pbxproj new file mode 100644 index 000000000..8b1bd8c7f --- /dev/null +++ b/litewallet.xcodeproj/project.pbxproj @@ -0,0 +1,5245 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1B3F74231FFB106200CCA50C /* BiometricsSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3F74211FFB106200CCA50C /* BiometricsSettingsViewController.swift */; }; + 1B3F74241FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3F74221FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift */; }; + 1BA9FE3D216F68A700BB2DE8 /* BRBech32.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BA9FE3C216F68A700BB2DE8 /* BRBech32.c */; }; + 1BBAEC841F8025C10047DEA8 /* BRTransaction.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEC051F80237B0047DEA8 /* BRTransaction.c */; }; + 1BBAEC851F8025C90047DEA8 /* BRPeer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBFF1F80237B0047DEA8 /* BRPeer.c */; }; + 1BBAEC861F8025D20047DEA8 /* BRBIP38Key.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBEF1F80237B0047DEA8 /* BRBIP38Key.c */; }; + 1BBAEC871F8025D80047DEA8 /* BRAddress.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBE81F80237B0047DEA8 /* BRAddress.c */; }; + 1BBAEC881F8025DF0047DEA8 /* BRBase58.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBEB1F80237B0047DEA8 /* BRBase58.c */; }; + 1BBAEC891F8025E60047DEA8 /* BRBloomFilter.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBF41F80237B0047DEA8 /* BRBloomFilter.c */; }; + 1BBAEC8A1F8025EF0047DEA8 /* BRBIP39Mnemonic.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBF11F80237B0047DEA8 /* BRBIP39Mnemonic.c */; }; + 1BBAEC8B1F8025F60047DEA8 /* BRKey.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBF91F80237B0047DEA8 /* BRKey.c */; }; + 1BBAEC8C1F8025FC0047DEA8 /* BRPeerManager.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEC011F80237B0047DEA8 /* BRPeerManager.c */; }; + 1BBAEC8D1F8026030047DEA8 /* BRPaymentProtocol.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBFD1F80237B0047DEA8 /* BRPaymentProtocol.c */; }; + 1BBAEC8E1F8026090047DEA8 /* BRCrypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEC7D1F8025020047DEA8 /* BRCrypto.c */; }; + 1BBAEC8F1F8026130047DEA8 /* BRSet.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEC031F80237B0047DEA8 /* BRSet.c */; }; + 1BBAEC901F80261D0047DEA8 /* BRMerkleBlock.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBFB1F80237B0047DEA8 /* BRMerkleBlock.c */; }; + 1BBAEC911F8026250047DEA8 /* BRBIP32Sequence.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEBED1F80237B0047DEA8 /* BRBIP32Sequence.c */; }; + 1BBAEC921F80262A0047DEA8 /* BRWallet.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BBAEC071F80237B0047DEA8 /* BRWallet.c */; }; + 22122B721F0B8996000E9AB9 /* BRAPIClient+Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22122B711F0B8996000E9AB9 /* BRAPIClient+Events.swift */; }; + 222319B21F279B3C00008F20 /* POSTBouncer.html in Resources */ = {isa = PBXBuildFile; fileRef = 222319B11F279B3C00008F20 /* POSTBouncer.html */; }; + 2228734F1E916FC30044BA15 /* BRAPIClient+Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2228734E1E916FC30044BA15 /* BRAPIClient+Wallet.swift */; }; + 222C42501E90492800078EB5 /* BRAPIClient+KV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 222C424F1E90492800078EB5 /* BRAPIClient+KV.swift */; }; + 223DB2151DF654940076A151 /* WalletManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75519F331DC7D20500EDF66C /* WalletManager.swift */; }; + 223DB2191DF691260076A151 /* BRSocketHelpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 223DB2171DF691260076A151 /* BRSocketHelpers.c */; }; + 22A9A9461DF61945000F0016 /* BRAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9321DF61945000F0016 /* BRAPIClient.swift */; }; + 22A9A94B1DF61945000F0016 /* BRCoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9371DF61945000F0016 /* BRCoding.swift */; }; + 22A9A9511DF61945000F0016 /* TxMetaData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A93D1DF61945000F0016 /* TxMetaData.swift */; }; + 22A9A9541DF61945000F0016 /* BRReplicatedKVStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9401DF61945000F0016 /* BRReplicatedKVStore.swift */; }; + 22A9A9591DF61945000F0016 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9451DF61945000F0016 /* Extensions.swift */; }; + 22A9A95E1DF61FD0000F0016 /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A95D1DF61FD0000F0016 /* PushKit.framework */; }; + 22A9A9601DF61FD8000F0016 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A95F1DF61FD8000F0016 /* CoreLocation.framework */; }; + 22A9A9621DF61FE0000F0016 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9611DF61FE0000F0016 /* SystemConfiguration.framework */; }; + 22A9A9641DF61FE7000F0016 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9631DF61FE7000F0016 /* Security.framework */; }; + 22A9A9661DF61FEE000F0016 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9651DF61FEE000F0016 /* WebKit.framework */; }; + 24016D9023F913C1006A6791 /* LWAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24016D8F23F913C1006A6791 /* LWAnalytics.swift */; }; + 2427342D2381C21800E2D22F /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2427342B2381C21800E2D22F /* MainViewController.swift */; }; + 24306797238F3DF900EBEA99 /* BartyCrouch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24306796238F3DF900EBEA99 /* BartyCrouch.swift */; }; + 24313C752381E73200A83F69 /* TransactionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C732381E73200A83F69 /* TransactionManager.swift */; }; + 24313C7B23820BC200A83F69 /* SendLTCViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C7923820BC200A83F69 /* SendLTCViewController.swift */; }; + 24313C7E23820C1900A83F69 /* TransactionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C7C23820C1900A83F69 /* TransactionsViewController.swift */; }; + 24313C8423820C4B00A83F69 /* ReceiveLTCViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C8223820C4B00A83F69 /* ReceiveLTCViewController.swift */; }; + 24313C8723821B8C00A83F69 /* PromptTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C8523821B8C00A83F69 /* PromptTableViewCell.swift */; }; + 24313C922382433700A83F69 /* LFModalReceiveQRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24313C902382433700A83F69 /* LFModalReceiveQRViewController.swift */; }; + 24313C9B23824F5800A83F69 /* Transactions.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9323824F5700A83F69 /* Transactions.storyboard */; }; + 24313C9D23824F5800A83F69 /* Alerts.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9423824F5700A83F69 /* Alerts.storyboard */; }; + 24313C9F23824F5800A83F69 /* Animate.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9523824F5700A83F69 /* Animate.storyboard */; }; + 24313CA123824F5800A83F69 /* Receive.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9623824F5800A83F69 /* Receive.storyboard */; }; + 24313CA323824F5800A83F69 /* Send.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9723824F5800A83F69 /* Send.storyboard */; }; + 24313CA523824F5800A83F69 /* Buy.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313C9823824F5800A83F69 /* Buy.storyboard */; }; + 24313CAA23824F9800A83F69 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24313CA823824F9800A83F69 /* Main.storyboard */; }; + 24393B5C23C259400075218D /* Phrase.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24393B5B23C259400075218D /* Phrase.storyboard */; }; + 24470E2123A5DA9700ADDA27 /* APIManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2023A5DA9700ADDA27 /* APIManagerTests.swift */; }; + 24470E2323A5DB7D00ADDA27 /* WalletManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2223A5DB7D00ADDA27 /* WalletManagerTests.swift */; }; + 24470E2A23A5F33000ADDA27 /* BRReplicatedKVStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2923A5F33000ADDA27 /* BRReplicatedKVStoreTests.swift */; }; + 24470E2C23A5F43B00ADDA27 /* DefaultFiatCurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2B23A5F43B00ADDA27 /* DefaultFiatCurrencyTests.swift */; }; + 24470E2E23A5F4FF00ADDA27 /* BRCoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2D23A5F4FF00ADDA27 /* BRCoderTests.swift */; }; + 24470E3223A5F5B100ADDA27 /* NSDataExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3123A5F5B100ADDA27 /* NSDataExtensionTests.swift */; }; + 24470E3423A5F5E600ADDA27 /* PaymentRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3323A5F5E600ADDA27 /* PaymentRequestTests.swift */; }; + 24470E3623A5FDE800ADDA27 /* PhraseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3523A5FDE800ADDA27 /* PhraseTests.swift */; }; + 24470E3823A5FEF200ADDA27 /* SpendingLimitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3723A5FEF200ADDA27 /* SpendingLimitTests.swift */; }; + 24470E3A23A5FF5700ADDA27 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3923A5FF5700ADDA27 /* TestHelpers.swift */; }; + 24470E3C23A5FFD700ADDA27 /* TouchIdEnabledTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3B23A5FFD700ADDA27 /* TouchIdEnabledTests.swift */; }; + 24470E3E23A6000900ADDA27 /* WalletAuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3D23A6000900ADDA27 /* WalletAuthenticationTests.swift */; }; + 24470E4023A6004800ADDA27 /* WalletCreationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E3F23A6004800ADDA27 /* WalletCreationTests.swift */; }; + 24470E4223A6007200ADDA27 /* WalletInfoTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E4123A6007200ADDA27 /* WalletInfoTest.swift */; }; + 24470E4523A608A700ADDA27 /* AmountTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E4423A608A700ADDA27 /* AmountTests.swift */; }; + 24470E4723A6B6E900ADDA27 /* MockSeeds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E4623A6B6E900ADDA27 /* MockSeeds.swift */; }; + 24670EAE2368EDE7006093E0 /* LFColorPalette.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 24670EAC2368EDE7006093E0 /* LFColorPalette.xcassets */; }; + 2485F7D023728C19005962F1 /* RELEASE_NOTES.md in Resources */ = {isa = PBXBuildFile; fileRef = 2485F7CE23728C19005962F1 /* RELEASE_NOTES.md */; }; + 248BFE2623AB302200CE1A71 /* BuyWKWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 248BFE2523AB302200CE1A71 /* BuyWKWebViewController.swift */; }; + 2494037623AD35C000369261 /* BuyWKWebVCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2494037523AD35C000369261 /* BuyWKWebVCTests.swift */; }; + 2494037823AD53B900369261 /* ChildViewTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2494037723AD53B900369261 /* ChildViewTransitioningDelegate.swift */; }; + 2494037E23AE0C7100369261 /* SyncProgressHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2494037C23AE0C7100369261 /* SyncProgressHeaderView.swift */; }; + 2494037F23AE0C7100369261 /* SyncProgressHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2494037D23AE0C7100369261 /* SyncProgressHeaderView.xib */; }; + 2494038123AF208F00369261 /* PromptModalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2494038023AF208F00369261 /* PromptModalViewController.swift */; }; + 24A6DCFC2230BD9000505F44 /* WipeEmptyWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A6DCFA2230BD9000505F44 /* WipeEmptyWalletViewController.swift */; }; + 24AF00FE221B331D00FF636F /* WarningConfirmation.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24AF00FC221B331D00FF636F /* WarningConfirmation.storyboard */; }; + 24AF0101221B349100FF636F /* WarningConfirmationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24AF00FF221B349100FF636F /* WarningConfirmationViewController.swift */; }; + 24B523AD238A53DC0030594D /* BIP39Words.plist in Resources */ = {isa = PBXBuildFile; fileRef = 24B523AF238A53DC0030594D /* BIP39Words.plist */; }; + 24B8FAC4216128A000A155B1 /* PartnerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8FAC3216128A000A155B1 /* PartnerData.swift */; }; + 24B8FAD22162B10200A155B1 /* BuyCenterWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8FAD12162B10200A155B1 /* BuyCenterWebViewController.swift */; }; + 24B8FADF2163C4D400A155B1 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8FADE2163C4D400A155B1 /* Currency.swift */; }; + 24BA90C62410129E001E3825 /* FeeSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24BA90C52410129E001E3825 /* FeeSelectorView.swift */; }; + 24D5F23822599C0B00225462 /* BarlowSemiCondensed-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F22522599C0900225462 /* BarlowSemiCondensed-Italic.ttf */; }; + 24D5F23B22599C0B00225462 /* BarlowSemiCondensed-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F22622599C0A00225462 /* BarlowSemiCondensed-Bold.ttf */; }; + 24D5F25022599C0B00225462 /* BarlowSemiCondensed-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F22D22599C0A00225462 /* BarlowSemiCondensed-Light.ttf */; }; + 24D5F25922599C0B00225462 /* BarlowSemiCondensed-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F23022599C0B00225462 /* BarlowSemiCondensed-Medium.ttf */; }; + 24D5F25F22599C0B00225462 /* BarlowSemiCondensed-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F23222599C0B00225462 /* BarlowSemiCondensed-Regular.ttf */; }; + 24D5F26522599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 24D5F23422599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf */; }; + 24D5F26F225A5BEA00225462 /* ContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24D5F26D225A5BEA00225462 /* ContainerViewController.swift */; }; + 24D91D0B2166923E0077A619 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D91D0A2166923E0077A619 /* UserNotifications.framework */; }; + 24DFCE6823B89CDE001F17F8 /* Settings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 24DFCE6723B89CDE001F17F8 /* Settings.storyboard */; }; + 584E24F32951C11A005E0E8B /* Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24F22951C119005E0E8B /* Localization.swift */; }; + 584E24F52951D2DC005E0E8B /* BundleExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24F42951D2DB005E0E8B /* BundleExtension.swift */; }; + 584E24F82951D412005E0E8B /* LanguageSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24F72951D412005E0E8B /* LanguageSelectionViewController.swift */; }; + 584E24FA2951D43A005E0E8B /* LanguageSelectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24F92951D43A005E0E8B /* LanguageSelectionViewModel.swift */; }; + 584E24FC2951D476005E0E8B /* NSNotificationNameExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24FB2951D476005E0E8B /* NSNotificationNameExtension.swift */; }; + 584E24FE2951D752005E0E8B /* UITableViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E24FD2951D752005E0E8B /* UITableViewExtension.swift */; }; + 584E25012951DAAA005E0E8B /* LanguageSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584E25002951DAAA005E0E8B /* LanguageSelectionTests.swift */; }; + 7503773D1DF57428005EB8AE /* WalletManager+Auth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7503773C1DF57428005EB8AE /* WalletManager+Auth.swift */; }; + 751734B91DAC941E00193C87 /* sec-sub-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8BE1DAA16820075898E /* sec-sub-1.c */; }; + 752438751DAAC50800844BEC /* alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6761DAA0E400075898E /* alloc.c */; }; + 752438761DAAC52700844BEC /* config_file.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD67A1DAA0E400075898E /* config_file.c */; }; + 752438771DAAC55C00844BEC /* net_help.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6981DAA0E400075898E /* net_help.c */; }; + 752438781DAAC58E00844BEC /* msgreply.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6891DAA0E400075898E /* msgreply.c */; }; + 752438791DAAC5A600844BEC /* rtt.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6A21DAA0E400075898E /* rtt.c */; }; + 7524387A1DAAC5D100844BEC /* context.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4101DAA0E3E0075898E /* context.c */; }; + 7524387B1DAAC5F200844BEC /* dname.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6831DAA0E400075898E /* dname.c */; }; + 7524387C1DAAC61700844BEC /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6921DAA0E400075898E /* log.c */; }; + 7524387D1DAAC63A00844BEC /* fptr_wlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD68D1DAA0E400075898E /* fptr_wlist.c */; }; + 7524387E1DAAC65C00844BEC /* dnstree.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6A51DAA0E400075898E /* dnstree.c */; }; + 7524387F1DAAC67F00844BEC /* val_anchor.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6B91DAA0E400075898E /* val_anchor.c */; }; + 752438801DAAC6A200844BEC /* as112.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6781DAA0E400075898E /* as112.c */; }; + 752438811DAAC6C100844BEC /* autotrust.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6B71DAA0E400075898E /* autotrust.c */; }; + 752438821DAAC6E200844BEC /* val_sigcrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6C71DAA0E400075898E /* val_sigcrypt.c */; }; + 752438831DAAC74300844BEC /* libworker.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4131DAA0E3E0075898E /* libworker.c */; }; + 752438841DAAC76500844BEC /* netevent.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD69A1DAA0E400075898E /* netevent.c */; }; + 752438851DAAC7E500844BEC /* dns64.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3DB1DAA0E3E0075898E /* dns64.c */; }; + 752438861DAAC86200844BEC /* dns.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4751DAA0E3E0075898E /* dns.c */; }; + 752438871DAAC87E00844BEC /* iter_delegpt.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3FD1DAA0E3E0075898E /* iter_delegpt.c */; }; + 752438881DAAC8B000844BEC /* val_secalgo.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6C51DAA0E400075898E /* val_secalgo.c */; }; + 7528D2981ECF655500925DBC /* PaymentProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7528D2971ECF655500925DBC /* PaymentProtocol.swift */; }; + 754868CF1DAB57A200732D70 /* msgencode.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6851DAA0E400075898E /* msgencode.c */; }; + 754868D01DAB57BC00732D70 /* iter_fwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4011DAA0E3E0075898E /* iter_fwd.c */; }; + 754868D11DAB57E900732D70 /* packed_rrset.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD68B1DAA0E400075898E /* packed_rrset.c */; }; + 754868D21DAB580B00732D70 /* msgparse.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6871DAA0E400075898E /* msgparse.c */; }; + 754868D31DAB582C00732D70 /* lookup3.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6A71DAA0E400075898E /* lookup3.c */; }; + 754868D41DAB584E00732D70 /* iter_hints.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4031DAA0E3E0075898E /* iter_hints.c */; }; + 754868D51DAB586900732D70 /* infra.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4771DAA0E3E0075898E /* infra.c */; }; + 754868D61DAB588500732D70 /* configlexer.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD67C1DAA0E400075898E /* configlexer.c */; }; + 754868D71DAB58A100732D70 /* iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD40D1DAA0E3E0075898E /* iterator.c */; }; + 754868D81DAB58C000732D70 /* iter_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD40B1DAA0E3E0075898E /* iter_utils.c */; }; + 754868D91DAB58E000732D70 /* iter_donotq.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3FF1DAA0E3E0075898E /* iter_donotq.c */; }; + 754868DA1DAB58F900732D70 /* val_kcache.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6BB1DAA0E400075898E /* val_kcache.c */; }; + 754868DB1DAB591A00732D70 /* val_kentry.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6BD1DAA0E400075898E /* val_kentry.c */; }; + 754868DC1DAB593300732D70 /* localzone.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD47D1DAA0E3E0075898E /* localzone.c */; }; + 754868DD1DAB594F00732D70 /* mesh.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD47F1DAA0E3E0075898E /* mesh.c */; }; + 754868DE1DAB597B00732D70 /* mini_event.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6941DAA0E400075898E /* mini_event.c */; }; + 754868DF1DAB599700732D70 /* modstack.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4811DAA0E3E0075898E /* modstack.c */; }; + 754868E01DAB5A8400732D70 /* mini-gmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD84B1DAA16820075898E /* mini-gmp.c */; }; + 754868E21DAB5B0200732D70 /* bignum.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD75A1DAA16810075898E /* bignum.c */; }; + 754868E31DAB5B3B00732D70 /* rsa.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8B01DAA16820075898E /* rsa.c */; }; + 754868E41DAB5B6400732D70 /* rsa-sha1-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8A61DAA16820075898E /* rsa-sha1-verify.c */; }; + 754868E51DAB5B9200732D70 /* rsa-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8AF1DAA16820075898E /* rsa-verify.c */; }; + 754868E61DAB5BC200732D70 /* pkcs1-rsa-sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD88A1DAA16820075898E /* pkcs1-rsa-sha1.c */; }; + 754868E71DAB5BF900732D70 /* gmp-glue.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8201DAA16810075898E /* gmp-glue.c */; }; + 754868E81DAB5C1F00732D70 /* pkcs1.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD88D1DAA16820075898E /* pkcs1.c */; }; + 754868E91DAB5C3E00732D70 /* rsa-sha256-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8A91DAA16820075898E /* rsa-sha256-verify.c */; }; + 754868EA1DAB5C6200732D70 /* pkcs1-rsa-sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD88B1DAA16820075898E /* pkcs1-rsa-sha256.c */; }; + 754868EB1DAB5C8200732D70 /* rsa-sha512-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8AC1DAA16820075898E /* rsa-sha512-verify.c */; }; + 754868EC1DAB5CA400732D70 /* pkcs1-rsa-sha512.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD88C1DAA16820075898E /* pkcs1-rsa-sha512.c */; }; + 754868ED1DAB5CF400732D70 /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8D21DAA16820075898E /* sha1.c */; }; + 754868EE1DAB5D2100732D70 /* sha1-compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8D01DAA16820075898E /* sha1-compress.c */; }; + 754868EF1DAB5D6B00732D70 /* write-be32.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD9841DAA16830075898E /* write-be32.c */; }; + 754868F01DAB5D6F00732D70 /* sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8D81DAA16820075898E /* sha256.c */; }; + 754868F11DAB5D9900732D70 /* sha256-compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8D61DAA16820075898E /* sha256-compress.c */; }; + 754868F21DAB5DC900732D70 /* sha512.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8E91DAA16820075898E /* sha512.c */; }; + 754868F31DAB5DEB00732D70 /* sha512-compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8E71DAA16820075898E /* sha512-compress.c */; }; + 754868F41DAB5E1100732D70 /* val_nsec3.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6C31DAA0E400075898E /* val_nsec3.c */; }; + 754868F51DAB5E3F00732D70 /* val_nsec.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6C11DAA0E400075898E /* val_nsec.c */; }; + 754868F61DAB5E6200732D70 /* outbound_list.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4831DAA0E3E0075898E /* outbound_list.c */; }; + 754868F71DAB5E8E00732D70 /* outside_network.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4851DAA0E3E0075898E /* outside_network.c */; }; + 754868F81DAB5EB500732D70 /* listen_dnsport.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD47B1DAA0E3E0075898E /* listen_dnsport.c */; }; + 754868F91DAB5EDC00732D70 /* iter_priv.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4051DAA0E3E0075898E /* iter_priv.c */; }; + 754868FA1DAB5EFE00732D70 /* rbtree.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD69E1DAA0E400075898E /* rbtree.c */; }; + 754868FB1DAB5FAD00732D70 /* regional.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6A01DAA0E400075898E /* regional.c */; }; + 754868FC1DAB5FD600732D70 /* iter_resptype.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4071DAA0E3E0075898E /* iter_resptype.c */; }; + 754868FD1DAB5FF700732D70 /* rrset.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4791DAA0E3E0075898E /* rrset.c */; }; + 754868FE1DAB601A00732D70 /* lruhash.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6A91DAA0E400075898E /* lruhash.c */; }; + 754868FF1DAB7AB200732D70 /* iter_scrub.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4091DAA0E3E0075898E /* iter_scrub.c */; }; + 754869001DAB7AD100732D70 /* slabhash.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6AB1DAA0E400075898E /* slabhash.c */; }; + 754869011DAB7B0000732D70 /* wire2str.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4951DAA0E3E0075898E /* wire2str.c */; }; + 754869021DAB7B1D00732D70 /* parseutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD48C1DAA0E3E0075898E /* parseutil.c */; }; + 754869031DAB7B3F00732D70 /* sbuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4911DAA0E3E0075898E /* sbuffer.c */; }; + 754869041DAB7B6200732D70 /* keyraw.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4881DAA0E3E0075898E /* keyraw.c */; }; + 754869051DAB7B7F00732D70 /* str2wire.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4931DAA0E3E0075898E /* str2wire.c */; }; + 754869061DAB7B9900732D70 /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD48A1DAA0E3E0075898E /* parse.c */; }; + 754869071DAB7BB500732D70 /* rrdef.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD48F1DAA0E3E0075898E /* rrdef.c */; }; + 754869081DAB7BD900732D70 /* module.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6961DAA0E400075898E /* module.c */; }; + 754869091DAB7C1400732D70 /* timehist.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6AD1DAA0E400075898E /* timehist.c */; }; + 7548690A1DAB7C3000732D70 /* tube.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6AF1DAA0E400075898E /* tube.c */; }; + 7548690B1DAB7C7200732D70 /* random.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD69C1DAA0E400075898E /* random.c */; }; + 7548690C1DAB7CB600732D70 /* validator.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6CB1DAA0E400075898E /* validator.c */; }; + 7548690D1DAB7CD600732D70 /* val_neg.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6BF1DAA0E400075898E /* val_neg.c */; }; + 7548690E1DAB7CFA00732D70 /* yarrow256.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD9BE1DAA16830075898E /* yarrow256.c */; }; + 7548690F1DAB7D1800732D70 /* aes-encrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD70E1DAA16810075898E /* aes-encrypt.c */; }; + 754869101DAB7D4300732D70 /* aes-encrypt-internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD70C1DAA16810075898E /* aes-encrypt-internal.c */; }; + 754869111DAB7D6F00732D70 /* aes-encrypt-table.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD70D1DAA16810075898E /* aes-encrypt-table.c */; }; + 754869121DAB7D9C00732D70 /* aes256-set-encrypt-key.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD71D1DAA16810075898E /* aes256-set-encrypt-key.c */; }; + 754869131DAB7DC200732D70 /* aes-set-key-internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7131DAA16810075898E /* aes-set-key-internal.c */; }; + 754869141DAB7E4600732D70 /* ub_event.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6B11DAA0E400075898E /* ub_event.c */; }; + 754869151DAB7E8B00732D70 /* val_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD6C91DAA0E400075898E /* val_utils.c */; }; + 754869161DAB7F5C00732D70 /* strsep.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3A91DAA0E3E0075898E /* strsep.c */; }; + 754869171DAB7F7B00732D70 /* strlcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3A61DAA0E3E0075898E /* strlcat.c */; }; + 754869181DAB7F8000732D70 /* strlcpy.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3A71DAA0E3E0075898E /* strlcpy.c */; }; + 754869191DAB7F9D00732D70 /* reallocarray.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD3A31DAA0E3E0075898E /* reallocarray.c */; }; + 7548691A1DAB7FD600732D70 /* configparser.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD67E1DAA0E400075898E /* configparser.c */; }; + 754AE0BC1DFE8A46007FD001 /* BRCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754AE0BB1DFE8A46007FD001 /* BRCore.swift */; }; + 759DA0A11DAB838D008CC49B /* view.c in Sources */ = {isa = PBXBuildFile; fileRef = 759DA09F1DAB838D008CC49B /* view.c */; }; + 759DA0A31DAC0D6B008CC49B /* dsa.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7AC1DAA16810075898E /* dsa.c */; }; + 759DA0A41DAC0D84008CC49B /* ecc-point.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7D71DAA16810075898E /* ecc-point.c */; }; + 759DA0A51DAC0D9F008CC49B /* ecdsa-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7E01DAA16810075898E /* ecdsa-verify.c */; }; + 759DA0A61DAC0DB8008CC49B /* ecc-ecdsa-verify.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7C81DAA16810075898E /* ecc-ecdsa-verify.c */; }; + 759DA0A71DAC0DD9008CC49B /* ecc-hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7CA1DAA16810075898E /* ecc-hash.c */; }; + 759DA0A81DAC0E01008CC49B /* ecc-mod-arith.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7CD1DAA16810075898E /* ecc-mod-arith.c */; }; + 759DA0A91DAC0E13008CC49B /* ecc-size.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7DB1DAA16810075898E /* ecc-size.c */; }; + 759DA0AB1DAC0E4D008CC49B /* ecc-mul-a.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7D11DAA16810075898E /* ecc-mul-a.c */; }; + 759DA0AC1DAC1572008CC49B /* cnd-copy.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7841DAA16810075898E /* cnd-copy.c */; }; + 759DA0AD1DAC1589008CC49B /* ecc-a-to-j.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7BF1DAA16810075898E /* ecc-a-to-j.c */; }; + 759DA0AE1DAC15A0008CC49B /* ecc-add-jja.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7C21DAA16810075898E /* ecc-add-jja.c */; }; + 759DA0AF1DAC15E3008CC49B /* ecc-add-jjj.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7C31DAA16810075898E /* ecc-add-jjj.c */; }; + 759DA0B01DAC15F6008CC49B /* ecc-dup-jj.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7C61DAA16810075898E /* ecc-dup-jj.c */; }; + 759DA0B11DAC161C008CC49B /* ecc-j-to-a.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7CC1DAA16810075898E /* ecc-j-to-a.c */; }; + 759DA0B21DAC1634008CC49B /* ecc-mod-inv.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7CE1DAA16810075898E /* ecc-mod-inv.c */; }; + 759DA0B31DAC1654008CC49B /* ecc-mul-g.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7D31DAA16810075898E /* ecc-mul-g.c */; }; + 759DA0B41DAC169D008CC49B /* ecc-pp1-redc.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7D81DAA16810075898E /* ecc-pp1-redc.c */; }; + 759DA0B51DAC16C6008CC49B /* sec-tabselect.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8BF1DAA16820075898E /* sec-tabselect.c */; }; + 759DA0B61DAC16E1008CC49B /* ecc-384.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7BC1DAA16810075898E /* ecc-384.c */; }; + 759DA0B71DAC1708008CC49B /* ecc-mod.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7CF1DAA16810075898E /* ecc-mod.c */; }; + 759DA0B81DAC1723008CC49B /* sec-add-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD8BD1DAA16820075898E /* sec-add-1.c */; }; + 759DA0BB1DAC2A4F008CC49B /* ecc-256.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD7B81DAA16810075898E /* ecc-256.c */; }; + 759DA0BE1DAC36A3008CC49B /* libBRCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 755CD9D11DAA197C0075898E /* libBRCore.a */; }; + 75A2A7941DA5934300A983D8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A2A7931DA5934300A983D8 /* AppDelegate.swift */; }; + 75A2A79B1DA5934300A983D8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75A2A79A1DA5934300A983D8 /* Assets.xcassets */; }; + 75A2A79E1DA5934300A983D8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75A2A79C1DA5934300A983D8 /* LaunchScreen.storyboard */; }; + 75A2A80A1DA5936F00A983D8 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75A2A8091DA5936F00A983D8 /* NotificationCenter.framework */; }; + 75A2A8101DA5936F00A983D8 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 75A2A80E1DA5936F00A983D8 /* MainInterface.storyboard */; }; + 75A2A8141DA5936F00A983D8 /* TodayExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 75A2A8081DA5936F00A983D8 /* TodayExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 75C735AA1DAA1B9C00251ECF /* libunbound.c in Sources */ = {isa = PBXBuildFile; fileRef = 755CD4121DAA0E3E0075898E /* libunbound.c */; }; + C30029E225D0185500F08C2B /* StandardDividerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30029E125D0185500F08C2B /* StandardDividerView.swift */; }; + C30029EB25D019BC00F08C2B /* CopyButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30029EA25D019BC00F08C2B /* CopyButtonView.swift */; }; + C3019EE32B8FEFED00FAF648 /* AssociatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3019EE22B8FEFED00FAF648 /* AssociatedObject.swift */; }; + C316CF49261887FC00E4C09B /* UIApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C316CF48261887FC00E4C09B /* UIApplication+Extension.swift */; }; + C3188E2726431E750008ADD1 /* Debug-GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C3188E2526431E750008ADD1 /* Debug-GoogleService-Info.plist */; settings = {ASSET_TAGS = ("initial-resources", ); }; }; + C31891C326733FD400ECE25C /* TabBarViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C31891C226733FD400ECE25C /* TabBarViewControllerTests.swift */; }; + C32142EA25C97CD900BECCD0 /* TransactionCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32142E925C97CD900BECCD0 /* TransactionCellView.swift */; }; + C32142FA25C988C800BECCD0 /* TransactionCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32142F925C988C800BECCD0 /* TransactionCellViewModel.swift */; }; + C32DAE0725925B7E003FC978 /* Color+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32DAE0625925B7E003FC978 /* Color+Extension.swift */; }; + C32DB42F26488CAA00017D26 /* TabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32DB42E26488CAA00017D26 /* TabBarViewController.swift */; }; + C33685092BECE8B10069CBC7 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C33685082BECE8B10069CBC7 /* PrivacyInfo.xcprivacy */; }; + C339752127001BEC0071FED6 /* EmailValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C339752027001BEC0071FED6 /* EmailValidation.swift */; }; + C3423C182B781C6B0051BD6D /* PushNotifications in Frameworks */ = {isa = PBXBuildFile; productRef = C3423C172B781C6B0051BD6D /* PushNotifications */; }; + C3423C1A2B79039D0051BD6D /* LaunchCardHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C192B79039D0051BD6D /* LaunchCardHostingController.swift */; }; + C3423C1C2B7903CA0051BD6D /* LaunchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C1B2B7903CA0051BD6D /* LaunchView.swift */; }; + C3423C1E2B7904070051BD6D /* StartHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C1D2B7904070051BD6D /* StartHostingController.swift */; }; + C3423C202B79046A0051BD6D /* StartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C1F2B79046A0051BD6D /* StartView.swift */; }; + C3423C222B79047D0051BD6D /* StartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C212B79047D0051BD6D /* StartViewModel.swift */; }; + C3423C242B7904B80051BD6D /* SeedWordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C232B7904B80051BD6D /* SeedWordView.swift */; }; + C3423C262B7904E30051BD6D /* AnnounceUpdatesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C252B7904E30051BD6D /* AnnounceUpdatesView.swift */; }; + C3423C2A2B7905330051BD6D /* SafariServices+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C272B7905330051BD6D /* SafariServices+Extension.swift */; }; + C3423C2B2B7905330051BD6D /* SignupWebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C282B7905330051BD6D /* SignupWebViewModel.swift */; }; + C3423C2C2B7905330051BD6D /* SignupWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3423C292B7905330051BD6D /* SignupWebView.swift */; }; + C3423C3E2B796D820051BD6D /* 日本語.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C302B796D820051BD6D /* 日本語.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C3F2B796D820051BD6D /* Pt.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C312B796D820051BD6D /* Pt.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C402B796D820051BD6D /* De.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C322B796D820051BD6D /* De.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C412B796D820051BD6D /* En.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C332B796D820051BD6D /* En.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C422B796D820051BD6D /* coinflip.aiff in Resources */ = {isa = PBXBuildFile; fileRef = C3423C342B796D820051BD6D /* coinflip.aiff */; settings = {ASSET_TAGS = ("initial-resources", ); }; }; + C3423C432B796D820051BD6D /* Uk.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C352B796D820051BD6D /* Uk.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C442B796D820051BD6D /* Fr.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C362B796D820051BD6D /* Fr.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C452B796D820051BD6D /* 中國人.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C372B796D820051BD6D /* 中國人.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C462B796D820051BD6D /* Id.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C382B796D820051BD6D /* Id.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C472B796D820051BD6D /* Tr.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C392B796D820051BD6D /* Tr.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C482B796D820051BD6D /* Es.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C3A2B796D820051BD6D /* Es.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C492B796D820051BD6D /* Ko.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C3B2B796D820051BD6D /* Ko.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C4A2B796D820051BD6D /* It.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C3C2B796D820051BD6D /* It.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C3423C4B2B796D820051BD6D /* Ru.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C3423C3D2B796D820051BD6D /* Ru.mp3 */; settings = {ASSET_TAGS = (speakTag, ); }; }; + C350788C27DCB10700A50819 /* TextView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C350788B27DCB10700A50819 /* TextView+Extension.swift */; }; + C3543A27264AFE490005D17A /* LocaleChangeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3543A26264AFE490005D17A /* LocaleChangeView.swift */; }; + C3543A29264AFE720005D17A /* LocaleChangeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3543A28264AFE720005D17A /* LocaleChangeViewModel.swift */; }; + C35ABD232574070A002BB9BB /* PartnersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35ABD222574070A002BB9BB /* PartnersView.swift */; }; + C35ABD332574073F002BB9BB /* PartnersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35ABD322574073F002BB9BB /* PartnersViewModel.swift */; }; + C35C1220293D464A0009022D /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = C35C121F293D464A0009022D /* FirebaseAnalytics */; }; + C35C1222293D464A0009022D /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = C35C1221293D464A0009022D /* FirebaseAuth */; }; + C35C1224293D464A0009022D /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = C35C1223293D464A0009022D /* FirebaseCrashlytics */; }; + C35C122A293D48340009022D /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = C35C1229293D48340009022D /* KeychainAccess */; }; + C361F48228B368BC00E9798F /* AddressFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C361F48128B368BC00E9798F /* AddressFieldView.swift */; }; + C36375A328BD38A500CFB3D8 /* SendButtonHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C36375A228BD38A500CFB3D8 /* SendButtonHostingController.swift */; }; + C36375A528BD390C00CFB3D8 /* SendButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C36375A428BD390C00CFB3D8 /* SendButtonView.swift */; }; + C36DBF5F28F18D2C00FBCB24 /* LocalWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C36DBF5E28F18D2C00FBCB24 /* LocalWebView.swift */; }; + C36DBF6128F1988900FBCB24 /* LocalWebViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C36DBF6028F1988900FBCB24 /* LocalWebViewModel.swift */; }; + C39443F9269DDAD3002703E9 /* LitewalletIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C39443F8269DDAD3002703E9 /* LitewalletIconView.swift */; }; + C39A71472608CB4300E7B640 /* EmptyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C39A71462608CB4300E7B640 /* EmptyTableViewCell.swift */; }; + C3B419CB2BFCF14100EBD935 /* BuyHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B419CA2BFCF14100EBD935 /* BuyHostingController.swift */; }; + C3B419CD2BFCF17600EBD935 /* BuyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B419CC2BFCF17600EBD935 /* BuyView.swift */; }; + C3B7C3B9255EABBF00E98A64 /* SupportSafariViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7C3B8255EABBF00E98A64 /* SupportSafariViewModel.swift */; }; + C3B7C3EE255FF59200E98A64 /* ConstantsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7C3ED255FF59200E98A64 /* ConstantsTests.swift */; }; + C3BD4A5325975C6000D97079 /* View+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BD4A5225975C6000D97079 /* View+Extension.swift */; }; + C3C8973825CD6B9300241FBE /* HostingTransactionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C8973725CD6B9300241FBE /* HostingTransactionCell.swift */; }; + C3D4379F2566EA3E00F423E1 /* LWActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D4379E2566EA3E00F423E1 /* LWActivityIndicator.swift */; }; + C3DBBE312BFE15AF00B95939 /* BuyTileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DBBE302BFE15AF00B95939 /* BuyTileView.swift */; }; + C3E5A9052BFDEEF1002FBE04 /* BuyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E5A9042BFDEEF1002FBE04 /* BuyViewModel.swift */; }; + C3E751C22AF689BA005571CA /* BRKeyExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751C12AF689BA005571CA /* BRKeyExtension.swift */; }; + C3E751C42AF68A50005571CA /* BRAddressExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751C32AF68A50005571CA /* BRAddressExtension.swift */; }; + C3E751C62AF68A8E005571CA /* BRTxInputExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751C52AF68A8E005571CA /* BRTxInputExtension.swift */; }; + C3E751C82AF68AEB005571CA /* UnsafeMutablePointerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751C72AF68AEB005571CA /* UnsafeMutablePointerExtension.swift */; }; + C3E751CB2AF68B47005571CA /* BRPeerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751CA2AF68B47005571CA /* BRPeerManager.swift */; }; + C3E751CD2AF68B93005571CA /* BRWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751CC2AF68B93005571CA /* BRWallet.swift */; }; + C3E751CF2AF68C18005571CA /* BRCalculationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751CE2AF68C18005571CA /* BRCalculationExtension.swift */; }; + C3E751D12AF68C84005571CA /* BRMasterKeyExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751D02AF68C84005571CA /* BRMasterKeyExtension.swift */; }; + C3E751D32AF68CD1005571CA /* BRTxOutputExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E751D22AF68CD1005571CA /* BRTxOutputExtension.swift */; }; + C3EFA9A12650807B005C59B5 /* LockScreenHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3EFA9A02650807B005C59B5 /* LockScreenHeaderView.swift */; }; + C3EFA9A3265080FF005C59B5 /* LockScreenHeaderViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3EFA9A2265080FF005C59B5 /* LockScreenHeaderViewModel.swift */; }; + C3EFA9A62651A808005C59B5 /* LockScreenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3EFA9A52651A808005C59B5 /* LockScreenTests.swift */; }; + C3F7BD0325FEC77100694C28 /* TransactionModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */; }; + C3F8F13C2C049A4A006C3211 /* LocaleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F8F13B2C049A4A006C3211 /* LocaleTests.swift */; }; + C3F8F13E2C04C3A7006C3211 /* MoonpayHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F8F13D2C04C3A7006C3211 /* MoonpayHelper.swift */; }; + C3F8F1422C04DEA2006C3211 /* NoBuyTabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F8F1412C04DEA2006C3211 /* NoBuyTabBarViewController.swift */; }; + C3F8F1442C04F6BE006C3211 /* Dakar, Senegal.gpx in Resources */ = {isa = PBXBuildFile; fileRef = C3F8F1432C04F6BE006C3211 /* Dakar, Senegal.gpx */; }; + C3F8F1462C05269A006C3211 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C3F8F1452C05269A006C3211 /* GoogleService-Info.plist */; settings = {ASSET_TAGS = ("initial-resources", ); }; }; + C3FF4D5F28AC5A5800713139 /* SendAddressCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FF4D5E28AC5A5800713139 /* SendAddressCellView.swift */; }; + C3FF4D6128AC5AC100713139 /* SendAddressCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FF4D6028AC5AC100713139 /* SendAddressCellViewModel.swift */; }; + C7FD407F2C48FAF60010C0E6 /* partner-keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = C7FD407E2C48FAF60010C0E6 /* partner-keys.plist */; }; + CE03EC741EF256AC0038E3A8 /* SimpleUTXO.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE03EC731EF256AC0038E3A8 /* SimpleUTXO.swift */; }; + CE0CD1591DBFBCF5004023DA /* ModalPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0CD1581DBFBCF5004023DA /* ModalPresenter.swift */; }; + CE124CF81E67A8E500DFA146 /* TransactionDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE124CF71E67A8E500DFA146 /* TransactionDirection.swift */; }; + CE124CFC1E68932C00DFA146 /* FeeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE124CFB1E68932C00DFA146 /* FeeManager.swift */; }; + CE124CFE1E68F57700DFA146 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE124CFD1E68F57700DFA146 /* Async.swift */; }; + CE124D001E69170900DFA146 /* SyncingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE124CFF1E69170900DFA146 /* SyncingView.swift */; }; + CE1280F61EEA855C00D27649 /* Date+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1280F51EEA855C00D27649 /* Date+Additions.swift */; }; + CE1D84B61EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1D84B51EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift */; }; + CE1E5F261EF083A600BD0F72 /* StartImportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1E5F251EF083A600BD0F72 /* StartImportViewController.swift */; }; + CE20C8F21DBAF71500C8397A /* ApplicationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C8F11DBAF71500C8397A /* ApplicationController.swift */; }; + CE20C8F61DBAF77D00C8397A /* UIViewController+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C8F51DBAF77D00C8397A /* UIViewController+BRWAdditions.swift */; }; + CE20C8FC1DBB0F3A00C8397A /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C8FB1DBB0F3A00C8397A /* UIColor+Extension.swift */; }; + CE20C8FE1DBB133A00C8397A /* SimpleRedux.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C8FD1DBB133A00C8397A /* SimpleRedux.swift */; }; + CE20C9011DBBFFF800C8397A /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C9001DBBFFF800C8397A /* Actions.swift */; }; + CE20C9071DBC587200C8397A /* StartViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C9061DBC587200C8397A /* StartViewController.swift */; }; + CE20C90C1DBC59E600C8397A /* StartFlowPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C90B1DBC59E600C8397A /* StartFlowPresenter.swift */; }; + CE20C90E1DBE52B000C8397A /* UIView+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C90D1DBE52B000C8397A /* UIView+BRWAdditions.swift */; }; + CE20C9111DBE5B6F00C8397A /* Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C9101DBE5B6F00C8397A /* Circle.swift */; }; + CE20C9171DBE6F2A00C8397A /* UIButton+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C9161DBE6F2A00C8397A /* UIButton+BRWAdditions.swift */; }; + CE20C9191DBE7B8200C8397A /* ReduxState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE20C9181DBE7B8200C8397A /* ReduxState.swift */; }; + CE25BF8D1DF3B8A500BC67B6 /* InViewAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE25BF8C1DF3B8A500BC67B6 /* InViewAlert.swift */; }; + CE25BF911DF9ADE700BC67B6 /* UIImage+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE25BF901DF9ADE700BC67B6 /* UIImage+Utils.swift */; }; + CE25BF931DFDA7A600BC67B6 /* MessageUIPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE25BF921DFDA7A500BC67B6 /* MessageUIPresenter.swift */; }; + CE27F9591E2C8EA300F7F7F2 /* Amount.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE27F9581E2C8EA300F7F7F2 /* Amount.swift */; }; + CE29901A1EFD6DE50093A0F2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CE29901C1EFD6DE50093A0F2 /* Localizable.strings */; }; + CE36454C1E7B42850079D0CF /* PinPadCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE36454B1E7B42850079D0CF /* PinPadCells.swift */; }; + CE3D4C571EF5D5740016B1C8 /* ReachabilityMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3D4C561EF5D5740016B1C8 /* ReachabilityMonitor.swift */; }; + CE3D4C591EF743EF0016B1C8 /* Functions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE3D4C581EF743EF0016B1C8 /* Functions.swift */; }; + CE44BA1B1F33BFC500392A1A /* NodeSelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE44BA1A1F33BFC500392A1A /* NodeSelectorViewController.swift */; }; + CE45C1F91E74B400002C3847 /* ManageWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE45C1F81E74B400002C3847 /* ManageWalletViewController.swift */; }; + CE45C1FB1E74F89C002C3847 /* WalletInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE45C1FA1E74F89C002C3847 /* WalletInfo.swift */; }; + CE45C1FD1E7650F5002C3847 /* KVStoreCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE45C1FC1E7650F5002C3847 /* KVStoreCoordinator.swift */; }; + CE47A8E01F7DA54000FF35BA /* UIScreen+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE47A8DF1F7DA54000FF35BA /* UIScreen+Additions.swift */; }; + CE4B6C1A1E219CA600CF935B /* WalletCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4B6C191E219CA600CF935B /* WalletCoordinator.swift */; }; + CE4C1CC61ED65D830063E184 /* DrawableCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4C1CC51ED65D830063E184 /* DrawableCircle.swift */; }; + CE4C1CC81ED88B600063E184 /* URLController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4C1CC71ED88B600063E184 /* URLController.swift */; }; + CE4CA7BC1EE3649100373F11 /* BRActivityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4CA7BB1EE3649100373F11 /* BRActivityView.swift */; }; + CE4DFB2C1E9BE5880014009E /* ReScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DFB2B1E9BE5880014009E /* ReScanViewController.swift */; }; + CE4DFB2E1E9C26DA0014009E /* ShareDataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4DFB2D1E9C26DA0014009E /* ShareDataViewController.swift */; }; + CE5E6C941EB7964900A476DB /* WalletDisabledView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5E6C931EB7964900A476DB /* WalletDisabledView.swift */; }; + CE5E6C9A1EB9135000A476DB /* Icon.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE5E6C991EB9135000A476DB /* Icon.xcassets */; }; + CE5F21D91E4A922700C47B8E /* DismissLoginAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5F21D81E4A922700C47B8E /* DismissLoginAnimator.swift */; }; + CE5F21DB1E4A93A500C47B8E /* LoginTransitionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5F21DA1E4A93A500C47B8E /* LoginTransitionDelegate.swift */; }; + CE6314831E08E5BB00D4AFE0 /* UIView+InitAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6314821E08E5BB00D4AFE0 /* UIView+InitAdditions.swift */; }; + CE6B6B4A1E54C0CB00B31405 /* SecurityCenterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6B6B491E54C0CA00B31405 /* SecurityCenterCell.swift */; }; + CE6BCF5D1EE9E89A0029849C /* CustomTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6BCF5C1EE9E89A0029849C /* CustomTitleView.swift */; }; + CE6D0E5C1E14BFA700137DF1 /* KeyboardNotificationInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6D0E5B1E14BFA600137DF1 /* KeyboardNotificationInfo.swift */; }; + CE6D0F971DE8B73A00BD4BCF /* ModalTransitionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6D0F961DE8B73A00BD4BCF /* ModalTransitionDelegate.swift */; }; + CE6D0F991DE8B75900BD4BCF /* DismissModalAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6D0F981DE8B75900BD4BCF /* DismissModalAnimator.swift */; }; + CE6DCC251E6001E50044257B /* UIControl+Callback.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6DCC241E6001E50044257B /* UIControl+Callback.swift */; }; + CE6DCC271E6108D50044257B /* EnterPhraseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6DCC261E6108D50044257B /* EnterPhraseCell.swift */; }; + CE6DCC301E6666470044257B /* NonScrollingCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6DCC2F1E6666470044257B /* NonScrollingCollectionView.swift */; }; + CE74F58D1E3BA85600ED5FA9 /* ExchangeUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE74F58C1E3BA85600ED5FA9 /* ExchangeUpdater.swift */; }; + CE760EDC1E561DF900EFAC2B /* SecurityCenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE760EDA1E561DF900EFAC2B /* SecurityCenterViewController.swift */; }; + CE760EDD1E561DF900EFAC2B /* UpdatePinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE760EDB1E561DF900EFAC2B /* UpdatePinViewController.swift */; }; + CE83DE2A1E9EB7F600D07636 /* SendAmountCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE83DE291E9EB7F600D07636 /* SendAmountCell.swift */; }; + CE8644251F2C160200033129 /* ConfirmationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8644241F2C160200033129 /* ConfirmationViewController.swift */; }; + CE8CD8DD1E2D9EF200785E02 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8CD8DC1E2D9EF200785E02 /* Sender.swift */; }; + CE8CD8DF1E2E825100785E02 /* VerifyPinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8CD8DE1E2E825000785E02 /* VerifyPinViewController.swift */; }; + CE8CD8E11E31976800785E02 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8CD8E01E31976800785E02 /* LoginViewController.swift */; }; + CE8F0AE31EB91BB500AA7642 /* SearchHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8F0AE21EB91BB500AA7642 /* SearchHeaderView.swift */; }; + CE9057181DFF0FA8006BA848 /* String+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9057171DFF0FA8006BA848 /* String+Additions.swift */; }; + CE90571A1DFF18B2006BA848 /* ScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9057191DFF18B2006BA848 /* ScanViewController.swift */; }; + CE916E2A1EDA7E4400D641D6 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE916E291EDA7E4400D641D6 /* Media.xcassets */; }; + CE916E2E1EDA7ED000D641D6 /* BRBubbleView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE916E2D1EDA7ED000D641D6 /* BRBubbleView.m */; }; + CE916E311EDA7F1400D641D6 /* UIImage+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = CE916E301EDA7F1400D641D6 /* UIImage+Utils.m */; }; + CE916E331EDA800E00D641D6 /* UserDefaultsUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE916E321EDA800E00D641D6 /* UserDefaultsUpdater.swift */; }; + CE916E371EDA855800D641D6 /* BRTodayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CE916E361EDA855800D641D6 /* BRTodayViewController.m */; }; + CE92F9F01DED0C790046B516 /* PresentModalAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE92F9EF1DED0C790046B516 /* PresentModalAnimator.swift */; }; + CE92F9F41DED59E80046B516 /* UIView+AnimationAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE92F9F31DED59E80046B516 /* UIView+AnimationAdditions.swift */; }; + CE92F9F61DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE92F9F51DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift */; }; + CEA362681E00EE320061FC0E /* CameraGuideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA362671E00EE320061FC0E /* CameraGuideView.swift */; }; + CEA3626A1E01150D0061FC0E /* CGContext+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA362691E01150D0061FC0E /* CGContext+Additions.swift */; }; + CEAA9E8F1DC074410066731D /* StartPaperPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E8E1DC074410066731D /* StartPaperPhraseViewController.swift */; }; + CEAA9E911DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E901DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift */; }; + CEAA9E931DC110E70066731D /* WritePaperPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E921DC110E70066731D /* WritePaperPhraseViewController.swift */; }; + CEAA9E951DC1659F0066731D /* UILabel+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E941DC1659F0066731D /* UILabel+BRWAdditions.swift */; }; + CEAA9E971DC18E1F0066731D /* PhraseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E961DC18E1F0066731D /* PhraseView.swift */; }; + CEAA9E991DC262800066731D /* ConfirmPaperPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E981DC262800066731D /* ConfirmPaperPhraseViewController.swift */; }; + CEAA9E9B1DC2B9320066731D /* ConfirmPhrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E9A1DC2B9320066731D /* ConfirmPhrase.swift */; }; + CEAA9EA01DC2F9F50066731D /* UIFont+BRWAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9E9F1DC2F9F50066731D /* UIFont+BRWAdditions.swift */; }; + CEAA9EA61DC3246F0066731D /* StartNavigationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9EA51DC3246F0066731D /* StartNavigationDelegate.swift */; }; + CEAA9EA81DC3342E0066731D /* PinView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAA9EA71DC3342E0066731D /* PinView.swift */; }; + CEAFC8611E5D5B0500E4FD06 /* SegmentedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAFC8601E5D5B0500E4FD06 /* SegmentedButton.swift */; }; + CEB909F51E5FE63D001804DC /* EnterPhraseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB909F41E5FE63D001804DC /* EnterPhraseViewController.swift */; }; + CEB909F71E5FE654001804DC /* EnterPhraseCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB909F61E5FE654001804DC /* EnterPhraseCollectionViewController.swift */; }; + CEB909FA1E5FF242001804DC /* RecoverWalletIntroViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB909F91E5FF242001804DC /* RecoverWalletIntroViewController.swift */; }; + CEBF292E1EF99E55005C330A /* LightWeightAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBF292D1EF99E55005C330A /* LightWeightAlert.swift */; }; + CEBF29301EF9D76F005C330A /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBF292F1EF9D76F005C330A /* Environment.swift */; }; + CEBF32EE1DDBC30000348FC6 /* ShadowButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBF32ED1DDBC30000348FC6 /* ShadowButton.swift */; }; + CEBF33041DDE17A600348FC6 /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBF33031DDE17A600348FC6 /* Transaction.swift */; }; + CEC4CF071F0C48DD00E5C82E /* StartWipeWalletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC4CF061F0C48DD00E5C82E /* StartWipeWalletViewController.swift */; }; + CEC4CF091F0C84AB00E5C82E /* UIViewController+Alerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC4CF081F0C84AB00E5C82E /* UIViewController+Alerts.swift */; }; + CEC6AA391DEE10BA00EE5AFD /* UINavigationController+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA381DEE10BA00EE5AFD /* UINavigationController+Extension.swift */; }; + CEC6AA3B1DEE4EB000EE5AFD /* CGRect+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA3A1DEE4EB000EE5AFD /* CGRect+Additions.swift */; }; + CEC6AA3D1DEE687000EE5AFD /* RadialGradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA3C1DEE687000EE5AFD /* RadialGradientView.swift */; }; + CEC6AA401DEFC87300EE5AFD /* SendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA3F1DEFC87300EE5AFD /* SendViewController.swift */; }; + CEC6AA421DEFC88F00EE5AFD /* ReceiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA411DEFC88F00EE5AFD /* ReceiveViewController.swift */; }; + CEC6AA441DEFCDE900EE5AFD /* ModalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA431DEFCDE900EE5AFD /* ModalViewController.swift */; }; + CEC6AA461DEFCE9200EE5AFD /* MenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA451DEFCE9200EE5AFD /* MenuViewController.swift */; }; + CEC6AA491DEFD00100EE5AFD /* MenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA481DEFD00100EE5AFD /* MenuButton.swift */; }; + CEC6AA4B1DEFD24C00EE5AFD /* MenuButtonType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA4A1DEFD24C00EE5AFD /* MenuButtonType.swift */; }; + CEC6AA4D1DF0741100EE5AFD /* ModalDisplayable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6AA4C1DF0741100EE5AFD /* ModalDisplayable.swift */; }; + CEC6F8451E886723000795B8 /* PaymentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC6F8441E886723000795B8 /* PaymentRequest.swift */; }; + CECCE5A51E02408300D99448 /* UIView+FrameChangeBlocking.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECCE5A41E02408300D99448 /* UIView+FrameChangeBlocking.swift */; }; + CECCE5A91E0378FB00D99448 /* PinPadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECCE5A81E0378FB00D99448 /* PinPadViewController.swift */; }; + CECCE5AE1E04AD6300D99448 /* AddressCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECCE5AD1E04AD6300D99448 /* AddressCell.swift */; }; + CECCE5B01E04AD7600D99448 /* DescriptionSendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECCE5AF1E04AD7600D99448 /* DescriptionSendCell.swift */; }; + CECCE5B21E04B00D00D99448 /* SendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECCE5B11E04B00D00D99448 /* SendCell.swift */; }; + CED341331EF5A5C00014912A /* InAppAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = CED341321EF5A5C00014912A /* InAppAlert.swift */; }; + CEE0EF521EBD14B60018DB36 /* PinTransitioningDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE0EF511EBD14B60018DB36 /* PinTransitioningDelegate.swift */; }; + CEE1F5631DF13E5A00D733AD /* ModalHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE1F5621DF13E5A00D733AD /* ModalHeaderView.swift */; }; + CEE20C2D1EA288FA0086F724 /* UpdatingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C2C1EA288FA0086F724 /* UpdatingLabel.swift */; }; + CEE20C2F1EA3E5820086F724 /* BlinkingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C2E1EA3E5820086F724 /* BlinkingView.swift */; }; + CEE20C341EA5B4550086F724 /* ArticleIds.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C331EA5B4550086F724 /* ArticleIds.swift */; }; + CEE20C361EA5B4620086F724 /* Constants+Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C351EA5B4620086F724 /* Constants+Events.swift */; }; + CEE20C381EA5B4680086F724 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C371EA5B4680086F724 /* Strings.swift */; }; + CEE6282A1EA98B6D001035AA /* DispatchQueue+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE628291EA98B6D001035AA /* DispatchQueue+Additions.swift */; }; + CEE659E71F65A936001FF29D /* RetryTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE659E61F65A936001FF29D /* RetryTimer.swift */; }; + CEE659E91F664C73001FF29D /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE659E81F664C73001FF29D /* WelcomeViewController.swift */; }; + CEE65DF01E39056F0002994D /* Rate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE65DEF1E39056F0002994D /* Rate.swift */; }; + CEEC707F1E8D6B4100EF788E /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC707E1E8D6B4100EF788E /* SettingsViewController.swift */; }; + CEEC70811E90C04700EF788E /* SeparatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70801E90C04700EF788E /* SeparatorCell.swift */; }; + CEEC70831E90C07C00EF788E /* Setting.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70821E90C07C00EF788E /* Setting.swift */; }; + CEEC70861E94397D00EF788E /* UserDefaults+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70851E94397D00EF788E /* UserDefaults+Additions.swift */; }; + CEEC708A1E945E3B00EF788E /* UnEditableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70891E945E3B00EF788E /* UnEditableTextView.swift */; }; + CEEC708C1E95461A00EF788E /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC708B1E95461A00EF788E /* AboutViewController.swift */; }; + CEEC708E1E954AAB00EF788E /* AboutCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC708D1E954AAB00EF788E /* AboutCell.swift */; }; + CEEC70921E95DA4400EF788E /* GradientSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70911E95DA4400EF788E /* GradientSwitch.swift */; }; + CEEC70941E96A24F00EF788E /* DefaultCurrencyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC70931E96A24F00EF788E /* DefaultCurrencyViewController.swift */; }; + CEEE92F11EBA7CBA00B7AC9C /* RequestAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEE92F01EBA7CBA00B7AC9C /* RequestAmountViewController.swift */; }; + CEF3D2DD1E8CBA790070178E /* LAContext+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3D2DC1E8CBA790070178E /* LAContext+Extensions.swift */; }; + CEF3E82B1DE51612007C0A9E /* GradientCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E82A1DE51612007C0A9E /* GradientCircle.swift */; }; + CEF3E82D1DE528BF007C0A9E /* AlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E82C1DE528BF007C0A9E /* AlertView.swift */; }; + CEF3E82F1DE534C5007C0A9E /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E82E1DE534C5007C0A9E /* GradientView.swift */; }; + CEF3E8321DE55540007C0A9E /* CheckView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E8311DE55540007C0A9E /* CheckView.swift */; }; + CEF3E8341DE57166007C0A9E /* AnimatableIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E8331DE57166007C0A9E /* AnimatableIcon.swift */; }; + CEF3E8361DE60222007C0A9E /* ModalNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3E8351DE60222007C0A9E /* ModalNavigationController.swift */; }; + CEF61B121ECF52C700C7EA6A /* AmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF61B111ECF52C700C7EA6A /* AmountViewController.swift */; }; + CEF61B141ED0D10000C7EA6A /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF61B131ED0D10000C7EA6A /* Types.swift */; }; + CEF61B161ED2056D00C7EA6A /* NumberFormatter+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF61B151ED2056D00C7EA6A /* NumberFormatter+Additions.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2465873B23A5AAD100A32E9E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75A2A78F1DA5934300A983D8; + remoteInfo = litewallet; + }; + 759DA0BC1DAC369C008CC49B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 755CD9D01DAA197C0075898E; + remoteInfo = BRCore; + }; + 759DA0DB1DAC86B5008CC49B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 759DA0D71DAC8668008CC49B; + remoteInfo = submodules; + }; + 759DA0DD1DAC86BC008CC49B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 759DA0D71DAC8668008CC49B; + remoteInfo = submodules; + }; + 759DA0DF1DAC86C3008CC49B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 759DA0D71DAC8668008CC49B; + remoteInfo = submodules; + }; + 75A2A8121DA5936F00A983D8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75A2A8071DA5936F00A983D8; + remoteInfo = TodayExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 22A9A9831DF63288000F0016 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9C21DAA18420075898E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9CF1DAA197C0075898E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A8031DA5935F00A983D8 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 8; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 75A2A8141DA5936F00A983D8 /* TodayExtension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 1; + }; + 75C735AD1DAA1C9F00251ECF /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1B3F74211FFB106200CCA50C /* BiometricsSettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BiometricsSettingsViewController.swift; path = ViewControllers/BiometricsSettingsViewController.swift; sourceTree = ""; }; + 1B3F74221FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BiometricsSpendingLimitViewController.swift; path = ViewControllers/BiometricsSpendingLimitViewController.swift; sourceTree = ""; }; + 1BA9FE3B216F68A600BB2DE8 /* BRBech32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRBech32.h; sourceTree = ""; }; + 1BA9FE3C216F68A700BB2DE8 /* BRBech32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BRBech32.c; sourceTree = ""; }; + 1BBAEBE81F80237B0047DEA8 /* BRAddress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRAddress.c; sourceTree = ""; }; + 1BBAEBE91F80237B0047DEA8 /* BRAddress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRAddress.h; sourceTree = ""; }; + 1BBAEBEA1F80237B0047DEA8 /* BRArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRArray.h; sourceTree = ""; }; + 1BBAEBEB1F80237B0047DEA8 /* BRBase58.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRBase58.c; sourceTree = ""; }; + 1BBAEBEC1F80237B0047DEA8 /* BRBase58.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBase58.h; sourceTree = ""; }; + 1BBAEBED1F80237B0047DEA8 /* BRBIP32Sequence.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRBIP32Sequence.c; sourceTree = ""; }; + 1BBAEBEE1F80237B0047DEA8 /* BRBIP32Sequence.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBIP32Sequence.h; sourceTree = ""; }; + 1BBAEBEF1F80237B0047DEA8 /* BRBIP38Key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRBIP38Key.c; sourceTree = ""; }; + 1BBAEBF01F80237B0047DEA8 /* BRBIP38Key.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBIP38Key.h; sourceTree = ""; }; + 1BBAEBF11F80237B0047DEA8 /* BRBIP39Mnemonic.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRBIP39Mnemonic.c; sourceTree = ""; }; + 1BBAEBF21F80237B0047DEA8 /* BRBIP39Mnemonic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBIP39Mnemonic.h; sourceTree = ""; }; + 1BBAEBF31F80237B0047DEA8 /* BRBIP39WordsEn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBIP39WordsEn.h; sourceTree = ""; }; + 1BBAEBF41F80237B0047DEA8 /* BRBloomFilter.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRBloomFilter.c; sourceTree = ""; }; + 1BBAEBF51F80237B0047DEA8 /* BRBloomFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRBloomFilter.h; sourceTree = ""; }; + 1BBAEBF71F80237B0047DEA8 /* BRCrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRCrypto.h; sourceTree = ""; }; + 1BBAEBF81F80237B0047DEA8 /* BRInt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRInt.h; sourceTree = ""; }; + 1BBAEBF91F80237B0047DEA8 /* BRKey.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRKey.c; sourceTree = ""; }; + 1BBAEBFA1F80237B0047DEA8 /* BRKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRKey.h; sourceTree = ""; }; + 1BBAEBFB1F80237B0047DEA8 /* BRMerkleBlock.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRMerkleBlock.c; sourceTree = ""; }; + 1BBAEBFC1F80237B0047DEA8 /* BRMerkleBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRMerkleBlock.h; sourceTree = ""; }; + 1BBAEBFD1F80237B0047DEA8 /* BRPaymentProtocol.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRPaymentProtocol.c; sourceTree = ""; }; + 1BBAEBFE1F80237B0047DEA8 /* BRPaymentProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRPaymentProtocol.h; sourceTree = ""; }; + 1BBAEBFF1F80237B0047DEA8 /* BRPeer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRPeer.c; sourceTree = ""; }; + 1BBAEC001F80237B0047DEA8 /* BRPeer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRPeer.h; sourceTree = ""; }; + 1BBAEC011F80237B0047DEA8 /* BRPeerManager.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRPeerManager.c; sourceTree = ""; }; + 1BBAEC021F80237B0047DEA8 /* BRPeerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRPeerManager.h; sourceTree = ""; }; + 1BBAEC031F80237B0047DEA8 /* BRSet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRSet.c; sourceTree = ""; }; + 1BBAEC041F80237B0047DEA8 /* BRSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRSet.h; sourceTree = ""; }; + 1BBAEC051F80237B0047DEA8 /* BRTransaction.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRTransaction.c; sourceTree = ""; }; + 1BBAEC061F80237B0047DEA8 /* BRTransaction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRTransaction.h; sourceTree = ""; }; + 1BBAEC071F80237B0047DEA8 /* BRWallet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRWallet.c; sourceTree = ""; }; + 1BBAEC081F80237B0047DEA8 /* BRWallet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BRWallet.h; sourceTree = ""; }; + 1BBAEC0A1F80237B0047DEA8 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 1BBAEC0B1F80237B0047DEA8 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 1BBAEC0D1F80237B0047DEA8 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + 1BBAEC0E1F80237B0047DEA8 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; + 1BBAEC0F1F80237B0047DEA8 /* autogen.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = autogen.sh; sourceTree = ""; }; + 1BBAEC121F80237B0047DEA8 /* ax_jni_include_dir.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; path = ax_jni_include_dir.m4; sourceTree = ""; }; + 1BBAEC131F80237B0047DEA8 /* ax_prog_cc_for_build.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; path = ax_prog_cc_for_build.m4; sourceTree = ""; }; + 1BBAEC141F80237B0047DEA8 /* bitcoin_secp.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; path = bitcoin_secp.m4; sourceTree = ""; }; + 1BBAEC151F80237B0047DEA8 /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; path = configure.ac; sourceTree = ""; }; + 1BBAEC171F80237B0047DEA8 /* lax_der_parsing.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lax_der_parsing.c; sourceTree = ""; }; + 1BBAEC181F80237B0047DEA8 /* lax_der_parsing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lax_der_parsing.h; sourceTree = ""; }; + 1BBAEC191F80237B0047DEA8 /* lax_der_privatekey_parsing.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lax_der_privatekey_parsing.c; sourceTree = ""; }; + 1BBAEC1A1F80237B0047DEA8 /* lax_der_privatekey_parsing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lax_der_privatekey_parsing.h; sourceTree = ""; }; + 1BBAEC1B1F80237B0047DEA8 /* COPYING */ = {isa = PBXFileReference; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; + 1BBAEC1D1F80237B0047DEA8 /* secp256k1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = secp256k1.h; sourceTree = ""; }; + 1BBAEC1E1F80237B0047DEA8 /* secp256k1_ecdh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = secp256k1_ecdh.h; sourceTree = ""; }; + 1BBAEC1F1F80237B0047DEA8 /* secp256k1_recovery.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = secp256k1_recovery.h; sourceTree = ""; }; + 1BBAEC201F80237B0047DEA8 /* libsecp256k1.pc.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = libsecp256k1.pc.in; sourceTree = ""; }; + 1BBAEC211F80237B0047DEA8 /* Makefile.am */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 1BBAEC231F80237B0047DEA8 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + 1BBAEC241F80237B0047DEA8 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 1BBAEC261F80237B0047DEA8 /* group_prover.sage */ = {isa = PBXFileReference; lastKnownFileType = text; path = group_prover.sage; sourceTree = ""; }; + 1BBAEC271F80237B0047DEA8 /* secp256k1.sage */ = {isa = PBXFileReference; lastKnownFileType = text; path = secp256k1.sage; sourceTree = ""; }; + 1BBAEC281F80237B0047DEA8 /* weierstrass_prover.sage */ = {isa = PBXFileReference; lastKnownFileType = text; path = weierstrass_prover.sage; sourceTree = ""; }; + 1BBAEC2B1F80237B0047DEA8 /* field_10x26_arm.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = field_10x26_arm.s; sourceTree = ""; }; + 1BBAEC2C1F80237B0047DEA8 /* basic-config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "basic-config.h"; sourceTree = ""; }; + 1BBAEC2D1F80237B0047DEA8 /* bench.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bench.h; sourceTree = ""; }; + 1BBAEC2E1F80237B0047DEA8 /* bench_ecdh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bench_ecdh.c; sourceTree = ""; }; + 1BBAEC2F1F80237B0047DEA8 /* bench_internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bench_internal.c; sourceTree = ""; }; + 1BBAEC301F80237B0047DEA8 /* bench_recover.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bench_recover.c; sourceTree = ""; }; + 1BBAEC311F80237B0047DEA8 /* bench_sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bench_sign.c; sourceTree = ""; }; + 1BBAEC321F80237B0047DEA8 /* bench_verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bench_verify.c; sourceTree = ""; }; + 1BBAEC331F80237B0047DEA8 /* ecdsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; + 1BBAEC341F80237B0047DEA8 /* ecdsa_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecdsa_impl.h; sourceTree = ""; }; + 1BBAEC351F80237B0047DEA8 /* eckey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eckey.h; sourceTree = ""; }; + 1BBAEC361F80237B0047DEA8 /* eckey_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eckey_impl.h; sourceTree = ""; }; + 1BBAEC371F80237B0047DEA8 /* ecmult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult.h; sourceTree = ""; }; + 1BBAEC381F80237B0047DEA8 /* ecmult_const.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult_const.h; sourceTree = ""; }; + 1BBAEC391F80237B0047DEA8 /* ecmult_const_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult_const_impl.h; sourceTree = ""; }; + 1BBAEC3A1F80237B0047DEA8 /* ecmult_gen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult_gen.h; sourceTree = ""; }; + 1BBAEC3B1F80237B0047DEA8 /* ecmult_gen_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult_gen_impl.h; sourceTree = ""; }; + 1BBAEC3C1F80237B0047DEA8 /* ecmult_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecmult_impl.h; sourceTree = ""; }; + 1BBAEC3D1F80237B0047DEA8 /* field.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field.h; sourceTree = ""; }; + 1BBAEC3E1F80237B0047DEA8 /* field_10x26.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_10x26.h; sourceTree = ""; }; + 1BBAEC3F1F80237B0047DEA8 /* field_10x26_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_10x26_impl.h; sourceTree = ""; }; + 1BBAEC401F80237B0047DEA8 /* field_5x52.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_5x52.h; sourceTree = ""; }; + 1BBAEC411F80237B0047DEA8 /* field_5x52_asm_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_5x52_asm_impl.h; sourceTree = ""; }; + 1BBAEC421F80237B0047DEA8 /* field_5x52_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_5x52_impl.h; sourceTree = ""; }; + 1BBAEC431F80237B0047DEA8 /* field_5x52_int128_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_5x52_int128_impl.h; sourceTree = ""; }; + 1BBAEC441F80237B0047DEA8 /* field_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = field_impl.h; sourceTree = ""; }; + 1BBAEC451F80237B0047DEA8 /* gen_context.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gen_context.c; sourceTree = ""; }; + 1BBAEC461F80237B0047DEA8 /* group.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = group.h; sourceTree = ""; }; + 1BBAEC471F80237B0047DEA8 /* group_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = group_impl.h; sourceTree = ""; }; + 1BBAEC481F80237B0047DEA8 /* hash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; + 1BBAEC491F80237B0047DEA8 /* hash_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hash_impl.h; sourceTree = ""; }; + 1BBAEC4D1F80237B0047DEA8 /* NativeSecp256k1.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = NativeSecp256k1.java; sourceTree = ""; }; + 1BBAEC4E1F80237B0047DEA8 /* NativeSecp256k1Test.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = NativeSecp256k1Test.java; sourceTree = ""; }; + 1BBAEC4F1F80237B0047DEA8 /* NativeSecp256k1Util.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = NativeSecp256k1Util.java; sourceTree = ""; }; + 1BBAEC501F80237B0047DEA8 /* Secp256k1Context.java */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.java; path = Secp256k1Context.java; sourceTree = ""; }; + 1BBAEC511F80237B0047DEA8 /* org_bitcoin_NativeSecp256k1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = org_bitcoin_NativeSecp256k1.c; sourceTree = ""; }; + 1BBAEC521F80237B0047DEA8 /* org_bitcoin_NativeSecp256k1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = org_bitcoin_NativeSecp256k1.h; sourceTree = ""; }; + 1BBAEC531F80237B0047DEA8 /* org_bitcoin_Secp256k1Context.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = org_bitcoin_Secp256k1Context.c; sourceTree = ""; }; + 1BBAEC541F80237B0047DEA8 /* org_bitcoin_Secp256k1Context.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = org_bitcoin_Secp256k1Context.h; sourceTree = ""; }; + 1BBAEC571F80237B0047DEA8 /* main_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = main_impl.h; sourceTree = ""; }; + 1BBAEC581F80237B0047DEA8 /* Makefile.am.include */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.am.include; sourceTree = ""; }; + 1BBAEC591F80237B0047DEA8 /* tests_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tests_impl.h; sourceTree = ""; }; + 1BBAEC5B1F80237B0047DEA8 /* main_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = main_impl.h; sourceTree = ""; }; + 1BBAEC5C1F80237B0047DEA8 /* Makefile.am.include */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.am.include; sourceTree = ""; }; + 1BBAEC5D1F80237B0047DEA8 /* tests_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tests_impl.h; sourceTree = ""; }; + 1BBAEC5E1F80237B0047DEA8 /* num.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = num.h; sourceTree = ""; }; + 1BBAEC5F1F80237B0047DEA8 /* num_gmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = num_gmp.h; sourceTree = ""; }; + 1BBAEC601F80237B0047DEA8 /* num_gmp_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = num_gmp_impl.h; sourceTree = ""; }; + 1BBAEC611F80237B0047DEA8 /* num_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = num_impl.h; sourceTree = ""; }; + 1BBAEC621F80237B0047DEA8 /* scalar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar.h; sourceTree = ""; }; + 1BBAEC631F80237B0047DEA8 /* scalar_4x64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_4x64.h; sourceTree = ""; }; + 1BBAEC641F80237B0047DEA8 /* scalar_4x64_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_4x64_impl.h; sourceTree = ""; }; + 1BBAEC651F80237B0047DEA8 /* scalar_8x32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_8x32.h; sourceTree = ""; }; + 1BBAEC661F80237B0047DEA8 /* scalar_8x32_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_8x32_impl.h; sourceTree = ""; }; + 1BBAEC671F80237B0047DEA8 /* scalar_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_impl.h; sourceTree = ""; }; + 1BBAEC681F80237B0047DEA8 /* scalar_low.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_low.h; sourceTree = ""; }; + 1BBAEC691F80237B0047DEA8 /* scalar_low_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scalar_low_impl.h; sourceTree = ""; }; + 1BBAEC6A1F80237B0047DEA8 /* secp256k1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = secp256k1.c; sourceTree = ""; }; + 1BBAEC6B1F80237B0047DEA8 /* testrand.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = testrand.h; sourceTree = ""; }; + 1BBAEC6C1F80237B0047DEA8 /* testrand_impl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = testrand_impl.h; sourceTree = ""; }; + 1BBAEC6D1F80237B0047DEA8 /* tests.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tests.c; sourceTree = ""; }; + 1BBAEC6E1F80237B0047DEA8 /* tests_exhaustive.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tests_exhaustive.c; sourceTree = ""; }; + 1BBAEC6F1F80237B0047DEA8 /* util.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; + 1BBAEC701F80237C0047DEA8 /* TODO */ = {isa = PBXFileReference; lastKnownFileType = text; path = TODO; sourceTree = ""; }; + 1BBAEC711F80237C0047DEA8 /* test.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = test.c; sourceTree = ""; }; + 1BBAEC7D1F8025020047DEA8 /* BRCrypto.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = BRCrypto.c; sourceTree = ""; }; + 22122B711F0B8996000E9AB9 /* BRAPIClient+Events.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BRAPIClient+Events.swift"; sourceTree = ""; }; + 222319B11F279B3C00008F20 /* POSTBouncer.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = POSTBouncer.html; sourceTree = ""; }; + 2228734E1E916FC30044BA15 /* BRAPIClient+Wallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BRAPIClient+Wallet.swift"; sourceTree = ""; }; + 222C424F1E90492800078EB5 /* BRAPIClient+KV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BRAPIClient+KV.swift"; sourceTree = ""; }; + 223DB2171DF691260076A151 /* BRSocketHelpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BRSocketHelpers.c; path = Platform/BRSocketHelpers.c; sourceTree = ""; }; + 223DB2181DF691260076A151 /* BRSocketHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSocketHelpers.h; path = Platform/BRSocketHelpers.h; sourceTree = ""; }; + 22A9A9321DF61945000F0016 /* BRAPIClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRAPIClient.swift; path = Platform/BRAPIClient.swift; sourceTree = ""; }; + 22A9A9371DF61945000F0016 /* BRCoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRCoding.swift; path = Platform/BRCoding.swift; sourceTree = ""; }; + 22A9A93D1DF61945000F0016 /* TxMetaData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TxMetaData.swift; path = Platform/TxMetaData.swift; sourceTree = ""; }; + 22A9A9401DF61945000F0016 /* BRReplicatedKVStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRReplicatedKVStore.swift; path = Platform/BRReplicatedKVStore.swift; sourceTree = ""; }; + 22A9A9451DF61945000F0016 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Platform/Extensions.swift; sourceTree = ""; }; + 22A9A95D1DF61FD0000F0016 /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; }; + 22A9A95F1DF61FD8000F0016 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 22A9A9611DF61FE0000F0016 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + 22A9A9631DF61FE7000F0016 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 22A9A9651DF61FEE000F0016 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 22A9A9671DF61FF8000F0016 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; + 22A9A9A91DF64B97000F0016 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Modules/libbz2/Info.plist; sourceTree = SOURCE_ROOT; }; + 22A9A9AA1DF64B97000F0016 /* iphone.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = iphone.modulemap; path = Modules/libbz2/iphone.modulemap; sourceTree = SOURCE_ROOT; }; + 22A9A9AB1DF64B97000F0016 /* iphonesim.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = iphonesim.modulemap; path = Modules/libbz2/iphonesim.modulemap; sourceTree = SOURCE_ROOT; }; + 24016D8F23F913C1006A6791 /* LWAnalytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LWAnalytics.swift; sourceTree = ""; }; + 2427342B2381C21800E2D22F /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 24306796238F3DF900EBEA99 /* BartyCrouch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BartyCrouch.swift; sourceTree = ""; }; + 24306799238F479500EBEA99 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; + 2430679B238F5A2900EBEA99 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 24313C732381E73200A83F69 /* TransactionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionManager.swift; sourceTree = ""; }; + 24313C7923820BC200A83F69 /* SendLTCViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendLTCViewController.swift; sourceTree = ""; }; + 24313C7C23820C1900A83F69 /* TransactionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsViewController.swift; sourceTree = ""; }; + 24313C8223820C4B00A83F69 /* ReceiveLTCViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiveLTCViewController.swift; sourceTree = ""; }; + 24313C8523821B8C00A83F69 /* PromptTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromptTableViewCell.swift; sourceTree = ""; }; + 24313C902382433700A83F69 /* LFModalReceiveQRViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LFModalReceiveQRViewController.swift; sourceTree = ""; }; + 24313C9323824F5700A83F69 /* Transactions.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Transactions.storyboard; sourceTree = ""; }; + 24313C9423824F5700A83F69 /* Alerts.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Alerts.storyboard; sourceTree = ""; }; + 24313C9523824F5700A83F69 /* Animate.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Animate.storyboard; sourceTree = ""; }; + 24313C9623824F5800A83F69 /* Receive.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Receive.storyboard; sourceTree = ""; }; + 24313C9723824F5800A83F69 /* Send.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Send.storyboard; sourceTree = ""; }; + 24313C9823824F5800A83F69 /* Buy.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Buy.storyboard; sourceTree = ""; }; + 24313CA823824F9800A83F69 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 2437530E238AE08A00E1B2AE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = de; path = de.lproj/BIP39Words.plist; sourceTree = ""; }; + 24375311238AE09100E1B2AE /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = id; path = id.lproj/BIP39Words.plist; sourceTree = ""; }; + 24375314238AE09700E1B2AE /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = pt; path = pt.lproj/BIP39Words.plist; sourceTree = ""; }; + 24375315238AE09900E1B2AE /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ru; path = ru.lproj/BIP39Words.plist; sourceTree = ""; }; + 24393B5B23C259400075218D /* Phrase.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Phrase.storyboard; sourceTree = ""; }; + 24470E2023A5DA9700ADDA27 /* APIManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIManagerTests.swift; sourceTree = ""; }; + 24470E2223A5DB7D00ADDA27 /* WalletManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletManagerTests.swift; sourceTree = ""; }; + 24470E2923A5F33000ADDA27 /* BRReplicatedKVStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRReplicatedKVStoreTests.swift; sourceTree = ""; }; + 24470E2B23A5F43B00ADDA27 /* DefaultFiatCurrencyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFiatCurrencyTests.swift; sourceTree = ""; }; + 24470E2D23A5F4FF00ADDA27 /* BRCoderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRCoderTests.swift; sourceTree = ""; }; + 24470E3123A5F5B100ADDA27 /* NSDataExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSDataExtensionTests.swift; sourceTree = ""; }; + 24470E3323A5F5E600ADDA27 /* PaymentRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentRequestTests.swift; sourceTree = ""; }; + 24470E3523A5FDE800ADDA27 /* PhraseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhraseTests.swift; sourceTree = ""; }; + 24470E3723A5FEF200ADDA27 /* SpendingLimitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpendingLimitTests.swift; sourceTree = ""; }; + 24470E3923A5FF5700ADDA27 /* TestHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = ""; }; + 24470E3B23A5FFD700ADDA27 /* TouchIdEnabledTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TouchIdEnabledTests.swift; sourceTree = ""; }; + 24470E3D23A6000900ADDA27 /* WalletAuthenticationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletAuthenticationTests.swift; sourceTree = ""; }; + 24470E3F23A6004800ADDA27 /* WalletCreationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletCreationTests.swift; sourceTree = ""; }; + 24470E4123A6007200ADDA27 /* WalletInfoTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletInfoTest.swift; sourceTree = ""; }; + 24470E4423A608A700ADDA27 /* AmountTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AmountTests.swift; sourceTree = ""; }; + 24470E4623A6B6E900ADDA27 /* MockSeeds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSeeds.swift; sourceTree = ""; }; + 2464B6DA238A53FC00B2A2CB /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hant"; path = "zh-Hant.lproj/BIP39Words.plist"; sourceTree = ""; }; + 2464B6DB238A543300B2A2CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = fr; path = fr.lproj/BIP39Words.plist; sourceTree = ""; }; + 2464B6DC238A543800B2A2CB /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ja; path = ja.lproj/BIP39Words.plist; sourceTree = ""; }; + 2464B6DD238A543D00B2A2CB /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = ko; path = ko.lproj/BIP39Words.plist; sourceTree = ""; }; + 2464B6DF238A586600B2A2CB /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = es; path = es.lproj/BIP39Words.plist; sourceTree = ""; }; + 2465873623A5AAD000A32E9E /* litewalletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = litewalletTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 2465873A23A5AAD100A32E9E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 24670EAC2368EDE7006093E0 /* LFColorPalette.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = LFColorPalette.xcassets; sourceTree = ""; }; + 2485F7CE23728C19005962F1 /* RELEASE_NOTES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = RELEASE_NOTES.md; sourceTree = ""; }; + 248BFE2523AB302200CE1A71 /* BuyWKWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyWKWebViewController.swift; sourceTree = ""; }; + 2494037523AD35C000369261 /* BuyWKWebVCTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyWKWebVCTests.swift; sourceTree = ""; }; + 2494037723AD53B900369261 /* ChildViewTransitioningDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildViewTransitioningDelegate.swift; sourceTree = ""; }; + 2494037C23AE0C7100369261 /* SyncProgressHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncProgressHeaderView.swift; sourceTree = ""; }; + 2494037D23AE0C7100369261 /* SyncProgressHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SyncProgressHeaderView.xib; sourceTree = ""; }; + 2494038023AF208F00369261 /* PromptModalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromptModalViewController.swift; sourceTree = ""; }; + 249F9770236F862C0045087A /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/MainInterface.strings; sourceTree = ""; }; + 24A6DCFA2230BD9000505F44 /* WipeEmptyWalletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WipeEmptyWalletViewController.swift; sourceTree = ""; }; + 24AF00FC221B331D00FF636F /* WarningConfirmation.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = WarningConfirmation.storyboard; sourceTree = ""; }; + 24AF00FF221B349100FF636F /* WarningConfirmationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WarningConfirmationViewController.swift; sourceTree = ""; }; + 24B523AE238A53DC0030594D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = en.lproj/BIP39Words.plist; sourceTree = ""; }; + 24B523B0238A53E40030594D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "zh-Hans"; path = "zh-Hans.lproj/BIP39Words.plist"; sourceTree = ""; }; + 24B8FAC3216128A000A155B1 /* PartnerData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartnerData.swift; sourceTree = ""; }; + 24B8FAD12162B10200A155B1 /* BuyCenterWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyCenterWebViewController.swift; sourceTree = ""; }; + 24B8FADE2163C4D400A155B1 /* Currency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Currency.swift; sourceTree = ""; }; + 24B9621723BA66CC00ECD938 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/MainInterface.strings; sourceTree = ""; }; + 24B9621923BA66CE00ECD938 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/MainInterface.strings"; sourceTree = ""; }; + 24B9621B23BA66CF00ECD938 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/MainInterface.strings; sourceTree = ""; }; + 24BA90C52410129E001E3825 /* FeeSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeeSelectorView.swift; sourceTree = ""; }; + 24D5F22522599C0900225462 /* BarlowSemiCondensed-Italic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Italic.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-Italic.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F22622599C0A00225462 /* BarlowSemiCondensed-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Bold.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-Bold.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F22D22599C0A00225462 /* BarlowSemiCondensed-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Light.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-Light.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F23022599C0B00225462 /* BarlowSemiCondensed-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Medium.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-Medium.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F23222599C0B00225462 /* BarlowSemiCondensed-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Regular.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-Regular.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F23422599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-SemiBold.ttf"; path = "litewallet/Fonts/BarlowSemiCondensed-SemiBold.ttf"; sourceTree = SOURCE_ROOT; }; + 24D5F26D225A5BEA00225462 /* ContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContainerViewController.swift; sourceTree = ""; }; + 24D91D0A2166923E0077A619 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; + 24D91D0D2166A5480077A619 /* TestnetData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestnetData.swift; sourceTree = ""; }; + 24DFCE6723B89CDE001F17F8 /* Settings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = ""; }; + 584E24F22951C119005E0E8B /* Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localization.swift; sourceTree = ""; }; + 584E24F42951D2DB005E0E8B /* BundleExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleExtension.swift; sourceTree = ""; }; + 584E24F72951D412005E0E8B /* LanguageSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageSelectionViewController.swift; sourceTree = ""; }; + 584E24F92951D43A005E0E8B /* LanguageSelectionViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageSelectionViewModel.swift; sourceTree = ""; }; + 584E24FB2951D476005E0E8B /* NSNotificationNameExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSNotificationNameExtension.swift; sourceTree = ""; }; + 584E24FD2951D752005E0E8B /* UITableViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewExtension.swift; sourceTree = ""; }; + 584E25002951DAAA005E0E8B /* LanguageSelectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageSelectionTests.swift; sourceTree = ""; }; + 7503773C1DF57428005EB8AE /* WalletManager+Auth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "WalletManager+Auth.swift"; sourceTree = ""; }; + 7528D2971ECF655500925DBC /* PaymentProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaymentProtocol.swift; sourceTree = ""; }; + 752FB03B1DF8BE4B009086FB /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 752FB03C1DF8BE4B009086FB /* iphone.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iphone.modulemap; sourceTree = ""; }; + 752FB03D1DF8BE4B009086FB /* iphonesim.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = iphonesim.modulemap; sourceTree = ""; }; + 754AE0BB1DFE8A46007FD001 /* BRCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BRCore.swift; sourceTree = ""; }; + 754AE0BD1DFE8E5A007FD001 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = Platform/module.modulemap; sourceTree = ""; }; + 75519F331DC7D20500EDF66C /* WalletManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletManager.swift; sourceTree = ""; }; + 755CD38B1DAA0E3E0075898E /* cachedb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = cachedb.c; sourceTree = ""; }; + 755CD38C1DAA0E3E0075898E /* cachedb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cachedb.h; sourceTree = ""; }; + 755CD38E1DAA0E3E0075898E /* arc4_lock.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = arc4_lock.c; sourceTree = ""; }; + 755CD38F1DAA0E3E0075898E /* arc4random.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = arc4random.c; sourceTree = ""; }; + 755CD3901DAA0E3E0075898E /* arc4random_uniform.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = arc4random_uniform.c; sourceTree = ""; }; + 755CD3911DAA0E3E0075898E /* chacha_private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chacha_private.h; sourceTree = ""; }; + 755CD3921DAA0E3E0075898E /* ctime_r.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ctime_r.c; sourceTree = ""; }; + 755CD3931DAA0E3E0075898E /* explicit_bzero.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = explicit_bzero.c; sourceTree = ""; }; + 755CD3941DAA0E3E0075898E /* fake-rfc2553.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "fake-rfc2553.c"; sourceTree = ""; }; + 755CD3951DAA0E3E0075898E /* fake-rfc2553.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "fake-rfc2553.h"; sourceTree = ""; }; + 755CD3961DAA0E3E0075898E /* getentropy_linux.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getentropy_linux.c; sourceTree = ""; }; + 755CD3971DAA0E3E0075898E /* getentropy_osx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getentropy_osx.c; sourceTree = ""; }; + 755CD3981DAA0E3E0075898E /* getentropy_solaris.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getentropy_solaris.c; sourceTree = ""; }; + 755CD3991DAA0E3E0075898E /* getentropy_win.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getentropy_win.c; sourceTree = ""; }; + 755CD39A1DAA0E3E0075898E /* gmtime_r.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gmtime_r.c; sourceTree = ""; }; + 755CD39B1DAA0E3E0075898E /* inet_aton.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = inet_aton.c; sourceTree = ""; }; + 755CD39C1DAA0E3E0075898E /* inet_ntop.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = inet_ntop.c; sourceTree = ""; }; + 755CD39D1DAA0E3E0075898E /* inet_pton.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = inet_pton.c; sourceTree = ""; }; + 755CD39E1DAA0E3E0075898E /* isblank.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = isblank.c; sourceTree = ""; }; + 755CD39F1DAA0E3E0075898E /* malloc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = malloc.c; sourceTree = ""; }; + 755CD3A01DAA0E3E0075898E /* memcmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = memcmp.c; sourceTree = ""; }; + 755CD3A11DAA0E3E0075898E /* memcmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memcmp.h; sourceTree = ""; }; + 755CD3A21DAA0E3E0075898E /* memmove.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = memmove.c; sourceTree = ""; }; + 755CD3A31DAA0E3E0075898E /* reallocarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = reallocarray.c; sourceTree = ""; }; + 755CD3A41DAA0E3E0075898E /* sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha512.c; sourceTree = ""; }; + 755CD3A51DAA0E3E0075898E /* snprintf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = snprintf.c; sourceTree = ""; }; + 755CD3A61DAA0E3E0075898E /* strlcat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strlcat.c; sourceTree = ""; }; + 755CD3A71DAA0E3E0075898E /* strlcpy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strlcpy.c; sourceTree = ""; }; + 755CD3A81DAA0E3E0075898E /* strptime.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strptime.c; sourceTree = ""; }; + 755CD3A91DAA0E3E0075898E /* strsep.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = strsep.c; sourceTree = ""; }; + 755CD3AB1DAA0E3E0075898E /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 755CD3DB1DAA0E3E0075898E /* dns64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dns64.c; sourceTree = ""; }; + 755CD3DC1DAA0E3E0075898E /* dns64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dns64.h; sourceTree = ""; }; + 755CD3DE1DAA0E3E0075898E /* dnstap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dnstap.c; sourceTree = ""; }; + 755CD3DF1DAA0E3E0075898E /* dnstap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dnstap.h; sourceTree = ""; }; + 755CD3E21DAA0E3E0075898E /* dnstap_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dnstap_config.h; sourceTree = ""; }; + 755CD3FD1DAA0E3E0075898E /* iter_delegpt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_delegpt.c; sourceTree = ""; }; + 755CD3FE1DAA0E3E0075898E /* iter_delegpt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_delegpt.h; sourceTree = ""; }; + 755CD3FF1DAA0E3E0075898E /* iter_donotq.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_donotq.c; sourceTree = ""; }; + 755CD4001DAA0E3E0075898E /* iter_donotq.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_donotq.h; sourceTree = ""; }; + 755CD4011DAA0E3E0075898E /* iter_fwd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_fwd.c; sourceTree = ""; }; + 755CD4021DAA0E3E0075898E /* iter_fwd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_fwd.h; sourceTree = ""; }; + 755CD4031DAA0E3E0075898E /* iter_hints.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_hints.c; sourceTree = ""; }; + 755CD4041DAA0E3E0075898E /* iter_hints.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_hints.h; sourceTree = ""; }; + 755CD4051DAA0E3E0075898E /* iter_priv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_priv.c; sourceTree = ""; }; + 755CD4061DAA0E3E0075898E /* iter_priv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_priv.h; sourceTree = ""; }; + 755CD4071DAA0E3E0075898E /* iter_resptype.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_resptype.c; sourceTree = ""; }; + 755CD4081DAA0E3E0075898E /* iter_resptype.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_resptype.h; sourceTree = ""; }; + 755CD4091DAA0E3E0075898E /* iter_scrub.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_scrub.c; sourceTree = ""; }; + 755CD40A1DAA0E3E0075898E /* iter_scrub.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_scrub.h; sourceTree = ""; }; + 755CD40B1DAA0E3E0075898E /* iter_utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iter_utils.c; sourceTree = ""; }; + 755CD40C1DAA0E3E0075898E /* iter_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iter_utils.h; sourceTree = ""; }; + 755CD40D1DAA0E3E0075898E /* iterator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = iterator.c; sourceTree = ""; }; + 755CD40E1DAA0E3E0075898E /* iterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = ""; }; + 755CD4101DAA0E3E0075898E /* context.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = context.c; sourceTree = ""; }; + 755CD4111DAA0E3E0075898E /* context.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; + 755CD4121DAA0E3E0075898E /* libunbound.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = libunbound.c; sourceTree = ""; }; + 755CD4131DAA0E3E0075898E /* libworker.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = libworker.c; sourceTree = ""; }; + 755CD4141DAA0E3E0075898E /* libworker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libworker.h; sourceTree = ""; }; + 755CD43D1DAA0E3E0075898E /* unbound-event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "unbound-event.h"; sourceTree = ""; }; + 755CD43E1DAA0E3E0075898E /* unbound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unbound.h; sourceTree = ""; }; + 755CD43F1DAA0E3E0075898E /* worker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = worker.h; sourceTree = ""; }; + 755CD4441DAA0E3E0075898E /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 755CD4751DAA0E3E0075898E /* dns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dns.c; sourceTree = ""; }; + 755CD4761DAA0E3E0075898E /* dns.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dns.h; sourceTree = ""; }; + 755CD4771DAA0E3E0075898E /* infra.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = infra.c; sourceTree = ""; }; + 755CD4781DAA0E3E0075898E /* infra.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = infra.h; sourceTree = ""; }; + 755CD4791DAA0E3E0075898E /* rrset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rrset.c; sourceTree = ""; }; + 755CD47A1DAA0E3E0075898E /* rrset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rrset.h; sourceTree = ""; }; + 755CD47B1DAA0E3E0075898E /* listen_dnsport.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = listen_dnsport.c; sourceTree = ""; }; + 755CD47C1DAA0E3E0075898E /* listen_dnsport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = listen_dnsport.h; sourceTree = ""; }; + 755CD47D1DAA0E3E0075898E /* localzone.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = localzone.c; sourceTree = ""; }; + 755CD47E1DAA0E3E0075898E /* localzone.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = localzone.h; sourceTree = ""; }; + 755CD47F1DAA0E3E0075898E /* mesh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mesh.c; sourceTree = ""; }; + 755CD4801DAA0E3E0075898E /* mesh.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mesh.h; sourceTree = ""; }; + 755CD4811DAA0E3E0075898E /* modstack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = modstack.c; sourceTree = ""; }; + 755CD4821DAA0E3E0075898E /* modstack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = modstack.h; sourceTree = ""; }; + 755CD4831DAA0E3E0075898E /* outbound_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = outbound_list.c; sourceTree = ""; }; + 755CD4841DAA0E3E0075898E /* outbound_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = outbound_list.h; sourceTree = ""; }; + 755CD4851DAA0E3E0075898E /* outside_network.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = outside_network.c; sourceTree = ""; }; + 755CD4861DAA0E3E0075898E /* outside_network.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = outside_network.h; sourceTree = ""; }; + 755CD4881DAA0E3E0075898E /* keyraw.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = keyraw.c; sourceTree = ""; }; + 755CD4891DAA0E3E0075898E /* keyraw.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = keyraw.h; sourceTree = ""; }; + 755CD48A1DAA0E3E0075898E /* parse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = ""; }; + 755CD48B1DAA0E3E0075898E /* parse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = ""; }; + 755CD48C1DAA0E3E0075898E /* parseutil.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = parseutil.c; sourceTree = ""; }; + 755CD48D1DAA0E3E0075898E /* parseutil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parseutil.h; sourceTree = ""; }; + 755CD48E1DAA0E3E0075898E /* pkthdr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pkthdr.h; sourceTree = ""; }; + 755CD48F1DAA0E3E0075898E /* rrdef.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rrdef.c; sourceTree = ""; }; + 755CD4901DAA0E3E0075898E /* rrdef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rrdef.h; sourceTree = ""; }; + 755CD4911DAA0E3E0075898E /* sbuffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sbuffer.c; sourceTree = ""; }; + 755CD4921DAA0E3E0075898E /* sbuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sbuffer.h; sourceTree = ""; }; + 755CD4931DAA0E3E0075898E /* str2wire.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = str2wire.c; sourceTree = ""; }; + 755CD4941DAA0E3E0075898E /* str2wire.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = str2wire.h; sourceTree = ""; }; + 755CD4951DAA0E3E0075898E /* wire2str.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = wire2str.c; sourceTree = ""; }; + 755CD4961DAA0E3E0075898E /* wire2str.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wire2str.h; sourceTree = ""; }; + 755CD6761DAA0E400075898E /* alloc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = alloc.c; sourceTree = ""; }; + 755CD6771DAA0E400075898E /* alloc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = alloc.h; sourceTree = ""; }; + 755CD6781DAA0E400075898E /* as112.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = as112.c; sourceTree = ""; }; + 755CD6791DAA0E400075898E /* as112.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = as112.h; sourceTree = ""; }; + 755CD67A1DAA0E400075898E /* config_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = config_file.c; sourceTree = ""; }; + 755CD67B1DAA0E400075898E /* config_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config_file.h; sourceTree = ""; }; + 755CD67C1DAA0E400075898E /* configlexer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = configlexer.c; sourceTree = ""; }; + 755CD67E1DAA0E400075898E /* configparser.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = configparser.c; sourceTree = ""; }; + 755CD67F1DAA0E400075898E /* configparser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = configparser.h; sourceTree = ""; }; + 755CD6811DAA0E400075898E /* configyyrename.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = configyyrename.h; sourceTree = ""; }; + 755CD6831DAA0E400075898E /* dname.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dname.c; sourceTree = ""; }; + 755CD6841DAA0E400075898E /* dname.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dname.h; sourceTree = ""; }; + 755CD6851DAA0E400075898E /* msgencode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = msgencode.c; sourceTree = ""; }; + 755CD6861DAA0E400075898E /* msgencode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = msgencode.h; sourceTree = ""; }; + 755CD6871DAA0E400075898E /* msgparse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = msgparse.c; sourceTree = ""; }; + 755CD6881DAA0E400075898E /* msgparse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = msgparse.h; sourceTree = ""; }; + 755CD6891DAA0E400075898E /* msgreply.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = msgreply.c; sourceTree = ""; }; + 755CD68A1DAA0E400075898E /* msgreply.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = msgreply.h; sourceTree = ""; }; + 755CD68B1DAA0E400075898E /* packed_rrset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = packed_rrset.c; sourceTree = ""; }; + 755CD68C1DAA0E400075898E /* packed_rrset.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = packed_rrset.h; sourceTree = ""; }; + 755CD68D1DAA0E400075898E /* fptr_wlist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = fptr_wlist.c; sourceTree = ""; }; + 755CD68E1DAA0E400075898E /* fptr_wlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fptr_wlist.h; sourceTree = ""; }; + 755CD6901DAA0E400075898E /* locks.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = locks.c; sourceTree = ""; }; + 755CD6911DAA0E400075898E /* locks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = locks.h; sourceTree = ""; }; + 755CD6921DAA0E400075898E /* log.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = ""; }; + 755CD6931DAA0E400075898E /* log.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = ""; }; + 755CD6941DAA0E400075898E /* mini_event.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mini_event.c; sourceTree = ""; }; + 755CD6951DAA0E400075898E /* mini_event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mini_event.h; sourceTree = ""; }; + 755CD6961DAA0E400075898E /* module.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = module.c; sourceTree = ""; }; + 755CD6971DAA0E400075898E /* module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; + 755CD6981DAA0E400075898E /* net_help.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = net_help.c; sourceTree = ""; }; + 755CD6991DAA0E400075898E /* net_help.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_help.h; sourceTree = ""; }; + 755CD69A1DAA0E400075898E /* netevent.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = netevent.c; sourceTree = ""; }; + 755CD69B1DAA0E400075898E /* netevent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = netevent.h; sourceTree = ""; }; + 755CD69C1DAA0E400075898E /* random.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = random.c; sourceTree = ""; }; + 755CD69D1DAA0E400075898E /* random.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = random.h; sourceTree = ""; }; + 755CD69E1DAA0E400075898E /* rbtree.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rbtree.c; sourceTree = ""; }; + 755CD69F1DAA0E400075898E /* rbtree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbtree.h; sourceTree = ""; }; + 755CD6A01DAA0E400075898E /* regional.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = regional.c; sourceTree = ""; }; + 755CD6A11DAA0E400075898E /* regional.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = regional.h; sourceTree = ""; }; + 755CD6A21DAA0E400075898E /* rtt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rtt.c; sourceTree = ""; }; + 755CD6A31DAA0E400075898E /* rtt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtt.h; sourceTree = ""; }; + 755CD6A51DAA0E400075898E /* dnstree.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dnstree.c; sourceTree = ""; }; + 755CD6A61DAA0E400075898E /* dnstree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dnstree.h; sourceTree = ""; }; + 755CD6A71DAA0E400075898E /* lookup3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lookup3.c; sourceTree = ""; }; + 755CD6A81DAA0E400075898E /* lookup3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lookup3.h; sourceTree = ""; }; + 755CD6A91DAA0E400075898E /* lruhash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lruhash.c; sourceTree = ""; }; + 755CD6AA1DAA0E400075898E /* lruhash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lruhash.h; sourceTree = ""; }; + 755CD6AB1DAA0E400075898E /* slabhash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = slabhash.c; sourceTree = ""; }; + 755CD6AC1DAA0E400075898E /* slabhash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = slabhash.h; sourceTree = ""; }; + 755CD6AD1DAA0E400075898E /* timehist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = timehist.c; sourceTree = ""; }; + 755CD6AE1DAA0E400075898E /* timehist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = timehist.h; sourceTree = ""; }; + 755CD6AF1DAA0E400075898E /* tube.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tube.c; sourceTree = ""; }; + 755CD6B01DAA0E400075898E /* tube.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tube.h; sourceTree = ""; }; + 755CD6B11DAA0E400075898E /* ub_event.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ub_event.c; sourceTree = ""; }; + 755CD6B21DAA0E400075898E /* ub_event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ub_event.h; sourceTree = ""; }; + 755CD6B31DAA0E400075898E /* ub_event_pluggable.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ub_event_pluggable.c; sourceTree = ""; }; + 755CD6B71DAA0E400075898E /* autotrust.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = autotrust.c; sourceTree = ""; }; + 755CD6B81DAA0E400075898E /* autotrust.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = autotrust.h; sourceTree = ""; }; + 755CD6B91DAA0E400075898E /* val_anchor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_anchor.c; sourceTree = ""; }; + 755CD6BA1DAA0E400075898E /* val_anchor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_anchor.h; sourceTree = ""; }; + 755CD6BB1DAA0E400075898E /* val_kcache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_kcache.c; sourceTree = ""; }; + 755CD6BC1DAA0E400075898E /* val_kcache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_kcache.h; sourceTree = ""; }; + 755CD6BD1DAA0E400075898E /* val_kentry.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_kentry.c; sourceTree = ""; }; + 755CD6BE1DAA0E400075898E /* val_kentry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_kentry.h; sourceTree = ""; }; + 755CD6BF1DAA0E400075898E /* val_neg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_neg.c; sourceTree = ""; }; + 755CD6C01DAA0E400075898E /* val_neg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_neg.h; sourceTree = ""; }; + 755CD6C11DAA0E400075898E /* val_nsec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_nsec.c; sourceTree = ""; }; + 755CD6C21DAA0E400075898E /* val_nsec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_nsec.h; sourceTree = ""; }; + 755CD6C31DAA0E400075898E /* val_nsec3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_nsec3.c; sourceTree = ""; }; + 755CD6C41DAA0E400075898E /* val_nsec3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_nsec3.h; sourceTree = ""; }; + 755CD6C51DAA0E400075898E /* val_secalgo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_secalgo.c; sourceTree = ""; }; + 755CD6C61DAA0E400075898E /* val_secalgo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_secalgo.h; sourceTree = ""; }; + 755CD6C71DAA0E400075898E /* val_sigcrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_sigcrypt.c; sourceTree = ""; }; + 755CD6C81DAA0E400075898E /* val_sigcrypt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_sigcrypt.h; sourceTree = ""; }; + 755CD6C91DAA0E400075898E /* val_utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = val_utils.c; sourceTree = ""; }; + 755CD6CA1DAA0E400075898E /* val_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = val_utils.h; sourceTree = ""; }; + 755CD6CB1DAA0E400075898E /* validator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = validator.c; sourceTree = ""; }; + 755CD6CC1DAA0E400075898E /* validator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = validator.h; sourceTree = ""; }; + 755CD70A1DAA16810075898E /* aes-decrypt-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-decrypt-internal.c"; sourceTree = ""; }; + 755CD70B1DAA16810075898E /* aes-decrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-decrypt.c"; sourceTree = ""; }; + 755CD70C1DAA16810075898E /* aes-encrypt-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-encrypt-internal.c"; sourceTree = ""; }; + 755CD70D1DAA16810075898E /* aes-encrypt-table.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-encrypt-table.c"; sourceTree = ""; }; + 755CD70E1DAA16810075898E /* aes-encrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-encrypt.c"; sourceTree = ""; }; + 755CD70F1DAA16810075898E /* aes-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "aes-internal.h"; sourceTree = ""; }; + 755CD7101DAA16810075898E /* aes-invert-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-invert-internal.c"; sourceTree = ""; }; + 755CD7111DAA16810075898E /* aes-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-set-decrypt-key.c"; sourceTree = ""; }; + 755CD7121DAA16810075898E /* aes-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-set-encrypt-key.c"; sourceTree = ""; }; + 755CD7131DAA16810075898E /* aes-set-key-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes-set-key-internal.c"; sourceTree = ""; }; + 755CD7141DAA16810075898E /* aes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; + 755CD7151DAA16810075898E /* aes128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes128-meta.c"; sourceTree = ""; }; + 755CD7161DAA16810075898E /* aes128-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes128-set-decrypt-key.c"; sourceTree = ""; }; + 755CD7171DAA16810075898E /* aes128-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes128-set-encrypt-key.c"; sourceTree = ""; }; + 755CD7181DAA16810075898E /* aes192-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes192-meta.c"; sourceTree = ""; }; + 755CD7191DAA16810075898E /* aes192-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes192-set-decrypt-key.c"; sourceTree = ""; }; + 755CD71A1DAA16810075898E /* aes192-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes192-set-encrypt-key.c"; sourceTree = ""; }; + 755CD71B1DAA16810075898E /* aes256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes256-meta.c"; sourceTree = ""; }; + 755CD71C1DAA16810075898E /* aes256-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes256-set-decrypt-key.c"; sourceTree = ""; }; + 755CD71D1DAA16810075898E /* aes256-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "aes256-set-encrypt-key.c"; sourceTree = ""; }; + 755CD71E1DAA16810075898E /* aesdata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = aesdata.c; sourceTree = ""; }; + 755CD71F1DAA16810075898E /* arcfour-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "arcfour-crypt.c"; sourceTree = ""; }; + 755CD7201DAA16810075898E /* arcfour.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = arcfour.c; sourceTree = ""; }; + 755CD7211DAA16810075898E /* arcfour.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arcfour.h; sourceTree = ""; }; + 755CD7221DAA16810075898E /* arctwo-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "arctwo-meta.c"; sourceTree = ""; }; + 755CD7231DAA16810075898E /* arctwo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = arctwo.c; sourceTree = ""; }; + 755CD7241DAA16810075898E /* arctwo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = arctwo.h; sourceTree = ""; }; + 755CD74B1DAA16810075898E /* asn1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; + 755CD74D1DAA16810075898E /* base16-decode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base16-decode.c"; sourceTree = ""; }; + 755CD74E1DAA16810075898E /* base16-encode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base16-encode.c"; sourceTree = ""; }; + 755CD74F1DAA16810075898E /* base16-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base16-meta.c"; sourceTree = ""; }; + 755CD7501DAA16810075898E /* base16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = base16.h; sourceTree = ""; }; + 755CD7511DAA16810075898E /* base64-decode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64-decode.c"; sourceTree = ""; }; + 755CD7521DAA16810075898E /* base64-encode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64-encode.c"; sourceTree = ""; }; + 755CD7531DAA16810075898E /* base64-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64-meta.c"; sourceTree = ""; }; + 755CD7541DAA16810075898E /* base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = ""; }; + 755CD7551DAA16810075898E /* base64url-decode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64url-decode.c"; sourceTree = ""; }; + 755CD7561DAA16810075898E /* base64url-encode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64url-encode.c"; sourceTree = ""; }; + 755CD7571DAA16810075898E /* base64url-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "base64url-meta.c"; sourceTree = ""; }; + 755CD7581DAA16810075898E /* bignum-random-prime.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "bignum-random-prime.c"; sourceTree = ""; }; + 755CD7591DAA16810075898E /* bignum-random.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "bignum-random.c"; sourceTree = ""; }; + 755CD75A1DAA16810075898E /* bignum.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bignum.c; sourceTree = ""; }; + 755CD75B1DAA16810075898E /* bignum.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bignum.h; sourceTree = ""; }; + 755CD75C1DAA16810075898E /* blowfish.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = blowfish.c; sourceTree = ""; }; + 755CD75D1DAA16810075898E /* blowfish.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; + 755CD75E1DAA16810075898E /* buffer-init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "buffer-init.c"; sourceTree = ""; }; + 755CD75F1DAA16810075898E /* buffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; + 755CD7601DAA16810075898E /* buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; + 755CD7611DAA16810075898E /* camellia-absorb.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia-absorb.c"; sourceTree = ""; }; + 755CD7621DAA16810075898E /* camellia-crypt-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia-crypt-internal.c"; sourceTree = ""; }; + 755CD7631DAA16810075898E /* camellia-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "camellia-internal.h"; sourceTree = ""; }; + 755CD7641DAA16810075898E /* camellia-invert-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia-invert-key.c"; sourceTree = ""; }; + 755CD7651DAA16810075898E /* camellia-table.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia-table.c"; sourceTree = ""; }; + 755CD7661DAA16810075898E /* camellia.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = ""; }; + 755CD7671DAA16810075898E /* camellia128-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia128-crypt.c"; sourceTree = ""; }; + 755CD7681DAA16810075898E /* camellia128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia128-meta.c"; sourceTree = ""; }; + 755CD7691DAA16810075898E /* camellia128-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia128-set-decrypt-key.c"; sourceTree = ""; }; + 755CD76A1DAA16810075898E /* camellia128-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia128-set-encrypt-key.c"; sourceTree = ""; }; + 755CD76B1DAA16810075898E /* camellia192-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia192-meta.c"; sourceTree = ""; }; + 755CD76C1DAA16810075898E /* camellia256-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia256-crypt.c"; sourceTree = ""; }; + 755CD76D1DAA16810075898E /* camellia256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia256-meta.c"; sourceTree = ""; }; + 755CD76E1DAA16810075898E /* camellia256-set-decrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia256-set-decrypt-key.c"; sourceTree = ""; }; + 755CD76F1DAA16810075898E /* camellia256-set-encrypt-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "camellia256-set-encrypt-key.c"; sourceTree = ""; }; + 755CD7701DAA16810075898E /* cast128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "cast128-meta.c"; sourceTree = ""; }; + 755CD7711DAA16810075898E /* cast128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = cast128.c; sourceTree = ""; }; + 755CD7721DAA16810075898E /* cast128.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cast128.h; sourceTree = ""; }; + 755CD7731DAA16810075898E /* cast128_sboxes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cast128_sboxes.h; sourceTree = ""; }; + 755CD7741DAA16810075898E /* cbc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = cbc.c; sourceTree = ""; }; + 755CD7751DAA16810075898E /* cbc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cbc.h; sourceTree = ""; }; + 755CD7761DAA16810075898E /* ccm-aes128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ccm-aes128.c"; sourceTree = ""; }; + 755CD7771DAA16810075898E /* ccm-aes192.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ccm-aes192.c"; sourceTree = ""; }; + 755CD7781DAA16810075898E /* ccm-aes256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ccm-aes256.c"; sourceTree = ""; }; + 755CD7791DAA16810075898E /* ccm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ccm.c; sourceTree = ""; }; + 755CD77A1DAA16810075898E /* ccm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ccm.h; sourceTree = ""; }; + 755CD77B1DAA16810075898E /* chacha-core-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-core-internal.c"; sourceTree = ""; }; + 755CD77C1DAA16810075898E /* chacha-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-crypt.c"; sourceTree = ""; }; + 755CD77D1DAA16810075898E /* chacha-poly1305-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-poly1305-meta.c"; sourceTree = ""; }; + 755CD77E1DAA16810075898E /* chacha-poly1305.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-poly1305.c"; sourceTree = ""; }; + 755CD77F1DAA16810075898E /* chacha-poly1305.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "chacha-poly1305.h"; sourceTree = ""; }; + 755CD7801DAA16810075898E /* chacha-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-set-key.c"; sourceTree = ""; }; + 755CD7811DAA16810075898E /* chacha-set-nonce.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "chacha-set-nonce.c"; sourceTree = ""; }; + 755CD7821DAA16810075898E /* chacha.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chacha.h; sourceTree = ""; }; + 755CD7841DAA16810075898E /* cnd-copy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "cnd-copy.c"; sourceTree = ""; }; + 755CD7861DAA16810075898E /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 755CD78E1DAA16810075898E /* ctr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ctr.c; sourceTree = ""; }; + 755CD78F1DAA16810075898E /* ctr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ctr.h; sourceTree = ""; }; + 755CD7901DAA16810075898E /* curve25519-eh-to-x.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "curve25519-eh-to-x.c"; sourceTree = ""; }; + 755CD7911DAA16810075898E /* curve25519-mul-g.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "curve25519-mul-g.c"; sourceTree = ""; }; + 755CD7921DAA16810075898E /* curve25519-mul.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "curve25519-mul.c"; sourceTree = ""; }; + 755CD7931DAA16810075898E /* curve25519.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = curve25519.h; sourceTree = ""; }; + 755CD7941DAA16810075898E /* der-iterator.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "der-iterator.c"; sourceTree = ""; }; + 755CD7951DAA16810075898E /* der2dsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = der2dsa.c; sourceTree = ""; }; + 755CD7961DAA16810075898E /* der2rsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = der2rsa.c; sourceTree = ""; }; + 755CD7971DAA16810075898E /* des-compat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "des-compat.c"; sourceTree = ""; }; + 755CD7981DAA16810075898E /* des-compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "des-compat.h"; sourceTree = ""; }; + 755CD7991DAA16810075898E /* des.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = des.c; sourceTree = ""; }; + 755CD79A1DAA16810075898E /* des.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = ""; }; + 755CD79B1DAA16810075898E /* des3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = des3.c; sourceTree = ""; }; + 755CD79C1DAA16810075898E /* desCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = desCode.h; sourceTree = ""; }; + 755CD79E1DAA16810075898E /* desdata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = desdata.c; sourceTree = ""; }; + 755CD79F1DAA16810075898E /* desinfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = desinfo.h; sourceTree = ""; }; + 755CD7A01DAA16810075898E /* dsa-compat-keygen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-compat-keygen.c"; sourceTree = ""; }; + 755CD7A11DAA16810075898E /* dsa-compat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-compat.c"; sourceTree = ""; }; + 755CD7A21DAA16810075898E /* dsa-compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "dsa-compat.h"; sourceTree = ""; }; + 755CD7A31DAA16810075898E /* dsa-gen-params.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-gen-params.c"; sourceTree = ""; }; + 755CD7A41DAA16810075898E /* dsa-hash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-hash.c"; sourceTree = ""; }; + 755CD7A51DAA16810075898E /* dsa-keygen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-keygen.c"; sourceTree = ""; }; + 755CD7A61DAA16810075898E /* dsa-sha1-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-sha1-sign.c"; sourceTree = ""; }; + 755CD7A71DAA16810075898E /* dsa-sha1-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-sha1-verify.c"; sourceTree = ""; }; + 755CD7A81DAA16810075898E /* dsa-sha256-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-sha256-sign.c"; sourceTree = ""; }; + 755CD7A91DAA16810075898E /* dsa-sha256-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-sha256-verify.c"; sourceTree = ""; }; + 755CD7AA1DAA16810075898E /* dsa-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-sign.c"; sourceTree = ""; }; + 755CD7AB1DAA16810075898E /* dsa-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "dsa-verify.c"; sourceTree = ""; }; + 755CD7AC1DAA16810075898E /* dsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dsa.c; sourceTree = ""; }; + 755CD7AD1DAA16810075898E /* dsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = ""; }; + 755CD7AE1DAA16810075898E /* dsa2sexp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = dsa2sexp.c; sourceTree = ""; }; + 755CD7AF1DAA16810075898E /* eax-aes128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eax-aes128-meta.c"; sourceTree = ""; }; + 755CD7B01DAA16810075898E /* eax-aes128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eax-aes128.c"; sourceTree = ""; }; + 755CD7B11DAA16810075898E /* eax.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = eax.c; sourceTree = ""; }; + 755CD7B21DAA16810075898E /* eax.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eax.h; sourceTree = ""; }; + 755CD7B31DAA16810075898E /* ecc-192.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-192.c"; sourceTree = ""; }; + 755CD7B41DAA16810075898E /* ecc-224.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-224.c"; sourceTree = ""; }; + 755CD7B51DAA16810075898E /* ecc-25519.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-25519.c"; sourceTree = ""; }; + 755CD7B61DAA16810075898E /* ecc-256-32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-256-32.h"; sourceTree = ""; }; + 755CD7B71DAA16810075898E /* ecc-256-64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-256-64.h"; sourceTree = ""; }; + 755CD7B81DAA16810075898E /* ecc-256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-256.c"; sourceTree = ""; }; + 755CD7B91DAA16810075898E /* ecc-256.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-256.h"; sourceTree = ""; }; + 755CD7BA1DAA16810075898E /* ecc-384-32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-384-32.h"; sourceTree = ""; }; + 755CD7BB1DAA16810075898E /* ecc-384-64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-384-64.h"; sourceTree = ""; }; + 755CD7BC1DAA16810075898E /* ecc-384.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-384.c"; sourceTree = ""; }; + 755CD7BD1DAA16810075898E /* ecc-384.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-384.h"; sourceTree = ""; }; + 755CD7BE1DAA16810075898E /* ecc-521.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-521.c"; sourceTree = ""; }; + 755CD7BF1DAA16810075898E /* ecc-a-to-j.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-a-to-j.c"; sourceTree = ""; }; + 755CD7C01DAA16810075898E /* ecc-add-eh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-add-eh.c"; sourceTree = ""; }; + 755CD7C11DAA16810075898E /* ecc-add-ehh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-add-ehh.c"; sourceTree = ""; }; + 755CD7C21DAA16810075898E /* ecc-add-jja.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-add-jja.c"; sourceTree = ""; }; + 755CD7C31DAA16810075898E /* ecc-add-jjj.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-add-jjj.c"; sourceTree = ""; }; + 755CD7C41DAA16810075898E /* ecc-curve.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-curve.h"; sourceTree = ""; }; + 755CD7C51DAA16810075898E /* ecc-dup-eh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-dup-eh.c"; sourceTree = ""; }; + 755CD7C61DAA16810075898E /* ecc-dup-jj.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-dup-jj.c"; sourceTree = ""; }; + 755CD7C71DAA16810075898E /* ecc-ecdsa-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-ecdsa-sign.c"; sourceTree = ""; }; + 755CD7C81DAA16810075898E /* ecc-ecdsa-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-ecdsa-verify.c"; sourceTree = ""; }; + 755CD7C91DAA16810075898E /* ecc-eh-to-a.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-eh-to-a.c"; sourceTree = ""; }; + 755CD7CA1DAA16810075898E /* ecc-hash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-hash.c"; sourceTree = ""; }; + 755CD7CB1DAA16810075898E /* ecc-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ecc-internal.h"; sourceTree = ""; }; + 755CD7CC1DAA16810075898E /* ecc-j-to-a.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-j-to-a.c"; sourceTree = ""; }; + 755CD7CD1DAA16810075898E /* ecc-mod-arith.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mod-arith.c"; sourceTree = ""; }; + 755CD7CE1DAA16810075898E /* ecc-mod-inv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mod-inv.c"; sourceTree = ""; }; + 755CD7CF1DAA16810075898E /* ecc-mod.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mod.c"; sourceTree = ""; }; + 755CD7D01DAA16810075898E /* ecc-mul-a-eh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mul-a-eh.c"; sourceTree = ""; }; + 755CD7D11DAA16810075898E /* ecc-mul-a.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mul-a.c"; sourceTree = ""; }; + 755CD7D21DAA16810075898E /* ecc-mul-g-eh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mul-g-eh.c"; sourceTree = ""; }; + 755CD7D31DAA16810075898E /* ecc-mul-g.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-mul-g.c"; sourceTree = ""; }; + 755CD7D41DAA16810075898E /* ecc-pm1-redc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-pm1-redc.c"; sourceTree = ""; }; + 755CD7D51DAA16810075898E /* ecc-point-mul-g.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-point-mul-g.c"; sourceTree = ""; }; + 755CD7D61DAA16810075898E /* ecc-point-mul.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-point-mul.c"; sourceTree = ""; }; + 755CD7D71DAA16810075898E /* ecc-point.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-point.c"; sourceTree = ""; }; + 755CD7D81DAA16810075898E /* ecc-pp1-redc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-pp1-redc.c"; sourceTree = ""; }; + 755CD7D91DAA16810075898E /* ecc-random.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-random.c"; sourceTree = ""; }; + 755CD7DA1DAA16810075898E /* ecc-scalar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-scalar.c"; sourceTree = ""; }; + 755CD7DB1DAA16810075898E /* ecc-size.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecc-size.c"; sourceTree = ""; }; + 755CD7DC1DAA16810075898E /* ecc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ecc.h; sourceTree = ""; }; + 755CD7DD1DAA16810075898E /* eccdata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = eccdata.c; sourceTree = ""; }; + 755CD7DE1DAA16810075898E /* ecdsa-keygen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecdsa-keygen.c"; sourceTree = ""; }; + 755CD7DF1DAA16810075898E /* ecdsa-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecdsa-sign.c"; sourceTree = ""; }; + 755CD7E01DAA16810075898E /* ecdsa-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ecdsa-verify.c"; sourceTree = ""; }; + 755CD7E21DAA16810075898E /* ed25519-sha512-pubkey.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ed25519-sha512-pubkey.c"; sourceTree = ""; }; + 755CD7E31DAA16810075898E /* ed25519-sha512-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ed25519-sha512-sign.c"; sourceTree = ""; }; + 755CD7E41DAA16810075898E /* ed25519-sha512-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ed25519-sha512-verify.c"; sourceTree = ""; }; + 755CD7E51DAA16810075898E /* eddsa-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-compress.c"; sourceTree = ""; }; + 755CD7E61DAA16810075898E /* eddsa-decompress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-decompress.c"; sourceTree = ""; }; + 755CD7E71DAA16810075898E /* eddsa-expand.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-expand.c"; sourceTree = ""; }; + 755CD7E81DAA16810075898E /* eddsa-hash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-hash.c"; sourceTree = ""; }; + 755CD7E91DAA16810075898E /* eddsa-pubkey.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-pubkey.c"; sourceTree = ""; }; + 755CD7EA1DAA16810075898E /* eddsa-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-sign.c"; sourceTree = ""; }; + 755CD7EB1DAA16810075898E /* eddsa-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "eddsa-verify.c"; sourceTree = ""; }; + 755CD7EC1DAA16810075898E /* eddsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = eddsa.h; sourceTree = ""; }; + 755CD80B1DAA16810075898E /* fat-arm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "fat-arm.c"; sourceTree = ""; }; + 755CD80C1DAA16810075898E /* fat-setup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "fat-setup.h"; sourceTree = ""; }; + 755CD80D1DAA16810075898E /* fat-x86_64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "fat-x86_64.c"; sourceTree = ""; }; + 755CD80E1DAA16810075898E /* gcm-aes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes.c"; sourceTree = ""; }; + 755CD80F1DAA16810075898E /* gcm-aes128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes128-meta.c"; sourceTree = ""; }; + 755CD8101DAA16810075898E /* gcm-aes128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes128.c"; sourceTree = ""; }; + 755CD8111DAA16810075898E /* gcm-aes192-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes192-meta.c"; sourceTree = ""; }; + 755CD8121DAA16810075898E /* gcm-aes192.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes192.c"; sourceTree = ""; }; + 755CD8131DAA16810075898E /* gcm-aes256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes256-meta.c"; sourceTree = ""; }; + 755CD8141DAA16810075898E /* gcm-aes256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-aes256.c"; sourceTree = ""; }; + 755CD8151DAA16810075898E /* gcm-camellia128-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-camellia128-meta.c"; sourceTree = ""; }; + 755CD8161DAA16810075898E /* gcm-camellia128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-camellia128.c"; sourceTree = ""; }; + 755CD8171DAA16810075898E /* gcm-camellia256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-camellia256-meta.c"; sourceTree = ""; }; + 755CD8181DAA16810075898E /* gcm-camellia256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gcm-camellia256.c"; sourceTree = ""; }; + 755CD8191DAA16810075898E /* gcm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gcm.c; sourceTree = ""; }; + 755CD81A1DAA16810075898E /* gcm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gcm.h; sourceTree = ""; }; + 755CD81B1DAA16810075898E /* gcmdata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gcmdata.c; sourceTree = ""; }; + 755CD81C1DAA16810075898E /* getopt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getopt.c; sourceTree = ""; }; + 755CD81D1DAA16810075898E /* getopt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = getopt.h; sourceTree = ""; }; + 755CD81E1DAA16810075898E /* getopt1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = getopt1.c; sourceTree = ""; }; + 755CD81F1DAA16810075898E /* getopt_int.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = getopt_int.h; sourceTree = ""; }; + 755CD8201DAA16810075898E /* gmp-glue.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gmp-glue.c"; sourceTree = ""; }; + 755CD8211DAA16810075898E /* gmp-glue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "gmp-glue.h"; sourceTree = ""; }; + 755CD8221DAA16810075898E /* gosthash94-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "gosthash94-meta.c"; sourceTree = ""; }; + 755CD8231DAA16810075898E /* gosthash94.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gosthash94.c; sourceTree = ""; }; + 755CD8241DAA16810075898E /* gosthash94.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gosthash94.h; sourceTree = ""; }; + 755CD8251DAA16810075898E /* hmac-md5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-md5.c"; sourceTree = ""; }; + 755CD8261DAA16810075898E /* hmac-ripemd160.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-ripemd160.c"; sourceTree = ""; }; + 755CD8271DAA16810075898E /* hmac-sha1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-sha1.c"; sourceTree = ""; }; + 755CD8281DAA16810075898E /* hmac-sha224.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-sha224.c"; sourceTree = ""; }; + 755CD8291DAA16810075898E /* hmac-sha256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-sha256.c"; sourceTree = ""; }; + 755CD82A1DAA16810075898E /* hmac-sha384.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-sha384.c"; sourceTree = ""; }; + 755CD82B1DAA16810075898E /* hmac-sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "hmac-sha512.c"; sourceTree = ""; }; + 755CD82C1DAA16810075898E /* hmac.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = ""; }; + 755CD82D1DAA16810075898E /* hmac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = ""; }; + 755CD8321DAA16820075898E /* knuth-lfib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "knuth-lfib.c"; sourceTree = ""; }; + 755CD8331DAA16820075898E /* knuth-lfib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "knuth-lfib.h"; sourceTree = ""; }; + 755CD8371DAA16820075898E /* macros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 755CD8391DAA16820075898E /* md2-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "md2-meta.c"; sourceTree = ""; }; + 755CD83A1DAA16820075898E /* md2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = md2.c; sourceTree = ""; }; + 755CD83B1DAA16820075898E /* md2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md2.h; sourceTree = ""; }; + 755CD83C1DAA16820075898E /* md4-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "md4-meta.c"; sourceTree = ""; }; + 755CD83D1DAA16820075898E /* md4.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = md4.c; sourceTree = ""; }; + 755CD83E1DAA16820075898E /* md4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = ""; }; + 755CD83F1DAA16820075898E /* md5-compat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "md5-compat.c"; sourceTree = ""; }; + 755CD8401DAA16820075898E /* md5-compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "md5-compat.h"; sourceTree = ""; }; + 755CD8411DAA16820075898E /* md5-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "md5-compress.c"; sourceTree = ""; }; + 755CD8421DAA16820075898E /* md5-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "md5-meta.c"; sourceTree = ""; }; + 755CD8431DAA16820075898E /* md5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = md5.c; sourceTree = ""; }; + 755CD8441DAA16820075898E /* md5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + 755CD8451DAA16820075898E /* memeql-sec.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "memeql-sec.c"; sourceTree = ""; }; + 755CD8461DAA16820075898E /* memops.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memops.h; sourceTree = ""; }; + 755CD8471DAA16820075898E /* memxor-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "memxor-internal.h"; sourceTree = ""; }; + 755CD8481DAA16820075898E /* memxor.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = memxor.c; sourceTree = ""; }; + 755CD8491DAA16820075898E /* memxor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memxor.h; sourceTree = ""; }; + 755CD84A1DAA16820075898E /* memxor3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = memxor3.c; sourceTree = ""; }; + 755CD84B1DAA16820075898E /* mini-gmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "mini-gmp.c"; sourceTree = ""; }; + 755CD84C1DAA16820075898E /* mini-gmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "mini-gmp.h"; sourceTree = ""; }; + 755CD8731DAA16820075898E /* nettle-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-internal.c"; sourceTree = ""; }; + 755CD8741DAA16820075898E /* nettle-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "nettle-internal.h"; sourceTree = ""; }; + 755CD8751DAA16820075898E /* nettle-meta-aeads.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-meta-aeads.c"; sourceTree = ""; }; + 755CD8761DAA16820075898E /* nettle-meta-armors.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-meta-armors.c"; sourceTree = ""; }; + 755CD8771DAA16820075898E /* nettle-meta-ciphers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-meta-ciphers.c"; sourceTree = ""; }; + 755CD8781DAA16820075898E /* nettle-meta-hashes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-meta-hashes.c"; sourceTree = ""; }; + 755CD8791DAA16820075898E /* nettle-meta.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "nettle-meta.h"; sourceTree = ""; }; + 755CD87A1DAA16820075898E /* nettle-stdint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "nettle-stdint.h"; sourceTree = ""; }; + 755CD87B1DAA16820075898E /* nettle-types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "nettle-types.h"; sourceTree = ""; }; + 755CD87C1DAA16820075898E /* nettle-write.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "nettle-write.h"; sourceTree = ""; }; + 755CD8801DAA16820075898E /* pbkdf2-hmac-sha1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pbkdf2-hmac-sha1.c"; sourceTree = ""; }; + 755CD8811DAA16820075898E /* pbkdf2-hmac-sha256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pbkdf2-hmac-sha256.c"; sourceTree = ""; }; + 755CD8821DAA16820075898E /* pbkdf2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = pbkdf2.c; sourceTree = ""; }; + 755CD8831DAA16820075898E /* pbkdf2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pbkdf2.h; sourceTree = ""; }; + 755CD8841DAA16820075898E /* pgp-encode.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pgp-encode.c"; sourceTree = ""; }; + 755CD8851DAA16820075898E /* pgp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pgp.h; sourceTree = ""; }; + 755CD8861DAA16820075898E /* pkcs1-decrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-decrypt.c"; sourceTree = ""; }; + 755CD8871DAA16820075898E /* pkcs1-encrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-encrypt.c"; sourceTree = ""; }; + 755CD8881DAA16820075898E /* pkcs1-rsa-digest.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-rsa-digest.c"; sourceTree = ""; }; + 755CD8891DAA16820075898E /* pkcs1-rsa-md5.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-rsa-md5.c"; sourceTree = ""; }; + 755CD88A1DAA16820075898E /* pkcs1-rsa-sha1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-rsa-sha1.c"; sourceTree = ""; }; + 755CD88B1DAA16820075898E /* pkcs1-rsa-sha256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-rsa-sha256.c"; sourceTree = ""; }; + 755CD88C1DAA16820075898E /* pkcs1-rsa-sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-rsa-sha512.c"; sourceTree = ""; }; + 755CD88D1DAA16820075898E /* pkcs1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = pkcs1.c; sourceTree = ""; }; + 755CD88E1DAA16820075898E /* pkcs1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pkcs1.h; sourceTree = ""; }; + 755CD88F1DAA16820075898E /* poly1305-aes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "poly1305-aes.c"; sourceTree = ""; }; + 755CD8901DAA16820075898E /* poly1305-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "poly1305-internal.c"; sourceTree = ""; }; + 755CD8911DAA16820075898E /* poly1305.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = poly1305.h; sourceTree = ""; }; + 755CD8931DAA16820075898E /* realloc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = realloc.c; sourceTree = ""; }; + 755CD8941DAA16820075898E /* realloc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = realloc.h; sourceTree = ""; }; + 755CD8951DAA16820075898E /* ripemd160-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ripemd160-compress.c"; sourceTree = ""; }; + 755CD8961DAA16820075898E /* ripemd160-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "ripemd160-meta.c"; sourceTree = ""; }; + 755CD8971DAA16820075898E /* ripemd160.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ripemd160.c; sourceTree = ""; }; + 755CD8981DAA16820075898E /* ripemd160.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ripemd160.h; sourceTree = ""; }; + 755CD8991DAA16820075898E /* rsa-blind.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-blind.c"; sourceTree = ""; }; + 755CD89A1DAA16820075898E /* rsa-decrypt-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-decrypt-tr.c"; sourceTree = ""; }; + 755CD89B1DAA16820075898E /* rsa-decrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-decrypt.c"; sourceTree = ""; }; + 755CD89C1DAA16820075898E /* rsa-encrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-encrypt.c"; sourceTree = ""; }; + 755CD89D1DAA16820075898E /* rsa-keygen.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-keygen.c"; sourceTree = ""; }; + 755CD89E1DAA16820075898E /* rsa-md5-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-md5-sign-tr.c"; sourceTree = ""; }; + 755CD89F1DAA16820075898E /* rsa-md5-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-md5-sign.c"; sourceTree = ""; }; + 755CD8A01DAA16820075898E /* rsa-md5-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-md5-verify.c"; sourceTree = ""; }; + 755CD8A11DAA16820075898E /* rsa-pkcs1-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-pkcs1-sign-tr.c"; sourceTree = ""; }; + 755CD8A21DAA16820075898E /* rsa-pkcs1-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-pkcs1-sign.c"; sourceTree = ""; }; + 755CD8A31DAA16820075898E /* rsa-pkcs1-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-pkcs1-verify.c"; sourceTree = ""; }; + 755CD8A41DAA16820075898E /* rsa-sha1-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha1-sign-tr.c"; sourceTree = ""; }; + 755CD8A51DAA16820075898E /* rsa-sha1-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha1-sign.c"; sourceTree = ""; }; + 755CD8A61DAA16820075898E /* rsa-sha1-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha1-verify.c"; sourceTree = ""; }; + 755CD8A71DAA16820075898E /* rsa-sha256-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha256-sign-tr.c"; sourceTree = ""; }; + 755CD8A81DAA16820075898E /* rsa-sha256-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha256-sign.c"; sourceTree = ""; }; + 755CD8A91DAA16820075898E /* rsa-sha256-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha256-verify.c"; sourceTree = ""; }; + 755CD8AA1DAA16820075898E /* rsa-sha512-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha512-sign-tr.c"; sourceTree = ""; }; + 755CD8AB1DAA16820075898E /* rsa-sha512-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha512-sign.c"; sourceTree = ""; }; + 755CD8AC1DAA16820075898E /* rsa-sha512-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sha512-verify.c"; sourceTree = ""; }; + 755CD8AD1DAA16820075898E /* rsa-sign-tr.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sign-tr.c"; sourceTree = ""; }; + 755CD8AE1DAA16820075898E /* rsa-sign.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-sign.c"; sourceTree = ""; }; + 755CD8AF1DAA16820075898E /* rsa-verify.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "rsa-verify.c"; sourceTree = ""; }; + 755CD8B01DAA16820075898E /* rsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rsa.c; sourceTree = ""; }; + 755CD8B11DAA16820075898E /* rsa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = ""; }; + 755CD8B21DAA16820075898E /* rsa2openpgp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rsa2openpgp.c; sourceTree = ""; }; + 755CD8B31DAA16820075898E /* rsa2sexp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rsa2sexp.c; sourceTree = ""; }; + 755CD8B51DAA16820075898E /* salsa20-128-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-128-set-key.c"; sourceTree = ""; }; + 755CD8B61DAA16820075898E /* salsa20-256-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-256-set-key.c"; sourceTree = ""; }; + 755CD8B71DAA16820075898E /* salsa20-core-internal.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-core-internal.c"; sourceTree = ""; }; + 755CD8B81DAA16820075898E /* salsa20-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-crypt.c"; sourceTree = ""; }; + 755CD8B91DAA16820075898E /* salsa20-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-set-key.c"; sourceTree = ""; }; + 755CD8BA1DAA16820075898E /* salsa20-set-nonce.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20-set-nonce.c"; sourceTree = ""; }; + 755CD8BB1DAA16820075898E /* salsa20.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = salsa20.h; sourceTree = ""; }; + 755CD8BC1DAA16820075898E /* salsa20r12-crypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "salsa20r12-crypt.c"; sourceTree = ""; }; + 755CD8BD1DAA16820075898E /* sec-add-1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sec-add-1.c"; sourceTree = ""; }; + 755CD8BE1DAA16820075898E /* sec-sub-1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sec-sub-1.c"; sourceTree = ""; }; + 755CD8BF1DAA16820075898E /* sec-tabselect.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sec-tabselect.c"; sourceTree = ""; }; + 755CD8C01DAA16820075898E /* serpent-decrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "serpent-decrypt.c"; sourceTree = ""; }; + 755CD8C11DAA16820075898E /* serpent-encrypt.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "serpent-encrypt.c"; sourceTree = ""; }; + 755CD8C21DAA16820075898E /* serpent-internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "serpent-internal.h"; sourceTree = ""; }; + 755CD8C31DAA16820075898E /* serpent-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "serpent-meta.c"; sourceTree = ""; }; + 755CD8C41DAA16820075898E /* serpent-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "serpent-set-key.c"; sourceTree = ""; }; + 755CD8C51DAA16820075898E /* serpent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = serpent.h; sourceTree = ""; }; + 755CD8C61DAA16820075898E /* sexp-format.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sexp-format.c"; sourceTree = ""; }; + 755CD8C71DAA16820075898E /* sexp-transport-format.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sexp-transport-format.c"; sourceTree = ""; }; + 755CD8C81DAA16820075898E /* sexp-transport.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sexp-transport.c"; sourceTree = ""; }; + 755CD8C91DAA16820075898E /* sexp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sexp.c; sourceTree = ""; }; + 755CD8CA1DAA16820075898E /* sexp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sexp.h; sourceTree = ""; }; + 755CD8CB1DAA16820075898E /* sexp2bignum.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sexp2bignum.c; sourceTree = ""; }; + 755CD8CC1DAA16820075898E /* sexp2dsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sexp2dsa.c; sourceTree = ""; }; + 755CD8CD1DAA16820075898E /* sexp2rsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sexp2rsa.c; sourceTree = ""; }; + 755CD8CE1DAA16820075898E /* sha-example.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha-example.c"; sourceTree = ""; }; + 755CD8CF1DAA16820075898E /* sha.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = ""; }; + 755CD8D01DAA16820075898E /* sha1-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha1-compress.c"; sourceTree = ""; }; + 755CD8D11DAA16820075898E /* sha1-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha1-meta.c"; sourceTree = ""; }; + 755CD8D21DAA16820075898E /* sha1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha1.c; sourceTree = ""; }; + 755CD8D31DAA16820075898E /* sha1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = ""; }; + 755CD8D41DAA16820075898E /* sha2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sha2.h; sourceTree = ""; }; + 755CD8D51DAA16820075898E /* sha224-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha224-meta.c"; sourceTree = ""; }; + 755CD8D61DAA16820075898E /* sha256-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha256-compress.c"; sourceTree = ""; }; + 755CD8D71DAA16820075898E /* sha256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha256-meta.c"; sourceTree = ""; }; + 755CD8D81DAA16820075898E /* sha256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha256.c; sourceTree = ""; }; + 755CD8D91DAA16820075898E /* sha3-224-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-224-meta.c"; sourceTree = ""; }; + 755CD8DA1DAA16820075898E /* sha3-224.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-224.c"; sourceTree = ""; }; + 755CD8DB1DAA16820075898E /* sha3-256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-256-meta.c"; sourceTree = ""; }; + 755CD8DC1DAA16820075898E /* sha3-256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-256.c"; sourceTree = ""; }; + 755CD8DD1DAA16820075898E /* sha3-384-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-384-meta.c"; sourceTree = ""; }; + 755CD8DE1DAA16820075898E /* sha3-384.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-384.c"; sourceTree = ""; }; + 755CD8DF1DAA16820075898E /* sha3-512-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-512-meta.c"; sourceTree = ""; }; + 755CD8E01DAA16820075898E /* sha3-512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-512.c"; sourceTree = ""; }; + 755CD8E11DAA16820075898E /* sha3-permute.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha3-permute.c"; sourceTree = ""; }; + 755CD8E21DAA16820075898E /* sha3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha3.c; sourceTree = ""; }; + 755CD8E31DAA16820075898E /* sha3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = sha3.h; sourceTree = ""; }; + 755CD8E41DAA16820075898E /* sha384-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha384-meta.c"; sourceTree = ""; }; + 755CD8E51DAA16820075898E /* sha512-224-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha512-224-meta.c"; sourceTree = ""; }; + 755CD8E61DAA16820075898E /* sha512-256-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha512-256-meta.c"; sourceTree = ""; }; + 755CD8E71DAA16820075898E /* sha512-compress.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha512-compress.c"; sourceTree = ""; }; + 755CD8E81DAA16820075898E /* sha512-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sha512-meta.c"; sourceTree = ""; }; + 755CD8E91DAA16820075898E /* sha512.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sha512.c; sourceTree = ""; }; + 755CD8EA1DAA16820075898E /* shadata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = shadata.c; sourceTree = ""; }; + 755CD9631DAA16830075898E /* input.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = input.c; sourceTree = ""; }; + 755CD9641DAA16830075898E /* input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 755CD9661DAA16830075898E /* misc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = misc.c; sourceTree = ""; }; + 755CD9671DAA16830075898E /* misc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = misc.h; sourceTree = ""; }; + 755CD9681DAA16830075898E /* nettle-hash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-hash.c"; sourceTree = ""; }; + 755CD9691DAA16830075898E /* nettle-lfib-stream.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-lfib-stream.c"; sourceTree = ""; }; + 755CD96A1DAA16830075898E /* nettle-pbkdf2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "nettle-pbkdf2.c"; sourceTree = ""; }; + 755CD96B1DAA16830075898E /* output.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = output.c; sourceTree = ""; }; + 755CD96C1DAA16830075898E /* output.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; + 755CD96D1DAA16830075898E /* parse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = parse.c; sourceTree = ""; }; + 755CD96E1DAA16830075898E /* parse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = ""; }; + 755CD96F1DAA16830075898E /* pkcs1-conv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "pkcs1-conv.c"; sourceTree = ""; }; + 755CD9701DAA16830075898E /* sexp-conv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "sexp-conv.c"; sourceTree = ""; }; + 755CD9711DAA16830075898E /* twofish-meta.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "twofish-meta.c"; sourceTree = ""; }; + 755CD9721DAA16830075898E /* twofish.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = twofish.c; sourceTree = ""; }; + 755CD9731DAA16830075898E /* twofish.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = twofish.h; sourceTree = ""; }; + 755CD9741DAA16830075898E /* twofishdata.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = twofishdata.c; sourceTree = ""; }; + 755CD9751DAA16830075898E /* umac-l2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-l2.c"; sourceTree = ""; }; + 755CD9761DAA16830075898E /* umac-l3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-l3.c"; sourceTree = ""; }; + 755CD9771DAA16830075898E /* umac-nh-n.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-nh-n.c"; sourceTree = ""; }; + 755CD9781DAA16830075898E /* umac-nh.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-nh.c"; sourceTree = ""; }; + 755CD9791DAA16830075898E /* umac-poly128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-poly128.c"; sourceTree = ""; }; + 755CD97A1DAA16830075898E /* umac-poly64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-poly64.c"; sourceTree = ""; }; + 755CD97B1DAA16830075898E /* umac-set-key.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "umac-set-key.c"; sourceTree = ""; }; + 755CD97C1DAA16830075898E /* umac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = umac.h; sourceTree = ""; }; + 755CD97D1DAA16830075898E /* umac128.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = umac128.c; sourceTree = ""; }; + 755CD97E1DAA16830075898E /* umac32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = umac32.c; sourceTree = ""; }; + 755CD97F1DAA16830075898E /* umac64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = umac64.c; sourceTree = ""; }; + 755CD9801DAA16830075898E /* umac96.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = umac96.c; sourceTree = ""; }; + 755CD9811DAA16830075898E /* version.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = version.c; sourceTree = ""; }; + 755CD9821DAA16830075898E /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; + 755CD9841DAA16830075898E /* write-be32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "write-be32.c"; sourceTree = ""; }; + 755CD9851DAA16830075898E /* write-le32.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "write-le32.c"; sourceTree = ""; }; + 755CD9861DAA16830075898E /* write-le64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "write-le64.c"; sourceTree = ""; }; + 755CD9BD1DAA16830075898E /* yarrow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = yarrow.h; sourceTree = ""; }; + 755CD9BE1DAA16830075898E /* yarrow256.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = yarrow256.c; sourceTree = ""; }; + 755CD9BF1DAA16830075898E /* yarrow_key_event.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = yarrow_key_event.c; sourceTree = ""; }; + 755CD9C41DAA18420075898E /* libunbound.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libunbound.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 755CD9D11DAA197C0075898E /* libBRCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRCore.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 759DA09F1DAB838D008CC49B /* view.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = view.c; sourceTree = ""; }; + 759DA0A01DAB838D008CC49B /* view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = view.h; sourceTree = ""; }; + 75A2A7901DA5934300A983D8 /* Litewallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Litewallet.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 75A2A7931DA5934300A983D8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75A2A79A1DA5934300A983D8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 75A2A79D1DA5934300A983D8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 75A2A79F1DA5934300A983D8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 75A2A7F21DA5935F00A983D8 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = System/Library/Frameworks/Messages.framework; sourceTree = SDKROOT; }; + 75A2A8081DA5936F00A983D8 /* TodayExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TodayExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 75A2A8091DA5936F00A983D8 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; }; + 75A2A80F1DA5936F00A983D8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + 75A2A8111DA5936F00A983D8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 75A2A82B1DA59B2A00A983D8 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A8301DA59B2F00A983D8 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A8351DA59B3600A983D8 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/MainInterface.strings"; sourceTree = ""; }; + 75A2A83A1DA59B3C00A983D8 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A83F1DA59B4500A983D8 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A84E1DA59B5700A983D8 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A8671DA59BFB00A983D8 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/MainInterface.strings; sourceTree = ""; }; + 75A2A87C1DA59E4E00A983D8 /* litewallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = litewallet.entitlements; sourceTree = ""; }; + 75C735AF1DAA1C9F00251ECF /* libnettle.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libnettle.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 75FEFD1B1DAED56E00203D3A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + C30029E125D0185500F08C2B /* StandardDividerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardDividerView.swift; sourceTree = ""; }; + C30029EA25D019BC00F08C2B /* CopyButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyButtonView.swift; sourceTree = ""; }; + C3019EE22B8FEFED00FAF648 /* AssociatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssociatedObject.swift; sourceTree = ""; }; + C316CF48261887FC00E4C09B /* UIApplication+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extension.swift"; sourceTree = ""; }; + C3188E2526431E750008ADD1 /* Debug-GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Debug-GoogleService-Info.plist"; sourceTree = ""; }; + C31891C226733FD400ECE25C /* TabBarViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarViewControllerTests.swift; sourceTree = ""; }; + C31C27662BA327640047F855 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + C32142E925C97CD900BECCD0 /* TransactionCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionCellView.swift; sourceTree = ""; }; + C32142F925C988C800BECCD0 /* TransactionCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionCellViewModel.swift; sourceTree = ""; }; + C32DAE0625925B7E003FC978 /* Color+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Extension.swift"; sourceTree = ""; }; + C32DB42E26488CAA00017D26 /* TabBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarViewController.swift; sourceTree = ""; }; + C33685082BECE8B10069CBC7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + C339752027001BEC0071FED6 /* EmailValidation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailValidation.swift; sourceTree = ""; }; + C3423C192B79039D0051BD6D /* LaunchCardHostingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchCardHostingController.swift; sourceTree = ""; }; + C3423C1B2B7903CA0051BD6D /* LaunchView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchView.swift; sourceTree = ""; }; + C3423C1D2B7904070051BD6D /* StartHostingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartHostingController.swift; sourceTree = ""; }; + C3423C1F2B79046A0051BD6D /* StartView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartView.swift; sourceTree = ""; }; + C3423C212B79047D0051BD6D /* StartViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartViewModel.swift; sourceTree = ""; }; + C3423C232B7904B80051BD6D /* SeedWordView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeedWordView.swift; sourceTree = ""; }; + C3423C252B7904E30051BD6D /* AnnounceUpdatesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnounceUpdatesView.swift; sourceTree = ""; }; + C3423C272B7905330051BD6D /* SafariServices+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SafariServices+Extension.swift"; path = "Extensions/SafariServices+Extension.swift"; sourceTree = ""; }; + C3423C282B7905330051BD6D /* SignupWebViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupWebViewModel.swift; sourceTree = ""; }; + C3423C292B7905330051BD6D /* SignupWebView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignupWebView.swift; sourceTree = ""; }; + C3423C302B796D820051BD6D /* 日本語.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "日本語.mp3"; sourceTree = ""; }; + C3423C312B796D820051BD6D /* Pt.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Pt.mp3; sourceTree = ""; }; + C3423C322B796D820051BD6D /* De.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = De.mp3; sourceTree = ""; }; + C3423C332B796D820051BD6D /* En.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = En.mp3; sourceTree = ""; }; + C3423C342B796D820051BD6D /* coinflip.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = coinflip.aiff; sourceTree = ""; }; + C3423C352B796D820051BD6D /* Uk.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Uk.mp3; sourceTree = ""; }; + C3423C362B796D820051BD6D /* Fr.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Fr.mp3; sourceTree = ""; }; + C3423C372B796D820051BD6D /* 中國人.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "中國人.mp3"; sourceTree = ""; }; + C3423C382B796D820051BD6D /* Id.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Id.mp3; sourceTree = ""; }; + C3423C392B796D820051BD6D /* Tr.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Tr.mp3; sourceTree = ""; }; + C3423C3A2B796D820051BD6D /* Es.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Es.mp3; sourceTree = ""; }; + C3423C3B2B796D820051BD6D /* Ko.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Ko.mp3; sourceTree = ""; }; + C3423C3C2B796D820051BD6D /* It.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = It.mp3; sourceTree = ""; }; + C3423C3D2B796D820051BD6D /* Ru.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = Ru.mp3; sourceTree = ""; }; + C350788727DCAAA000A50819 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/LaunchScreen.strings; sourceTree = ""; }; + C350788827DCAAA000A50819 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/MainInterface.strings; sourceTree = ""; }; + C350788927DCAAA000A50819 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + C350788A27DCAAA100A50819 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = uk; path = uk.lproj/BIP39Words.plist; sourceTree = ""; }; + C350788B27DCB10700A50819 /* TextView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TextView+Extension.swift"; sourceTree = ""; }; + C3543A26264AFE490005D17A /* LocaleChangeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocaleChangeView.swift; sourceTree = ""; }; + C3543A28264AFE720005D17A /* LocaleChangeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocaleChangeViewModel.swift; sourceTree = ""; }; + C35ABD222574070A002BB9BB /* PartnersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartnersView.swift; sourceTree = ""; }; + C35ABD322574073F002BB9BB /* PartnersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PartnersViewModel.swift; sourceTree = ""; }; + C361F48128B368BC00E9798F /* AddressFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressFieldView.swift; sourceTree = ""; }; + C36375A228BD38A500CFB3D8 /* SendButtonHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendButtonHostingController.swift; sourceTree = ""; }; + C36375A428BD390C00CFB3D8 /* SendButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendButtonView.swift; sourceTree = ""; }; + C36DBF5E28F18D2C00FBCB24 /* LocalWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalWebView.swift; sourceTree = ""; }; + C36DBF6028F1988900FBCB24 /* LocalWebViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalWebViewModel.swift; sourceTree = ""; }; + C39443F8269DDAD3002703E9 /* LitewalletIconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LitewalletIconView.swift; sourceTree = ""; }; + C39A71462608CB4300E7B640 /* EmptyTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyTableViewCell.swift; sourceTree = ""; }; + C3ACF2DE25DED601008671D4 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + C3B419CA2BFCF14100EBD935 /* BuyHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyHostingController.swift; sourceTree = ""; }; + C3B419CC2BFCF17600EBD935 /* BuyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyView.swift; sourceTree = ""; }; + C3B7C3B8255EABBF00E98A64 /* SupportSafariViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportSafariViewModel.swift; sourceTree = ""; }; + C3B7C3ED255FF59200E98A64 /* ConstantsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConstantsTests.swift; sourceTree = ""; }; + C3BD4A5225975C6000D97079 /* View+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Extension.swift"; sourceTree = ""; }; + C3BDB42626CC028F004DAE77 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = tr; path = tr.lproj/BIP39Words.plist; sourceTree = ""; }; + C3BDB42726CC028F004DAE77 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/MainInterface.strings; sourceTree = ""; }; + C3BDB42826CC0338004DAE77 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; + C3C8973725CD6B9300241FBE /* HostingTransactionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostingTransactionCell.swift; sourceTree = ""; }; + C3D4379E2566EA3E00F423E1 /* LWActivityIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LWActivityIndicator.swift; sourceTree = ""; }; + C3DBBE302BFE15AF00B95939 /* BuyTileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyTileView.swift; sourceTree = ""; }; + C3E5A9042BFDEEF1002FBE04 /* BuyViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyViewModel.swift; sourceTree = ""; }; + C3E751C12AF689BA005571CA /* BRKeyExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRKeyExtension.swift; sourceTree = ""; }; + C3E751C32AF68A50005571CA /* BRAddressExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAddressExtension.swift; sourceTree = ""; }; + C3E751C52AF68A8E005571CA /* BRTxInputExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTxInputExtension.swift; sourceTree = ""; }; + C3E751C72AF68AEB005571CA /* UnsafeMutablePointerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsafeMutablePointerExtension.swift; sourceTree = ""; }; + C3E751CA2AF68B47005571CA /* BRPeerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPeerManager.swift; sourceTree = ""; }; + C3E751CC2AF68B93005571CA /* BRWallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRWallet.swift; sourceTree = ""; }; + C3E751CE2AF68C18005571CA /* BRCalculationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRCalculationExtension.swift; sourceTree = ""; }; + C3E751D02AF68C84005571CA /* BRMasterKeyExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRMasterKeyExtension.swift; sourceTree = ""; }; + C3E751D22AF68CD1005571CA /* BRTxOutputExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTxOutputExtension.swift; sourceTree = ""; }; + C3EFA9A02650807B005C59B5 /* LockScreenHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockScreenHeaderView.swift; sourceTree = ""; }; + C3EFA9A2265080FF005C59B5 /* LockScreenHeaderViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockScreenHeaderViewModel.swift; sourceTree = ""; }; + C3EFA9A52651A808005C59B5 /* LockScreenTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockScreenTests.swift; sourceTree = ""; }; + C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionModalView.swift; sourceTree = ""; }; + C3F8F13B2C049A4A006C3211 /* LocaleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocaleTests.swift; sourceTree = ""; }; + C3F8F13D2C04C3A7006C3211 /* MoonpayHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoonpayHelper.swift; sourceTree = ""; }; + C3F8F1412C04DEA2006C3211 /* NoBuyTabBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoBuyTabBarViewController.swift; sourceTree = ""; }; + C3F8F1432C04F6BE006C3211 /* Dakar, Senegal.gpx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Dakar, Senegal.gpx"; sourceTree = ""; }; + C3F8F1452C05269A006C3211 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + C3FF4D5E28AC5A5800713139 /* SendAddressCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendAddressCellView.swift; sourceTree = ""; }; + C3FF4D6028AC5AC100713139 /* SendAddressCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendAddressCellViewModel.swift; sourceTree = ""; }; + C7FD407E2C48FAF60010C0E6 /* partner-keys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "partner-keys.plist"; sourceTree = ""; }; + CE03EC731EF256AC0038E3A8 /* SimpleUTXO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SimpleUTXO.swift; path = Models/SimpleUTXO.swift; sourceTree = ""; }; + CE0CD1581DBFBCF5004023DA /* ModalPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ModalPresenter.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CE0FC0F81F72417200E7C626 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + CE124CF71E67A8E500DFA146 /* TransactionDirection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TransactionDirection.swift; path = ViewModels/TransactionDirection.swift; sourceTree = ""; }; + CE124CFB1E68932C00DFA146 /* FeeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeeManager.swift; sourceTree = ""; }; + CE124CFD1E68F57700DFA146 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Extensions/Async.swift; sourceTree = ""; }; + CE124CFF1E69170900DFA146 /* SyncingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SyncingView.swift; path = Views/SyncingView.swift; sourceTree = ""; }; + CE1280F51EEA855C00D27649 /* Date+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Date+Additions.swift"; path = "Extensions/Date+Additions.swift"; sourceTree = ""; }; + CE1D84B51EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIBarButtonItem+Additions.swift"; path = "Extensions/UIBarButtonItem+Additions.swift"; sourceTree = ""; }; + CE1E5F251EF083A600BD0F72 /* StartImportViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartImportViewController.swift; path = ViewControllers/Import/StartImportViewController.swift; sourceTree = ""; }; + CE20C8F11DBAF71500C8397A /* ApplicationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplicationController.swift; sourceTree = ""; }; + CE20C8F51DBAF77D00C8397A /* UIViewController+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+BRWAdditions.swift"; path = "Extensions/UIViewController+BRWAdditions.swift"; sourceTree = ""; }; + CE20C8FB1DBB0F3A00C8397A /* UIColor+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "Extensions/UIColor+Extension.swift"; sourceTree = ""; }; + CE20C8FD1DBB133A00C8397A /* SimpleRedux.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleRedux.swift; sourceTree = ""; }; + CE20C9001DBBFFF800C8397A /* Actions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Actions.swift; path = SimpleRedux/Actions.swift; sourceTree = ""; }; + CE20C9061DBC587200C8397A /* StartViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartViewController.swift; path = ViewControllers/StartViewController.swift; sourceTree = ""; }; + CE20C90B1DBC59E600C8397A /* StartFlowPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartFlowPresenter.swift; sourceTree = ""; }; + CE20C90D1DBE52B000C8397A /* UIView+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+BRWAdditions.swift"; path = "Extensions/UIView+BRWAdditions.swift"; sourceTree = ""; }; + CE20C9101DBE5B6F00C8397A /* Circle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Circle.swift; path = Views/Circle.swift; sourceTree = ""; }; + CE20C9161DBE6F2A00C8397A /* UIButton+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIButton+BRWAdditions.swift"; path = "Extensions/UIButton+BRWAdditions.swift"; sourceTree = ""; }; + CE20C9181DBE7B8200C8397A /* ReduxState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReduxState.swift; path = SimpleRedux/ReduxState.swift; sourceTree = ""; }; + CE25BF8C1DF3B8A500BC67B6 /* InViewAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InViewAlert.swift; path = Views/InViewAlert.swift; sourceTree = ""; }; + CE25BF901DF9ADE700BC67B6 /* UIImage+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIImage+Utils.swift"; path = "Extensions/UIImage+Utils.swift"; sourceTree = ""; }; + CE25BF921DFDA7A500BC67B6 /* MessageUIPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageUIPresenter.swift; sourceTree = ""; }; + CE27074B1F016B6B00431BBC /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + CE27074C1F016B6D00431BBC /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + CE27074E1F016D2400431BBC /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; + CE27F9581E2C8EA300F7F7F2 /* Amount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Amount.swift; path = ViewModels/Amount.swift; sourceTree = ""; }; + CE29901B1EFD6DE50093A0F2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + CE29901F1EFD6E060093A0F2 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + CE2990201EFD6F3E0093A0F2 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + CE2990221EFD6F500093A0F2 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + CE36454B1E7B42850079D0CF /* PinPadCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinPadCells.swift; path = Views/PinPadCells/PinPadCells.swift; sourceTree = ""; }; + CE3D4C561EF5D5740016B1C8 /* ReachabilityMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReachabilityMonitor.swift; sourceTree = ""; }; + CE3D4C581EF743EF0016B1C8 /* Functions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Functions.swift; path = Constants/Functions.swift; sourceTree = ""; }; + CE44BA1A1F33BFC500392A1A /* NodeSelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NodeSelectorViewController.swift; path = ViewControllers/NodeSelectorViewController.swift; sourceTree = ""; }; + CE45C1F81E74B400002C3847 /* ManageWalletViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ManageWalletViewController.swift; path = ViewControllers/RootModals/ManageWalletViewController.swift; sourceTree = ""; }; + CE45C1FA1E74F89C002C3847 /* WalletInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletInfo.swift; path = Platform/WalletInfo.swift; sourceTree = ""; }; + CE45C1FC1E7650F5002C3847 /* KVStoreCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KVStoreCoordinator.swift; sourceTree = ""; }; + CE47A8DF1F7DA54000FF35BA /* UIScreen+Additions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "UIScreen+Additions.swift"; path = "Extensions/UIScreen+Additions.swift"; sourceTree = ""; }; + CE4B6C191E219CA600CF935B /* WalletCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletCoordinator.swift; sourceTree = ""; }; + CE4C1CC51ED65D830063E184 /* DrawableCircle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DrawableCircle.swift; path = Views/DrawableCircle.swift; sourceTree = ""; }; + CE4C1CC71ED88B600063E184 /* URLController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = URLController.swift; path = FlowControllers/URLController.swift; sourceTree = ""; }; + CE4CA7BB1EE3649100373F11 /* BRActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRActivityView.swift; path = Platform/BRActivityView.swift; sourceTree = ""; }; + CE4DFB2B1E9BE5880014009E /* ReScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReScanViewController.swift; path = ViewControllers/ReScanViewController.swift; sourceTree = ""; }; + CE4DFB2D1E9C26DA0014009E /* ShareDataViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareDataViewController.swift; path = ViewControllers/ShareDataViewController.swift; sourceTree = ""; }; + CE5E6C931EB7964900A476DB /* WalletDisabledView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletDisabledView.swift; path = Views/WalletDisabledView.swift; sourceTree = ""; }; + CE5E6C991EB9135000A476DB /* Icon.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icon.xcassets; sourceTree = ""; }; + CE5F21D81E4A922700C47B8E /* DismissLoginAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DismissLoginAnimator.swift; path = ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift; sourceTree = ""; }; + CE5F21DA1E4A93A500C47B8E /* LoginTransitionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginTransitionDelegate.swift; path = ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift; sourceTree = ""; }; + CE6314821E08E5BB00D4AFE0 /* UIView+InitAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+InitAdditions.swift"; path = "Extensions/UIView+InitAdditions.swift"; sourceTree = ""; }; + CE6B6B491E54C0CA00B31405 /* SecurityCenterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SecurityCenterCell.swift; path = Views/SecurityCenterCell.swift; sourceTree = ""; }; + CE6BCF5C1EE9E89A0029849C /* CustomTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomTitleView.swift; path = Extensions/CustomTitleView.swift; sourceTree = ""; }; + CE6D0E5B1E14BFA600137DF1 /* KeyboardNotificationInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KeyboardNotificationInfo.swift; path = Models/KeyboardNotificationInfo.swift; sourceTree = ""; }; + CE6D0F961DE8B73A00BD4BCF /* ModalTransitionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalTransitionDelegate.swift; path = ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift; sourceTree = ""; }; + CE6D0F981DE8B75900BD4BCF /* DismissModalAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DismissModalAnimator.swift; path = ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift; sourceTree = ""; }; + CE6DCC241E6001E50044257B /* UIControl+Callback.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIControl+Callback.swift"; path = "Extensions/UIControl+Callback.swift"; sourceTree = ""; }; + CE6DCC261E6108D50044257B /* EnterPhraseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseCell.swift; path = Views/EnterPhraseCell.swift; sourceTree = ""; }; + CE6DCC2F1E6666470044257B /* NonScrollingCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NonScrollingCollectionView.swift; path = Views/NonScrollingCollectionView.swift; sourceTree = ""; }; + CE74F58C1E3BA85600ED5FA9 /* ExchangeUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExchangeUpdater.swift; path = Wallet/ExchangeUpdater.swift; sourceTree = ""; }; + CE760EDA1E561DF900EFAC2B /* SecurityCenterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SecurityCenterViewController.swift; path = ViewControllers/SecurityCenter/SecurityCenterViewController.swift; sourceTree = ""; }; + CE760EDB1E561DF900EFAC2B /* UpdatePinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UpdatePinViewController.swift; path = ViewControllers/SecurityCenter/UpdatePinViewController.swift; sourceTree = ""; }; + CE83DE291E9EB7F600D07636 /* SendAmountCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SendAmountCell.swift; path = Views/SendAmountCell.swift; sourceTree = ""; }; + CE8644241F2C160200033129 /* ConfirmationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmationViewController.swift; path = ViewControllers/ConfirmationViewController.swift; sourceTree = ""; }; + CE8CD8DC1E2D9EF200785E02 /* Sender.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Sender.swift; sourceTree = ""; }; + CE8CD8DE1E2E825000785E02 /* VerifyPinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerifyPinViewController.swift; path = ViewControllers/VerifyPinViewController.swift; sourceTree = ""; }; + CE8CD8E01E31976800785E02 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginViewController.swift; path = ViewControllers/LoginViewController.swift; sourceTree = ""; }; + CE8F0AE21EB91BB500AA7642 /* SearchHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SearchHeaderView.swift; path = Views/SearchHeaderView.swift; sourceTree = ""; }; + CE9057171DFF0FA8006BA848 /* String+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "String+Additions.swift"; path = "Extensions/String+Additions.swift"; sourceTree = ""; }; + CE9057191DFF18B2006BA848 /* ScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ScanViewController.swift; path = ViewControllers/ScanViewController.swift; sourceTree = ""; }; + CE916E291EDA7E4400D641D6 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; + CE916E2B1EDA7E9100D641D6 /* BRAppGroupConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRAppGroupConstants.h; sourceTree = ""; }; + CE916E2C1EDA7ED000D641D6 /* BRBubbleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRBubbleView.h; sourceTree = ""; }; + CE916E2D1EDA7ED000D641D6 /* BRBubbleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRBubbleView.m; sourceTree = ""; }; + CE916E2F1EDA7F1400D641D6 /* UIImage+Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Utils.h"; sourceTree = ""; }; + CE916E301EDA7F1400D641D6 /* UIImage+Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Utils.m"; sourceTree = ""; }; + CE916E321EDA800E00D641D6 /* UserDefaultsUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaultsUpdater.swift; sourceTree = ""; }; + CE916E341EDA848B00D641D6 /* TodayExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TodayExtension.entitlements; sourceTree = ""; }; + CE916E351EDA855800D641D6 /* BRTodayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRTodayViewController.h; sourceTree = ""; }; + CE916E361EDA855800D641D6 /* BRTodayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRTodayViewController.m; sourceTree = ""; }; + CE92F9EF1DED0C790046B516 /* PresentModalAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PresentModalAnimator.swift; path = ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift; sourceTree = ""; }; + CE92F9F31DED59E80046B516 /* UIView+AnimationAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+AnimationAdditions.swift"; path = "Extensions/UIView+AnimationAdditions.swift"; sourceTree = ""; }; + CE92F9F51DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewControllerContextTransitioning+BRAdditions.swift"; path = "Extensions/UIViewControllerContextTransitioning+BRAdditions.swift"; sourceTree = ""; }; + CEA362671E00EE320061FC0E /* CameraGuideView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CameraGuideView.swift; path = Views/CameraGuideView.swift; sourceTree = ""; }; + CEA362691E01150D0061FC0E /* CGContext+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CGContext+Additions.swift"; path = "Extensions/CGContext+Additions.swift"; sourceTree = ""; }; + CEAA9E8E1DC074410066731D /* StartPaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartPaperPhraseViewController.swift; path = ViewControllers/StartPaperPhraseViewController.swift; sourceTree = ""; }; + CEAA9E901DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewPropertyAnimator+BRWAdditions.swift"; path = "Extensions/UIViewPropertyAnimator+BRWAdditions.swift"; sourceTree = ""; }; + CEAA9E921DC110E70066731D /* WritePaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WritePaperPhraseViewController.swift; path = ViewControllers/WritePaperPhraseViewController.swift; sourceTree = ""; }; + CEAA9E941DC1659F0066731D /* UILabel+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UILabel+BRWAdditions.swift"; path = "Extensions/UILabel+BRWAdditions.swift"; sourceTree = ""; }; + CEAA9E961DC18E1F0066731D /* PhraseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PhraseView.swift; path = Views/PhraseView.swift; sourceTree = ""; }; + CEAA9E981DC262800066731D /* ConfirmPaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmPaperPhraseViewController.swift; path = ViewControllers/ConfirmPaperPhraseViewController.swift; sourceTree = ""; }; + CEAA9E9A1DC2B9320066731D /* ConfirmPhrase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmPhrase.swift; path = Views/ConfirmPhrase.swift; sourceTree = ""; }; + CEAA9E9F1DC2F9F50066731D /* UIFont+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIFont+BRWAdditions.swift"; path = "Extensions/UIFont+BRWAdditions.swift"; sourceTree = ""; }; + CEAA9EA51DC3246F0066731D /* StartNavigationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StartNavigationDelegate.swift; sourceTree = ""; }; + CEAA9EA71DC3342E0066731D /* PinView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinView.swift; path = Views/PinView.swift; sourceTree = ""; }; + CEAFC8601E5D5B0500E4FD06 /* SegmentedButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SegmentedButton.swift; path = Controls/SegmentedButton.swift; sourceTree = ""; }; + CEB909F41E5FE63D001804DC /* EnterPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseViewController.swift; path = ViewControllers/EnterPhraseViewController.swift; sourceTree = ""; }; + CEB909F61E5FE654001804DC /* EnterPhraseCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseCollectionViewController.swift; path = ViewControllers/EnterPhraseCollectionViewController.swift; sourceTree = ""; }; + CEB909F91E5FF242001804DC /* RecoverWalletIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RecoverWalletIntroViewController.swift; path = ViewControllers/RecoverWalletIntroViewController.swift; sourceTree = ""; }; + CEBF292D1EF99E55005C330A /* LightWeightAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LightWeightAlert.swift; path = Views/LightWeightAlert.swift; sourceTree = ""; }; + CEBF292F1EF9D76F005C330A /* Environment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = ""; }; + CEBF32ED1DDBC30000348FC6 /* ShadowButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShadowButton.swift; path = Views/ShadowButton.swift; sourceTree = ""; }; + CEBF33031DDE17A600348FC6 /* Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = Transaction.swift; path = ViewModels/Transaction.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CEC4CF061F0C48DD00E5C82E /* StartWipeWalletViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartWipeWalletViewController.swift; path = ViewControllers/StartWipeWalletViewController.swift; sourceTree = ""; }; + CEC4CF081F0C84AB00E5C82E /* UIViewController+Alerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Alerts.swift"; path = "Extensions/UIViewController+Alerts.swift"; sourceTree = ""; }; + CEC6AA381DEE10BA00EE5AFD /* UINavigationController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UINavigationController+Extension.swift"; path = "Extensions/UINavigationController+Extension.swift"; sourceTree = ""; }; + CEC6AA3A1DEE4EB000EE5AFD /* CGRect+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CGRect+Additions.swift"; path = "Extensions/CGRect+Additions.swift"; sourceTree = ""; }; + CEC6AA3C1DEE687000EE5AFD /* RadialGradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RadialGradientView.swift; path = Views/RadialGradientView.swift; sourceTree = ""; }; + CEC6AA3F1DEFC87300EE5AFD /* SendViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = SendViewController.swift; path = ViewControllers/RootModals/SendViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CEC6AA411DEFC88F00EE5AFD /* ReceiveViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReceiveViewController.swift; path = ViewControllers/RootModals/ReceiveViewController.swift; sourceTree = ""; }; + CEC6AA431DEFCDE900EE5AFD /* ModalViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalViewController.swift; path = ViewControllers/RootModals/ModalViewController.swift; sourceTree = ""; }; + CEC6AA451DEFCE9200EE5AFD /* MenuViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuViewController.swift; path = ViewControllers/RootModals/MenuViewController.swift; sourceTree = ""; }; + CEC6AA481DEFD00100EE5AFD /* MenuButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuButton.swift; path = Controls/MenuButton.swift; sourceTree = ""; }; + CEC6AA4A1DEFD24C00EE5AFD /* MenuButtonType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuButtonType.swift; path = Controls/MenuButtonType.swift; sourceTree = ""; }; + CEC6AA4C1DF0741100EE5AFD /* ModalDisplayable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalDisplayable.swift; path = ViewControllers/RootModals/ModalDisplayable.swift; sourceTree = ""; }; + CEC6F8441E886723000795B8 /* PaymentRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaymentRequest.swift; sourceTree = ""; }; + CECCE5A41E02408300D99448 /* UIView+FrameChangeBlocking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+FrameChangeBlocking.swift"; path = "Extensions/UIView+FrameChangeBlocking.swift"; sourceTree = ""; }; + CECCE5A81E0378FB00D99448 /* PinPadViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinPadViewController.swift; path = ViewControllers/PinPadViewController.swift; sourceTree = ""; }; + CECCE5AD1E04AD6300D99448 /* AddressCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AddressCell.swift; path = Views/SendViewCells/AddressCell.swift; sourceTree = ""; }; + CECCE5AF1E04AD7600D99448 /* DescriptionSendCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DescriptionSendCell.swift; path = Views/SendViewCells/DescriptionSendCell.swift; sourceTree = ""; }; + CECCE5B11E04B00D00D99448 /* SendCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SendCell.swift; path = Views/SendViewCells/SendCell.swift; sourceTree = ""; }; + CED341321EF5A5C00014912A /* InAppAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InAppAlert.swift; path = Views/InAppAlert.swift; sourceTree = ""; }; + CEE0EF511EBD14B60018DB36 /* PinTransitioningDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinTransitioningDelegate.swift; path = ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift; sourceTree = ""; }; + CEE1F5621DF13E5A00D733AD /* ModalHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalHeaderView.swift; path = Views/ModalHeaderView.swift; sourceTree = ""; }; + CEE20C2C1EA288FA0086F724 /* UpdatingLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UpdatingLabel.swift; path = Views/UpdatingLabel.swift; sourceTree = ""; }; + CEE20C2E1EA3E5820086F724 /* BlinkingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BlinkingView.swift; path = Views/BlinkingView.swift; sourceTree = ""; }; + CEE20C331EA5B4550086F724 /* ArticleIds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ArticleIds.swift; path = Constants/ArticleIds.swift; sourceTree = ""; }; + CEE20C351EA5B4620086F724 /* Constants+Events.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Constants+Events.swift"; path = "Constants/Constants+Events.swift"; sourceTree = ""; }; + CEE20C371EA5B4680086F724 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Strings.swift; path = Constants/Strings.swift; sourceTree = ""; }; + CEE628291EA98B6D001035AA /* DispatchQueue+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Additions.swift"; path = "Extensions/DispatchQueue+Additions.swift"; sourceTree = ""; }; + CEE659E61F65A936001FF29D /* RetryTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RetryTimer.swift; sourceTree = ""; }; + CEE659E81F664C73001FF29D /* WelcomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WelcomeViewController.swift; path = ViewControllers/WelcomeViewController.swift; sourceTree = ""; }; + CEE659ED1F68AAB5001FF29D /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + CEE659EE1F68AAB9001FF29D /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + CEE65DEF1E39056F0002994D /* Rate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Rate.swift; path = Models/Rate.swift; sourceTree = ""; }; + CEEC707E1E8D6B4100EF788E /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SettingsViewController.swift; path = ViewControllers/SettingsViewController.swift; sourceTree = ""; }; + CEEC70801E90C04700EF788E /* SeparatorCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SeparatorCell.swift; path = Views/SeparatorCell.swift; sourceTree = ""; }; + CEEC70821E90C07C00EF788E /* Setting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Setting.swift; path = Models/Setting.swift; sourceTree = ""; }; + CEEC70851E94397D00EF788E /* UserDefaults+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UserDefaults+Additions.swift"; path = "Extensions/UserDefaults+Additions.swift"; sourceTree = ""; }; + CEEC70891E945E3B00EF788E /* UnEditableTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UnEditableTextView.swift; path = Views/UnEditableTextView.swift; sourceTree = ""; }; + CEEC708B1E95461A00EF788E /* AboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AboutViewController.swift; path = ViewControllers/AboutViewController.swift; sourceTree = ""; }; + CEEC708D1E954AAB00EF788E /* AboutCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AboutCell.swift; path = Views/AboutCell.swift; sourceTree = ""; }; + CEEC70911E95DA4400EF788E /* GradientSwitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientSwitch.swift; path = Views/GradientSwitch.swift; sourceTree = ""; }; + CEEC70931E96A24F00EF788E /* DefaultCurrencyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = DefaultCurrencyViewController.swift; path = Views/DefaultCurrencyViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CEEE92F01EBA7CBA00B7AC9C /* RequestAmountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = RequestAmountViewController.swift; path = ViewControllers/RequestAmountViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CEF3D2DC1E8CBA790070178E /* LAContext+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "LAContext+Extensions.swift"; path = "Extensions/LAContext+Extensions.swift"; sourceTree = ""; }; + CEF3E82A1DE51612007C0A9E /* GradientCircle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientCircle.swift; path = Views/GradientCircle.swift; sourceTree = ""; }; + CEF3E82C1DE528BF007C0A9E /* AlertView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AlertView.swift; path = Views/AlertView.swift; sourceTree = ""; }; + CEF3E82E1DE534C5007C0A9E /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientView.swift; path = Views/GradientView.swift; sourceTree = ""; }; + CEF3E8311DE55540007C0A9E /* CheckView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CheckView.swift; path = Views/AnimatedIcons/CheckView.swift; sourceTree = ""; }; + CEF3E8331DE57166007C0A9E /* AnimatableIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnimatableIcon.swift; path = Views/AnimatedIcons/AnimatableIcon.swift; sourceTree = ""; }; + CEF3E8351DE60222007C0A9E /* ModalNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalNavigationController.swift; path = ViewControllers/ModalNavigationController.swift; sourceTree = ""; }; + CEF61B111ECF52C700C7EA6A /* AmountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = AmountViewController.swift; path = ViewControllers/AmountViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + CEF61B131ED0D10000C7EA6A /* Types.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Types.swift; path = Models/Types.swift; sourceTree = ""; }; + CEF61B151ED2056D00C7EA6A /* NumberFormatter+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NumberFormatter+Additions.swift"; path = "Extensions/NumberFormatter+Additions.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2465873323A5AAD000A32E9E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9C11DAA18420075898E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9CE1DAA197C0075898E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A78D1DA5934300A983D8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 24D91D0B2166923E0077A619 /* UserNotifications.framework in Frameworks */, + C35C122A293D48340009022D /* KeychainAccess in Frameworks */, + 22A9A9661DF61FEE000F0016 /* WebKit.framework in Frameworks */, + 22A9A9641DF61FE7000F0016 /* Security.framework in Frameworks */, + 22A9A9621DF61FE0000F0016 /* SystemConfiguration.framework in Frameworks */, + 22A9A9601DF61FD8000F0016 /* CoreLocation.framework in Frameworks */, + 22A9A95E1DF61FD0000F0016 /* PushKit.framework in Frameworks */, + C3423C182B781C6B0051BD6D /* PushNotifications in Frameworks */, + C35C1222293D464A0009022D /* FirebaseAuth in Frameworks */, + C35C1224293D464A0009022D /* FirebaseCrashlytics in Frameworks */, + C35C1220293D464A0009022D /* FirebaseAnalytics in Frameworks */, + 759DA0BE1DAC36A3008CC49B /* libBRCore.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A8051DA5936F00A983D8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 75A2A80A1DA5936F00A983D8 /* NotificationCenter.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75C735AC1DAA1C9F00251ECF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1BBAEBE51F80237B0047DEA8 /* loafwallet-core */ = { + isa = PBXGroup; + children = ( + 1BBAEBE81F80237B0047DEA8 /* BRAddress.c */, + 1BBAEBE91F80237B0047DEA8 /* BRAddress.h */, + 1BBAEBEA1F80237B0047DEA8 /* BRArray.h */, + 1BBAEBEB1F80237B0047DEA8 /* BRBase58.c */, + 1BBAEBEC1F80237B0047DEA8 /* BRBase58.h */, + 1BA9FE3C216F68A700BB2DE8 /* BRBech32.c */, + 1BA9FE3B216F68A600BB2DE8 /* BRBech32.h */, + 1BBAEBED1F80237B0047DEA8 /* BRBIP32Sequence.c */, + 1BBAEBEE1F80237B0047DEA8 /* BRBIP32Sequence.h */, + 1BBAEBEF1F80237B0047DEA8 /* BRBIP38Key.c */, + 1BBAEBF01F80237B0047DEA8 /* BRBIP38Key.h */, + 1BBAEBF11F80237B0047DEA8 /* BRBIP39Mnemonic.c */, + 1BBAEBF21F80237B0047DEA8 /* BRBIP39Mnemonic.h */, + 1BBAEBF31F80237B0047DEA8 /* BRBIP39WordsEn.h */, + 1BBAEBF41F80237B0047DEA8 /* BRBloomFilter.c */, + 1BBAEBF51F80237B0047DEA8 /* BRBloomFilter.h */, + 1BBAEC7D1F8025020047DEA8 /* BRCrypto.c */, + 1BBAEBF71F80237B0047DEA8 /* BRCrypto.h */, + 1BBAEBF81F80237B0047DEA8 /* BRInt.h */, + 1BBAEBF91F80237B0047DEA8 /* BRKey.c */, + 1BBAEBFA1F80237B0047DEA8 /* BRKey.h */, + 1BBAEBFB1F80237B0047DEA8 /* BRMerkleBlock.c */, + 1BBAEBFC1F80237B0047DEA8 /* BRMerkleBlock.h */, + 1BBAEBFD1F80237B0047DEA8 /* BRPaymentProtocol.c */, + 1BBAEBFE1F80237B0047DEA8 /* BRPaymentProtocol.h */, + 1BBAEBFF1F80237B0047DEA8 /* BRPeer.c */, + 1BBAEC001F80237B0047DEA8 /* BRPeer.h */, + 1BBAEC011F80237B0047DEA8 /* BRPeerManager.c */, + 1BBAEC021F80237B0047DEA8 /* BRPeerManager.h */, + 1BBAEC031F80237B0047DEA8 /* BRSet.c */, + 1BBAEC041F80237B0047DEA8 /* BRSet.h */, + 1BBAEC051F80237B0047DEA8 /* BRTransaction.c */, + 1BBAEC061F80237B0047DEA8 /* BRTransaction.h */, + 1BBAEC071F80237B0047DEA8 /* BRWallet.c */, + 1BBAEC081F80237B0047DEA8 /* BRWallet.h */, + 1BBAEC0A1F80237B0047DEA8 /* module.modulemap */, + 1BBAEC0B1F80237B0047DEA8 /* README.md */, + 1BBAEC0C1F80237B0047DEA8 /* secp256k1 */, + 1BBAEC711F80237C0047DEA8 /* test.c */, + ); + name = "loafwallet-core"; + path = "Modules/loafwallet-core"; + sourceTree = ""; + }; + 1BBAEC0C1F80237B0047DEA8 /* secp256k1 */ = { + isa = PBXGroup; + children = ( + 1BBAEC0D1F80237B0047DEA8 /* .gitignore */, + 1BBAEC0E1F80237B0047DEA8 /* .travis.yml */, + 1BBAEC0F1F80237B0047DEA8 /* autogen.sh */, + 1BBAEC101F80237B0047DEA8 /* build-aux */, + 1BBAEC151F80237B0047DEA8 /* configure.ac */, + 1BBAEC161F80237B0047DEA8 /* contrib */, + 1BBAEC1B1F80237B0047DEA8 /* COPYING */, + 1BBAEC1C1F80237B0047DEA8 /* include */, + 1BBAEC201F80237B0047DEA8 /* libsecp256k1.pc.in */, + 1BBAEC211F80237B0047DEA8 /* Makefile.am */, + 1BBAEC221F80237B0047DEA8 /* obj */, + 1BBAEC241F80237B0047DEA8 /* README.md */, + 1BBAEC251F80237B0047DEA8 /* sage */, + 1BBAEC291F80237B0047DEA8 /* src */, + 1BBAEC701F80237C0047DEA8 /* TODO */, + ); + path = secp256k1; + sourceTree = ""; + }; + 1BBAEC101F80237B0047DEA8 /* build-aux */ = { + isa = PBXGroup; + children = ( + 1BBAEC111F80237B0047DEA8 /* m4 */, + ); + path = "build-aux"; + sourceTree = ""; + }; + 1BBAEC111F80237B0047DEA8 /* m4 */ = { + isa = PBXGroup; + children = ( + 1BBAEC121F80237B0047DEA8 /* ax_jni_include_dir.m4 */, + 1BBAEC131F80237B0047DEA8 /* ax_prog_cc_for_build.m4 */, + 1BBAEC141F80237B0047DEA8 /* bitcoin_secp.m4 */, + ); + path = m4; + sourceTree = ""; + }; + 1BBAEC161F80237B0047DEA8 /* contrib */ = { + isa = PBXGroup; + children = ( + 1BBAEC171F80237B0047DEA8 /* lax_der_parsing.c */, + 1BBAEC181F80237B0047DEA8 /* lax_der_parsing.h */, + 1BBAEC191F80237B0047DEA8 /* lax_der_privatekey_parsing.c */, + 1BBAEC1A1F80237B0047DEA8 /* lax_der_privatekey_parsing.h */, + ); + path = contrib; + sourceTree = ""; + }; + 1BBAEC1C1F80237B0047DEA8 /* include */ = { + isa = PBXGroup; + children = ( + 1BBAEC1D1F80237B0047DEA8 /* secp256k1.h */, + 1BBAEC1E1F80237B0047DEA8 /* secp256k1_ecdh.h */, + 1BBAEC1F1F80237B0047DEA8 /* secp256k1_recovery.h */, + ); + path = include; + sourceTree = ""; + }; + 1BBAEC221F80237B0047DEA8 /* obj */ = { + isa = PBXGroup; + children = ( + 1BBAEC231F80237B0047DEA8 /* .gitignore */, + ); + path = obj; + sourceTree = ""; + }; + 1BBAEC251F80237B0047DEA8 /* sage */ = { + isa = PBXGroup; + children = ( + 1BBAEC261F80237B0047DEA8 /* group_prover.sage */, + 1BBAEC271F80237B0047DEA8 /* secp256k1.sage */, + 1BBAEC281F80237B0047DEA8 /* weierstrass_prover.sage */, + ); + path = sage; + sourceTree = ""; + }; + 1BBAEC291F80237B0047DEA8 /* src */ = { + isa = PBXGroup; + children = ( + 1BBAEC2A1F80237B0047DEA8 /* asm */, + 1BBAEC2C1F80237B0047DEA8 /* basic-config.h */, + 1BBAEC2D1F80237B0047DEA8 /* bench.h */, + 1BBAEC2E1F80237B0047DEA8 /* bench_ecdh.c */, + 1BBAEC2F1F80237B0047DEA8 /* bench_internal.c */, + 1BBAEC301F80237B0047DEA8 /* bench_recover.c */, + 1BBAEC311F80237B0047DEA8 /* bench_sign.c */, + 1BBAEC321F80237B0047DEA8 /* bench_verify.c */, + 1BBAEC331F80237B0047DEA8 /* ecdsa.h */, + 1BBAEC341F80237B0047DEA8 /* ecdsa_impl.h */, + 1BBAEC351F80237B0047DEA8 /* eckey.h */, + 1BBAEC361F80237B0047DEA8 /* eckey_impl.h */, + 1BBAEC371F80237B0047DEA8 /* ecmult.h */, + 1BBAEC381F80237B0047DEA8 /* ecmult_const.h */, + 1BBAEC391F80237B0047DEA8 /* ecmult_const_impl.h */, + 1BBAEC3A1F80237B0047DEA8 /* ecmult_gen.h */, + 1BBAEC3B1F80237B0047DEA8 /* ecmult_gen_impl.h */, + 1BBAEC3C1F80237B0047DEA8 /* ecmult_impl.h */, + 1BBAEC3D1F80237B0047DEA8 /* field.h */, + 1BBAEC3E1F80237B0047DEA8 /* field_10x26.h */, + 1BBAEC3F1F80237B0047DEA8 /* field_10x26_impl.h */, + 1BBAEC401F80237B0047DEA8 /* field_5x52.h */, + 1BBAEC411F80237B0047DEA8 /* field_5x52_asm_impl.h */, + 1BBAEC421F80237B0047DEA8 /* field_5x52_impl.h */, + 1BBAEC431F80237B0047DEA8 /* field_5x52_int128_impl.h */, + 1BBAEC441F80237B0047DEA8 /* field_impl.h */, + 1BBAEC451F80237B0047DEA8 /* gen_context.c */, + 1BBAEC461F80237B0047DEA8 /* group.h */, + 1BBAEC471F80237B0047DEA8 /* group_impl.h */, + 1BBAEC481F80237B0047DEA8 /* hash.h */, + 1BBAEC491F80237B0047DEA8 /* hash_impl.h */, + 1BBAEC4A1F80237B0047DEA8 /* java */, + 1BBAEC551F80237B0047DEA8 /* modules */, + 1BBAEC5E1F80237B0047DEA8 /* num.h */, + 1BBAEC5F1F80237B0047DEA8 /* num_gmp.h */, + 1BBAEC601F80237B0047DEA8 /* num_gmp_impl.h */, + 1BBAEC611F80237B0047DEA8 /* num_impl.h */, + 1BBAEC621F80237B0047DEA8 /* scalar.h */, + 1BBAEC631F80237B0047DEA8 /* scalar_4x64.h */, + 1BBAEC641F80237B0047DEA8 /* scalar_4x64_impl.h */, + 1BBAEC651F80237B0047DEA8 /* scalar_8x32.h */, + 1BBAEC661F80237B0047DEA8 /* scalar_8x32_impl.h */, + 1BBAEC671F80237B0047DEA8 /* scalar_impl.h */, + 1BBAEC681F80237B0047DEA8 /* scalar_low.h */, + 1BBAEC691F80237B0047DEA8 /* scalar_low_impl.h */, + 1BBAEC6A1F80237B0047DEA8 /* secp256k1.c */, + 1BBAEC6B1F80237B0047DEA8 /* testrand.h */, + 1BBAEC6C1F80237B0047DEA8 /* testrand_impl.h */, + 1BBAEC6D1F80237B0047DEA8 /* tests.c */, + 1BBAEC6E1F80237B0047DEA8 /* tests_exhaustive.c */, + 1BBAEC6F1F80237B0047DEA8 /* util.h */, + ); + path = src; + sourceTree = ""; + }; + 1BBAEC2A1F80237B0047DEA8 /* asm */ = { + isa = PBXGroup; + children = ( + 1BBAEC2B1F80237B0047DEA8 /* field_10x26_arm.s */, + ); + path = asm; + sourceTree = ""; + }; + 1BBAEC4A1F80237B0047DEA8 /* java */ = { + isa = PBXGroup; + children = ( + 1BBAEC4B1F80237B0047DEA8 /* org */, + 1BBAEC511F80237B0047DEA8 /* org_bitcoin_NativeSecp256k1.c */, + 1BBAEC521F80237B0047DEA8 /* org_bitcoin_NativeSecp256k1.h */, + 1BBAEC531F80237B0047DEA8 /* org_bitcoin_Secp256k1Context.c */, + 1BBAEC541F80237B0047DEA8 /* org_bitcoin_Secp256k1Context.h */, + ); + path = java; + sourceTree = ""; + }; + 1BBAEC4B1F80237B0047DEA8 /* org */ = { + isa = PBXGroup; + children = ( + 1BBAEC4C1F80237B0047DEA8 /* bitcoin */, + ); + path = org; + sourceTree = ""; + }; + 1BBAEC4C1F80237B0047DEA8 /* bitcoin */ = { + isa = PBXGroup; + children = ( + 1BBAEC4D1F80237B0047DEA8 /* NativeSecp256k1.java */, + 1BBAEC4E1F80237B0047DEA8 /* NativeSecp256k1Test.java */, + 1BBAEC4F1F80237B0047DEA8 /* NativeSecp256k1Util.java */, + 1BBAEC501F80237B0047DEA8 /* Secp256k1Context.java */, + ); + path = bitcoin; + sourceTree = ""; + }; + 1BBAEC551F80237B0047DEA8 /* modules */ = { + isa = PBXGroup; + children = ( + 1BBAEC561F80237B0047DEA8 /* ecdh */, + 1BBAEC5A1F80237B0047DEA8 /* recovery */, + ); + path = modules; + sourceTree = ""; + }; + 1BBAEC561F80237B0047DEA8 /* ecdh */ = { + isa = PBXGroup; + children = ( + 1BBAEC571F80237B0047DEA8 /* main_impl.h */, + 1BBAEC581F80237B0047DEA8 /* Makefile.am.include */, + 1BBAEC591F80237B0047DEA8 /* tests_impl.h */, + ); + path = ecdh; + sourceTree = ""; + }; + 1BBAEC5A1F80237B0047DEA8 /* recovery */ = { + isa = PBXGroup; + children = ( + 1BBAEC5B1F80237B0047DEA8 /* main_impl.h */, + 1BBAEC5C1F80237B0047DEA8 /* Makefile.am.include */, + 1BBAEC5D1F80237B0047DEA8 /* tests_impl.h */, + ); + path = recovery; + sourceTree = ""; + }; + 22A9A9311DF61930000F0016 /* Platform */ = { + isa = PBXGroup; + children = ( + CE4CA7BB1EE3649100373F11 /* BRActivityView.swift */, + 22A9A9321DF61945000F0016 /* BRAPIClient.swift */, + 222C424F1E90492800078EB5 /* BRAPIClient+KV.swift */, + 2228734E1E916FC30044BA15 /* BRAPIClient+Wallet.swift */, + 22122B711F0B8996000E9AB9 /* BRAPIClient+Events.swift */, + 22A9A9401DF61945000F0016 /* BRReplicatedKVStore.swift */, + 22A9A9371DF61945000F0016 /* BRCoding.swift */, + 22A9A9451DF61945000F0016 /* Extensions.swift */, + 223DB2171DF691260076A151 /* BRSocketHelpers.c */, + 223DB2181DF691260076A151 /* BRSocketHelpers.h */, + CE45C1FA1E74F89C002C3847 /* WalletInfo.swift */, + 22A9A93D1DF61945000F0016 /* TxMetaData.swift */, + 754AE0BD1DFE8E5A007FD001 /* module.modulemap */, + 222319B11F279B3C00008F20 /* POSTBouncer.html */, + ); + name = Platform; + sourceTree = ""; + }; + 22A9A9971DF63426000F0016 /* libbz2 */ = { + isa = PBXGroup; + children = ( + 22A9A9A91DF64B97000F0016 /* Info.plist */, + 22A9A9AA1DF64B97000F0016 /* iphone.modulemap */, + 22A9A9AB1DF64B97000F0016 /* iphonesim.modulemap */, + ); + name = libbz2; + path = Modules/libbz2; + sourceTree = ""; + }; + 24306795238F3DDF00EBEA99 /* BartyCrouch */ = { + isa = PBXGroup; + children = ( + 24306796238F3DF900EBEA99 /* BartyCrouch.swift */, + ); + name = BartyCrouch; + sourceTree = ""; + }; + 24313C8823823B9F00A83F69 /* Receive */ = { + isa = PBXGroup; + children = ( + 24313C8223820C4B00A83F69 /* ReceiveLTCViewController.swift */, + 24313C902382433700A83F69 /* LFModalReceiveQRViewController.swift */, + ); + name = Receive; + sourceTree = ""; + }; + 24313C8923823BB700A83F69 /* WipeWallet */ = { + isa = PBXGroup; + children = ( + 24A6DCFA2230BD9000505F44 /* WipeEmptyWalletViewController.swift */, + ); + name = WipeWallet; + sourceTree = ""; + }; + 24313C8A23823BC400A83F69 /* SendLTC */ = { + isa = PBXGroup; + children = ( + 24313C7923820BC200A83F69 /* SendLTCViewController.swift */, + ); + name = SendLTC; + sourceTree = ""; + }; + 24313C8B23823BDD00A83F69 /* Transactions */ = { + isa = PBXGroup; + children = ( + 24313C7C23820C1900A83F69 /* TransactionsViewController.swift */, + ); + name = Transactions; + sourceTree = ""; + }; + 24313C8C23823C0F00A83F69 /* Login */ = { + isa = PBXGroup; + children = ( + CE8CD8E01E31976800785E02 /* LoginViewController.swift */, + ); + name = Login; + sourceTree = ""; + }; + 24313C8D23823C2B00A83F69 /* Pin */ = { + isa = PBXGroup; + children = ( + CECCE5A81E0378FB00D99448 /* PinPadViewController.swift */, + CE8CD8DE1E2E825000785E02 /* VerifyPinViewController.swift */, + ); + name = Pin; + sourceTree = ""; + }; + 24313C8E23823C5D00A83F69 /* PaperPhrase */ = { + isa = PBXGroup; + children = ( + CEAA9E8E1DC074410066731D /* StartPaperPhraseViewController.swift */, + CEAA9E921DC110E70066731D /* WritePaperPhraseViewController.swift */, + ); + name = PaperPhrase; + sourceTree = ""; + }; + 24313C8F23823D8500A83F69 /* Main */ = { + isa = PBXGroup; + children = ( + 2427342B2381C21800E2D22F /* MainViewController.swift */, + C32DB42E26488CAA00017D26 /* TabBarViewController.swift */, + C3F8F1412C04DEA2006C3211 /* NoBuyTabBarViewController.swift */, + ); + name = Main; + sourceTree = ""; + }; + 24470E2823A5F2C000ADDA27 /* Legacy BRTests */ = { + isa = PBXGroup; + children = ( + 24470E2D23A5F4FF00ADDA27 /* BRCoderTests.swift */, + 24470E2923A5F33000ADDA27 /* BRReplicatedKVStoreTests.swift */, + 24470E2B23A5F43B00ADDA27 /* DefaultFiatCurrencyTests.swift */, + 24470E3123A5F5B100ADDA27 /* NSDataExtensionTests.swift */, + 24470E3523A5FDE800ADDA27 /* PhraseTests.swift */, + 24470E3323A5F5E600ADDA27 /* PaymentRequestTests.swift */, + 24470E3B23A5FFD700ADDA27 /* TouchIdEnabledTests.swift */, + 24470E3D23A6000900ADDA27 /* WalletAuthenticationTests.swift */, + 24470E3F23A6004800ADDA27 /* WalletCreationTests.swift */, + 24470E4123A6007200ADDA27 /* WalletInfoTest.swift */, + 24470E3723A5FEF200ADDA27 /* SpendingLimitTests.swift */, + ); + path = "Legacy BRTests"; + sourceTree = ""; + }; + 24470E4323A6088700ADDA27 /* Class Tests */ = { + isa = PBXGroup; + children = ( + 24470E4423A608A700ADDA27 /* AmountTests.swift */, + 2494037523AD35C000369261 /* BuyWKWebVCTests.swift */, + C31891C226733FD400ECE25C /* TabBarViewControllerTests.swift */, + ); + path = "Class Tests"; + sourceTree = ""; + }; + 2465873723A5AAD100A32E9E /* litewalletTests */ = { + isa = PBXGroup; + children = ( + 584E24FF2951DA97005E0E8B /* Language Selection Tests */, + C3EFA9A42651A7C4005C59B5 /* Lock Screen Tests */, + C3B7C3EC255FF56100E98A64 /* Constants Tests */, + 24470E3923A5FF5700ADDA27 /* TestHelpers.swift */, + 24470E4323A6088700ADDA27 /* Class Tests */, + 24470E2823A5F2C000ADDA27 /* Legacy BRTests */, + 24470E2023A5DA9700ADDA27 /* APIManagerTests.swift */, + 24470E2223A5DB7D00ADDA27 /* WalletManagerTests.swift */, + 2465873A23A5AAD100A32E9E /* Info.plist */, + ); + path = litewalletTests; + sourceTree = ""; + }; + 2494037923ADFBA200369261 /* XIBs */ = { + isa = PBXGroup; + children = ( + 2494037D23AE0C7100369261 /* SyncProgressHeaderView.xib */, + ); + path = XIBs; + sourceTree = ""; + }; + 24AF00FB221B32EC00FF636F /* Storyboards */ = { + isa = PBXGroup; + children = ( + 2494037923ADFBA200369261 /* XIBs */, + 24313CA823824F9800A83F69 /* Main.storyboard */, + 24313C9423824F5700A83F69 /* Alerts.storyboard */, + 24313C9523824F5700A83F69 /* Animate.storyboard */, + 24313C9823824F5800A83F69 /* Buy.storyboard */, + 24313C9623824F5800A83F69 /* Receive.storyboard */, + 24313C9723824F5800A83F69 /* Send.storyboard */, + 24393B5B23C259400075218D /* Phrase.storyboard */, + 24313C9323824F5700A83F69 /* Transactions.storyboard */, + 24DFCE6723B89CDE001F17F8 /* Settings.storyboard */, + 24AF00FC221B331D00FF636F /* WarningConfirmation.storyboard */, + ); + path = Storyboards; + sourceTree = ""; + }; + 24C516502158820E007CE038 /* Buy */ = { + isa = PBXGroup; + children = ( + 24B8FAD12162B10200A155B1 /* BuyCenterWebViewController.swift */, + 248BFE2523AB302200CE1A71 /* BuyWKWebViewController.swift */, + ); + name = Buy; + sourceTree = ""; + }; + 584E24F62951D400005E0E8B /* LanguageSelection */ = { + isa = PBXGroup; + children = ( + 584E24F72951D412005E0E8B /* LanguageSelectionViewController.swift */, + 584E24F92951D43A005E0E8B /* LanguageSelectionViewModel.swift */, + ); + name = LanguageSelection; + sourceTree = ""; + }; + 584E24FF2951DA97005E0E8B /* Language Selection Tests */ = { + isa = PBXGroup; + children = ( + 584E25002951DAAA005E0E8B /* LanguageSelectionTests.swift */, + C3F8F13B2C049A4A006C3211 /* LocaleTests.swift */, + ); + path = "Language Selection Tests"; + sourceTree = ""; + }; + 755CD3831DAA0E3E0075898E /* unbound */ = { + isa = PBXGroup; + children = ( + 755CD38A1DAA0E3E0075898E /* cachedb */, + 755CD38D1DAA0E3E0075898E /* compat */, + 755CD3AB1DAA0E3E0075898E /* config.h */, + 755CD3DA1DAA0E3E0075898E /* dns64 */, + 755CD3DD1DAA0E3E0075898E /* dnstap */, + 755CD3FC1DAA0E3E0075898E /* iterator */, + 755CD40F1DAA0E3E0075898E /* libunbound */, + 755CD4441DAA0E3E0075898E /* module.modulemap */, + 755CD4731DAA0E3E0075898E /* services */, + 755CD4871DAA0E3E0075898E /* sldns */, + 755CD6751DAA0E400075898E /* util */, + 755CD6B61DAA0E400075898E /* validator */, + ); + name = unbound; + path = Modules/unbound; + sourceTree = ""; + }; + 755CD38A1DAA0E3E0075898E /* cachedb */ = { + isa = PBXGroup; + children = ( + 755CD38B1DAA0E3E0075898E /* cachedb.c */, + 755CD38C1DAA0E3E0075898E /* cachedb.h */, + ); + path = cachedb; + sourceTree = ""; + }; + 755CD38D1DAA0E3E0075898E /* compat */ = { + isa = PBXGroup; + children = ( + 755CD38E1DAA0E3E0075898E /* arc4_lock.c */, + 755CD38F1DAA0E3E0075898E /* arc4random.c */, + 755CD3901DAA0E3E0075898E /* arc4random_uniform.c */, + 755CD3911DAA0E3E0075898E /* chacha_private.h */, + 755CD3921DAA0E3E0075898E /* ctime_r.c */, + 755CD3931DAA0E3E0075898E /* explicit_bzero.c */, + 755CD3941DAA0E3E0075898E /* fake-rfc2553.c */, + 755CD3951DAA0E3E0075898E /* fake-rfc2553.h */, + 755CD3961DAA0E3E0075898E /* getentropy_linux.c */, + 755CD3971DAA0E3E0075898E /* getentropy_osx.c */, + 755CD3981DAA0E3E0075898E /* getentropy_solaris.c */, + 755CD3991DAA0E3E0075898E /* getentropy_win.c */, + 755CD39A1DAA0E3E0075898E /* gmtime_r.c */, + 755CD39B1DAA0E3E0075898E /* inet_aton.c */, + 755CD39C1DAA0E3E0075898E /* inet_ntop.c */, + 755CD39D1DAA0E3E0075898E /* inet_pton.c */, + 755CD39E1DAA0E3E0075898E /* isblank.c */, + 755CD39F1DAA0E3E0075898E /* malloc.c */, + 755CD3A01DAA0E3E0075898E /* memcmp.c */, + 755CD3A11DAA0E3E0075898E /* memcmp.h */, + 755CD3A21DAA0E3E0075898E /* memmove.c */, + 755CD3A31DAA0E3E0075898E /* reallocarray.c */, + 755CD3A41DAA0E3E0075898E /* sha512.c */, + 755CD3A51DAA0E3E0075898E /* snprintf.c */, + 755CD3A61DAA0E3E0075898E /* strlcat.c */, + 755CD3A71DAA0E3E0075898E /* strlcpy.c */, + 755CD3A81DAA0E3E0075898E /* strptime.c */, + 755CD3A91DAA0E3E0075898E /* strsep.c */, + ); + path = compat; + sourceTree = ""; + }; + 755CD3DA1DAA0E3E0075898E /* dns64 */ = { + isa = PBXGroup; + children = ( + 755CD3DB1DAA0E3E0075898E /* dns64.c */, + 755CD3DC1DAA0E3E0075898E /* dns64.h */, + ); + path = dns64; + sourceTree = ""; + }; + 755CD3DD1DAA0E3E0075898E /* dnstap */ = { + isa = PBXGroup; + children = ( + 755CD3DE1DAA0E3E0075898E /* dnstap.c */, + 755CD3DF1DAA0E3E0075898E /* dnstap.h */, + 755CD3E21DAA0E3E0075898E /* dnstap_config.h */, + ); + path = dnstap; + sourceTree = ""; + }; + 755CD3FC1DAA0E3E0075898E /* iterator */ = { + isa = PBXGroup; + children = ( + 755CD3FD1DAA0E3E0075898E /* iter_delegpt.c */, + 755CD3FE1DAA0E3E0075898E /* iter_delegpt.h */, + 755CD3FF1DAA0E3E0075898E /* iter_donotq.c */, + 755CD4001DAA0E3E0075898E /* iter_donotq.h */, + 755CD4011DAA0E3E0075898E /* iter_fwd.c */, + 755CD4021DAA0E3E0075898E /* iter_fwd.h */, + 755CD4031DAA0E3E0075898E /* iter_hints.c */, + 755CD4041DAA0E3E0075898E /* iter_hints.h */, + 755CD4051DAA0E3E0075898E /* iter_priv.c */, + 755CD4061DAA0E3E0075898E /* iter_priv.h */, + 755CD4071DAA0E3E0075898E /* iter_resptype.c */, + 755CD4081DAA0E3E0075898E /* iter_resptype.h */, + 755CD4091DAA0E3E0075898E /* iter_scrub.c */, + 755CD40A1DAA0E3E0075898E /* iter_scrub.h */, + 755CD40B1DAA0E3E0075898E /* iter_utils.c */, + 755CD40C1DAA0E3E0075898E /* iter_utils.h */, + 755CD40D1DAA0E3E0075898E /* iterator.c */, + 755CD40E1DAA0E3E0075898E /* iterator.h */, + ); + path = iterator; + sourceTree = ""; + }; + 755CD40F1DAA0E3E0075898E /* libunbound */ = { + isa = PBXGroup; + children = ( + 755CD4101DAA0E3E0075898E /* context.c */, + 755CD4111DAA0E3E0075898E /* context.h */, + 755CD4121DAA0E3E0075898E /* libunbound.c */, + 755CD4131DAA0E3E0075898E /* libworker.c */, + 755CD4141DAA0E3E0075898E /* libworker.h */, + 755CD43D1DAA0E3E0075898E /* unbound-event.h */, + 755CD43E1DAA0E3E0075898E /* unbound.h */, + 755CD43F1DAA0E3E0075898E /* worker.h */, + ); + path = libunbound; + sourceTree = ""; + }; + 755CD4731DAA0E3E0075898E /* services */ = { + isa = PBXGroup; + children = ( + 755CD4741DAA0E3E0075898E /* cache */, + 755CD47B1DAA0E3E0075898E /* listen_dnsport.c */, + 755CD47C1DAA0E3E0075898E /* listen_dnsport.h */, + 755CD47D1DAA0E3E0075898E /* localzone.c */, + 755CD47E1DAA0E3E0075898E /* localzone.h */, + 755CD47F1DAA0E3E0075898E /* mesh.c */, + 755CD4801DAA0E3E0075898E /* mesh.h */, + 755CD4811DAA0E3E0075898E /* modstack.c */, + 755CD4821DAA0E3E0075898E /* modstack.h */, + 755CD4831DAA0E3E0075898E /* outbound_list.c */, + 755CD4841DAA0E3E0075898E /* outbound_list.h */, + 755CD4851DAA0E3E0075898E /* outside_network.c */, + 755CD4861DAA0E3E0075898E /* outside_network.h */, + 759DA09F1DAB838D008CC49B /* view.c */, + 759DA0A01DAB838D008CC49B /* view.h */, + ); + path = services; + sourceTree = ""; + }; + 755CD4741DAA0E3E0075898E /* cache */ = { + isa = PBXGroup; + children = ( + 755CD4751DAA0E3E0075898E /* dns.c */, + 755CD4761DAA0E3E0075898E /* dns.h */, + 755CD4771DAA0E3E0075898E /* infra.c */, + 755CD4781DAA0E3E0075898E /* infra.h */, + 755CD4791DAA0E3E0075898E /* rrset.c */, + 755CD47A1DAA0E3E0075898E /* rrset.h */, + ); + path = cache; + sourceTree = ""; + }; + 755CD4871DAA0E3E0075898E /* sldns */ = { + isa = PBXGroup; + children = ( + 755CD4881DAA0E3E0075898E /* keyraw.c */, + 755CD4891DAA0E3E0075898E /* keyraw.h */, + 755CD48A1DAA0E3E0075898E /* parse.c */, + 755CD48B1DAA0E3E0075898E /* parse.h */, + 755CD48C1DAA0E3E0075898E /* parseutil.c */, + 755CD48D1DAA0E3E0075898E /* parseutil.h */, + 755CD48E1DAA0E3E0075898E /* pkthdr.h */, + 755CD48F1DAA0E3E0075898E /* rrdef.c */, + 755CD4901DAA0E3E0075898E /* rrdef.h */, + 755CD4911DAA0E3E0075898E /* sbuffer.c */, + 755CD4921DAA0E3E0075898E /* sbuffer.h */, + 755CD4931DAA0E3E0075898E /* str2wire.c */, + 755CD4941DAA0E3E0075898E /* str2wire.h */, + 755CD4951DAA0E3E0075898E /* wire2str.c */, + 755CD4961DAA0E3E0075898E /* wire2str.h */, + ); + path = sldns; + sourceTree = ""; + }; + 755CD6751DAA0E400075898E /* util */ = { + isa = PBXGroup; + children = ( + 755CD6761DAA0E400075898E /* alloc.c */, + 755CD6771DAA0E400075898E /* alloc.h */, + 755CD6781DAA0E400075898E /* as112.c */, + 755CD6791DAA0E400075898E /* as112.h */, + 755CD67A1DAA0E400075898E /* config_file.c */, + 755CD67B1DAA0E400075898E /* config_file.h */, + 755CD67C1DAA0E400075898E /* configlexer.c */, + 755CD67E1DAA0E400075898E /* configparser.c */, + 755CD67F1DAA0E400075898E /* configparser.h */, + 755CD6811DAA0E400075898E /* configyyrename.h */, + 755CD6821DAA0E400075898E /* data */, + 755CD68D1DAA0E400075898E /* fptr_wlist.c */, + 755CD68E1DAA0E400075898E /* fptr_wlist.h */, + 755CD6901DAA0E400075898E /* locks.c */, + 755CD6911DAA0E400075898E /* locks.h */, + 755CD6921DAA0E400075898E /* log.c */, + 755CD6931DAA0E400075898E /* log.h */, + 755CD6941DAA0E400075898E /* mini_event.c */, + 755CD6951DAA0E400075898E /* mini_event.h */, + 755CD6961DAA0E400075898E /* module.c */, + 755CD6971DAA0E400075898E /* module.h */, + 755CD6981DAA0E400075898E /* net_help.c */, + 755CD6991DAA0E400075898E /* net_help.h */, + 755CD69A1DAA0E400075898E /* netevent.c */, + 755CD69B1DAA0E400075898E /* netevent.h */, + 755CD69C1DAA0E400075898E /* random.c */, + 755CD69D1DAA0E400075898E /* random.h */, + 755CD69E1DAA0E400075898E /* rbtree.c */, + 755CD69F1DAA0E400075898E /* rbtree.h */, + 755CD6A01DAA0E400075898E /* regional.c */, + 755CD6A11DAA0E400075898E /* regional.h */, + 755CD6A21DAA0E400075898E /* rtt.c */, + 755CD6A31DAA0E400075898E /* rtt.h */, + 755CD6A41DAA0E400075898E /* storage */, + 755CD6AD1DAA0E400075898E /* timehist.c */, + 755CD6AE1DAA0E400075898E /* timehist.h */, + 755CD6AF1DAA0E400075898E /* tube.c */, + 755CD6B01DAA0E400075898E /* tube.h */, + 755CD6B11DAA0E400075898E /* ub_event.c */, + 755CD6B21DAA0E400075898E /* ub_event.h */, + 755CD6B31DAA0E400075898E /* ub_event_pluggable.c */, + ); + path = util; + sourceTree = ""; + }; + 755CD6821DAA0E400075898E /* data */ = { + isa = PBXGroup; + children = ( + 755CD6831DAA0E400075898E /* dname.c */, + 755CD6841DAA0E400075898E /* dname.h */, + 755CD6851DAA0E400075898E /* msgencode.c */, + 755CD6861DAA0E400075898E /* msgencode.h */, + 755CD6871DAA0E400075898E /* msgparse.c */, + 755CD6881DAA0E400075898E /* msgparse.h */, + 755CD6891DAA0E400075898E /* msgreply.c */, + 755CD68A1DAA0E400075898E /* msgreply.h */, + 755CD68B1DAA0E400075898E /* packed_rrset.c */, + 755CD68C1DAA0E400075898E /* packed_rrset.h */, + ); + path = data; + sourceTree = ""; + }; + 755CD6A41DAA0E400075898E /* storage */ = { + isa = PBXGroup; + children = ( + 755CD6A51DAA0E400075898E /* dnstree.c */, + 755CD6A61DAA0E400075898E /* dnstree.h */, + 755CD6A71DAA0E400075898E /* lookup3.c */, + 755CD6A81DAA0E400075898E /* lookup3.h */, + 755CD6A91DAA0E400075898E /* lruhash.c */, + 755CD6AA1DAA0E400075898E /* lruhash.h */, + 755CD6AB1DAA0E400075898E /* slabhash.c */, + 755CD6AC1DAA0E400075898E /* slabhash.h */, + ); + path = storage; + sourceTree = ""; + }; + 755CD6B61DAA0E400075898E /* validator */ = { + isa = PBXGroup; + children = ( + 755CD6B71DAA0E400075898E /* autotrust.c */, + 755CD6B81DAA0E400075898E /* autotrust.h */, + 755CD6B91DAA0E400075898E /* val_anchor.c */, + 755CD6BA1DAA0E400075898E /* val_anchor.h */, + 755CD6BB1DAA0E400075898E /* val_kcache.c */, + 755CD6BC1DAA0E400075898E /* val_kcache.h */, + 755CD6BD1DAA0E400075898E /* val_kentry.c */, + 755CD6BE1DAA0E400075898E /* val_kentry.h */, + 755CD6BF1DAA0E400075898E /* val_neg.c */, + 755CD6C01DAA0E400075898E /* val_neg.h */, + 755CD6C11DAA0E400075898E /* val_nsec.c */, + 755CD6C21DAA0E400075898E /* val_nsec.h */, + 755CD6C31DAA0E400075898E /* val_nsec3.c */, + 755CD6C41DAA0E400075898E /* val_nsec3.h */, + 755CD6C51DAA0E400075898E /* val_secalgo.c */, + 755CD6C61DAA0E400075898E /* val_secalgo.h */, + 755CD6C71DAA0E400075898E /* val_sigcrypt.c */, + 755CD6C81DAA0E400075898E /* val_sigcrypt.h */, + 755CD6C91DAA0E400075898E /* val_utils.c */, + 755CD6CA1DAA0E400075898E /* val_utils.h */, + 755CD6CB1DAA0E400075898E /* validator.c */, + 755CD6CC1DAA0E400075898E /* validator.h */, + ); + path = validator; + sourceTree = ""; + }; + 755CD7031DAA16810075898E /* nettle */ = { + isa = PBXGroup; + children = ( + 755CD70A1DAA16810075898E /* aes-decrypt-internal.c */, + 755CD70B1DAA16810075898E /* aes-decrypt.c */, + 755CD70C1DAA16810075898E /* aes-encrypt-internal.c */, + 755CD70D1DAA16810075898E /* aes-encrypt-table.c */, + 755CD70E1DAA16810075898E /* aes-encrypt.c */, + 755CD70F1DAA16810075898E /* aes-internal.h */, + 755CD7101DAA16810075898E /* aes-invert-internal.c */, + 755CD7111DAA16810075898E /* aes-set-decrypt-key.c */, + 755CD7121DAA16810075898E /* aes-set-encrypt-key.c */, + 755CD7131DAA16810075898E /* aes-set-key-internal.c */, + 755CD7141DAA16810075898E /* aes.h */, + 755CD7151DAA16810075898E /* aes128-meta.c */, + 755CD7161DAA16810075898E /* aes128-set-decrypt-key.c */, + 755CD7171DAA16810075898E /* aes128-set-encrypt-key.c */, + 755CD7181DAA16810075898E /* aes192-meta.c */, + 755CD7191DAA16810075898E /* aes192-set-decrypt-key.c */, + 755CD71A1DAA16810075898E /* aes192-set-encrypt-key.c */, + 755CD71B1DAA16810075898E /* aes256-meta.c */, + 755CD71C1DAA16810075898E /* aes256-set-decrypt-key.c */, + 755CD71D1DAA16810075898E /* aes256-set-encrypt-key.c */, + 755CD71E1DAA16810075898E /* aesdata.c */, + 755CD71F1DAA16810075898E /* arcfour-crypt.c */, + 755CD7201DAA16810075898E /* arcfour.c */, + 755CD7211DAA16810075898E /* arcfour.h */, + 755CD7221DAA16810075898E /* arctwo-meta.c */, + 755CD7231DAA16810075898E /* arctwo.c */, + 755CD7241DAA16810075898E /* arctwo.h */, + 755CD74B1DAA16810075898E /* asn1.h */, + 755CD74D1DAA16810075898E /* base16-decode.c */, + 755CD74E1DAA16810075898E /* base16-encode.c */, + 755CD74F1DAA16810075898E /* base16-meta.c */, + 755CD7501DAA16810075898E /* base16.h */, + 755CD7511DAA16810075898E /* base64-decode.c */, + 755CD7521DAA16810075898E /* base64-encode.c */, + 755CD7531DAA16810075898E /* base64-meta.c */, + 755CD7541DAA16810075898E /* base64.h */, + 755CD7551DAA16810075898E /* base64url-decode.c */, + 755CD7561DAA16810075898E /* base64url-encode.c */, + 755CD7571DAA16810075898E /* base64url-meta.c */, + 755CD7581DAA16810075898E /* bignum-random-prime.c */, + 755CD7591DAA16810075898E /* bignum-random.c */, + 755CD75A1DAA16810075898E /* bignum.c */, + 755CD75B1DAA16810075898E /* bignum.h */, + 755CD75C1DAA16810075898E /* blowfish.c */, + 755CD75D1DAA16810075898E /* blowfish.h */, + 755CD75E1DAA16810075898E /* buffer-init.c */, + 755CD75F1DAA16810075898E /* buffer.c */, + 755CD7601DAA16810075898E /* buffer.h */, + 755CD7611DAA16810075898E /* camellia-absorb.c */, + 755CD7621DAA16810075898E /* camellia-crypt-internal.c */, + 755CD7631DAA16810075898E /* camellia-internal.h */, + 755CD7641DAA16810075898E /* camellia-invert-key.c */, + 755CD7651DAA16810075898E /* camellia-table.c */, + 755CD7661DAA16810075898E /* camellia.h */, + 755CD7671DAA16810075898E /* camellia128-crypt.c */, + 755CD7681DAA16810075898E /* camellia128-meta.c */, + 755CD7691DAA16810075898E /* camellia128-set-decrypt-key.c */, + 755CD76A1DAA16810075898E /* camellia128-set-encrypt-key.c */, + 755CD76B1DAA16810075898E /* camellia192-meta.c */, + 755CD76C1DAA16810075898E /* camellia256-crypt.c */, + 755CD76D1DAA16810075898E /* camellia256-meta.c */, + 755CD76E1DAA16810075898E /* camellia256-set-decrypt-key.c */, + 755CD76F1DAA16810075898E /* camellia256-set-encrypt-key.c */, + 755CD7701DAA16810075898E /* cast128-meta.c */, + 755CD7711DAA16810075898E /* cast128.c */, + 755CD7721DAA16810075898E /* cast128.h */, + 755CD7731DAA16810075898E /* cast128_sboxes.h */, + 755CD7741DAA16810075898E /* cbc.c */, + 755CD7751DAA16810075898E /* cbc.h */, + 755CD7761DAA16810075898E /* ccm-aes128.c */, + 755CD7771DAA16810075898E /* ccm-aes192.c */, + 755CD7781DAA16810075898E /* ccm-aes256.c */, + 755CD7791DAA16810075898E /* ccm.c */, + 755CD77A1DAA16810075898E /* ccm.h */, + 755CD77B1DAA16810075898E /* chacha-core-internal.c */, + 755CD77C1DAA16810075898E /* chacha-crypt.c */, + 755CD77D1DAA16810075898E /* chacha-poly1305-meta.c */, + 755CD77E1DAA16810075898E /* chacha-poly1305.c */, + 755CD77F1DAA16810075898E /* chacha-poly1305.h */, + 755CD7801DAA16810075898E /* chacha-set-key.c */, + 755CD7811DAA16810075898E /* chacha-set-nonce.c */, + 755CD7821DAA16810075898E /* chacha.h */, + 755CD7841DAA16810075898E /* cnd-copy.c */, + 755CD7861DAA16810075898E /* config.h */, + 755CD78E1DAA16810075898E /* ctr.c */, + 755CD78F1DAA16810075898E /* ctr.h */, + 755CD7901DAA16810075898E /* curve25519-eh-to-x.c */, + 755CD7911DAA16810075898E /* curve25519-mul-g.c */, + 755CD7921DAA16810075898E /* curve25519-mul.c */, + 755CD7931DAA16810075898E /* curve25519.h */, + 755CD7941DAA16810075898E /* der-iterator.c */, + 755CD7951DAA16810075898E /* der2dsa.c */, + 755CD7961DAA16810075898E /* der2rsa.c */, + 755CD7971DAA16810075898E /* des-compat.c */, + 755CD7981DAA16810075898E /* des-compat.h */, + 755CD7991DAA16810075898E /* des.c */, + 755CD79A1DAA16810075898E /* des.h */, + 755CD79B1DAA16810075898E /* des3.c */, + 755CD79C1DAA16810075898E /* desCode.h */, + 755CD79E1DAA16810075898E /* desdata.c */, + 755CD79F1DAA16810075898E /* desinfo.h */, + 755CD7A01DAA16810075898E /* dsa-compat-keygen.c */, + 755CD7A11DAA16810075898E /* dsa-compat.c */, + 755CD7A21DAA16810075898E /* dsa-compat.h */, + 755CD7A31DAA16810075898E /* dsa-gen-params.c */, + 755CD7A41DAA16810075898E /* dsa-hash.c */, + 755CD7A51DAA16810075898E /* dsa-keygen.c */, + 755CD7A61DAA16810075898E /* dsa-sha1-sign.c */, + 755CD7A71DAA16810075898E /* dsa-sha1-verify.c */, + 755CD7A81DAA16810075898E /* dsa-sha256-sign.c */, + 755CD7A91DAA16810075898E /* dsa-sha256-verify.c */, + 755CD7AA1DAA16810075898E /* dsa-sign.c */, + 755CD7AB1DAA16810075898E /* dsa-verify.c */, + 755CD7AC1DAA16810075898E /* dsa.c */, + 755CD7AD1DAA16810075898E /* dsa.h */, + 755CD7AE1DAA16810075898E /* dsa2sexp.c */, + 755CD7AF1DAA16810075898E /* eax-aes128-meta.c */, + 755CD7B01DAA16810075898E /* eax-aes128.c */, + 755CD7B11DAA16810075898E /* eax.c */, + 755CD7B21DAA16810075898E /* eax.h */, + 755CD7B31DAA16810075898E /* ecc-192.c */, + 755CD7B41DAA16810075898E /* ecc-224.c */, + 755CD7B51DAA16810075898E /* ecc-25519.c */, + 755CD7B61DAA16810075898E /* ecc-256-32.h */, + 755CD7B71DAA16810075898E /* ecc-256-64.h */, + 755CD7B81DAA16810075898E /* ecc-256.c */, + 755CD7B91DAA16810075898E /* ecc-256.h */, + 755CD7BA1DAA16810075898E /* ecc-384-32.h */, + 755CD7BB1DAA16810075898E /* ecc-384-64.h */, + 755CD7BC1DAA16810075898E /* ecc-384.c */, + 755CD7BD1DAA16810075898E /* ecc-384.h */, + 755CD7BE1DAA16810075898E /* ecc-521.c */, + 755CD7BF1DAA16810075898E /* ecc-a-to-j.c */, + 755CD7C01DAA16810075898E /* ecc-add-eh.c */, + 755CD7C11DAA16810075898E /* ecc-add-ehh.c */, + 755CD7C21DAA16810075898E /* ecc-add-jja.c */, + 755CD7C31DAA16810075898E /* ecc-add-jjj.c */, + 755CD7C41DAA16810075898E /* ecc-curve.h */, + 755CD7C51DAA16810075898E /* ecc-dup-eh.c */, + 755CD7C61DAA16810075898E /* ecc-dup-jj.c */, + 755CD7C71DAA16810075898E /* ecc-ecdsa-sign.c */, + 755CD7C81DAA16810075898E /* ecc-ecdsa-verify.c */, + 755CD7C91DAA16810075898E /* ecc-eh-to-a.c */, + 755CD7CA1DAA16810075898E /* ecc-hash.c */, + 755CD7CB1DAA16810075898E /* ecc-internal.h */, + 755CD7CC1DAA16810075898E /* ecc-j-to-a.c */, + 755CD7CD1DAA16810075898E /* ecc-mod-arith.c */, + 755CD7CE1DAA16810075898E /* ecc-mod-inv.c */, + 755CD7CF1DAA16810075898E /* ecc-mod.c */, + 755CD7D01DAA16810075898E /* ecc-mul-a-eh.c */, + 755CD7D11DAA16810075898E /* ecc-mul-a.c */, + 755CD7D21DAA16810075898E /* ecc-mul-g-eh.c */, + 755CD7D31DAA16810075898E /* ecc-mul-g.c */, + 755CD7D41DAA16810075898E /* ecc-pm1-redc.c */, + 755CD7D51DAA16810075898E /* ecc-point-mul-g.c */, + 755CD7D61DAA16810075898E /* ecc-point-mul.c */, + 755CD7D71DAA16810075898E /* ecc-point.c */, + 755CD7D81DAA16810075898E /* ecc-pp1-redc.c */, + 755CD7D91DAA16810075898E /* ecc-random.c */, + 755CD7DA1DAA16810075898E /* ecc-scalar.c */, + 755CD7DB1DAA16810075898E /* ecc-size.c */, + 755CD7DC1DAA16810075898E /* ecc.h */, + 755CD7DD1DAA16810075898E /* eccdata.c */, + 755CD7DE1DAA16810075898E /* ecdsa-keygen.c */, + 755CD7DF1DAA16810075898E /* ecdsa-sign.c */, + 755CD7E01DAA16810075898E /* ecdsa-verify.c */, + 755CD7E21DAA16810075898E /* ed25519-sha512-pubkey.c */, + 755CD7E31DAA16810075898E /* ed25519-sha512-sign.c */, + 755CD7E41DAA16810075898E /* ed25519-sha512-verify.c */, + 755CD7E51DAA16810075898E /* eddsa-compress.c */, + 755CD7E61DAA16810075898E /* eddsa-decompress.c */, + 755CD7E71DAA16810075898E /* eddsa-expand.c */, + 755CD7E81DAA16810075898E /* eddsa-hash.c */, + 755CD7E91DAA16810075898E /* eddsa-pubkey.c */, + 755CD7EA1DAA16810075898E /* eddsa-sign.c */, + 755CD7EB1DAA16810075898E /* eddsa-verify.c */, + 755CD7EC1DAA16810075898E /* eddsa.h */, + 755CD80B1DAA16810075898E /* fat-arm.c */, + 755CD80C1DAA16810075898E /* fat-setup.h */, + 755CD80D1DAA16810075898E /* fat-x86_64.c */, + 755CD80E1DAA16810075898E /* gcm-aes.c */, + 755CD80F1DAA16810075898E /* gcm-aes128-meta.c */, + 755CD8101DAA16810075898E /* gcm-aes128.c */, + 755CD8111DAA16810075898E /* gcm-aes192-meta.c */, + 755CD8121DAA16810075898E /* gcm-aes192.c */, + 755CD8131DAA16810075898E /* gcm-aes256-meta.c */, + 755CD8141DAA16810075898E /* gcm-aes256.c */, + 755CD8151DAA16810075898E /* gcm-camellia128-meta.c */, + 755CD8161DAA16810075898E /* gcm-camellia128.c */, + 755CD8171DAA16810075898E /* gcm-camellia256-meta.c */, + 755CD8181DAA16810075898E /* gcm-camellia256.c */, + 755CD8191DAA16810075898E /* gcm.c */, + 755CD81A1DAA16810075898E /* gcm.h */, + 755CD81B1DAA16810075898E /* gcmdata.c */, + 755CD81C1DAA16810075898E /* getopt.c */, + 755CD81D1DAA16810075898E /* getopt.h */, + 755CD81E1DAA16810075898E /* getopt1.c */, + 755CD81F1DAA16810075898E /* getopt_int.h */, + 755CD8201DAA16810075898E /* gmp-glue.c */, + 755CD8211DAA16810075898E /* gmp-glue.h */, + 755CD8221DAA16810075898E /* gosthash94-meta.c */, + 755CD8231DAA16810075898E /* gosthash94.c */, + 755CD8241DAA16810075898E /* gosthash94.h */, + 755CD8251DAA16810075898E /* hmac-md5.c */, + 755CD8261DAA16810075898E /* hmac-ripemd160.c */, + 755CD8271DAA16810075898E /* hmac-sha1.c */, + 755CD8281DAA16810075898E /* hmac-sha224.c */, + 755CD8291DAA16810075898E /* hmac-sha256.c */, + 755CD82A1DAA16810075898E /* hmac-sha384.c */, + 755CD82B1DAA16810075898E /* hmac-sha512.c */, + 755CD82C1DAA16810075898E /* hmac.c */, + 755CD82D1DAA16810075898E /* hmac.h */, + 755CD8321DAA16820075898E /* knuth-lfib.c */, + 755CD8331DAA16820075898E /* knuth-lfib.h */, + 755CD8371DAA16820075898E /* macros.h */, + 755CD8391DAA16820075898E /* md2-meta.c */, + 755CD83A1DAA16820075898E /* md2.c */, + 755CD83B1DAA16820075898E /* md2.h */, + 755CD83C1DAA16820075898E /* md4-meta.c */, + 755CD83D1DAA16820075898E /* md4.c */, + 755CD83E1DAA16820075898E /* md4.h */, + 755CD83F1DAA16820075898E /* md5-compat.c */, + 755CD8401DAA16820075898E /* md5-compat.h */, + 755CD8411DAA16820075898E /* md5-compress.c */, + 755CD8421DAA16820075898E /* md5-meta.c */, + 755CD8431DAA16820075898E /* md5.c */, + 755CD8441DAA16820075898E /* md5.h */, + 755CD8451DAA16820075898E /* memeql-sec.c */, + 755CD8461DAA16820075898E /* memops.h */, + 755CD8471DAA16820075898E /* memxor-internal.h */, + 755CD8481DAA16820075898E /* memxor.c */, + 755CD8491DAA16820075898E /* memxor.h */, + 755CD84A1DAA16820075898E /* memxor3.c */, + 755CD84B1DAA16820075898E /* mini-gmp.c */, + 755CD84C1DAA16820075898E /* mini-gmp.h */, + 755CD8731DAA16820075898E /* nettle-internal.c */, + 755CD8741DAA16820075898E /* nettle-internal.h */, + 755CD8751DAA16820075898E /* nettle-meta-aeads.c */, + 755CD8761DAA16820075898E /* nettle-meta-armors.c */, + 755CD8771DAA16820075898E /* nettle-meta-ciphers.c */, + 755CD8781DAA16820075898E /* nettle-meta-hashes.c */, + 755CD8791DAA16820075898E /* nettle-meta.h */, + 755CD87A1DAA16820075898E /* nettle-stdint.h */, + 755CD87B1DAA16820075898E /* nettle-types.h */, + 755CD87C1DAA16820075898E /* nettle-write.h */, + 755CD8801DAA16820075898E /* pbkdf2-hmac-sha1.c */, + 755CD8811DAA16820075898E /* pbkdf2-hmac-sha256.c */, + 755CD8821DAA16820075898E /* pbkdf2.c */, + 755CD8831DAA16820075898E /* pbkdf2.h */, + 755CD8841DAA16820075898E /* pgp-encode.c */, + 755CD8851DAA16820075898E /* pgp.h */, + 755CD8861DAA16820075898E /* pkcs1-decrypt.c */, + 755CD8871DAA16820075898E /* pkcs1-encrypt.c */, + 755CD8881DAA16820075898E /* pkcs1-rsa-digest.c */, + 755CD8891DAA16820075898E /* pkcs1-rsa-md5.c */, + 755CD88A1DAA16820075898E /* pkcs1-rsa-sha1.c */, + 755CD88B1DAA16820075898E /* pkcs1-rsa-sha256.c */, + 755CD88C1DAA16820075898E /* pkcs1-rsa-sha512.c */, + 755CD88D1DAA16820075898E /* pkcs1.c */, + 755CD88E1DAA16820075898E /* pkcs1.h */, + 755CD88F1DAA16820075898E /* poly1305-aes.c */, + 755CD8901DAA16820075898E /* poly1305-internal.c */, + 755CD8911DAA16820075898E /* poly1305.h */, + 755CD8931DAA16820075898E /* realloc.c */, + 755CD8941DAA16820075898E /* realloc.h */, + 755CD8951DAA16820075898E /* ripemd160-compress.c */, + 755CD8961DAA16820075898E /* ripemd160-meta.c */, + 755CD8971DAA16820075898E /* ripemd160.c */, + 755CD8981DAA16820075898E /* ripemd160.h */, + 755CD8991DAA16820075898E /* rsa-blind.c */, + 755CD89A1DAA16820075898E /* rsa-decrypt-tr.c */, + 755CD89B1DAA16820075898E /* rsa-decrypt.c */, + 755CD89C1DAA16820075898E /* rsa-encrypt.c */, + 755CD89D1DAA16820075898E /* rsa-keygen.c */, + 755CD89E1DAA16820075898E /* rsa-md5-sign-tr.c */, + 755CD89F1DAA16820075898E /* rsa-md5-sign.c */, + 755CD8A01DAA16820075898E /* rsa-md5-verify.c */, + 755CD8A11DAA16820075898E /* rsa-pkcs1-sign-tr.c */, + 755CD8A21DAA16820075898E /* rsa-pkcs1-sign.c */, + 755CD8A31DAA16820075898E /* rsa-pkcs1-verify.c */, + 755CD8A41DAA16820075898E /* rsa-sha1-sign-tr.c */, + 755CD8A51DAA16820075898E /* rsa-sha1-sign.c */, + 755CD8A61DAA16820075898E /* rsa-sha1-verify.c */, + 755CD8A71DAA16820075898E /* rsa-sha256-sign-tr.c */, + 755CD8A81DAA16820075898E /* rsa-sha256-sign.c */, + 755CD8A91DAA16820075898E /* rsa-sha256-verify.c */, + 755CD8AA1DAA16820075898E /* rsa-sha512-sign-tr.c */, + 755CD8AB1DAA16820075898E /* rsa-sha512-sign.c */, + 755CD8AC1DAA16820075898E /* rsa-sha512-verify.c */, + 755CD8AD1DAA16820075898E /* rsa-sign-tr.c */, + 755CD8AE1DAA16820075898E /* rsa-sign.c */, + 755CD8AF1DAA16820075898E /* rsa-verify.c */, + 755CD8B01DAA16820075898E /* rsa.c */, + 755CD8B11DAA16820075898E /* rsa.h */, + 755CD8B21DAA16820075898E /* rsa2openpgp.c */, + 755CD8B31DAA16820075898E /* rsa2sexp.c */, + 755CD8B51DAA16820075898E /* salsa20-128-set-key.c */, + 755CD8B61DAA16820075898E /* salsa20-256-set-key.c */, + 755CD8B71DAA16820075898E /* salsa20-core-internal.c */, + 755CD8B81DAA16820075898E /* salsa20-crypt.c */, + 755CD8B91DAA16820075898E /* salsa20-set-key.c */, + 755CD8BA1DAA16820075898E /* salsa20-set-nonce.c */, + 755CD8BB1DAA16820075898E /* salsa20.h */, + 755CD8BC1DAA16820075898E /* salsa20r12-crypt.c */, + 755CD8BD1DAA16820075898E /* sec-add-1.c */, + 755CD8BE1DAA16820075898E /* sec-sub-1.c */, + 755CD8BF1DAA16820075898E /* sec-tabselect.c */, + 755CD8C01DAA16820075898E /* serpent-decrypt.c */, + 755CD8C11DAA16820075898E /* serpent-encrypt.c */, + 755CD8C21DAA16820075898E /* serpent-internal.h */, + 755CD8C31DAA16820075898E /* serpent-meta.c */, + 755CD8C41DAA16820075898E /* serpent-set-key.c */, + 755CD8C51DAA16820075898E /* serpent.h */, + 755CD8C61DAA16820075898E /* sexp-format.c */, + 755CD8C71DAA16820075898E /* sexp-transport-format.c */, + 755CD8C81DAA16820075898E /* sexp-transport.c */, + 755CD8C91DAA16820075898E /* sexp.c */, + 755CD8CA1DAA16820075898E /* sexp.h */, + 755CD8CB1DAA16820075898E /* sexp2bignum.c */, + 755CD8CC1DAA16820075898E /* sexp2dsa.c */, + 755CD8CD1DAA16820075898E /* sexp2rsa.c */, + 755CD8CE1DAA16820075898E /* sha-example.c */, + 755CD8CF1DAA16820075898E /* sha.h */, + 755CD8D01DAA16820075898E /* sha1-compress.c */, + 755CD8D11DAA16820075898E /* sha1-meta.c */, + 755CD8D21DAA16820075898E /* sha1.c */, + 755CD8D31DAA16820075898E /* sha1.h */, + 755CD8D41DAA16820075898E /* sha2.h */, + 755CD8D51DAA16820075898E /* sha224-meta.c */, + 755CD8D61DAA16820075898E /* sha256-compress.c */, + 755CD8D71DAA16820075898E /* sha256-meta.c */, + 755CD8D81DAA16820075898E /* sha256.c */, + 755CD8D91DAA16820075898E /* sha3-224-meta.c */, + 755CD8DA1DAA16820075898E /* sha3-224.c */, + 755CD8DB1DAA16820075898E /* sha3-256-meta.c */, + 755CD8DC1DAA16820075898E /* sha3-256.c */, + 755CD8DD1DAA16820075898E /* sha3-384-meta.c */, + 755CD8DE1DAA16820075898E /* sha3-384.c */, + 755CD8DF1DAA16820075898E /* sha3-512-meta.c */, + 755CD8E01DAA16820075898E /* sha3-512.c */, + 755CD8E11DAA16820075898E /* sha3-permute.c */, + 755CD8E21DAA16820075898E /* sha3.c */, + 755CD8E31DAA16820075898E /* sha3.h */, + 755CD8E41DAA16820075898E /* sha384-meta.c */, + 755CD8E51DAA16820075898E /* sha512-224-meta.c */, + 755CD8E61DAA16820075898E /* sha512-256-meta.c */, + 755CD8E71DAA16820075898E /* sha512-compress.c */, + 755CD8E81DAA16820075898E /* sha512-meta.c */, + 755CD8E91DAA16820075898E /* sha512.c */, + 755CD8EA1DAA16820075898E /* shadata.c */, + 755CD95F1DAA16830075898E /* tools */, + 755CD9711DAA16830075898E /* twofish-meta.c */, + 755CD9721DAA16830075898E /* twofish.c */, + 755CD9731DAA16830075898E /* twofish.h */, + 755CD9741DAA16830075898E /* twofishdata.c */, + 755CD9751DAA16830075898E /* umac-l2.c */, + 755CD9761DAA16830075898E /* umac-l3.c */, + 755CD9771DAA16830075898E /* umac-nh-n.c */, + 755CD9781DAA16830075898E /* umac-nh.c */, + 755CD9791DAA16830075898E /* umac-poly128.c */, + 755CD97A1DAA16830075898E /* umac-poly64.c */, + 755CD97B1DAA16830075898E /* umac-set-key.c */, + 755CD97C1DAA16830075898E /* umac.h */, + 755CD97D1DAA16830075898E /* umac128.c */, + 755CD97E1DAA16830075898E /* umac32.c */, + 755CD97F1DAA16830075898E /* umac64.c */, + 755CD9801DAA16830075898E /* umac96.c */, + 755CD9811DAA16830075898E /* version.c */, + 755CD9821DAA16830075898E /* version.h */, + 755CD9841DAA16830075898E /* write-be32.c */, + 755CD9851DAA16830075898E /* write-le32.c */, + 755CD9861DAA16830075898E /* write-le64.c */, + 755CD9BD1DAA16830075898E /* yarrow.h */, + 755CD9BE1DAA16830075898E /* yarrow256.c */, + 755CD9BF1DAA16830075898E /* yarrow_key_event.c */, + ); + name = nettle; + path = Modules/nettle; + sourceTree = ""; + }; + 755CD95F1DAA16830075898E /* tools */ = { + isa = PBXGroup; + children = ( + 755CD9631DAA16830075898E /* input.c */, + 755CD9641DAA16830075898E /* input.h */, + 755CD9661DAA16830075898E /* misc.c */, + 755CD9671DAA16830075898E /* misc.h */, + 755CD9681DAA16830075898E /* nettle-hash.c */, + 755CD9691DAA16830075898E /* nettle-lfib-stream.c */, + 755CD96A1DAA16830075898E /* nettle-pbkdf2.c */, + 755CD96B1DAA16830075898E /* output.c */, + 755CD96C1DAA16830075898E /* output.h */, + 755CD96D1DAA16830075898E /* parse.c */, + 755CD96E1DAA16830075898E /* parse.h */, + 755CD96F1DAA16830075898E /* pkcs1-conv.c */, + 755CD9701DAA16830075898E /* sexp-conv.c */, + ); + path = tools; + sourceTree = ""; + }; + 75A2A7871DA5934300A983D8 = { + isa = PBXGroup; + children = ( + C3F8F1432C04F6BE006C3211 /* Dakar, Senegal.gpx */, + C33685082BECE8B10069CBC7 /* PrivacyInfo.xcprivacy */, + 75A2A7921DA5934300A983D8 /* litewallet */, + 2465873723A5AAD100A32E9E /* litewalletTests */, + 75A2A80B1DA5936F00A983D8 /* TodayExtension */, + 75B6F52F1DA71DCC0031A93F /* Modules */, + 75A2A7F11DA5935F00A983D8 /* Frameworks */, + 75A2A7911DA5934300A983D8 /* Products */, + ); + sourceTree = ""; + }; + 75A2A7911DA5934300A983D8 /* Products */ = { + isa = PBXGroup; + children = ( + 75A2A7901DA5934300A983D8 /* Litewallet.app */, + 75A2A8081DA5936F00A983D8 /* TodayExtension.appex */, + 755CD9C41DAA18420075898E /* libunbound.a */, + 755CD9D11DAA197C0075898E /* libBRCore.a */, + 75C735AF1DAA1C9F00251ECF /* libnettle.a */, + 2465873623A5AAD000A32E9E /* litewalletTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 75A2A7921DA5934300A983D8 /* litewallet */ = { + isa = PBXGroup; + children = ( + C3055B662B8E593A002A0882 /* LaunchDataResources */, + C3423C2F2B796D820051BD6D /* Sounds */, + C35ABD07257404C6002BB9BB /* SwiftUI+UIKit */, + 75A2A87C1DA59E4E00A983D8 /* litewallet.entitlements */, + 75A2A7931DA5934300A983D8 /* AppDelegate.swift */, + CE20C8F11DBAF71500C8397A /* ApplicationController.swift */, + 754AE0BB1DFE8A46007FD001 /* BRCore.swift */, + C3E751C92AF68B2F005571CA /* BRCoreClasses */, + C3E751C02AF689A0005571CA /* BRExtensions */, + 75519F331DC7D20500EDF66C /* WalletManager.swift */, + 7503773C1DF57428005EB8AE /* WalletManager+Auth.swift */, + CE4B6C191E219CA600CF935B /* WalletCoordinator.swift */, + CEE659E61F65A936001FF29D /* RetryTimer.swift */, + CE8CD8DC1E2D9EF200785E02 /* Sender.swift */, + CE74F58C1E3BA85600ED5FA9 /* ExchangeUpdater.swift */, + CE124CFB1E68932C00DFA146 /* FeeManager.swift */, + CE45C1FC1E7650F5002C3847 /* KVStoreCoordinator.swift */, + CEC6F8441E886723000795B8 /* PaymentRequest.swift */, + 7528D2971ECF655500925DBC /* PaymentProtocol.swift */, + CE4C1CC71ED88B600063E184 /* URLController.swift */, + CE916E321EDA800E00D641D6 /* UserDefaultsUpdater.swift */, + CE3D4C561EF5D5740016B1C8 /* ReachabilityMonitor.swift */, + CE2990171EFD6DAF0093A0F2 /* Strings */, + 24306795238F3DDF00EBEA99 /* BartyCrouch */, + 24AF00FB221B32EC00FF636F /* Storyboards */, + CE20C90A1DBC59C500C8397A /* FlowControllers */, + CEE20C321EA5B2EC0086F724 /* Constants */, + CE20C8EF1DBAF6D300C8397A /* ViewControllers */, + CE20C90F1DBE5B5100C8397A /* Views */, + CEBF33021DDE177F00348FC6 /* ViewModels */, + CE6D0E5A1E14BF8400137DF1 /* Models */, + CE20C8F01DBAF6E100C8397A /* Extensions */, + 22A9A9311DF61930000F0016 /* Platform */, + CEAA9E9C1DC2F8270066731D /* Fonts */, + 24670EAC2368EDE7006093E0 /* LFColorPalette.xcassets */, + 75A2A79A1DA5934300A983D8 /* Assets.xcassets */, + CE5E6C991EB9135000A476DB /* Icon.xcassets */, + 75A2A79C1DA5934300A983D8 /* LaunchScreen.storyboard */, + 75A2A79F1DA5934300A983D8 /* Info.plist */, + C31C27662BA327640047F855 /* PrivacyInfo.xcprivacy */, + 24B523AF238A53DC0030594D /* BIP39Words.plist */, + 2485F7CE23728C19005962F1 /* RELEASE_NOTES.md */, + C3ACF2DE25DED601008671D4 /* CHANGELOG.md */, + ); + path = litewallet; + sourceTree = ""; + }; + 75A2A7F11DA5935F00A983D8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 24D91D0A2166923E0077A619 /* UserNotifications.framework */, + 22A9A9671DF61FF8000F0016 /* libbz2.tbd */, + 22A9A9651DF61FEE000F0016 /* WebKit.framework */, + 22A9A9631DF61FE7000F0016 /* Security.framework */, + 22A9A9611DF61FE0000F0016 /* SystemConfiguration.framework */, + 22A9A95F1DF61FD8000F0016 /* CoreLocation.framework */, + 22A9A95D1DF61FD0000F0016 /* PushKit.framework */, + 75FEFD1B1DAED56E00203D3A /* libsqlite3.tbd */, + 75A2A7F21DA5935F00A983D8 /* Messages.framework */, + 75A2A8091DA5936F00A983D8 /* NotificationCenter.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 75A2A80B1DA5936F00A983D8 /* TodayExtension */ = { + isa = PBXGroup; + children = ( + CE916E341EDA848B00D641D6 /* TodayExtension.entitlements */, + CE916E2C1EDA7ED000D641D6 /* BRBubbleView.h */, + CE916E2D1EDA7ED000D641D6 /* BRBubbleView.m */, + CE916E2B1EDA7E9100D641D6 /* BRAppGroupConstants.h */, + CE916E351EDA855800D641D6 /* BRTodayViewController.h */, + CE916E361EDA855800D641D6 /* BRTodayViewController.m */, + CE916E2F1EDA7F1400D641D6 /* UIImage+Utils.h */, + CE916E301EDA7F1400D641D6 /* UIImage+Utils.m */, + 75A2A80E1DA5936F00A983D8 /* MainInterface.storyboard */, + 75A2A8111DA5936F00A983D8 /* Info.plist */, + CE916E291EDA7E4400D641D6 /* Media.xcassets */, + ); + path = TodayExtension; + sourceTree = ""; + }; + 75B6F52F1DA71DCC0031A93F /* Modules */ = { + isa = PBXGroup; + children = ( + 1BBAEBE51F80237B0047DEA8 /* loafwallet-core */, + 22A9A9971DF63426000F0016 /* libbz2 */, + 755CD3831DAA0E3E0075898E /* unbound */, + 755CD7031DAA16810075898E /* nettle */, + 75FEFD1F1DAEE7A400203D3A /* sqlite3 */, + ); + name = Modules; + sourceTree = ""; + }; + 75FEFD1F1DAEE7A400203D3A /* sqlite3 */ = { + isa = PBXGroup; + children = ( + 752FB03B1DF8BE4B009086FB /* Info.plist */, + 752FB03C1DF8BE4B009086FB /* iphone.modulemap */, + 752FB03D1DF8BE4B009086FB /* iphonesim.modulemap */, + ); + name = sqlite3; + path = Modules/sqlite3; + sourceTree = ""; + }; + C3055B662B8E593A002A0882 /* LaunchDataResources */ = { + isa = PBXGroup; + children = ( + C7FD407E2C48FAF60010C0E6 /* partner-keys.plist */, + C3F8F1452C05269A006C3211 /* GoogleService-Info.plist */, + C3188E2526431E750008ADD1 /* Debug-GoogleService-Info.plist */, + ); + name = LaunchDataResources; + sourceTree = ""; + }; + C32142E825C97CB900BECCD0 /* Transactions */ = { + isa = PBXGroup; + children = ( + C32142E925C97CD900BECCD0 /* TransactionCellView.swift */, + C3C8973725CD6B9300241FBE /* HostingTransactionCell.swift */, + C32142F925C988C800BECCD0 /* TransactionCellViewModel.swift */, + C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */, + ); + name = Transactions; + sourceTree = ""; + }; + C3423C2F2B796D820051BD6D /* Sounds */ = { + isa = PBXGroup; + children = ( + C3423C302B796D820051BD6D /* 日本語.mp3 */, + C3423C312B796D820051BD6D /* Pt.mp3 */, + C3423C322B796D820051BD6D /* De.mp3 */, + C3423C332B796D820051BD6D /* En.mp3 */, + C3423C342B796D820051BD6D /* coinflip.aiff */, + C3423C352B796D820051BD6D /* Uk.mp3 */, + C3423C362B796D820051BD6D /* Fr.mp3 */, + C3423C372B796D820051BD6D /* 中國人.mp3 */, + C3423C382B796D820051BD6D /* Id.mp3 */, + C3423C392B796D820051BD6D /* Tr.mp3 */, + C3423C3A2B796D820051BD6D /* Es.mp3 */, + C3423C3B2B796D820051BD6D /* Ko.mp3 */, + C3423C3C2B796D820051BD6D /* It.mp3 */, + C3423C3D2B796D820051BD6D /* Ru.mp3 */, + ); + path = Sounds; + sourceTree = ""; + }; + C3543A25264AFE190005D17A /* Settings */ = { + isa = PBXGroup; + children = ( + C3543A26264AFE490005D17A /* LocaleChangeView.swift */, + C3543A28264AFE720005D17A /* LocaleChangeViewModel.swift */, + ); + name = Settings; + sourceTree = ""; + }; + C35ABD07257404C6002BB9BB /* SwiftUI+UIKit */ = { + isa = PBXGroup; + children = ( + C3B419C92BFCF0C900EBD935 /* Buy */, + C3423C272B7905330051BD6D /* SafariServices+Extension.swift */, + C3423C292B7905330051BD6D /* SignupWebView.swift */, + C3423C282B7905330051BD6D /* SignupWebViewModel.swift */, + C3423C252B7904E30051BD6D /* AnnounceUpdatesView.swift */, + C3423C232B7904B80051BD6D /* SeedWordView.swift */, + C3423C1D2B7904070051BD6D /* StartHostingController.swift */, + C3423C212B79047D0051BD6D /* StartViewModel.swift */, + C3423C1F2B79046A0051BD6D /* StartView.swift */, + C3423C1B2B7903CA0051BD6D /* LaunchView.swift */, + C3423C192B79039D0051BD6D /* LaunchCardHostingController.swift */, + C3FF4D5D28AC5A2000713139 /* Send */, + C3543A25264AFE190005D17A /* Settings */, + C32142E825C97CB900BECCD0 /* Transactions */, + C35ABD08257404D2002BB9BB /* Partners */, + C35ABD0925740518002BB9BB /* About */, + C3D4379E2566EA3E00F423E1 /* LWActivityIndicator.swift */, + C30029E125D0185500F08C2B /* StandardDividerView.swift */, + C30029EA25D019BC00F08C2B /* CopyButtonView.swift */, + C3EFA9A02650807B005C59B5 /* LockScreenHeaderView.swift */, + C3EFA9A2265080FF005C59B5 /* LockScreenHeaderViewModel.swift */, + C350788B27DCB10700A50819 /* TextView+Extension.swift */, + ); + name = "SwiftUI+UIKit"; + sourceTree = ""; + }; + C35ABD08257404D2002BB9BB /* Partners */ = { + isa = PBXGroup; + children = ( + C35ABD222574070A002BB9BB /* PartnersView.swift */, + C35ABD322574073F002BB9BB /* PartnersViewModel.swift */, + ); + name = Partners; + sourceTree = ""; + }; + C35ABD0925740518002BB9BB /* About */ = { + isa = PBXGroup; + children = ( + ); + name = About; + sourceTree = ""; + }; + C3B419C92BFCF0C900EBD935 /* Buy */ = { + isa = PBXGroup; + children = ( + C3B419CA2BFCF14100EBD935 /* BuyHostingController.swift */, + C3B419CC2BFCF17600EBD935 /* BuyView.swift */, + C3DBBE302BFE15AF00B95939 /* BuyTileView.swift */, + C3E5A9042BFDEEF1002FBE04 /* BuyViewModel.swift */, + ); + name = Buy; + sourceTree = ""; + }; + C3B7C3EC255FF56100E98A64 /* Constants Tests */ = { + isa = PBXGroup; + children = ( + C3B7C3ED255FF59200E98A64 /* ConstantsTests.swift */, + ); + path = "Constants Tests"; + sourceTree = ""; + }; + C3E751C02AF689A0005571CA /* BRExtensions */ = { + isa = PBXGroup; + children = ( + C3E751C12AF689BA005571CA /* BRKeyExtension.swift */, + C3E751C32AF68A50005571CA /* BRAddressExtension.swift */, + C3E751C52AF68A8E005571CA /* BRTxInputExtension.swift */, + C3E751C72AF68AEB005571CA /* UnsafeMutablePointerExtension.swift */, + C3E751CE2AF68C18005571CA /* BRCalculationExtension.swift */, + C3E751D02AF68C84005571CA /* BRMasterKeyExtension.swift */, + C3E751D22AF68CD1005571CA /* BRTxOutputExtension.swift */, + ); + name = BRExtensions; + sourceTree = ""; + }; + C3E751C92AF68B2F005571CA /* BRCoreClasses */ = { + isa = PBXGroup; + children = ( + C3E751CA2AF68B47005571CA /* BRPeerManager.swift */, + C3E751CC2AF68B93005571CA /* BRWallet.swift */, + ); + name = BRCoreClasses; + sourceTree = ""; + }; + C3EFA9A42651A7C4005C59B5 /* Lock Screen Tests */ = { + isa = PBXGroup; + children = ( + C3EFA9A52651A808005C59B5 /* LockScreenTests.swift */, + ); + path = "Lock Screen Tests"; + sourceTree = ""; + }; + C3FF4D5D28AC5A2000713139 /* Send */ = { + isa = PBXGroup; + children = ( + C3FF4D5E28AC5A5800713139 /* SendAddressCellView.swift */, + C36375A228BD38A500CFB3D8 /* SendButtonHostingController.swift */, + C3FF4D6028AC5AC100713139 /* SendAddressCellViewModel.swift */, + C36375A428BD390C00CFB3D8 /* SendButtonView.swift */, + C361F48128B368BC00E9798F /* AddressFieldView.swift */, + ); + name = Send; + sourceTree = ""; + }; + CE1E5F241EF081F300BD0F72 /* Import */ = { + isa = PBXGroup; + children = ( + CE1E5F251EF083A600BD0F72 /* StartImportViewController.swift */, + ); + name = Import; + sourceTree = ""; + }; + CE20C8EF1DBAF6D300C8397A /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 584E24F62951D400005E0E8B /* LanguageSelection */, + 24313C8F23823D8500A83F69 /* Main */, + 24313C8E23823C5D00A83F69 /* PaperPhrase */, + 24313C8D23823C2B00A83F69 /* Pin */, + 24313C8C23823C0F00A83F69 /* Login */, + 24313C8B23823BDD00A83F69 /* Transactions */, + 24313C8A23823BC400A83F69 /* SendLTC */, + 24313C8923823BB700A83F69 /* WipeWallet */, + 24313C8823823B9F00A83F69 /* Receive */, + CE1E5F241EF081F300BD0F72 /* Import */, + CEEC70841E90CCA600EF788E /* Settings */, + CEB909F81E5FF20A001804DC /* Recover */, + CEC6AA3E1DEFC85700EE5AFD /* RootModals */, + CE6D0F951DE8B6B600BD4BCF /* ViewControllerTransitions */, + 24C516502158820E007CE038 /* Buy */, + CE760ED71E55F9E000EFAC2B /* SecurityCenter */, + CE20C9061DBC587200C8397A /* StartViewController.swift */, + 2494038023AF208F00369261 /* PromptModalViewController.swift */, + CEAA9E981DC262800066731D /* ConfirmPaperPhraseViewController.swift */, + CEF3E8351DE60222007C0A9E /* ModalNavigationController.swift */, + CE9057191DFF18B2006BA848 /* ScanViewController.swift */, + CE45C1F81E74B400002C3847 /* ManageWalletViewController.swift */, + CEEC708B1E95461A00EF788E /* AboutViewController.swift */, + CEEC70931E96A24F00EF788E /* DefaultCurrencyViewController.swift */, + CE4DFB2B1E9BE5880014009E /* ReScanViewController.swift */, + CE4DFB2D1E9C26DA0014009E /* ShareDataViewController.swift */, + CEEE92F01EBA7CBA00B7AC9C /* RequestAmountViewController.swift */, + CEF61B111ECF52C700C7EA6A /* AmountViewController.swift */, + CEC4CF061F0C48DD00E5C82E /* StartWipeWalletViewController.swift */, + CE8644241F2C160200033129 /* ConfirmationViewController.swift */, + CE44BA1A1F33BFC500392A1A /* NodeSelectorViewController.swift */, + CEE659E81F664C73001FF29D /* WelcomeViewController.swift */, + 1B3F74211FFB106200CCA50C /* BiometricsSettingsViewController.swift */, + 1B3F74221FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift */, + 24AF00FF221B349100FF636F /* WarningConfirmationViewController.swift */, + 24D5F26D225A5BEA00225462 /* ContainerViewController.swift */, + ); + name = ViewControllers; + sourceTree = ""; + }; + CE20C8F01DBAF6E100C8397A /* Extensions */ = { + isa = PBXGroup; + children = ( + CE20C8F51DBAF77D00C8397A /* UIViewController+BRWAdditions.swift */, + C3BD4A5225975C6000D97079 /* View+Extension.swift */, + C32DAE0625925B7E003FC978 /* Color+Extension.swift */, + CE20C8FB1DBB0F3A00C8397A /* UIColor+Extension.swift */, + C316CF48261887FC00E4C09B /* UIApplication+Extension.swift */, + CE20C90D1DBE52B000C8397A /* UIView+BRWAdditions.swift */, + CE20C9161DBE6F2A00C8397A /* UIButton+BRWAdditions.swift */, + CEAA9E901DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift */, + CEAA9E941DC1659F0066731D /* UILabel+BRWAdditions.swift */, + CEAA9E9F1DC2F9F50066731D /* UIFont+BRWAdditions.swift */, + CE92F9F31DED59E80046B516 /* UIView+AnimationAdditions.swift */, + CE92F9F51DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift */, + CEC6AA381DEE10BA00EE5AFD /* UINavigationController+Extension.swift */, + CEC6AA3A1DEE4EB000EE5AFD /* CGRect+Additions.swift */, + CE25BF901DF9ADE700BC67B6 /* UIImage+Utils.swift */, + CE9057171DFF0FA8006BA848 /* String+Additions.swift */, + CEA362691E01150D0061FC0E /* CGContext+Additions.swift */, + CECCE5A41E02408300D99448 /* UIView+FrameChangeBlocking.swift */, + CE6314821E08E5BB00D4AFE0 /* UIView+InitAdditions.swift */, + CE6DCC241E6001E50044257B /* UIControl+Callback.swift */, + CE124CFD1E68F57700DFA146 /* Async.swift */, + CEF3D2DC1E8CBA790070178E /* LAContext+Extensions.swift */, + CEEC70851E94397D00EF788E /* UserDefaults+Additions.swift */, + CEE628291EA98B6D001035AA /* DispatchQueue+Additions.swift */, + CE1D84B51EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift */, + CEF61B151ED2056D00C7EA6A /* NumberFormatter+Additions.swift */, + CE1280F51EEA855C00D27649 /* Date+Additions.swift */, + CEC4CF081F0C84AB00E5C82E /* UIViewController+Alerts.swift */, + CE47A8DF1F7DA54000FF35BA /* UIScreen+Additions.swift */, + 584E24F42951D2DB005E0E8B /* BundleExtension.swift */, + 584E24FB2951D476005E0E8B /* NSNotificationNameExtension.swift */, + 584E24FD2951D752005E0E8B /* UITableViewExtension.swift */, + ); + name = Extensions; + sourceTree = ""; + }; + CE20C8FF1DBBFFDD00C8397A /* SimpleRedux */ = { + isa = PBXGroup; + children = ( + CE20C8FD1DBB133A00C8397A /* SimpleRedux.swift */, + CE20C9181DBE7B8200C8397A /* ReduxState.swift */, + CE20C9001DBBFFF800C8397A /* Actions.swift */, + ); + name = SimpleRedux; + sourceTree = ""; + }; + CE20C90A1DBC59C500C8397A /* FlowControllers */ = { + isa = PBXGroup; + children = ( + CE0CD1581DBFBCF5004023DA /* ModalPresenter.swift */, + CE25BF921DFDA7A500BC67B6 /* MessageUIPresenter.swift */, + CE20C90B1DBC59E600C8397A /* StartFlowPresenter.swift */, + CEAA9EA51DC3246F0066731D /* StartNavigationDelegate.swift */, + ); + name = FlowControllers; + sourceTree = ""; + }; + CE20C90F1DBE5B5100C8397A /* Views */ = { + isa = PBXGroup; + children = ( + 24BA90C52410129E001E3825 /* FeeSelectorView.swift */, + C39443F8269DDAD3002703E9 /* LitewalletIconView.swift */, + CE6BCF5C1EE9E89A0029849C /* CustomTitleView.swift */, + CED341321EF5A5C00014912A /* InAppAlert.swift */, + CE3645461E7B40280079D0CF /* PinPadCells */, + CECCE5AC1E04AD4100D99448 /* SendViewCells */, + CEBF32F71DDD191300348FC6 /* TransactionCells */, + CEF3E8301DE554F1007C0A9E /* AnimatedIcons */, + CEC6AA471DEFCFCD00EE5AFD /* Controls */, + CE20C9101DBE5B6F00C8397A /* Circle.swift */, + CEF3E82A1DE51612007C0A9E /* GradientCircle.swift */, + CEAA9E961DC18E1F0066731D /* PhraseView.swift */, + CEAA9E9A1DC2B9320066731D /* ConfirmPhrase.swift */, + CEAA9EA71DC3342E0066731D /* PinView.swift */, + CEBF32ED1DDBC30000348FC6 /* ShadowButton.swift */, + CEF3E82C1DE528BF007C0A9E /* AlertView.swift */, + CEF3E82E1DE534C5007C0A9E /* GradientView.swift */, + CEC6AA3C1DEE687000EE5AFD /* RadialGradientView.swift */, + CEE1F5621DF13E5A00D733AD /* ModalHeaderView.swift */, + CE25BF8C1DF3B8A500BC67B6 /* InViewAlert.swift */, + CEA362671E00EE320061FC0E /* CameraGuideView.swift */, + CE6B6B491E54C0CA00B31405 /* SecurityCenterCell.swift */, + CE6DCC261E6108D50044257B /* EnterPhraseCell.swift */, + CEAFC8601E5D5B0500E4FD06 /* SegmentedButton.swift */, + CE6DCC2F1E6666470044257B /* NonScrollingCollectionView.swift */, + CE124CFF1E69170900DFA146 /* SyncingView.swift */, + CEEC70801E90C04700EF788E /* SeparatorCell.swift */, + CEEC70891E945E3B00EF788E /* UnEditableTextView.swift */, + CEEC708D1E954AAB00EF788E /* AboutCell.swift */, + CEEC70911E95DA4400EF788E /* GradientSwitch.swift */, + CE83DE291E9EB7F600D07636 /* SendAmountCell.swift */, + CEE20C2C1EA288FA0086F724 /* UpdatingLabel.swift */, + CEE20C2E1EA3E5820086F724 /* BlinkingView.swift */, + CE5E6C931EB7964900A476DB /* WalletDisabledView.swift */, + CE8F0AE21EB91BB500AA7642 /* SearchHeaderView.swift */, + CE4C1CC51ED65D830063E184 /* DrawableCircle.swift */, + CEBF292D1EF99E55005C330A /* LightWeightAlert.swift */, + 2494037C23AE0C7100369261 /* SyncProgressHeaderView.swift */, + C36DBF5E28F18D2C00FBCB24 /* LocalWebView.swift */, + C36DBF6028F1988900FBCB24 /* LocalWebViewModel.swift */, + ); + name = Views; + sourceTree = ""; + }; + CE2990171EFD6DAF0093A0F2 /* Strings */ = { + isa = PBXGroup; + children = ( + CEE20C371EA5B4680086F724 /* Strings.swift */, + CE29901C1EFD6DE50093A0F2 /* Localizable.strings */, + ); + name = Strings; + sourceTree = ""; + }; + CE3645461E7B40280079D0CF /* PinPadCells */ = { + isa = PBXGroup; + children = ( + CE36454B1E7B42850079D0CF /* PinPadCells.swift */, + ); + name = PinPadCells; + sourceTree = ""; + }; + CE6D0E5A1E14BF8400137DF1 /* Models */ = { + isa = PBXGroup; + children = ( + CE20C8FF1DBBFFDD00C8397A /* SimpleRedux */, + CE6D0E5B1E14BFA600137DF1 /* KeyboardNotificationInfo.swift */, + CEE65DEF1E39056F0002994D /* Rate.swift */, + 24016D8F23F913C1006A6791 /* LWAnalytics.swift */, + CEEC70821E90C07C00EF788E /* Setting.swift */, + C339752027001BEC0071FED6 /* EmailValidation.swift */, + C3019EE22B8FEFED00FAF648 /* AssociatedObject.swift */, + CEF61B131ED0D10000C7EA6A /* Types.swift */, + CE03EC731EF256AC0038E3A8 /* SimpleUTXO.swift */, + 24D91D0D2166A5480077A619 /* TestnetData.swift */, + 24B8FAC3216128A000A155B1 /* PartnerData.swift */, + 24B8FADE2163C4D400A155B1 /* Currency.swift */, + 24313C732381E73200A83F69 /* TransactionManager.swift */, + 24470E4623A6B6E900ADDA27 /* MockSeeds.swift */, + 584E24F22951C119005E0E8B /* Localization.swift */, + ); + name = Models; + sourceTree = ""; + }; + CE6D0F951DE8B6B600BD4BCF /* ViewControllerTransitions */ = { + isa = PBXGroup; + children = ( + CE6D0F961DE8B73A00BD4BCF /* ModalTransitionDelegate.swift */, + CE6D0F981DE8B75900BD4BCF /* DismissModalAnimator.swift */, + CE92F9EF1DED0C790046B516 /* PresentModalAnimator.swift */, + CE5F21D81E4A922700C47B8E /* DismissLoginAnimator.swift */, + CE5F21DA1E4A93A500C47B8E /* LoginTransitionDelegate.swift */, + CEE0EF511EBD14B60018DB36 /* PinTransitioningDelegate.swift */, + 2494037723AD53B900369261 /* ChildViewTransitioningDelegate.swift */, + ); + name = ViewControllerTransitions; + sourceTree = ""; + }; + CE760ED71E55F9E000EFAC2B /* SecurityCenter */ = { + isa = PBXGroup; + children = ( + CE760EDA1E561DF900EFAC2B /* SecurityCenterViewController.swift */, + CE760EDB1E561DF900EFAC2B /* UpdatePinViewController.swift */, + ); + name = SecurityCenter; + sourceTree = ""; + }; + CEAA9E9C1DC2F8270066731D /* Fonts */ = { + isa = PBXGroup; + children = ( + 24D5F22622599C0A00225462 /* BarlowSemiCondensed-Bold.ttf */, + 24D5F22522599C0900225462 /* BarlowSemiCondensed-Italic.ttf */, + 24D5F22D22599C0A00225462 /* BarlowSemiCondensed-Light.ttf */, + 24D5F23022599C0B00225462 /* BarlowSemiCondensed-Medium.ttf */, + 24D5F23222599C0B00225462 /* BarlowSemiCondensed-Regular.ttf */, + 24D5F23422599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf */, + ); + name = Fonts; + sourceTree = ""; + }; + CEB909F81E5FF20A001804DC /* Recover */ = { + isa = PBXGroup; + children = ( + CEB909F41E5FE63D001804DC /* EnterPhraseViewController.swift */, + CEB909F61E5FE654001804DC /* EnterPhraseCollectionViewController.swift */, + CEB909F91E5FF242001804DC /* RecoverWalletIntroViewController.swift */, + ); + name = Recover; + sourceTree = ""; + }; + CEBF32F71DDD191300348FC6 /* TransactionCells */ = { + isa = PBXGroup; + children = ( + 24313C8523821B8C00A83F69 /* PromptTableViewCell.swift */, + C39A71462608CB4300E7B640 /* EmptyTableViewCell.swift */, + ); + name = TransactionCells; + sourceTree = ""; + }; + CEBF33021DDE177F00348FC6 /* ViewModels */ = { + isa = PBXGroup; + children = ( + C3B7C3B8255EABBF00E98A64 /* SupportSafariViewModel.swift */, + CEBF33031DDE17A600348FC6 /* Transaction.swift */, + CE27F9581E2C8EA300F7F7F2 /* Amount.swift */, + CE124CF71E67A8E500DFA146 /* TransactionDirection.swift */, + ); + name = ViewModels; + sourceTree = ""; + }; + CEC6AA3E1DEFC85700EE5AFD /* RootModals */ = { + isa = PBXGroup; + children = ( + CEC6AA431DEFCDE900EE5AFD /* ModalViewController.swift */, + CEC6AA3F1DEFC87300EE5AFD /* SendViewController.swift */, + CEC6AA411DEFC88F00EE5AFD /* ReceiveViewController.swift */, + CEC6AA451DEFCE9200EE5AFD /* MenuViewController.swift */, + CEC6AA4C1DF0741100EE5AFD /* ModalDisplayable.swift */, + ); + name = RootModals; + sourceTree = ""; + }; + CEC6AA471DEFCFCD00EE5AFD /* Controls */ = { + isa = PBXGroup; + children = ( + CEC6AA481DEFD00100EE5AFD /* MenuButton.swift */, + CEC6AA4A1DEFD24C00EE5AFD /* MenuButtonType.swift */, + ); + name = Controls; + sourceTree = ""; + }; + CECCE5AC1E04AD4100D99448 /* SendViewCells */ = { + isa = PBXGroup; + children = ( + CECCE5B11E04B00D00D99448 /* SendCell.swift */, + CECCE5AD1E04AD6300D99448 /* AddressCell.swift */, + CECCE5AF1E04AD7600D99448 /* DescriptionSendCell.swift */, + ); + name = SendViewCells; + sourceTree = ""; + }; + CEE20C321EA5B2EC0086F724 /* Constants */ = { + isa = PBXGroup; + children = ( + CEE20C351EA5B4620086F724 /* Constants+Events.swift */, + CEBF292F1EF9D76F005C330A /* Environment.swift */, + CEE20C331EA5B4550086F724 /* ArticleIds.swift */, + CE3D4C581EF743EF0016B1C8 /* Functions.swift */, + C3F8F13D2C04C3A7006C3211 /* MoonpayHelper.swift */, + ); + name = Constants; + sourceTree = ""; + }; + CEEC70841E90CCA600EF788E /* Settings */ = { + isa = PBXGroup; + children = ( + CEEC707E1E8D6B4100EF788E /* SettingsViewController.swift */, + ); + name = Settings; + sourceTree = ""; + }; + CEF3E8301DE554F1007C0A9E /* AnimatedIcons */ = { + isa = PBXGroup; + children = ( + CEF3E8311DE55540007C0A9E /* CheckView.swift */, + CEF3E8331DE57166007C0A9E /* AnimatableIcon.swift */, + ); + name = AnimatedIcons; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXLegacyTarget section */ + 759DA0D71DAC8668008CC49B /* submodules */ = { + isa = PBXLegacyTarget; + buildArgumentsString = "-c 'git submodule init && git submodule update && git -C Modules/loafwallet-core submodule init && git -C Modules/loafwallet-core submodule update'"; + buildConfigurationList = 759DA0DA1DAC8668008CC49B /* Build configuration list for PBXLegacyTarget "submodules" */; + buildPhases = ( + ); + buildToolPath = /bin/sh; + buildWorkingDirectory = ""; + dependencies = ( + ); + name = submodules; + passBuildSettingsInEnvironment = 1; + productName = submodules; + }; +/* End PBXLegacyTarget section */ + +/* Begin PBXNativeTarget section */ + 2465873523A5AAD000A32E9E /* litewalletTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2465873D23A5AAD100A32E9E /* Build configuration list for PBXNativeTarget "litewalletTests" */; + buildPhases = ( + 2465873223A5AAD000A32E9E /* Sources */, + 2465873323A5AAD000A32E9E /* Frameworks */, + 2465873423A5AAD000A32E9E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2465873C23A5AAD100A32E9E /* PBXTargetDependency */, + ); + name = litewalletTests; + productName = litewalletTests; + productReference = 2465873623A5AAD000A32E9E /* litewalletTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 755CD9C31DAA18420075898E /* unbound */ = { + isa = PBXNativeTarget; + buildConfigurationList = 755CD9CA1DAA18420075898E /* Build configuration list for PBXNativeTarget "unbound" */; + buildPhases = ( + 755CD9C01DAA18420075898E /* Sources */, + 755CD9C11DAA18420075898E /* Frameworks */, + 755CD9C21DAA18420075898E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 759DA0DC1DAC86B5008CC49B /* PBXTargetDependency */, + ); + name = unbound; + productName = unbound; + productReference = 755CD9C41DAA18420075898E /* libunbound.a */; + productType = "com.apple.product-type.library.static"; + }; + 755CD9D01DAA197C0075898E /* BRCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = 755CD9D71DAA197D0075898E /* Build configuration list for PBXNativeTarget "BRCore" */; + buildPhases = ( + 755CD9CD1DAA197C0075898E /* Sources */, + 755CD9CE1DAA197C0075898E /* Frameworks */, + 755CD9CF1DAA197C0075898E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 759DA0DE1DAC86BC008CC49B /* PBXTargetDependency */, + ); + name = BRCore; + productName = BRCore; + productReference = 755CD9D11DAA197C0075898E /* libBRCore.a */; + productType = "com.apple.product-type.library.static"; + }; + 75A2A78F1DA5934300A983D8 /* litewallet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75A2A7E31DA5934400A983D8 /* Build configuration list for PBXNativeTarget "litewallet" */; + buildPhases = ( + 2430679A238F538C00EBEA99 /* Update Localizable using BartyCrouch */, + 583FE8702927ED5A009A6384 /* Run SwiftFormat */, + 58A9FE4829191E4700B75825 /* Check for unused code */, + 75A2A78C1DA5934300A983D8 /* Sources */, + 75A2A78D1DA5934300A983D8 /* Frameworks */, + 75A2A78E1DA5934300A983D8 /* Resources */, + 75A2A8031DA5935F00A983D8 /* Embed App Extensions */, + 22A9A9831DF63288000F0016 /* Embed Frameworks */, + C3A3FFB526FE46E8000FE955 /* Mark Dev Notes */, + 58A9FE4C291BC37400B75825 /* Count number of swift lines */, + ); + buildRules = ( + ); + dependencies = ( + 759DA0BD1DAC369C008CC49B /* PBXTargetDependency */, + 75A2A8131DA5936F00A983D8 /* PBXTargetDependency */, + ); + name = litewallet; + packageProductDependencies = ( + C35C121F293D464A0009022D /* FirebaseAnalytics */, + C35C1221293D464A0009022D /* FirebaseAuth */, + C35C1223293D464A0009022D /* FirebaseCrashlytics */, + C35C1229293D48340009022D /* KeychainAccess */, + C3423C172B781C6B0051BD6D /* PushNotifications */, + ); + productName = breadwallet; + productReference = 75A2A7901DA5934300A983D8 /* Litewallet.app */; + productType = "com.apple.product-type.application"; + }; + 75A2A8071DA5936F00A983D8 /* TodayExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75A2A8151DA5936F00A983D8 /* Build configuration list for PBXNativeTarget "TodayExtension" */; + buildPhases = ( + 75A2A8041DA5936F00A983D8 /* Sources */, + 75A2A8051DA5936F00A983D8 /* Frameworks */, + 75A2A8061DA5936F00A983D8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TodayExtension; + productName = TodayExtension; + productReference = 75A2A8081DA5936F00A983D8 /* TodayExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 75C735AE1DAA1C9F00251ECF /* nettle */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75C735B51DAA1C9F00251ECF /* Build configuration list for PBXNativeTarget "nettle" */; + buildPhases = ( + 75C735AB1DAA1C9F00251ECF /* Sources */, + 75C735AC1DAA1C9F00251ECF /* Frameworks */, + 75C735AD1DAA1C9F00251ECF /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 759DA0E01DAC86C3008CC49B /* PBXTargetDependency */, + ); + name = nettle; + productName = nettle; + productReference = 75C735AF1DAA1C9F00251ECF /* libnettle.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 75A2A7881DA5934300A983D8 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = ""; + KnownAssetTags = ( + "initial-resources", + speakTag, + ); + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1340; + ORGANIZATIONNAME = "Litecoin Foundation"; + TargetAttributes = { + 2465873523A5AAD000A32E9E = { + CreatedOnToolsVersion = 11.3; + TestTargetID = 75A2A78F1DA5934300A983D8; + }; + 755CD9C31DAA18420075898E = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + 755CD9D01DAA197C0075898E = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + 759DA0D71DAC8668008CC49B = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + 75A2A78F1DA5934300A983D8 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.DataProtection = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + }; + }; + 75A2A8071DA5936F00A983D8 = { + CreatedOnToolsVersion = 8.0; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + 75C735AE1DAA1C9F00251ECF = { + CreatedOnToolsVersion = 8.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 75A2A78B1DA5934300A983D8 /* Build configuration list for PBXProject "litewallet" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + fr, + es, + ja, + "zh-Hans", + de, + ru, + pt, + ko, + "zh-Hant", + id, + Base, + tr, + uk, + ); + mainGroup = 75A2A7871DA5934300A983D8; + packageReferences = ( + C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + C35C1228293D48330009022D /* XCRemoteSwiftPackageReference "KeychainAccess" */, + C3423C162B7816EA0051BD6D /* XCRemoteSwiftPackageReference "push-notifications-swift" */, + ); + productRefGroup = 75A2A7911DA5934300A983D8 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 75A2A78F1DA5934300A983D8 /* litewallet */, + 2465873523A5AAD000A32E9E /* litewalletTests */, + 75A2A8071DA5936F00A983D8 /* TodayExtension */, + 755CD9C31DAA18420075898E /* unbound */, + 755CD9D01DAA197C0075898E /* BRCore */, + 75C735AE1DAA1C9F00251ECF /* nettle */, + 759DA0D71DAC8668008CC49B /* submodules */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2465873423A5AAD000A32E9E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A78E1DA5934300A983D8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C3423C492B796D820051BD6D /* Ko.mp3 in Resources */, + 75A2A79E1DA5934300A983D8 /* LaunchScreen.storyboard in Resources */, + C33685092BECE8B10069CBC7 /* PrivacyInfo.xcprivacy in Resources */, + C3423C3F2B796D820051BD6D /* Pt.mp3 in Resources */, + 24D5F23822599C0B00225462 /* BarlowSemiCondensed-Italic.ttf in Resources */, + 24D5F25922599C0B00225462 /* BarlowSemiCondensed-Medium.ttf in Resources */, + 24313C9B23824F5800A83F69 /* Transactions.storyboard in Resources */, + C3423C412B796D820051BD6D /* En.mp3 in Resources */, + 222319B21F279B3C00008F20 /* POSTBouncer.html in Resources */, + C7FD407F2C48FAF60010C0E6 /* partner-keys.plist in Resources */, + 24670EAE2368EDE7006093E0 /* LFColorPalette.xcassets in Resources */, + 24313CA523824F5800A83F69 /* Buy.storyboard in Resources */, + 24D5F23B22599C0B00225462 /* BarlowSemiCondensed-Bold.ttf in Resources */, + 24AF00FE221B331D00FF636F /* WarningConfirmation.storyboard in Resources */, + C3423C4B2B796D820051BD6D /* Ru.mp3 in Resources */, + 24313C9D23824F5800A83F69 /* Alerts.storyboard in Resources */, + 24313CA123824F5800A83F69 /* Receive.storyboard in Resources */, + 24D5F26522599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf in Resources */, + C3423C482B796D820051BD6D /* Es.mp3 in Resources */, + C3423C4A2B796D820051BD6D /* It.mp3 in Resources */, + CE5E6C9A1EB9135000A476DB /* Icon.xcassets in Resources */, + C3423C452B796D820051BD6D /* 中國人.mp3 in Resources */, + 24D5F25022599C0B00225462 /* BarlowSemiCondensed-Light.ttf in Resources */, + C3423C472B796D820051BD6D /* Tr.mp3 in Resources */, + C3F8F1442C04F6BE006C3211 /* Dakar, Senegal.gpx in Resources */, + 2494037F23AE0C7100369261 /* SyncProgressHeaderView.xib in Resources */, + C3188E2726431E750008ADD1 /* Debug-GoogleService-Info.plist in Resources */, + C3423C432B796D820051BD6D /* Uk.mp3 in Resources */, + CE29901A1EFD6DE50093A0F2 /* Localizable.strings in Resources */, + C3423C3E2B796D820051BD6D /* 日本語.mp3 in Resources */, + 24313C9F23824F5800A83F69 /* Animate.storyboard in Resources */, + C3423C442B796D820051BD6D /* Fr.mp3 in Resources */, + C3423C462B796D820051BD6D /* Id.mp3 in Resources */, + 24313CA323824F5800A83F69 /* Send.storyboard in Resources */, + 2485F7D023728C19005962F1 /* RELEASE_NOTES.md in Resources */, + 24B523AD238A53DC0030594D /* BIP39Words.plist in Resources */, + 24313CAA23824F9800A83F69 /* Main.storyboard in Resources */, + 24D5F25F22599C0B00225462 /* BarlowSemiCondensed-Regular.ttf in Resources */, + C3423C402B796D820051BD6D /* De.mp3 in Resources */, + 24DFCE6823B89CDE001F17F8 /* Settings.storyboard in Resources */, + 24393B5C23C259400075218D /* Phrase.storyboard in Resources */, + C3F8F1462C05269A006C3211 /* GoogleService-Info.plist in Resources */, + C3423C422B796D820051BD6D /* coinflip.aiff in Resources */, + 75A2A79B1DA5934300A983D8 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A8061DA5936F00A983D8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CE916E2A1EDA7E4400D641D6 /* Media.xcassets in Resources */, + 75A2A8101DA5936F00A983D8 /* MainInterface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2430679A238F538C00EBEA99 /* Update Localizable using BartyCrouch */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 12; + files = ( + ); + inputPaths = ( + ); + name = "Update Localizable using BartyCrouch"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "## This only notates strings that have yet to be localized. The Base Localizable file is wnere the change needs to be changed.\n## Routing the extractLocString errors to null due to swift tools bug : kcw-grunt 17 JAN 23\nif which bartycrouch > /dev/null; then\n bartycrouch update -x > /dev/null 2>&1;\n bartycrouch lint -x\nelse\n echo \"warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch\"\nfi\n"; + }; + 583FE8702927ED5A009A6384 /* Run SwiftFormat */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run SwiftFormat"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "cd BuildTools\nSDKROOT=(xcrun --sdk macosx --show-sdk-path)\n#swift package update #Uncomment this line temporarily to update the version used to the latest matching your BuildTools/Package.swift file\nswift run -c release swiftformat \"$SRCROOT\"\n"; + }; + 58A9FE4829191E4700B75825 /* Check for unused code */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Check for unused code"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "file=\"unused.rb\"\nif [ -f \"$file\" ]\nthen\necho \"$file found.\"\nruby unused.rb xcode\nelse\necho \"unused.rb doesn't exist\"\nfi\n"; + }; + 58A9FE4C291BC37400B75825 /* Count number of swift lines */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Count number of swift lines"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\necho \"Total number of swift lines\\n------------------\" && find . -name '*.swift' -print0 | xargs -0 wc -l | grep \"total\"\n"; + }; + C3A3FFB526FE46E8000FE955 /* Mark Dev Notes */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Mark Dev Notes"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# http://www.benzado.com/blog/post/329/make-xcode-nag-you-about-unfinished-todos\necho \"make-xcode-nag-you-about-unfinished-todos for swift files only\"\nKEYWORDS=\"DEV:|TODO:|FIXME:|\\?\\?\\?:|\\!\\!\\!:\"\nfind \"${SRCROOT}\" \\( -name \"*.swift\" \\) -print0 | \\\nxargs -0 egrep --with-filename --line-number --only-matching \"($KEYWORDS).*\\$\" | \\\nperl -p -e \"s/($KEYWORDS)/ warning: \\$1/\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2465873223A5AAD000A32E9E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24470E4223A6007200ADDA27 /* WalletInfoTest.swift in Sources */, + 24470E2123A5DA9700ADDA27 /* APIManagerTests.swift in Sources */, + 24470E3423A5F5E600ADDA27 /* PaymentRequestTests.swift in Sources */, + 584E25012951DAAA005E0E8B /* LanguageSelectionTests.swift in Sources */, + 24470E2E23A5F4FF00ADDA27 /* BRCoderTests.swift in Sources */, + 2494037623AD35C000369261 /* BuyWKWebVCTests.swift in Sources */, + 24470E3223A5F5B100ADDA27 /* NSDataExtensionTests.swift in Sources */, + 24470E2C23A5F43B00ADDA27 /* DefaultFiatCurrencyTests.swift in Sources */, + C3EFA9A62651A808005C59B5 /* LockScreenTests.swift in Sources */, + 24470E4023A6004800ADDA27 /* WalletCreationTests.swift in Sources */, + 24470E3823A5FEF200ADDA27 /* SpendingLimitTests.swift in Sources */, + 24470E3E23A6000900ADDA27 /* WalletAuthenticationTests.swift in Sources */, + 24470E2A23A5F33000ADDA27 /* BRReplicatedKVStoreTests.swift in Sources */, + C31891C326733FD400ECE25C /* TabBarViewControllerTests.swift in Sources */, + 24470E3C23A5FFD700ADDA27 /* TouchIdEnabledTests.swift in Sources */, + 24470E3A23A5FF5700ADDA27 /* TestHelpers.swift in Sources */, + 24470E3623A5FDE800ADDA27 /* PhraseTests.swift in Sources */, + 24470E4523A608A700ADDA27 /* AmountTests.swift in Sources */, + C3B7C3EE255FF59200E98A64 /* ConstantsTests.swift in Sources */, + 24470E2323A5DB7D00ADDA27 /* WalletManagerTests.swift in Sources */, + C3F8F13C2C049A4A006C3211 /* LocaleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9C01DAA18420075898E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 754868DC1DAB593300732D70 /* localzone.c in Sources */, + 754869181DAB7F8000732D70 /* strlcpy.c in Sources */, + 7548690A1DAB7C3000732D70 /* tube.c in Sources */, + 7524387C1DAAC61700844BEC /* log.c in Sources */, + 754868CF1DAB57A200732D70 /* msgencode.c in Sources */, + 754868D01DAB57BC00732D70 /* iter_fwd.c in Sources */, + 7524387D1DAAC63A00844BEC /* fptr_wlist.c in Sources */, + 7524387F1DAAC67F00844BEC /* val_anchor.c in Sources */, + 752438871DAAC87E00844BEC /* iter_delegpt.c in Sources */, + 754868D91DAB58E000732D70 /* iter_donotq.c in Sources */, + 754869191DAB7F9D00732D70 /* reallocarray.c in Sources */, + 752438791DAAC5A600844BEC /* rtt.c in Sources */, + 754869011DAB7B0000732D70 /* wire2str.c in Sources */, + 754868D71DAB58A100732D70 /* iterator.c in Sources */, + 754869161DAB7F5C00732D70 /* strsep.c in Sources */, + 7548690B1DAB7C7200732D70 /* random.c in Sources */, + 75C735AA1DAA1B9C00251ECF /* libunbound.c in Sources */, + 754868FF1DAB7AB200732D70 /* iter_scrub.c in Sources */, + 754869051DAB7B7F00732D70 /* str2wire.c in Sources */, + 752438761DAAC52700844BEC /* config_file.c in Sources */, + 752438861DAAC86200844BEC /* dns.c in Sources */, + 752438781DAAC58E00844BEC /* msgreply.c in Sources */, + 754868F81DAB5EB500732D70 /* listen_dnsport.c in Sources */, + 754868F51DAB5E3F00732D70 /* val_nsec.c in Sources */, + 752438841DAAC76500844BEC /* netevent.c in Sources */, + 754869031DAB7B3F00732D70 /* sbuffer.c in Sources */, + 754868D21DAB580B00732D70 /* msgparse.c in Sources */, + 754868FE1DAB601A00732D70 /* lruhash.c in Sources */, + 752438811DAAC6C100844BEC /* autotrust.c in Sources */, + 752438881DAAC8B000844BEC /* val_secalgo.c in Sources */, + 754869071DAB7BB500732D70 /* rrdef.c in Sources */, + 754868D11DAB57E900732D70 /* packed_rrset.c in Sources */, + 754868DF1DAB599700732D70 /* modstack.c in Sources */, + 754869171DAB7F7B00732D70 /* strlcat.c in Sources */, + 754868D51DAB586900732D70 /* infra.c in Sources */, + 7548690C1DAB7CB600732D70 /* validator.c in Sources */, + 754868FC1DAB5FD600732D70 /* iter_resptype.c in Sources */, + 7548691A1DAB7FD600732D70 /* configparser.c in Sources */, + 754868FD1DAB5FF700732D70 /* rrset.c in Sources */, + 752438851DAAC7E500844BEC /* dns64.c in Sources */, + 752438821DAAC6E200844BEC /* val_sigcrypt.c in Sources */, + 754868F71DAB5E8E00732D70 /* outside_network.c in Sources */, + 754868FB1DAB5FAD00732D70 /* regional.c in Sources */, + 754869141DAB7E4600732D70 /* ub_event.c in Sources */, + 7524387E1DAAC65C00844BEC /* dnstree.c in Sources */, + 7524387A1DAAC5D100844BEC /* context.c in Sources */, + 754869021DAB7B1D00732D70 /* parseutil.c in Sources */, + 754868D61DAB588500732D70 /* configlexer.c in Sources */, + 7524387B1DAAC5F200844BEC /* dname.c in Sources */, + 754868D31DAB582C00732D70 /* lookup3.c in Sources */, + 759DA0A11DAB838D008CC49B /* view.c in Sources */, + 754868DE1DAB597B00732D70 /* mini_event.c in Sources */, + 752438801DAAC6A200844BEC /* as112.c in Sources */, + 754868D41DAB584E00732D70 /* iter_hints.c in Sources */, + 752438831DAAC74300844BEC /* libworker.c in Sources */, + 752438771DAAC55C00844BEC /* net_help.c in Sources */, + 754869001DAB7AD100732D70 /* slabhash.c in Sources */, + 754868DB1DAB591A00732D70 /* val_kentry.c in Sources */, + 754868F61DAB5E6200732D70 /* outbound_list.c in Sources */, + 754869151DAB7E8B00732D70 /* val_utils.c in Sources */, + 754868DD1DAB594F00732D70 /* mesh.c in Sources */, + 754868DA1DAB58F900732D70 /* val_kcache.c in Sources */, + 7548690D1DAB7CD600732D70 /* val_neg.c in Sources */, + 754869041DAB7B6200732D70 /* keyraw.c in Sources */, + 754868F91DAB5EDC00732D70 /* iter_priv.c in Sources */, + 754869081DAB7BD900732D70 /* module.c in Sources */, + 752438751DAAC50800844BEC /* alloc.c in Sources */, + 754868D81DAB58C000732D70 /* iter_utils.c in Sources */, + 754869061DAB7B9900732D70 /* parse.c in Sources */, + 754868F41DAB5E1100732D70 /* val_nsec3.c in Sources */, + 754869091DAB7C1400732D70 /* timehist.c in Sources */, + 754868FA1DAB5EFE00732D70 /* rbtree.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 755CD9CD1DAA197C0075898E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1BBAEC921F80262A0047DEA8 /* BRWallet.c in Sources */, + 1BBAEC911F8026250047DEA8 /* BRBIP32Sequence.c in Sources */, + 1BBAEC901F80261D0047DEA8 /* BRMerkleBlock.c in Sources */, + 1BBAEC8F1F8026130047DEA8 /* BRSet.c in Sources */, + 1BBAEC8E1F8026090047DEA8 /* BRCrypto.c in Sources */, + 1BBAEC8D1F8026030047DEA8 /* BRPaymentProtocol.c in Sources */, + 1BA9FE3D216F68A700BB2DE8 /* BRBech32.c in Sources */, + 1BBAEC8C1F8025FC0047DEA8 /* BRPeerManager.c in Sources */, + 1BBAEC8B1F8025F60047DEA8 /* BRKey.c in Sources */, + 1BBAEC8A1F8025EF0047DEA8 /* BRBIP39Mnemonic.c in Sources */, + 1BBAEC891F8025E60047DEA8 /* BRBloomFilter.c in Sources */, + 1BBAEC881F8025DF0047DEA8 /* BRBase58.c in Sources */, + 1BBAEC871F8025D80047DEA8 /* BRAddress.c in Sources */, + 1BBAEC861F8025D20047DEA8 /* BRBIP38Key.c in Sources */, + 1BBAEC851F8025C90047DEA8 /* BRPeer.c in Sources */, + 1BBAEC841F8025C10047DEA8 /* BRTransaction.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A78C1DA5934300A983D8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CEBF29301EF9D76F005C330A /* Environment.swift in Sources */, + C39A71472608CB4300E7B640 /* EmptyTableViewCell.swift in Sources */, + CEC6AA4D1DF0741100EE5AFD /* ModalDisplayable.swift in Sources */, + CEE0EF521EBD14B60018DB36 /* PinTransitioningDelegate.swift in Sources */, + CE45C1FD1E7650F5002C3847 /* KVStoreCoordinator.swift in Sources */, + 754AE0BC1DFE8A46007FD001 /* BRCore.swift in Sources */, + 24306797238F3DF900EBEA99 /* BartyCrouch.swift in Sources */, + CEC6AA3B1DEE4EB000EE5AFD /* CGRect+Additions.swift in Sources */, + C3423C2A2B7905330051BD6D /* SafariServices+Extension.swift in Sources */, + CE45C1FB1E74F89C002C3847 /* WalletInfo.swift in Sources */, + C3E751D12AF68C84005571CA /* BRMasterKeyExtension.swift in Sources */, + C3FF4D5F28AC5A5800713139 /* SendAddressCellView.swift in Sources */, + C36375A328BD38A500CFB3D8 /* SendButtonHostingController.swift in Sources */, + CEE659E71F65A936001FF29D /* RetryTimer.swift in Sources */, + 248BFE2623AB302200CE1A71 /* BuyWKWebViewController.swift in Sources */, + CE90571A1DFF18B2006BA848 /* ScanViewController.swift in Sources */, + CE20C8F61DBAF77D00C8397A /* UIViewController+BRWAdditions.swift in Sources */, + CE74F58D1E3BA85600ED5FA9 /* ExchangeUpdater.swift in Sources */, + 24313C7B23820BC200A83F69 /* SendLTCViewController.swift in Sources */, + CE6DCC251E6001E50044257B /* UIControl+Callback.swift in Sources */, + C30029E225D0185500F08C2B /* StandardDividerView.swift in Sources */, + 223DB2191DF691260076A151 /* BRSocketHelpers.c in Sources */, + CEF3E82D1DE528BF007C0A9E /* AlertView.swift in Sources */, + C3543A29264AFE720005D17A /* LocaleChangeViewModel.swift in Sources */, + CEF3E82B1DE51612007C0A9E /* GradientCircle.swift in Sources */, + C3423C262B7904E30051BD6D /* AnnounceUpdatesView.swift in Sources */, + CE124CFE1E68F57700DFA146 /* Async.swift in Sources */, + C3423C1E2B7904070051BD6D /* StartHostingController.swift in Sources */, + C316CF49261887FC00E4C09B /* UIApplication+Extension.swift in Sources */, + CE8644251F2C160200033129 /* ConfirmationViewController.swift in Sources */, + CEE1F5631DF13E5A00D733AD /* ModalHeaderView.swift in Sources */, + CE5F21DB1E4A93A500C47B8E /* LoginTransitionDelegate.swift in Sources */, + 584E24FA2951D43A005E0E8B /* LanguageSelectionViewModel.swift in Sources */, + C3E751CB2AF68B47005571CA /* BRPeerManager.swift in Sources */, + CEE659E91F664C73001FF29D /* WelcomeViewController.swift in Sources */, + 24313C8723821B8C00A83F69 /* PromptTableViewCell.swift in Sources */, + 2228734F1E916FC30044BA15 /* BRAPIClient+Wallet.swift in Sources */, + C3423C222B79047D0051BD6D /* StartViewModel.swift in Sources */, + CEAA9EA81DC3342E0066731D /* PinView.swift in Sources */, + CE1D84B61EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift in Sources */, + CE4B6C1A1E219CA600CF935B /* WalletCoordinator.swift in Sources */, + CE6D0E5C1E14BFA700137DF1 /* KeyboardNotificationInfo.swift in Sources */, + CE20C8F21DBAF71500C8397A /* ApplicationController.swift in Sources */, + C32142EA25C97CD900BECCD0 /* TransactionCellView.swift in Sources */, + 1B3F74231FFB106200CCA50C /* BiometricsSettingsViewController.swift in Sources */, + CEC4CF071F0C48DD00E5C82E /* StartWipeWalletViewController.swift in Sources */, + C3423C242B7904B80051BD6D /* SeedWordView.swift in Sources */, + 7528D2981ECF655500925DBC /* PaymentProtocol.swift in Sources */, + C3543A27264AFE490005D17A /* LocaleChangeView.swift in Sources */, + C36DBF6128F1988900FBCB24 /* LocalWebViewModel.swift in Sources */, + C3423C2C2B7905330051BD6D /* SignupWebView.swift in Sources */, + C3423C202B79046A0051BD6D /* StartView.swift in Sources */, + 24A6DCFC2230BD9000505F44 /* WipeEmptyWalletViewController.swift in Sources */, + CE92F9F61DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift in Sources */, + CEA362681E00EE320061FC0E /* CameraGuideView.swift in Sources */, + C35ABD232574070A002BB9BB /* PartnersView.swift in Sources */, + CE03EC741EF256AC0038E3A8 /* SimpleUTXO.swift in Sources */, + 24016D9023F913C1006A6791 /* LWAnalytics.swift in Sources */, + C3C8973825CD6B9300241FBE /* HostingTransactionCell.swift in Sources */, + CE124CFC1E68932C00DFA146 /* FeeManager.swift in Sources */, + C3B419CB2BFCF14100EBD935 /* BuyHostingController.swift in Sources */, + CEE20C381EA5B4680086F724 /* Strings.swift in Sources */, + 24AF0101221B349100FF636F /* WarningConfirmationViewController.swift in Sources */, + CE25BF8D1DF3B8A500BC67B6 /* InViewAlert.swift in Sources */, + 22A9A9511DF61945000F0016 /* TxMetaData.swift in Sources */, + CE8CD8E11E31976800785E02 /* LoginViewController.swift in Sources */, + CEC6AA391DEE10BA00EE5AFD /* UINavigationController+Extension.swift in Sources */, + 584E24FC2951D476005E0E8B /* NSNotificationNameExtension.swift in Sources */, + CECCE5B01E04AD7600D99448 /* DescriptionSendCell.swift in Sources */, + CE44BA1B1F33BFC500392A1A /* NodeSelectorViewController.swift in Sources */, + CE124D001E69170900DFA146 /* SyncingView.swift in Sources */, + 2494037823AD53B900369261 /* ChildViewTransitioningDelegate.swift in Sources */, + CE20C90E1DBE52B000C8397A /* UIView+BRWAdditions.swift in Sources */, + CE6314831E08E5BB00D4AFE0 /* UIView+InitAdditions.swift in Sources */, + CEC6AA401DEFC87300EE5AFD /* SendViewController.swift in Sources */, + CEAA9E8F1DC074410066731D /* StartPaperPhraseViewController.swift in Sources */, + 1B3F74241FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift in Sources */, + CEC6F8451E886723000795B8 /* PaymentRequest.swift in Sources */, + C3FF4D6128AC5AC100713139 /* SendAddressCellViewModel.swift in Sources */, + CE4C1CC81ED88B600063E184 /* URLController.swift in Sources */, + C3DBBE312BFE15AF00B95939 /* BuyTileView.swift in Sources */, + C30029EB25D019BC00F08C2B /* CopyButtonView.swift in Sources */, + 24313C922382433700A83F69 /* LFModalReceiveQRViewController.swift in Sources */, + CE20C9171DBE6F2A00C8397A /* UIButton+BRWAdditions.swift in Sources */, + C3F8F1422C04DEA2006C3211 /* NoBuyTabBarViewController.swift in Sources */, + CEAA9E931DC110E70066731D /* WritePaperPhraseViewController.swift in Sources */, + CE92F9F41DED59E80046B516 /* UIView+AnimationAdditions.swift in Sources */, + 24D5F26F225A5BEA00225462 /* ContainerViewController.swift in Sources */, + CEEC70941E96A24F00EF788E /* DefaultCurrencyViewController.swift in Sources */, + 24B8FAC4216128A000A155B1 /* PartnerData.swift in Sources */, + CEE6282A1EA98B6D001035AA /* DispatchQueue+Additions.swift in Sources */, + CEC6AA3D1DEE687000EE5AFD /* RadialGradientView.swift in Sources */, + 2494038123AF208F00369261 /* PromptModalViewController.swift in Sources */, + CEEC70921E95DA4400EF788E /* GradientSwitch.swift in Sources */, + CE0CD1591DBFBCF5004023DA /* ModalPresenter.swift in Sources */, + CEE20C2F1EA3E5820086F724 /* BlinkingView.swift in Sources */, + CEC6AA441DEFCDE900EE5AFD /* ModalViewController.swift in Sources */, + 24313C8423820C4B00A83F69 /* ReceiveLTCViewController.swift in Sources */, + CEEC70831E90C07C00EF788E /* Setting.swift in Sources */, + CE45C1F91E74B400002C3847 /* ManageWalletViewController.swift in Sources */, + CE92F9F01DED0C790046B516 /* PresentModalAnimator.swift in Sources */, + CEAA9E951DC1659F0066731D /* UILabel+BRWAdditions.swift in Sources */, + C3F8F13E2C04C3A7006C3211 /* MoonpayHelper.swift in Sources */, + CEBF292E1EF99E55005C330A /* LightWeightAlert.swift in Sources */, + CEBF32EE1DDBC30000348FC6 /* ShadowButton.swift in Sources */, + CEB909F71E5FE654001804DC /* EnterPhraseCollectionViewController.swift in Sources */, + CEF3D2DD1E8CBA790070178E /* LAContext+Extensions.swift in Sources */, + C3D4379F2566EA3E00F423E1 /* LWActivityIndicator.swift in Sources */, + CECCE5AE1E04AD6300D99448 /* AddressCell.swift in Sources */, + CE6BCF5D1EE9E89A0029849C /* CustomTitleView.swift in Sources */, + CE83DE2A1E9EB7F600D07636 /* SendAmountCell.swift in Sources */, + CEAFC8611E5D5B0500E4FD06 /* SegmentedButton.swift in Sources */, + 2427342D2381C21800E2D22F /* MainViewController.swift in Sources */, + 7503773D1DF57428005EB8AE /* WalletManager+Auth.swift in Sources */, + CEC4CF091F0C84AB00E5C82E /* UIViewController+Alerts.swift in Sources */, + CE27F9591E2C8EA300F7F7F2 /* Amount.swift in Sources */, + CE1280F61EEA855C00D27649 /* Date+Additions.swift in Sources */, + C350788C27DCB10700A50819 /* TextView+Extension.swift in Sources */, + C3B419CD2BFCF17600EBD935 /* BuyView.swift in Sources */, + CEEC708E1E954AAB00EF788E /* AboutCell.swift in Sources */, + 22A9A9461DF61945000F0016 /* BRAPIClient.swift in Sources */, + 24313C7E23820C1900A83F69 /* TransactionsViewController.swift in Sources */, + CEAA9E9B1DC2B9320066731D /* ConfirmPhrase.swift in Sources */, + 75A2A7941DA5934300A983D8 /* AppDelegate.swift in Sources */, + 24B8FADF2163C4D400A155B1 /* Currency.swift in Sources */, + 222C42501E90492800078EB5 /* BRAPIClient+KV.swift in Sources */, + 2494037E23AE0C7100369261 /* SyncProgressHeaderView.swift in Sources */, + C339752127001BEC0071FED6 /* EmailValidation.swift in Sources */, + CE5E6C941EB7964900A476DB /* WalletDisabledView.swift in Sources */, + CEF3E8341DE57166007C0A9E /* AnimatableIcon.swift in Sources */, + 584E24F52951D2DC005E0E8B /* BundleExtension.swift in Sources */, + CEF61B161ED2056D00C7EA6A /* NumberFormatter+Additions.swift in Sources */, + CEF3E8321DE55540007C0A9E /* CheckView.swift in Sources */, + CECCE5A91E0378FB00D99448 /* PinPadViewController.swift in Sources */, + 584E24F32951C11A005E0E8B /* Localization.swift in Sources */, + C3423C1C2B7903CA0051BD6D /* LaunchView.swift in Sources */, + C32DAE0725925B7E003FC978 /* Color+Extension.swift in Sources */, + C36DBF5F28F18D2C00FBCB24 /* LocalWebView.swift in Sources */, + CEC6AA4B1DEFD24C00EE5AFD /* MenuButtonType.swift in Sources */, + 584E24FE2951D752005E0E8B /* UITableViewExtension.swift in Sources */, + 24313C752381E73200A83F69 /* TransactionManager.swift in Sources */, + CE4CA7BC1EE3649100373F11 /* BRActivityView.swift in Sources */, + CEC6AA421DEFC88F00EE5AFD /* ReceiveViewController.swift in Sources */, + CEE20C2D1EA288FA0086F724 /* UpdatingLabel.swift in Sources */, + CE3D4C591EF743EF0016B1C8 /* Functions.swift in Sources */, + C3423C2B2B7905330051BD6D /* SignupWebViewModel.swift in Sources */, + CEE20C341EA5B4550086F724 /* ArticleIds.swift in Sources */, + CEE65DF01E39056F0002994D /* Rate.swift in Sources */, + CEE20C361EA5B4620086F724 /* Constants+Events.swift in Sources */, + CEC6AA461DEFCE9200EE5AFD /* MenuViewController.swift in Sources */, + CEEC707F1E8D6B4100EF788E /* SettingsViewController.swift in Sources */, + CEEE92F11EBA7CBA00B7AC9C /* RequestAmountViewController.swift in Sources */, + C36375A528BD390C00CFB3D8 /* SendButtonView.swift in Sources */, + C3019EE32B8FEFED00FAF648 /* AssociatedObject.swift in Sources */, + CE8CD8DF1E2E825100785E02 /* VerifyPinViewController.swift in Sources */, + CE916E331EDA800E00D641D6 /* UserDefaultsUpdater.swift in Sources */, + CE20C9111DBE5B6F00C8397A /* Circle.swift in Sources */, + CE20C9071DBC587200C8397A /* StartViewController.swift in Sources */, + 223DB2151DF654940076A151 /* WalletManager.swift in Sources */, + CE124CF81E67A8E500DFA146 /* TransactionDirection.swift in Sources */, + CE8CD8DD1E2D9EF200785E02 /* Sender.swift in Sources */, + CE4DFB2C1E9BE5880014009E /* ReScanViewController.swift in Sources */, + CE8F0AE31EB91BB500AA7642 /* SearchHeaderView.swift in Sources */, + CEAA9E971DC18E1F0066731D /* PhraseView.swift in Sources */, + CEF3E82F1DE534C5007C0A9E /* GradientView.swift in Sources */, + CE6D0F991DE8B75900BD4BCF /* DismissModalAnimator.swift in Sources */, + C39443F9269DDAD3002703E9 /* LitewalletIconView.swift in Sources */, + CE4C1CC61ED65D830063E184 /* DrawableCircle.swift in Sources */, + C3E751CD2AF68B93005571CA /* BRWallet.swift in Sources */, + C3E751D32AF68CD1005571CA /* BRTxOutputExtension.swift in Sources */, + C35ABD332574073F002BB9BB /* PartnersViewModel.swift in Sources */, + CEEC708C1E95461A00EF788E /* AboutViewController.swift in Sources */, + CEF61B141ED0D10000C7EA6A /* Types.swift in Sources */, + CEEC708A1E945E3B00EF788E /* UnEditableTextView.swift in Sources */, + CEAA9E991DC262800066731D /* ConfirmPaperPhraseViewController.swift in Sources */, + 22A9A9591DF61945000F0016 /* Extensions.swift in Sources */, + 24470E4723A6B6E900ADDA27 /* MockSeeds.swift in Sources */, + CEAA9EA61DC3246F0066731D /* StartNavigationDelegate.swift in Sources */, + 22A9A94B1DF61945000F0016 /* BRCoding.swift in Sources */, + CEF3E8361DE60222007C0A9E /* ModalNavigationController.swift in Sources */, + CEB909FA1E5FF242001804DC /* RecoverWalletIntroViewController.swift in Sources */, + CE25BF911DF9ADE700BC67B6 /* UIImage+Utils.swift in Sources */, + CEBF33041DDE17A600348FC6 /* Transaction.swift in Sources */, + CEAA9E911DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift in Sources */, + C3EFA9A12650807B005C59B5 /* LockScreenHeaderView.swift in Sources */, + CEAA9EA01DC2F9F50066731D /* UIFont+BRWAdditions.swift in Sources */, + C32DB42F26488CAA00017D26 /* TabBarViewController.swift in Sources */, + CEC6AA491DEFD00100EE5AFD /* MenuButton.swift in Sources */, + CEF61B121ECF52C700C7EA6A /* AmountViewController.swift in Sources */, + CECCE5B21E04B00D00D99448 /* SendCell.swift in Sources */, + 24B8FAD22162B10200A155B1 /* BuyCenterWebViewController.swift in Sources */, + C3E751C62AF68A8E005571CA /* BRTxInputExtension.swift in Sources */, + CE6DCC301E6666470044257B /* NonScrollingCollectionView.swift in Sources */, + CE20C9011DBBFFF800C8397A /* Actions.swift in Sources */, + CE20C9191DBE7B8200C8397A /* ReduxState.swift in Sources */, + CEEC70811E90C04700EF788E /* SeparatorCell.swift in Sources */, + CE20C8FE1DBB133A00C8397A /* SimpleRedux.swift in Sources */, + 22122B721F0B8996000E9AB9 /* BRAPIClient+Events.swift in Sources */, + CE760EDC1E561DF900EFAC2B /* SecurityCenterViewController.swift in Sources */, + CEEC70861E94397D00EF788E /* UserDefaults+Additions.swift in Sources */, + C3F7BD0325FEC77100694C28 /* TransactionModalView.swift in Sources */, + CE3D4C571EF5D5740016B1C8 /* ReachabilityMonitor.swift in Sources */, + C3423C1A2B79039D0051BD6D /* LaunchCardHostingController.swift in Sources */, + C32142FA25C988C800BECCD0 /* TransactionCellViewModel.swift in Sources */, + C3E751C22AF689BA005571CA /* BRKeyExtension.swift in Sources */, + CE4DFB2E1E9C26DA0014009E /* ShareDataViewController.swift in Sources */, + CE1E5F261EF083A600BD0F72 /* StartImportViewController.swift in Sources */, + CE25BF931DFDA7A600BC67B6 /* MessageUIPresenter.swift in Sources */, + CE20C90C1DBC59E600C8397A /* StartFlowPresenter.swift in Sources */, + CE20C8FC1DBB0F3A00C8397A /* UIColor+Extension.swift in Sources */, + C3B7C3B9255EABBF00E98A64 /* SupportSafariViewModel.swift in Sources */, + CEA3626A1E01150D0061FC0E /* CGContext+Additions.swift in Sources */, + 22A9A9541DF61945000F0016 /* BRReplicatedKVStore.swift in Sources */, + CE6B6B4A1E54C0CB00B31405 /* SecurityCenterCell.swift in Sources */, + CE36454C1E7B42850079D0CF /* PinPadCells.swift in Sources */, + C361F48228B368BC00E9798F /* AddressFieldView.swift in Sources */, + CE5F21D91E4A922700C47B8E /* DismissLoginAnimator.swift in Sources */, + CECCE5A51E02408300D99448 /* UIView+FrameChangeBlocking.swift in Sources */, + CE6DCC271E6108D50044257B /* EnterPhraseCell.swift in Sources */, + C3E751CF2AF68C18005571CA /* BRCalculationExtension.swift in Sources */, + C3EFA9A3265080FF005C59B5 /* LockScreenHeaderViewModel.swift in Sources */, + CE760EDD1E561DF900EFAC2B /* UpdatePinViewController.swift in Sources */, + 584E24F82951D412005E0E8B /* LanguageSelectionViewController.swift in Sources */, + 24BA90C62410129E001E3825 /* FeeSelectorView.swift in Sources */, + CE9057181DFF0FA8006BA848 /* String+Additions.swift in Sources */, + CED341331EF5A5C00014912A /* InAppAlert.swift in Sources */, + C3E751C42AF68A50005571CA /* BRAddressExtension.swift in Sources */, + CE47A8E01F7DA54000FF35BA /* UIScreen+Additions.swift in Sources */, + CEB909F51E5FE63D001804DC /* EnterPhraseViewController.swift in Sources */, + CE6D0F971DE8B73A00BD4BCF /* ModalTransitionDelegate.swift in Sources */, + C3E751C82AF68AEB005571CA /* UnsafeMutablePointerExtension.swift in Sources */, + C3BD4A5325975C6000D97079 /* View+Extension.swift in Sources */, + C3E5A9052BFDEEF1002FBE04 /* BuyViewModel.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75A2A8041DA5936F00A983D8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CE916E311EDA7F1400D641D6 /* UIImage+Utils.m in Sources */, + CE916E2E1EDA7ED000D641D6 /* BRBubbleView.m in Sources */, + CE916E371EDA855800D641D6 /* BRTodayViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75C735AB1DAA1C9F00251ECF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 754868ED1DAB5CF400732D70 /* sha1.c in Sources */, + 759DA0A71DAC0DD9008CC49B /* ecc-hash.c in Sources */, + 754868E41DAB5B6400732D70 /* rsa-sha1-verify.c in Sources */, + 759DA0BB1DAC2A4F008CC49B /* ecc-256.c in Sources */, + 759DA0B51DAC16C6008CC49B /* sec-tabselect.c in Sources */, + 759DA0A31DAC0D6B008CC49B /* dsa.c in Sources */, + 759DA0A41DAC0D84008CC49B /* ecc-point.c in Sources */, + 754868F01DAB5D6F00732D70 /* sha256.c in Sources */, + 759DA0B81DAC1723008CC49B /* sec-add-1.c in Sources */, + 759DA0B31DAC1654008CC49B /* ecc-mul-g.c in Sources */, + 759DA0A51DAC0D9F008CC49B /* ecdsa-verify.c in Sources */, + 754868E51DAB5B9200732D70 /* rsa-verify.c in Sources */, + 751734B91DAC941E00193C87 /* sec-sub-1.c in Sources */, + 754868F31DAB5DEB00732D70 /* sha512-compress.c in Sources */, + 759DA0AE1DAC15A0008CC49B /* ecc-add-jja.c in Sources */, + 754868F11DAB5D9900732D70 /* sha256-compress.c in Sources */, + 759DA0AB1DAC0E4D008CC49B /* ecc-mul-a.c in Sources */, + 754869131DAB7DC200732D70 /* aes-set-key-internal.c in Sources */, + 754868E91DAB5C3E00732D70 /* rsa-sha256-verify.c in Sources */, + 7548690F1DAB7D1800732D70 /* aes-encrypt.c in Sources */, + 754869121DAB7D9C00732D70 /* aes256-set-encrypt-key.c in Sources */, + 759DA0AC1DAC1572008CC49B /* cnd-copy.c in Sources */, + 759DA0A91DAC0E13008CC49B /* ecc-size.c in Sources */, + 754868E81DAB5C1F00732D70 /* pkcs1.c in Sources */, + 759DA0B21DAC1634008CC49B /* ecc-mod-inv.c in Sources */, + 754868EF1DAB5D6B00732D70 /* write-be32.c in Sources */, + 759DA0B11DAC161C008CC49B /* ecc-j-to-a.c in Sources */, + 754869101DAB7D4300732D70 /* aes-encrypt-internal.c in Sources */, + 759DA0AD1DAC1589008CC49B /* ecc-a-to-j.c in Sources */, + 754868E61DAB5BC200732D70 /* pkcs1-rsa-sha1.c in Sources */, + 754868EC1DAB5CA400732D70 /* pkcs1-rsa-sha512.c in Sources */, + 754868EB1DAB5C8200732D70 /* rsa-sha512-verify.c in Sources */, + 759DA0B71DAC1708008CC49B /* ecc-mod.c in Sources */, + 754868E31DAB5B3B00732D70 /* rsa.c in Sources */, + 754869111DAB7D6F00732D70 /* aes-encrypt-table.c in Sources */, + 7548690E1DAB7CFA00732D70 /* yarrow256.c in Sources */, + 754868EA1DAB5C6200732D70 /* pkcs1-rsa-sha256.c in Sources */, + 759DA0B01DAC15F6008CC49B /* ecc-dup-jj.c in Sources */, + 759DA0AF1DAC15E3008CC49B /* ecc-add-jjj.c in Sources */, + 754868F21DAB5DC900732D70 /* sha512.c in Sources */, + 754868EE1DAB5D2100732D70 /* sha1-compress.c in Sources */, + 759DA0B41DAC169D008CC49B /* ecc-pp1-redc.c in Sources */, + 754868E01DAB5A8400732D70 /* mini-gmp.c in Sources */, + 759DA0A61DAC0DB8008CC49B /* ecc-ecdsa-verify.c in Sources */, + 759DA0B61DAC16E1008CC49B /* ecc-384.c in Sources */, + 754868E71DAB5BF900732D70 /* gmp-glue.c in Sources */, + 754868E21DAB5B0200732D70 /* bignum.c in Sources */, + 759DA0A81DAC0E01008CC49B /* ecc-mod-arith.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 2465873C23A5AAD100A32E9E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75A2A78F1DA5934300A983D8 /* litewallet */; + targetProxy = 2465873B23A5AAD100A32E9E /* PBXContainerItemProxy */; + }; + 759DA0BD1DAC369C008CC49B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 755CD9D01DAA197C0075898E /* BRCore */; + targetProxy = 759DA0BC1DAC369C008CC49B /* PBXContainerItemProxy */; + }; + 759DA0DC1DAC86B5008CC49B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 759DA0D71DAC8668008CC49B /* submodules */; + targetProxy = 759DA0DB1DAC86B5008CC49B /* PBXContainerItemProxy */; + }; + 759DA0DE1DAC86BC008CC49B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 759DA0D71DAC8668008CC49B /* submodules */; + targetProxy = 759DA0DD1DAC86BC008CC49B /* PBXContainerItemProxy */; + }; + 759DA0E01DAC86C3008CC49B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 759DA0D71DAC8668008CC49B /* submodules */; + targetProxy = 759DA0DF1DAC86C3008CC49B /* PBXContainerItemProxy */; + }; + 75A2A8131DA5936F00A983D8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75A2A8071DA5936F00A983D8 /* TodayExtension */; + targetProxy = 75A2A8121DA5936F00A983D8 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 24B523AF238A53DC0030594D /* BIP39Words.plist */ = { + isa = PBXVariantGroup; + children = ( + 24B523AE238A53DC0030594D /* en */, + 24B523B0238A53E40030594D /* zh-Hans */, + 2464B6DA238A53FC00B2A2CB /* zh-Hant */, + 2464B6DB238A543300B2A2CB /* fr */, + 2464B6DC238A543800B2A2CB /* ja */, + 2464B6DD238A543D00B2A2CB /* ko */, + 2464B6DF238A586600B2A2CB /* es */, + 2437530E238AE08A00E1B2AE /* de */, + 24375311238AE09100E1B2AE /* id */, + 24375314238AE09700E1B2AE /* pt */, + 24375315238AE09900E1B2AE /* ru */, + C3BDB42626CC028F004DAE77 /* tr */, + C350788A27DCAAA100A50819 /* uk */, + ); + name = BIP39Words.plist; + sourceTree = ""; + }; + 75A2A79C1DA5934300A983D8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 75A2A79D1DA5934300A983D8 /* Base */, + C350788727DCAAA000A50819 /* uk */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 75A2A80E1DA5936F00A983D8 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 75A2A80F1DA5936F00A983D8 /* Base */, + 75A2A82B1DA59B2A00A983D8 /* fr */, + 75A2A8301DA59B2F00A983D8 /* de */, + 75A2A8351DA59B3600A983D8 /* zh-Hans */, + 75A2A83A1DA59B3C00A983D8 /* ja */, + 75A2A83F1DA59B4500A983D8 /* es */, + 75A2A84E1DA59B5700A983D8 /* ko */, + 75A2A8671DA59BFB00A983D8 /* ru */, + 249F9770236F862C0045087A /* id */, + 24B9621723BA66CC00ECD938 /* pt */, + 24B9621923BA66CE00ECD938 /* zh-Hant */, + 24B9621B23BA66CF00ECD938 /* en */, + C3BDB42726CC028F004DAE77 /* tr */, + C350788827DCAAA000A50819 /* uk */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; + CE29901C1EFD6DE50093A0F2 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + CE29901B1EFD6DE50093A0F2 /* Base */, + CE29901F1EFD6E060093A0F2 /* de */, + CE2990201EFD6F3E0093A0F2 /* ja */, + CE2990221EFD6F500093A0F2 /* ru */, + CE27074B1F016B6B00431BBC /* fr */, + CE27074C1F016B6D00431BBC /* es */, + CE27074E1F016D2400431BBC /* pt */, + CEE659ED1F68AAB5001FF29D /* zh-Hant */, + CEE659EE1F68AAB9001FF29D /* zh-Hans */, + CE0FC0F81F72417200E7C626 /* ko */, + 24306799238F479500EBEA99 /* id */, + 2430679B238F5A2900EBEA99 /* en */, + C3BDB42826CC0338004DAE77 /* tr */, + C350788927DCAAA000A50819 /* uk */, + ); + name = Localizable.strings; + path = Strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 24470E0023A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + ENABLE_ON_DEMAND_RESOURCES = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources"; + OTHER_LDFLAGS = "-ObjC"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/litewallet/Platform"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Debug; + }; + 24470E0123A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + "$(ARCHS_STANDARD)", + "\"armv7, armv7s, arm64, arm64e, x86_64\"", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = litewallet/litewallet.entitlements; + CURRENT_PROJECT_VERSION = 240527.6; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SRCROOT)/**", + "$(PROJECT_DIR)", + "$(inherited)", + ); + INFOPLIST_FILE = "$(SRCROOT)/litewallet/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Litewallet; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 3.13.5; + ONLY_ACTIVE_ARCH = YES; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources speakTag"; + OTHER_SWIFT_FLAGS = "-DDebug $(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; + PRODUCT_MODULE_NAME = litewallet; + PRODUCT_NAME = Litewallet; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 24470E0323A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = litewalletTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.litewalletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Litewallet.app/Litewallet"; + }; + name = Debug; + }; + 24470E0723A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = TodayExtension/TodayExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1586; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + INFOPLIST_FILE = TodayExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 3.10.2; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.TodayExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 24470E0923A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/unbound", + "${SRCROOT}/Modules/nettle", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 24470E0A23A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_COMMA = NO; + DEVELOPMENT_TEAM = FAPFEJXE9S; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/loafwallet-core", + "${SRCROOT}/Modules/loafwallet-core/secp256k1", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 24470E0B23A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = "${SRCROOT}/Modules/nettle"; + OTHER_CFLAGS = "-DHAVE_CONFIG_H=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + USE_HEADERMAP = NO; + }; + name = Debug; + }; + 24470E0C23A5BF3C00ADDA27 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 2465873F23A5AAD100A32E9E /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = litewalletTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.litewalletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Litewallet.app/Litewallet"; + }; + name = Testnet; + }; + 2465874023A5AAD100A32E9E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = litewalletTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.litewalletTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Litewallet.app/Litewallet"; + }; + name = Release; + }; + 755CD9CC1DAA18420075898E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/unbound", + "${SRCROOT}/Modules/nettle", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 755CD9D91DAA197D0075898E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_COMMA = NO; + DEVELOPMENT_TEAM = FAPFEJXE9S; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/loafwallet-core", + "${SRCROOT}/Modules/loafwallet-core/secp256k1", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 759DA0D91DAC8668008CC49B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 75A2A7DA1DA5934400A983D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_ON_DEMAND_RESOURCES = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources"; + "OTHER_LDFLAGS[arch=*]" = "-ObjC "; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/litewallet/Platform"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 75A2A7E51DA5934400A983D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + "$(ARCHS_STANDARD)", + "\"armv7, armv7s, arm64, arm64e, x86_64\"", + ); + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = litewallet/litewallet.entitlements; + CURRENT_PROJECT_VERSION = 240527.6; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SRCROOT)/**", + "$(PROJECT_DIR)", + "$(inherited)", + ); + INFOPLIST_FILE = "$(SRCROOT)/litewallet/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Litewallet; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 3.13.5; + ONLY_ACTIVE_ARCH = YES; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources speakTag"; + OTHER_SWIFT_FLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; + PRODUCT_MODULE_NAME = litewallet; + PRODUCT_NAME = Litewallet; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 75A2A8171DA5936F00A983D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = TodayExtension/TodayExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1586; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + INFOPLIST_FILE = TodayExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 3.10.2; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.TodayExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 75C735B71DAA1C9F00251ECF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = "${SRCROOT}/Modules/nettle"; + OTHER_CFLAGS = "-DHAVE_CONFIG_H=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + USE_HEADERMAP = NO; + }; + name = Release; + }; + CEA7E69B1F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; + ENABLE_ON_DEMAND_RESOURCES = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/litewallet/Platform"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Testnet; + }; + CEA7E69C1F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = litewallet/litewallet.entitlements; + CURRENT_PROJECT_VERSION = 240527.6; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(SRCROOT)/**", + "$(PROJECT_DIR)", + "$(inherited)", + ); + INFOPLIST_FILE = "$(SRCROOT)/litewallet/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = Litewallet; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 3.13.5; + ONLY_ACTIVE_ARCH = YES; + ON_DEMAND_RESOURCES_INITIAL_INSTALL_TAGS = "initial-resources speakTag"; + OTHER_SWIFT_FLAGS = "-DDebug -DTestnet $(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; + PRODUCT_MODULE_NAME = litewallet; + PRODUCT_NAME = Litewallet; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Testnet; + }; + CEA7E6A21F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = TodayExtension/TodayExtension.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1586; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ZV7987N2ZC; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + INFOPLIST_FILE = TodayExtension/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 3.10.2; + PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.TodayExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + }; + name = Testnet; + }; + CEA7E6A41F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/unbound", + "${SRCROOT}/Modules/nettle", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Testnet; + }; + CEA7E6A51F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_WARN_COMMA = NO; + DEVELOPMENT_TEAM = FAPFEJXE9S; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "BITCOIN_TESTNET=1", + ); + HEADER_SEARCH_PATHS = ( + "${SRCROOT}/Modules/loafwallet-core", + "${SRCROOT}/Modules/loafwallet-core/secp256k1", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Testnet; + }; + CEA7E6A61F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 4R7S6N88W9; + EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = NO; + ENABLE_ON_DEMAND_RESOURCES = NO; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + HEADER_SEARCH_PATHS = "${SRCROOT}/Modules/nettle"; + OTHER_CFLAGS = "-DHAVE_CONFIG_H=1"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + USE_HEADERMAP = NO; + }; + name = Testnet; + }; + CEA7E6A71F0AAA84001F8C27 /* Testnet */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Testnet; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2465873D23A5AAD100A32E9E /* Build configuration list for PBXNativeTarget "litewalletTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0323A5BF3C00ADDA27 /* Debug */, + 2465873F23A5AAD100A32E9E /* Testnet */, + 2465874023A5AAD100A32E9E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 755CD9CA1DAA18420075898E /* Build configuration list for PBXNativeTarget "unbound" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0923A5BF3C00ADDA27 /* Debug */, + CEA7E6A41F0AAA84001F8C27 /* Testnet */, + 755CD9CC1DAA18420075898E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 755CD9D71DAA197D0075898E /* Build configuration list for PBXNativeTarget "BRCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0A23A5BF3C00ADDA27 /* Debug */, + CEA7E6A51F0AAA84001F8C27 /* Testnet */, + 755CD9D91DAA197D0075898E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 759DA0DA1DAC8668008CC49B /* Build configuration list for PBXLegacyTarget "submodules" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0C23A5BF3C00ADDA27 /* Debug */, + CEA7E6A71F0AAA84001F8C27 /* Testnet */, + 759DA0D91DAC8668008CC49B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75A2A78B1DA5934300A983D8 /* Build configuration list for PBXProject "litewallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0023A5BF3C00ADDA27 /* Debug */, + CEA7E69B1F0AAA84001F8C27 /* Testnet */, + 75A2A7DA1DA5934400A983D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75A2A7E31DA5934400A983D8 /* Build configuration list for PBXNativeTarget "litewallet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0123A5BF3C00ADDA27 /* Debug */, + CEA7E69C1F0AAA84001F8C27 /* Testnet */, + 75A2A7E51DA5934400A983D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75A2A8151DA5936F00A983D8 /* Build configuration list for PBXNativeTarget "TodayExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0723A5BF3C00ADDA27 /* Debug */, + CEA7E6A21F0AAA84001F8C27 /* Testnet */, + 75A2A8171DA5936F00A983D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75C735B51DAA1C9F00251ECF /* Build configuration list for PBXNativeTarget "nettle" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 24470E0B23A5BF3C00ADDA27 /* Debug */, + CEA7E6A61F0AAA84001F8C27 /* Testnet */, + 75C735B71DAA1C9F00251ECF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + C3423C162B7816EA0051BD6D /* XCRemoteSwiftPackageReference "push-notifications-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pusher/push-notifications-swift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.0.0; + }; + }; + C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; + requirement = { + kind = exactVersion; + version = 10.23.0; + }; + }; + C35C1228293D48330009022D /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess.git"; + requirement = { + kind = exactVersion; + version = 4.2.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + C3423C172B781C6B0051BD6D /* PushNotifications */ = { + isa = XCSwiftPackageProductDependency; + package = C3423C162B7816EA0051BD6D /* XCRemoteSwiftPackageReference "push-notifications-swift" */; + productName = PushNotifications; + }; + C35C121F293D464A0009022D /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + C35C1221293D464A0009022D /* FirebaseAuth */ = { + isa = XCSwiftPackageProductDependency; + package = C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAuth; + }; + C35C1223293D464A0009022D /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; + C35C1229293D48340009022D /* KeychainAccess */ = { + isa = XCSwiftPackageProductDependency; + package = C35C1228293D48330009022D /* XCRemoteSwiftPackageReference "KeychainAccess" */; + productName = KeychainAccess; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 75A2A7881DA5934300A983D8 /* Project object */; +} diff --git a/litewallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/litewallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/litewallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/litewallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/litewallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/litewallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/litewallet/AddressFieldView.swift b/litewallet/AddressFieldView.swift index 76c956edf..4001a41ad 100644 --- a/litewallet/AddressFieldView.swift +++ b/litewallet/AddressFieldView.swift @@ -53,8 +53,7 @@ struct AddressFieldView: UIViewRepresentable { parent = textField } - func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool - { + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if let currentValue = textField.text as NSString? { let proposedValue = currentValue.replacingCharacters(in: range, with: string) as String parent.text = proposedValue diff --git a/litewallet/AppDelegate.swift b/litewallet/AppDelegate.swift index 0b73d33b9..ada803597 100644 --- a/litewallet/AppDelegate.swift +++ b/litewallet/AppDelegate.swift @@ -12,9 +12,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var resourceRequest: NSBundleResourceRequest? - func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool - { + func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { requestResourceWith(tag: ["initial-resources", "speakTag"]) { [self] in + + // Language + updateCurrentUserLocale(localeId: Locale.current.identifier) + Bundle.setLanguage(UserDefaults.selectedLanguage) + // Ops let startDate = Partner.partnerKeyPath(name: .litewalletStart) if startDate == "error-litewallet-start-key" { @@ -25,14 +29,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate { self.setFirebaseConfiguration() // Pusher - self.pushNotifications.start(instanceId: Partner.partnerKeyPath(name: .pusherStaging)) - let generaliOSInterest = "general-ios" - let debugGeneraliOSInterest = "debug-general-ios" + self.pushNotifications.start(instanceId: Partner.partnerKeyPath(name: .pusher)) + let generalInterest = String.preferredLanguageInterest(currentId: UserDefaults.selectedLanguage) + let debugGeneralInterest = "debug-general" + + try? self.pushNotifications.clearDeviceInterests() try? self.pushNotifications - .addDeviceInterest(interest: generaliOSInterest) + .addDeviceInterest(interest: generalInterest) try? self.pushNotifications - .addDeviceInterest(interest: debugGeneraliOSInterest) + .addDeviceInterest(interest: debugGeneralInterest) let interests = self.pushNotifications.getDeviceInterests()?.joined(separator: "|") ?? "" let device = UIDevice.current.identifierForVendor?.uuidString ?? "ID" @@ -41,6 +47,23 @@ class AppDelegate: UIResponder, UIApplicationDelegate { LWAnalytics.logEventWithParameters(itemName: ._20231202_RIGI, properties: interestsDict) + + let current = UNUserNotificationCenter.current() + + current.getNotificationSettings(completionHandler: { settings in + + debugPrint(settings.debugDescription) + if settings.authorizationStatus == .denied { + self.pushNotifications.clearAllState { + LWAnalytics.logEventWithParameters(itemName: ._20240506_DPN) + } + + self.pushNotifications.stop { + LWAnalytics.logEventWithParameters(itemName: ._20240510_SPN) + } + } + }) + } onFailure: { error in let properties: [String: String] = ["error_type": "on_demand_resources_not_found", @@ -49,8 +72,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { properties: properties) } - updateCurrentUserLocale(localeId: Locale.current.identifier) - guard let thisWindow = window else { return false } thisWindow.tintColor = .liteWalletBlue @@ -61,8 +82,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate { LWAnalytics.logEventWithParameters(itemName: ._20191105_AL) - Bundle.setLanguage(UserDefaults.selectedLanguage) - return true } @@ -78,13 +97,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { applicationController.didEnterBackground() } - func application(_: UIApplication, shouldAllowExtensionPointIdentifier _: UIApplication.ExtensionPointIdentifier) -> Bool - { + func application(_: UIApplication, shouldAllowExtensionPointIdentifier _: UIApplication.ExtensionPointIdentifier) -> Bool { return false // disable extensions such as custom keyboards for security purposes } - func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool - { + func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { return applicationController.open(url: url) } diff --git a/litewallet/ApplicationController.swift b/litewallet/ApplicationController.swift index 824d4d094..53cc08e21 100644 --- a/litewallet/ApplicationController.swift +++ b/litewallet/ApplicationController.swift @@ -1,5 +1,6 @@ import BackgroundTasks import StoreKit +import SwiftUI import UIKit let timeSinceLastExitKey = "TimeSinceLastExit" @@ -56,7 +57,6 @@ class ApplicationController: Subscriber, Trackable { func launch(application: UIApplication, window: UIWindow?) { self.application = application self.window = window - setup() reachability.didChange = { isReachable in if !isReachable { @@ -74,6 +74,8 @@ class ApplicationController: Subscriber, Trackable { } private func setup() { + setupDefaults() + countLaunches() setupRootViewController() window?.makeKeyAndVisible() offMainInitialization() @@ -114,8 +116,7 @@ class ApplicationController: Subscriber, Trackable { } exchangeUpdater?.refresh(completion: {}) feeUpdater?.refresh() - walletManager.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } - + // walletManager.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } if modalPresenter?.walletManager == nil { modalPresenter?.walletManager = walletManager } @@ -129,8 +130,7 @@ class ApplicationController: Subscriber, Trackable { } exchangeUpdater?.refresh(completion: {}) feeUpdater?.refresh() - walletManager.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } - + // walletManager.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } if modalPresenter?.walletManager == nil { modalPresenter?.walletManager = walletManager } @@ -146,7 +146,7 @@ class ApplicationController: Subscriber, Trackable { if !store.state.isLoginRequired { UserDefaults.standard.set(Date().timeIntervalSince1970, forKey: timeSinceLastExitKey) } - walletManager?.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } + // walletManager?.apiClient?.kv?.syncAllKeys { print("KV finished syncing. err: \(String(describing: $0))") } } func performFetch(_ completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { @@ -172,7 +172,9 @@ class ApplicationController: Subscriber, Trackable { walletCoordinator = WalletCoordinator(walletManager: walletManager, store: store) modalPresenter = ModalPresenter(store: store, walletManager: walletManager, window: window, apiClient: noAuthApiClient) exchangeUpdater = ExchangeUpdater(store: store, walletManager: walletManager) - feeUpdater = FeeUpdater(walletManager: walletManager, store: store) + + guard let exchangeUpdaterWithFee = exchangeUpdater else { return } + feeUpdater = FeeUpdater(walletManager: walletManager, store: store, exchangeUpdater: exchangeUpdaterWithFee) startFlowController = StartFlowPresenter(store: store, walletManager: walletManager, rootViewController: rootViewController) mainViewController?.walletManager = walletManager defaultsUpdater = UserDefaultsUpdater(walletManager: walletManager) @@ -228,9 +230,7 @@ class ApplicationController: Subscriber, Trackable { defaultsUpdater?.refresh() walletManager?.apiClient?.events?.up() - exchangeUpdater?.refresh(completion: { - NSLog("::: Refreshed fiat rates") - }) + exchangeUpdater?.refresh(completion: {}) } private func addWalletCreationListener() { @@ -260,7 +260,6 @@ class ApplicationController: Subscriber, Trackable { let properties = ["error_message": "kv_finished_syning", "error": "\(String(describing: error))"] LWAnalytics.logEventWithParameters(itemName: ._20240315_AI, properties: properties) - self.walletCoordinator?.kvStore = kvStore self.kvStoreCoordinator = KVStoreCoordinator(store: self.store, kvStore: kvStore) self.kvStoreCoordinator?.retreiveStoredWalletInfo() @@ -269,7 +268,7 @@ class ApplicationController: Subscriber, Trackable { } private func offMainInitialization() { - DispatchQueue.global(qos: .background).async { + Task(priority: .background) { _ = Rate.symbolMap // Initialize currency symbol map } } @@ -277,8 +276,7 @@ class ApplicationController: Subscriber, Trackable { func performBackgroundFetch() { saveEvent("appController.performBackgroundFetch") let group = DispatchGroup() - if let peerManager = walletManager?.peerManager, peerManager.syncProgress(fromStartHeight: peerManager.lastBlockHeight) < 1.0 - { + if let peerManager = walletManager?.peerManager, peerManager.syncProgress(fromStartHeight: peerManager.lastBlockHeight) < 1.0 { group.enter() LWAnalytics.logEventWithParameters(itemName: ._20200111_DEDG) @@ -304,7 +302,6 @@ class ApplicationController: Subscriber, Trackable { { self.exchangeUpdater?.refresh(completion: $0) }, { self.feeUpdater?.refresh(completion: $0) }, { self.walletManager?.apiClient?.events?.sync(completion: $0) }, - ], completion: { LWAnalytics.logEventWithParameters(itemName: ._20200111_DLDG) group.leave() @@ -322,3 +319,40 @@ class ApplicationController: Subscriber, Trackable { } } } + +extension ApplicationController { + func setupDefaults() { + if UserDefaults.standard.object(forKey: shouldRequireLoginTimeoutKey) == nil { + UserDefaults.standard.set(60.0 * 3.0, forKey: shouldRequireLoginTimeoutKey) // Default 3 min timeout + } + if UserDefaults.standard.object(forKey: hasSeenAnnounceView) == nil { + UserDefaults.standard.set(false, forKey: hasSeenAnnounceView) // Hasnt seen the Announce View + } + } + + func countLaunches() { + if var launchNumber = UserDefaults.standard.object(forKey: numberOfLitewalletLaunches) as? Int { + launchNumber += 1 + UserDefaults.standard.set(NSNumber(value: launchNumber), forKey: numberOfLitewalletLaunches) + if launchNumber == 5 { + if #available(iOS 14, *) { + if self.window != nil, + let scene = self.window?.windowScene + { + SKStoreReviewController.requestReview(in: scene) + } + + } else { + SKStoreReviewController.requestReview() + } + + LWAnalytics.logEventWithParameters(itemName: ._20200125_DSRR) + } + } else { + UserDefaults.standard.set(NSNumber(value: 1), forKey: numberOfLitewalletLaunches) + } + } + + func willResignActive() + {} +} diff --git a/litewallet/ArticleIds.swift b/litewallet/ArticleIds.swift index 1f4406487..94cfbeec1 100644 --- a/litewallet/ArticleIds.swift +++ b/litewallet/ArticleIds.swift @@ -1,4 +1,5 @@ import Foundation + enum ArticleIds { static let nothing = "nothing" } diff --git a/litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json index e8c9b92b8..383f53f79 100644 --- a/litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json +++ b/litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json @@ -9,13 +9,13 @@ "scale" : "2x" }, { - "idiom" : "universal", "filename" : "Logo_ltcnew.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/litewallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json index 2d4119bf2..bd7cc85ab 100644 --- a/litewallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json +++ b/litewallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json @@ -9,7 +9,7 @@ "scale" : "2x" }, { - "filename" : "Screenshot 2023-12-12 at 12.16.04 PM.png", + "filename" : "Litewallet-fin_white-65.png", "idiom" : "universal", "scale" : "3x" } diff --git a/litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json b/litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json index a40b9e737..c5077e884 100644 --- a/litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json +++ b/litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json @@ -2,7 +2,6 @@ "images" : [ { "idiom" : "universal", - "filename" : "MenuTabIcon.pdf", "scale" : "1x" }, { @@ -10,12 +9,13 @@ "scale" : "2x" }, { + "filename" : "MenuTabIcon.pdf", "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json index 80edc124d..cee6282c9 100644 --- a/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json +++ b/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json @@ -1,8 +1,8 @@ { "images" : [ { - "idiom" : "universal", "filename" : "Profile.pdf", + "idiom" : "universal", "scale" : "1x" }, { @@ -15,7 +15,7 @@ } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/Contents.json new file mode 100644 index 000000000..007d4b52e --- /dev/null +++ b/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "moonpay-white.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/moonpay-white.png b/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/moonpay-white.png new file mode 100644 index 000000000..cd873e0a3 Binary files /dev/null and b/litewallet/Assets.xcassets/Partners/moonpay-white-logo.imageset/moonpay-white.png differ diff --git a/litewallet/Assets.xcassets/buy_icon.imageset/Contents.json b/litewallet/Assets.xcassets/buy_icon.imageset/Contents.json index 89e4234c4..78b093be9 100644 --- a/litewallet/Assets.xcassets/buy_icon.imageset/Contents.json +++ b/litewallet/Assets.xcassets/buy_icon.imageset/Contents.json @@ -2,7 +2,6 @@ "images" : [ { "idiom" : "universal", - "filename" : "BuyIcon.pdf", "scale" : "1x" }, { @@ -10,12 +9,13 @@ "scale" : "2x" }, { + "filename" : "BuyIcon.pdf", "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/Contents.json b/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/Contents.json new file mode 100644 index 000000000..c63963760 --- /dev/null +++ b/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "sendTabIconwhiteinterdit.pdf", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/sendTabIconwhiteinterdit.pdf b/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/sendTabIconwhiteinterdit.pdf new file mode 100644 index 000000000..1dcee18fa Binary files /dev/null and b/litewallet/Assets.xcassets/white-interdit-send-icon.imageset/sendTabIconwhiteinterdit.pdf differ diff --git a/litewallet/AssociatedObject.swift b/litewallet/AssociatedObject.swift index 957fd4f31..72dcb9e52 100644 --- a/litewallet/AssociatedObject.swift +++ b/litewallet/AssociatedObject.swift @@ -1,7 +1,6 @@ import Foundation -func associatedObject(_ base: AnyObject, key: UnsafePointer, initialiser: () -> T) -> T -{ +func associatedObject(_ base: AnyObject, key: UnsafePointer, initialiser: () -> T) -> T { if let associated = objc_getAssociatedObject(base, key) as? T { return associated } @@ -10,8 +9,7 @@ func associatedObject(_ base: AnyObject, key: UnsafePointer return associated } -func lazyAssociatedObject(_ base: AnyObject, key: UnsafePointer, initialiser: () -> T?) -> T? -{ +func lazyAssociatedObject(_ base: AnyObject, key: UnsafePointer, initialiser: () -> T?) -> T? { if let associated = objc_getAssociatedObject(base, key) as? T { return associated } diff --git a/litewallet/BRAPIClient+Events.swift b/litewallet/BRAPIClient+Events.swift index fd0490100..c7f41e1f9 100644 --- a/litewallet/BRAPIClient+Events.swift +++ b/litewallet/BRAPIClient+Events.swift @@ -28,7 +28,7 @@ private var emKey: UInt8 = 1 extension BRAPIClient { var events: EventManager? { return lazyAssociatedObject(self, key: &emKey) { - return EventManager(adaptor: self) + EventManager(adaptor: self) } } @@ -90,10 +90,10 @@ class EventManager { defer { isSubscribed = true } // slurp up app lifecycle events and save them as events - eventToNotifications.forEach { key, value in + for (key, value) in eventToNotifications { NotificationCenter.default.addObserver(forName: value, object: nil, - queue: self.queue, + queue: queue, using: { [weak self] note in self?.saveEvent(key) if note.name == UIScene.didEnterBackgroundNotification { @@ -121,7 +121,7 @@ class EventManager { func down() { guard isSubscribed else { return } - eventToNotifications.forEach { _, value in + for (_, value) in eventToNotifications { NotificationCenter.default.removeObserver(self, name: value, object: nil) } } @@ -163,8 +163,7 @@ class EventManager { let dataToSerialize = myself.buffer.map { $0.dictionary } guard JSONSerialization.isValidJSONObject(dataToSerialize) else { print("Invalid json"); return } var error: NSError? - if JSONSerialization.writeJSONObject(dataToSerialize, to: outputStream, options: [], error: &error) == 0 - { + if JSONSerialization.writeJSONObject(dataToSerialize, to: outputStream, options: [], error: &error) == 0 { print("[EventManager] Unable to write JSON for events file: \(String(describing: error))") } else { print("[EventManager] saved \(myself.buffer.count) events to disk") @@ -178,7 +177,7 @@ class EventManager { queue.addOperation { [weak self] in guard let myself = self else { return } guard let files = try? FileManager.default.contentsOfDirectory(atPath: myself.unsentDataDirectory) else { return } - files.forEach { baseName in + for baseName in files { let fileName = NSString(string: myself.unsentDataDirectory).appendingPathComponent("/\(baseName)") do { try FileManager.default.removeItem(atPath: fileName) diff --git a/litewallet/BRAPIClient+KV.swift b/litewallet/BRAPIClient+KV.swift index debcb6e01..e850a1263 100644 --- a/litewallet/BRAPIClient+KV.swift +++ b/litewallet/BRAPIClient+KV.swift @@ -37,8 +37,7 @@ private class KVStoreAdaptor: BRRemoteKVStoreAdaptor { }.resume() } - func put(_ key: String, value: [UInt8], version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) - { + func put(_ key: String, value: [UInt8], version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) { var req = URLRequest(url: client.url("/kv/1/\(key)")) req.httpMethod = "PUT" req.addValue("\(version)", forHTTPHeaderField: "If-None-Match") @@ -59,8 +58,7 @@ private class KVStoreAdaptor: BRRemoteKVStoreAdaptor { }.resume() } - func del(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) - { + func del(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) { var req = URLRequest(url: client.url("/kv/1/\(key)")) req.httpMethod = "DELETE" req.addValue("\(version)", forHTTPHeaderField: "If-None-Match") @@ -77,77 +75,87 @@ private class KVStoreAdaptor: BRRemoteKVStoreAdaptor { }.resume() } - func get(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, [UInt8], BRRemoteKVStoreError?) -> Void) - { + func get(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, [UInt8], BRRemoteKVStoreError?) -> Void) { var req = URLRequest(url: client.url("/kv/1/\(key)")) req.httpMethod = "GET" req.addValue("\(version)", forHTTPHeaderField: "If-None-Match") - client.dataTaskWithRequest(req as URLRequest, authenticated: true, retryCount: 0) - { dat, resp, err in - if let err = err { - self.client.log("[KV] GET key=\(key) err=\(err)") - return completionFunc(0, Date(timeIntervalSince1970: 0), [], .unknown) - } - guard let resp = resp, let v = resp.kvVersion, - let d = resp.kvDate, let dat = dat - else { - return completionFunc(0, Date(timeIntervalSince1970: 0), [], .unknown) - } - let ud = (dat as NSData).bytes.bindMemory(to: UInt8.self, capacity: dat.count) - let dp = UnsafeBufferPointer(start: ud, count: dat.count) - completionFunc(v, d, Array(dp), resp.kvError) - }.resume() + client.dataTaskWithRequest(req as URLRequest, authenticated: true, retryCount: 0) { dat, resp, err in + if let err = err { + self.client.log("[KV] GET key=\(key) err=\(err)") + return completionFunc(0, Date(timeIntervalSince1970: 0), [], .unknown) + } + guard let resp = resp, let v = resp.kvVersion, + let d = resp.kvDate, let dat = dat + else { + return completionFunc(0, Date(timeIntervalSince1970: 0), [], .unknown) + } + let ud = (dat as NSData).bytes.bindMemory(to: UInt8.self, capacity: dat.count) + let dp = UnsafeBufferPointer(start: ud, count: dat.count) + completionFunc(v, d, Array(dp), resp.kvError) + }.resume() } - func keys(_ completionFunc: @escaping ([(String, UInt64, Date, BRRemoteKVStoreError?)], BRRemoteKVStoreError?) -> Void) - { + func keys(_ completionFunc: @escaping ([(String, UInt64, Date, BRRemoteKVStoreError?)], BRRemoteKVStoreError?) -> Void) { var req = URLRequest(url: client.url("/kv/_all_keys")) req.httpMethod = "GET" - client.dataTaskWithRequest(req as URLRequest, authenticated: true, retryCount: 0) - { dat, resp, err in - if let err = err { - self.client.log("[KV] KEYS err=\(err)") + client.dataTaskWithRequest(req as URLRequest, authenticated: true, retryCount: 0) { dat, resp, err in + if let err = err { + self.client.log("[KV] KEYS err=\(err)") + return completionFunc([], .unknown) + } + + guard let resp = resp, let dat = dat, resp.statusCode == 200 else { + return completionFunc([], .unknown) + } + + // Data format validation (basic check) + guard dat.count >= MemoryLayout.size else { + self.client.log("Invalid data format. Too short.") + return completionFunc([], .unknown) + } + + // data is encoded as: + // LE32(num) + (num * (LEU8(keyLeng) + (keyLen * LEU32(char)) + LEU64(ver) + LEU64(msTs) + LEU8(del))) + var i = UInt(MemoryLayout.size) + let c = dat.uInt32(atOffset: 0) + var items = [(String, UInt64, Date, BRRemoteKVStoreError?)]() + + for _ in 0 ..< c { + let keyLen = UInt(dat.uInt32(atOffset: i)) + i += UInt(MemoryLayout.size) + + // Check if key length is within data bounds + guard keyLen <= UInt(dat.count) - i else { + self.client.log("Invalid data format. Key length exceeds data size.") return completionFunc([], .unknown) } - guard let resp = resp, let dat = dat, resp.statusCode == 200 + + let range: Range = Int(i) ..< Int(i + keyLen) + + guard let key = NSString(data: dat.subdata(in: range), + encoding: String.Encoding.utf8.rawValue) as String? else { + self.client.log("Well crap. Failed to decode a string.") return completionFunc([], .unknown) } - - // data is encoded as: - // LE32(num) + (num * (LEU8(keyLeng) + (keyLen * LEU32(char)) + LEU64(ver) + LEU64(msTs) + LEU8(del))) - var i = UInt(MemoryLayout.size) - let c = dat.uInt32(atOffset: 0) - var items = [(String, UInt64, Date, BRRemoteKVStoreError?)]() - for _ in 0 ..< c { - let keyLen = UInt(dat.uInt32(atOffset: i)) - i += UInt(MemoryLayout.size) - let range: Range = Int(i) ..< Int(i + keyLen) - guard let key = NSString(data: dat.subdata(in: range), - encoding: String.Encoding.utf8.rawValue) as String? - else { - self.client.log("Well crap. Failed to decode a string.") - return completionFunc([], .unknown) - } - i += keyLen - let ver = dat.uInt64(atOffset: i) - i += UInt(MemoryLayout.size) - let date = Date.withMsTimestamp(dat.uInt64(atOffset: i)) - i += UInt(MemoryLayout.size) - let deleted = dat.uInt8(atOffset: i) > 0 - i += UInt(MemoryLayout.size) - items.append((key, ver, date, deleted ? .tombstone : nil)) - self.client.log("keys: \(key) \(ver) \(date) \(deleted)") - } - completionFunc(items, nil) - }.resume() + i += keyLen + let ver = dat.uInt64(atOffset: i) + i += UInt(MemoryLayout.size) + let date = Date.withMsTimestamp(dat.uInt64(atOffset: i)) + i += UInt(MemoryLayout.size) + let deleted = dat.uInt8(atOffset: i) > 0 + i += UInt(MemoryLayout.size) + items.append((key, ver, date, deleted ? .tombstone : nil)) + self.client.log("keys: \(key) \(ver) \(date) \(deleted)") + } + completionFunc(items, nil) + }.resume() } } private extension HTTPURLResponse { var kvDate: Date? { - if let remDate = allHeaderFields["Last-Modified"] as? String, let dateDate = Date.fromRFC1123(remDate) - { + if let remDate = allHeaderFields["Last-Modified"] as? String, let dateDate = Date.fromRFC1123(remDate) { return dateDate } return nil diff --git a/litewallet/BRAPIClient+Wallet.swift b/litewallet/BRAPIClient+Wallet.swift index 8c7824a84..6204cf6bc 100644 --- a/litewallet/BRAPIClient+Wallet.swift +++ b/litewallet/BRAPIClient+Wallet.swift @@ -1,42 +1,48 @@ import Foundation -private let fallbackRatesURL = "https://api.loshan.co.uk/api/v1/rates" +private let fallbackRatesURL = "https://api-dev.lite-wallet.org/v1/rates" extension BRAPIClient { func feePerKb(_ handler: @escaping (_ fees: Fees, _ error: String?) -> Void) { let req = URLRequest(url: url("/fee-per-kb")) let task = dataTaskWithRequest(req) { _, _, _ in - // TODO: Refactor when mobile-api v0.4.0 is in prod let staticFees = Fees.usingDefaultValues handler(staticFees, nil) } task.resume() } - func exchangeRates(isFallback: Bool = false, _ handler: @escaping (_ rates: [Rate], _ error: String?) -> Void) - { + func exchangeRates(isFallback: Bool = false, _ handler: @escaping (_ rates: [Rate], _ error: String?) -> Void) { let request = isFallback ? URLRequest(url: URL(string: fallbackRatesURL)!) : URLRequest(url: URL(string: APIServer.baseUrl + "v1/rates")!) - _ = dataTaskWithRequest(request) { data, _, error in + dataTaskWithRequest(request) { data, _, error in if error == nil, let data = data, let parsedData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) { if isFallback { guard let array = parsedData as? [Any] else { - return handler([], "/rates didn't return an array") + let properties = ["error_message": "is_fallback_no_rate_array_returned"] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) + return handler([], "::: /rates didn't return an array") } handler(array.compactMap { Rate(data: $0) }, nil) } else { guard let array = parsedData as? [Any] else { + let properties = ["error_message": "is_fallback_parsed_data_fail"] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) return handler([], "/rates didn't return an array") } handler(array.compactMap { Rate(data: $0) }, nil) } } else { if isFallback { + let properties = ["error_message": "is_fallback_no_rate_array_returned"] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) handler([], "Error fetching from fallback url") } else { + let properties: [String: String] = ["error_message": "is_fallback"] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) self.exchangeRates(isFallback: true, handler) } } diff --git a/litewallet/BRKeyExtension.swift b/litewallet/BRKeyExtension.swift index d5d4e1408..3a0868575 100644 --- a/litewallet/BRKeyExtension.swift +++ b/litewallet/BRKeyExtension.swift @@ -42,15 +42,14 @@ extension BRKey { // WIF private key mutating func privKey() -> String? { - return autoreleasepool - { // wrapping in autoreleasepool ensures sensitive memory is wiped and freed immediately - let count = BRKeyPrivKey(&self, nil, 0) - var data = CFDataCreateMutable(secureAllocator, count) as Data - data.count = count - guard data.withUnsafeMutableBytes({ BRKeyPrivKey(&self, $0, count) }) != 0 else { return nil } - return CFStringCreateFromExternalRepresentation(secureAllocator, data as CFData, - CFStringBuiltInEncodings.UTF8.rawValue) as String - } + return autoreleasepool { // wrapping in autoreleasepool ensures sensitive memory is wiped and freed immediately + let count = BRKeyPrivKey(&self, nil, 0) + var data = CFDataCreateMutable(secureAllocator, count) as Data + data.count = count + guard data.withUnsafeMutableBytes({ BRKeyPrivKey(&self, $0, count) }) != 0 else { return nil } + return CFStringCreateFromExternalRepresentation(secureAllocator, data as CFData, + CFStringBuiltInEncodings.UTF8.rawValue) as String + } } // encrypts key with passphrase diff --git a/litewallet/BRPeerManager.swift b/litewallet/BRPeerManager.swift index 8e58da18c..44e0e4900 100644 --- a/litewallet/BRPeerManager.swift +++ b/litewallet/BRPeerManager.swift @@ -90,13 +90,6 @@ class BRPeerManager { return BRPeerManagerEstimatedBlockHeight(cPtr) } - // Only show syncing view if more than 2 days behind - var shouldShowSyncingView: Bool { - let lastBlock = Date(timeIntervalSince1970: TimeInterval(lastBlockTimestamp)) - let cutoff = Date().addingTimeInterval(-24 * 60 * 60 * 2) // 2 days ago - return lastBlock.compare(cutoff) == .orderedAscending - } - // current network sync progress from 0 to 1 // startHeight is the block height of the most recent fully completed sync func syncProgress(fromStartHeight: UInt32) -> Double { @@ -115,17 +108,16 @@ class BRPeerManager { // publishes tx to litecoin network func publishTx(_ tx: BRTxRef, completion: @escaping (Bool, BRPeerManagerError?) -> Void) { - BRPeerManagerPublishTx(cPtr, tx, Unmanaged.passRetained(CompletionWrapper(completion)).toOpaque()) - { info, error in - guard let info = info else { return } - guard error == 0 - else { - let err = BRPeerManagerError.posixError(errorCode: error, description: String(cString: strerror(error))) - return Unmanaged.fromOpaque(info).takeRetainedValue().completion(false, err) - } - - Unmanaged.fromOpaque(info).takeRetainedValue().completion(true, nil) + BRPeerManagerPublishTx(cPtr, tx, Unmanaged.passRetained(CompletionWrapper(completion)).toOpaque()) { info, error in + guard let info = info else { return } + guard error == 0 + else { + let err = BRPeerManagerError.posixError(errorCode: error, description: String(cString: strerror(error))) + return Unmanaged.fromOpaque(info).takeRetainedValue().completion(false, err) } + + Unmanaged.fromOpaque(info).takeRetainedValue().completion(true, nil) + } } // number of connected peers that have relayed the given unconfirmed transaction diff --git a/litewallet/BRTxInputExtension.swift b/litewallet/BRTxInputExtension.swift index 9ef47a293..d49059848 100644 --- a/litewallet/BRTxInputExtension.swift +++ b/litewallet/BRTxInputExtension.swift @@ -18,9 +18,4 @@ extension BRTxInput { get { return [UInt8](UnsafeBufferPointer(start: script, count: scriptLen)) } set { BRTxInputSetScript(&self, newValue, newValue.count) } } - - var swiftSignature: [UInt8] { - get { return [UInt8](UnsafeBufferPointer(start: signature, count: sigLen)) } - set { BRTxInputSetSignature(&self, newValue, newValue.count) } - } } diff --git a/litewallet/BartyCrouch.swift b/litewallet/BartyCrouch.swift index d2ed0e571..af4fa82ad 100644 --- a/litewallet/BartyCrouch.swift +++ b/litewallet/BartyCrouch.swift @@ -3,29 +3,23 @@ import Foundation enum BartyCrouch { enum SupportedLanguage: String { // TODO: remove unsupported languages from the following cases list & add any missing languages - case arabic = "ar" case chineseSimplified = "zh-Hans" case chineseTraditional = "zh-Hant" case english = "en" case french = "fr" case german = "de" - case hindi = "hi" case indonesian = "id" case italian = "it" case japanese = "ja" case korean = "ko" - case malay = "ms" case portuguese = "pt" case russian = "ru" case spanish = "es" - case danish = "da" - case dutch = "nl" - case swedish = "sv" case turkey = "tr" + case ukrainian = "uk" } - static func translate(key: String, translations: [SupportedLanguage: String], comment _: String? = nil) -> String - { + static func translate(key: String, translations: [SupportedLanguage: String], comment _: String? = nil) -> String { let typeName = String(describing: BartyCrouch.self) let methodName = #function diff --git a/litewallet/Base.lproj/LaunchScreen.storyboard b/litewallet/Base.lproj/LaunchScreen.storyboard index a78a36743..b099ec32e 100644 --- a/litewallet/Base.lproj/LaunchScreen.storyboard +++ b/litewallet/Base.lproj/LaunchScreen.storyboard @@ -1,9 +1,9 @@ - + - + @@ -19,18 +19,29 @@ + + + + + + + + - + - + + - - + + + + @@ -42,5 +53,6 @@ + diff --git a/litewallet/BundleExtension.swift b/litewallet/BundleExtension.swift index b45b085a3..7494709f5 100644 --- a/litewallet/BundleExtension.swift +++ b/litewallet/BundleExtension.swift @@ -22,8 +22,16 @@ public extension Bundle { object_setClass(Bundle.main, BundleEx.self as AnyClass) } - if let temp = language { - guard let bundle = Bundle(path: Bundle.main.path(forResource: temp, ofType: "lproj")!) else { + if var temp = language { + if temp == "zh" { + temp = "zh-Hans" + } + + guard let path = Bundle.main.path(forResource: temp, ofType: "lproj") else { + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR) + return + } + guard let bundle = Bundle(path: path) else { LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR) return } diff --git a/litewallet/BuyHostingController.swift b/litewallet/BuyHostingController.swift new file mode 100644 index 000000000..4e7426b77 --- /dev/null +++ b/litewallet/BuyHostingController.swift @@ -0,0 +1,51 @@ +import Foundation +import SwiftUI + +/// Moonpay: List supported countries endpoint +/// https://api.moonpay.com/v3/countries +/// - Parameter alphaCode2Char: String +/// - Parameter alphaCode3Char: String +/// - Parameter isBuyAllowed: Bool +/// - Parameter isSellAllowed: Bool +/// - Parameter countryName: String (name) +/// - Parameter isAllowedInCountry: Bool (isAllowed) +/// =================================== +/// Unused JSON parameters +/// "isNftAllowed": false +/// "isBalanceLedgerWithdrawAllowed": true, +/// "isSelfServeHighRisk": true, +/// "continent": "Asia", +/// "supportedDocuments": [ +/// "passport", +/// "driving_licence", +/// "national_identity_card", +/// "residence_permit", +/// ], +/// "suggestedDocument": "national_identity_card" +/// - Returns: MoonpayCountryData +public struct MoonpayCountryData: Codable, Hashable { + var alphaCode2Char: String + var alphaCode3Char: String + var isBuyAllowed: Bool + var isSellAllowed: Bool + var countryName: String + var isAllowedInCountry: Bool +} + +class BuyHostingController: UIHostingController { + var contentView: BuyView + + var isLoaded: Bool = false + + init() { + let buyViewModel = BuyViewModel() + contentView = BuyView(viewModel: buyViewModel) + + super.init(rootView: contentView) + } + + @available(*, unavailable) + @MainActor dynamic required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/litewallet/BuyTableViewController.swift b/litewallet/BuyTableViewController.swift index c09af86aa..40d61f860 100644 --- a/litewallet/BuyTableViewController.swift +++ b/litewallet/BuyTableViewController.swift @@ -52,8 +52,7 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg private let currentWalletAddress: String = WalletManager.sharedInstance.wallet?.receiveAddress ?? "" @IBAction func didTapSimplex(_: Any) { - if let vcWKVC = UIStoryboard(name: "Buy", bundle: nil).instantiateViewController(withIdentifier: "BuyWKWebViewController") as? BuyWKWebViewController - { + if let vcWKVC = UIStoryboard(name: "Buy", bundle: nil).instantiateViewController(withIdentifier: "BuyWKWebViewController") as? BuyWKWebViewController { vcWKVC.currencyCode = currencyCode vcWKVC.currentWalletAddress = currentWalletAddress vcWKVC.uuidString = uuidString @@ -135,8 +134,7 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg } @objc private func didChangeCurrencyMoonpay() { - if let code = PartnerFiatOptions(rawValue: moonpaySegmentedControl.selectedSegmentIndex)?.description - { + if let code = PartnerFiatOptions(rawValue: moonpaySegmentedControl.selectedSegmentIndex)?.description { currencyCode = code } else { print("Error: Code not found: \(moonpaySegmentedControl.selectedSegmentIndex)") @@ -144,8 +142,7 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg } @objc private func didChangeCurrencySimplex() { - if let code = PartnerFiatOptions(rawValue: simplexCurrencySegmentedControl.selectedSegmentIndex)?.description - { + if let code = PartnerFiatOptions(rawValue: simplexCurrencySegmentedControl.selectedSegmentIndex)?.description { currencyCode = code } else { print("Error: Code not found: \(simplexCurrencySegmentedControl.selectedSegmentIndex)") diff --git a/litewallet/BuyTileView.swift b/litewallet/BuyTileView.swift new file mode 100644 index 000000000..9ab8be84f --- /dev/null +++ b/litewallet/BuyTileView.swift @@ -0,0 +1,45 @@ +import SwiftUI + +struct BuyTileView: View { + let codeCellHeight = 28.0 + let codeCellWidth = 80.0 + let smallPad = 3.0 + let buttonRegularFont: Font = .barlowSemiBold(size: 18.0) + + private var code: String + + init(code: String) { + self.code = code + } + + var body: some View { + ZStack { + RoundedRectangle(cornerRadius: 14.0) + .foregroundColor(.litewalletBlue) + .frame(width: codeCellWidth, + height: codeCellHeight, + alignment: .center) + .overlay { + RoundedRectangle(cornerRadius: 14.0) + .stroke(.white, lineWidth: 0.5) + .frame(width: codeCellWidth, + height: codeCellHeight, + alignment: .center) + } + Text(code) + .foregroundColor(.white) + .font(buttonRegularFont) + .frame(width: codeCellWidth, + height: codeCellHeight, + alignment: .center) + } + .frame(width: codeCellWidth, + height: codeCellHeight, + alignment: .center) + .padding(.all, smallPad) + } +} + +#Preview { + BuyTileView(code: "USD") +} diff --git a/litewallet/BuyView.swift b/litewallet/BuyView.swift new file mode 100644 index 000000000..0a1e47bdd --- /dev/null +++ b/litewallet/BuyView.swift @@ -0,0 +1,177 @@ +import SafariServices +import SwiftUI + +struct BuyView: View { + @ObservedObject + var viewModel: BuyViewModel + + let paragraphFont: Font = .barlowSemiBold(size: 20.0) + let calloutFont: Font = .barlowLight(size: 12.0) + let smallCalloutFont: Font = .barlowLight(size: 10.0) + + let genericPad = 25.0 + let selectButtonHeight = 35.0 + let smallPad = 6.0 + let buttonHeight = 44.0 + let pageHeight = 145.0 + let hugeFont = Font.barlowBold(size: 30.0) + let buttonLightFont: Font = .barlowLight(size: 15.0) + let buttonRegularFont: Font = .barlowSemiBold(size: 18.0) + let appDelegate = UIApplication.shared.delegate as! AppDelegate + + @State + private var shouldShowSafariVC = false + + @State + private var didTapCopy = false + // https://en.wikipedia.org/wiki/Template:Most_traded_currencies + /// As of 1716366977 + let rankedFiatCodes: [String] = ["USD", "EUR", "JPY", "GBP", + "CNY", "AUD", "CAD", "CHF", + "HKD", "SGD", "SEK", "NOK", + "NZD", "MXN", "TWD", "ZAR", + "BRL", "DKK", "PLN", "THB", + "ILS", "IDR", "CZK", "TRY", + "RON", "PEN"] + + init(viewModel: BuyViewModel) { + self.viewModel = viewModel + } + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + let height = geometry.size.height + + ZStack { + Color.liteWalletBlue.edgesIgnoringSafeArea(.all) + VStack { + Divider() + .frame(height: 1.0) + .background(.white) + .frame(maxWidth: .infinity, alignment: .center) + Text(S.BuyCenter.buyModalTitle.localize()) + .font(hugeFont) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity, alignment: .center) + .frame(idealHeight: buttonHeight) + .foregroundColor(.white) + .padding([.leading, .trailing], genericPad) + .padding(.all, genericPad) + + HStack { + VStack { + Picker(S.BuyCenter.buyDetail.localize() + " " + viewModel.receivingAddress, + selection: $viewModel.selectedCode) + { + ForEach(rankedFiatCodes, id: \.self) { + BuyTileView(code: $0) + } + } + .pickerStyle(.wheel) + Spacer() + } + + VStack { + Text(S.BuyCenter.buyDetail.localize()) + .font(buttonRegularFont) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + .frame(idealHeight: buttonHeight) + .foregroundColor(.white) + .padding([.leading, .trailing], genericPad) + .padding(.top, 0.0) + HStack { + Text(viewModel.receivingAddress) + .font(buttonLightFont) + .multilineTextAlignment(.leading) + .fixedSize(horizontal: false, vertical: true) + .frame(idealHeight: buttonHeight) + .foregroundColor(didTapCopy ? .litewalletBlue : .white) + .padding([.top, .bottom], smallPad) + Image(systemName: "doc.on.doc") + .foregroundColor(didTapCopy ? .litewalletBlue : .white) + } + .onTapGesture { + UIPasteboard.general.string = viewModel.receivingAddress + didTapCopy.toggle() + delay(0.2) { + didTapCopy.toggle() + } + } + .padding([.leading, .trailing], genericPad) + Button(action: { + if viewModel.receivingAddress != "" { + let timestamp = Int(Date().timeIntervalSince1970) + viewModel.urlString = APIServer.baseUrl + "moonpay/buy" + "?address=\(viewModel.receivingAddress)&idate=\(timestamp)&uid=\(viewModel.uuidString)&code=\(viewModel.selectedCode)" + self.shouldShowSafariVC = true + } + + }) { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(width: width * 0.4, height: selectButtonHeight, alignment: .center) + .foregroundColor(.litewalletDarkBlue) + + Text(S.BuyCenter.buyButtonTitle.localize() + " \(viewModel.selectedCode)") + .frame(width: width * 0.4, height: selectButtonHeight, alignment: .center) + .font(paragraphFont) + .foregroundColor(.white) + .overlay( + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .stroke(.white, lineWidth: 1.0) + ) + } + } + .padding([.leading, .trailing], genericPad) + .sheet(isPresented: $shouldShowSafariVC) { + if let url = URL(string: viewModel.urlString) { + MoonpaySafariView(url: url) + } + } + } + } + .frame(height: height * 0.2 + ) + + Divider() + .frame(height: 1.0) + .background(.white) + .frame(maxWidth: .infinity, alignment: .center) + HStack { + Text(S.BuyCenter.buyMoonpayDetail.localize()) + .font(smallCalloutFont) + .multilineTextAlignment(.leading) + .frame(idealHeight: buttonHeight) + .foregroundColor(.white) + .padding(.leading, genericPad) + Image("moonpay-white-logo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(maxWidth: .infinity, alignment: .leading) + .frame(height: 14.0) + .opacity(0.8) + Spacer() + } + .frame(height: 20.0) + Spacer() + } + } + } + } +} + +struct MoonpaySafariView: UIViewControllerRepresentable { + let url: URL + + func makeUIViewController(context _: UIViewControllerRepresentableContext) -> SFSafariViewController { + return SFSafariViewController(url: url) + } + + func updateUIViewController(_: SFSafariViewController, context _: UIViewControllerRepresentableContext) {} +} + +#Preview { + BuyView(viewModel: BuyViewModel()) +} diff --git a/litewallet/BuyViewModel.swift b/litewallet/BuyViewModel.swift new file mode 100644 index 000000000..154874aa5 --- /dev/null +++ b/litewallet/BuyViewModel.swift @@ -0,0 +1,73 @@ +import Foundation +import SwiftUI +import UIKit + +class BuyViewModel: ObservableObject { + // MARK: - Combine Variables + + @Published + var receivingAddress: String = "" + + @Published + var urlString: String = "" + + @Published + var selectedCode: String = "USD" + + @Published + var uuidString: String = UIDevice.current.identifierForVendor?.uuidString ?? "" + + init() { + receivingAddress = WalletManager.sharedInstance.wallet?.receiveAddress ?? "" + } + + func fetchCurrenciesCountries(completion: @escaping ([MoonpayCountryData]) -> Void) { + let url = URL(string: "https://api.moonpay.com/v3/countries")! + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.timeoutInterval = 10 + request.allHTTPHeaderFields = ["accept": "application/json"] + + let task = URLSession.shared.dataTask(with: request) { data, _, error in + + if error == nil { + DispatchQueue.main.sync { + if let jsonData = try? JSONSerialization.jsonObject(with: data ?? Data(), options: []), + let jsonArray = jsonData as? [[String: Any]] + { + var dataArray: [MoonpayCountryData] = [] + + /// Filters allowed currencies and the top ranked currencies + for element in jsonArray { + if element["isBuyAllowed"] as? Bool == true && + element["isAllowed"] as? Bool == true + { + let alpha2 = element["alpha2"] as? String + let alpha3 = element["alpha3"] as? String + let name = element["name"] as? String + let isBuyAllowed = element["isBuyAllowed"] as? Bool + let isSellAllowed = element["isSellAllowed"] as? Bool + let isAllowed = element["isAllowed"] as? Bool + + let mpCountryData = MoonpayCountryData(alphaCode2Char: alpha2 ?? "", + alphaCode3Char: alpha3 ?? "", + isBuyAllowed: isBuyAllowed ?? false, + isSellAllowed: isSellAllowed ?? false, + countryName: name ?? "", + isAllowedInCountry: isAllowed ?? false) + + dataArray.append(mpCountryData) + } + } + completion(dataArray) + } + } + } else { + let currencyError: [String: String] = ["error": error?.localizedDescription ?? ""] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: currencyError) + completion([]) + } + } + task.resume() + } +} diff --git a/litewallet/ChildViewTransitioningDelegate.swift b/litewallet/ChildViewTransitioningDelegate.swift index 8a33768de..656aafe32 100644 --- a/litewallet/ChildViewTransitioningDelegate.swift +++ b/litewallet/ChildViewTransitioningDelegate.swift @@ -11,18 +11,15 @@ class ChildViewTransitioningDelegate: NSObject { } extension ChildViewTransitioningDelegate: UIViewControllerTransitioningDelegate { - func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return nil } - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return nil } - func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? - { + func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { return nil } } diff --git a/litewallet/Constants/Constants+Events.swift b/litewallet/Constants/Constants+Events.swift index b2c8bc891..d600fc195 100644 --- a/litewallet/Constants/Constants+Events.swift +++ b/litewallet/Constants/Constants+Events.swift @@ -231,4 +231,13 @@ enum CustomEvent: String { /// Transactions info case _20240315_AI = "application_info" + + /// Disabled Push Notifications + case _20240506_DPN = "disabled_push_notifications" + + /// Stop Push Notifications + case _20240510_SPN = "stopped_push_notifications" + + /// Unsupported by Moonpay + case _20240527_UBM = "unsupported_by_moonpay" } diff --git a/litewallet/Constants/Functions.swift b/litewallet/Constants/Functions.swift index 4a89abb5b..9797a8558 100644 --- a/litewallet/Constants/Functions.swift +++ b/litewallet/Constants/Functions.swift @@ -25,25 +25,23 @@ func guardProtected(queue: DispatchQueue, callback: @escaping () -> Void) { } } -func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void -{ +func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void { return { [weak context] in guard let strongContext = context else { return } closure(strongContext) } } -func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void -{ +func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void { return { [weak context] arguments in guard let strongContext = context else { return } closure(strongContext, arguments) } } -/// Description: 1709405141 +/// Description: 1715876807 func tieredOpsFee(store: Store, amount: UInt64) -> UInt64 { - var usdRate = 67.000 + var usdRate = 83.000 if let liveRate = store.state.rates.filter({ $0.code == "USD" }).first?.rate { usdRate = liveRate } @@ -51,7 +49,8 @@ func tieredOpsFee(store: Store, amount: UInt64) -> UInt64 { switch usdInLTC { case 0 ..< 20.00: - return UInt64(0.20 / usdRate * 100_000_000) + let lowRate = usdInLTC * 0.01 + return UInt64(lowRate / usdRate * 100_000_000) case 20.00 ..< 50.00: return UInt64(0.30 / usdRate * 100_000_000) case 50.00 ..< 100.00: diff --git a/litewallet/Constants/Strings.swift b/litewallet/Constants/Strings.swift index 82a06f58f..019eae46e 100644 --- a/litewallet/Constants/Strings.swift +++ b/litewallet/Constants/Strings.swift @@ -132,17 +132,6 @@ enum S { static let loadingRequest = Localization(key: "Send.loadingRequest", value: "Loading Request", comment: "Loading request activity view message") static let insufficientFunds = Localization(key: "Send.insufficientFunds", value: "Insufficient Funds", comment: "Insufficient funds error") static let barItemTitle = Localization(key: "Send.barItemTitle", value: "Send", comment: "Send Bar Item Title") - - enum UnstoppableDomains { - static let placeholder = Localization(key: "Send.UnstoppableDomains.placeholder", value: "Enter a .crypto or .zil domain", comment: "Enter a .crypto,.zil domain") - static let simplePlaceholder = Localization(key: "Send.UnstoppableDomains.simpleplaceholder", value: "Enter domain", comment: "Enter domain") - static let enterA = Localization(key: "Send.UnstoppableDomains.enterA", value: "Enter a", comment: "Enter a") - static let domain = Localization(key: "Send.UnstoppableDomains.domain", value: "domain", comment: "domain") - static let lookup = Localization(key: "Send.UnstoppableDomains.lookup", value: "Lookup", comment: "Lookup") - static let lookupFailureHeader = Localization(key: "Send.UnstoppableDomains.lookupFailureHeader", value: "LookupFailureHeader", comment: "lookupFailureHeader") - static let lookupDomainError = Localization(key: "Send.UnstoppableDomains.lookupDomainError", value: "LookupDomainError", comment: "LookupDomainError") - static let udSystemError = Localization(key: "Send.UnstoppableDomains.udSystemError", value: "UDSystemError", comment: "UDSystemError") - } } enum Receive { @@ -249,6 +238,11 @@ enum S { enum BuyCenter { static let title = Localization(key: "BuyCenter.title", value: "Buy Litecoin", comment: "Buy Center Title") static let buyModalTitle = Localization(key: "BuyCenter.ModalTitle", value: "Buy Łitecoin", comment: "Buy Modal Title") + static let buyButtonTitle = Localization(key: "BuyCenter.buyButtonTitle", value: "Buy Ł with", comment: "Buy ButtonTitle") + static let buyDetail = Localization(key: "BuyCenter.buyDetail", value: "Ł will be sent to:", comment: "Buy ButtonTitle") + static let buyFiatDetail = Localization(key: "BuyCenter.buyFiatDetail", value: "Using:", comment: "Using fiat") + static let buyMoonpayDetail = Localization(key: "BuyCenter.buyMoonpayDetail", value: "Powered by:", comment: "Powered by") + enum Cells { static let moonpayTitle = Localization(key: "BuyCenter.moonpayTitle", value: "Moonpay", comment: "Moonpay Title") static let moonpayFinancialDetails = Localization(key: "BuyCenter.moonpayFinancialDetails", value: "• Point 1 XXXXX\n• Point 2 XXXXn• XXX Point 3", comment: "Moonpay buy financial details") @@ -689,7 +683,6 @@ enum S { static let processingTime = Localization(key: "Confirmation.processingTime", value: "Processing time: This transaction will take %1$@ minutes to process.", comment: "eg. Processing time: This transaction will take 10-30 minutes to process.") static let processingAndDonationTime = Localization(key: "Confirmation.processingAndDonationTime", value: "Processing time: These transactions will take %1$@ minutes to process.", comment: "eg. Processing with Donation time: This transaction will take 10-30 minutes to process.") static let amountLabel = Localization(key: "Confirmation.amountLabel", value: "Amount to Send:", comment: "Amount to Send: ($1.00)") - static let donateLabel = Localization(key: "Confirmation.donateLabel", value: "Amount to Donate:", comment: "Amount to Donate: ($1.00)") static let totalLabel = Localization(key: "Confirmation.totalLabel", value: "Total Cost:", comment: "Total Cost: ($5.00)") static let amountDetailLabel = Localization(key: "Confirmation.amountDetailLabel", value: "Exchange details:", comment: "$53.09/L + 1.07%") diff --git a/litewallet/Currency.swift b/litewallet/Currency.swift index 74f771e3e..8bfb58b01 100644 --- a/litewallet/Currency.swift +++ b/litewallet/Currency.swift @@ -3,7 +3,10 @@ import UIKit class Currency { class func getSymbolForCurrencyCode(code: String) -> String? { - let result = Locale.availableIdentifiers.map { Locale(identifier: $0) }.first { $0.currencyCode == code } + print(" ::: \(code)") + let result = Locale.availableIdentifiers.map { + Locale(identifier: $0) + }.first { $0.currencyCode == code } return result?.currencySymbol } } @@ -12,7 +15,7 @@ enum PartnerFiatOptions: Int, CustomStringConvertible { case cad case aud case idr - case rub + case tur case jpy case eur case gbp @@ -27,7 +30,7 @@ enum PartnerFiatOptions: Int, CustomStringConvertible { case .cad: return "CAD" case .aud: return "AUD" case .idr: return "IDR" - case .rub: return "RUB" + case .tur: return "TRY" case .jpy: return "JPY" case .eur: return "EUR" case .gbp: return "GBP" @@ -40,7 +43,7 @@ enum PartnerFiatOptions: Int, CustomStringConvertible { case .cad: return 0 case .aud: return 1 case .idr: return 2 - case .rub: return 3 + case .tur: return 3 case .jpy: return 4 case .eur: return 5 case .gbp: return 6 diff --git a/litewallet/EnterPhraseViewModel.swift b/litewallet/EnterPhraseViewModel.swift index e972f6b3d..3bde39c73 100644 --- a/litewallet/EnterPhraseViewModel.swift +++ b/litewallet/EnterPhraseViewModel.swift @@ -1,4 +1,5 @@ import Foundation + class EnterPhraseViewModel: ObservableObject { // MARK: - Combine Variables diff --git a/litewallet/Environment.swift b/litewallet/Environment.swift index 89fd3a648..41b971fcf 100644 --- a/litewallet/Environment.swift +++ b/litewallet/Environment.swift @@ -126,7 +126,7 @@ struct E { }() static var isIPhone4: Bool { - return (UIScreen.main.bounds.size.height == 480.0) + return UIScreen.main.bounds.size.height == 480.0 } static var isIPhone5: Bool { @@ -134,12 +134,10 @@ struct E { } static var isIPhoneX: Bool { - return (UIScreen.main.bounds.size.height == 812.0) + return UIScreen.main.bounds.size.height == 812.0 } - static let is32Bit: Bool = { - MemoryLayout.size == MemoryLayout.size - }() + static let is32Bit: Bool = MemoryLayout.size == MemoryLayout.size static var screenHeight: CGFloat { return UIScreen.main.bounds.size.height diff --git a/litewallet/Extensions/Async.swift b/litewallet/Extensions/Async.swift index 22dbf25c6..ed43c3625 100644 --- a/litewallet/Extensions/Async.swift +++ b/litewallet/Extensions/Async.swift @@ -1,10 +1,9 @@ import Foundation enum Async { - static func parallel(callbacks: [(@escaping () -> Void) -> Void], completion: @escaping () -> Void) - { + static func parallel(callbacks: [(@escaping () -> Void) -> Void], completion: @escaping () -> Void) { let dispatchGroup = DispatchGroup() - callbacks.forEach { cb in + for cb in callbacks { dispatchGroup.enter() cb { dispatchGroup.leave() diff --git a/litewallet/Extensions/CGContext+Additions.swift b/litewallet/Extensions/CGContext+Additions.swift index 29b720a3a..c5196c930 100644 --- a/litewallet/Extensions/CGContext+Additions.swift +++ b/litewallet/Extensions/CGContext+Additions.swift @@ -4,8 +4,8 @@ extension CGContext { func addLineThrough(_ points: [(CGFloat, CGFloat)]) { guard let first = points.first else { return } move(to: CGPoint(x: first.0, y: first.1)) - points.dropFirst().forEach { - addLine(to: CGPoint(x: $0.0, y: $0.1)) + for point in points.dropFirst() { + addLine(to: CGPoint(x: point.0, y: point.1)) } } } diff --git a/litewallet/Extensions/NumberFormatter+Additions.swift b/litewallet/Extensions/NumberFormatter+Additions.swift index 7875041e4..8505fb57b 100644 --- a/litewallet/Extensions/NumberFormatter+Additions.swift +++ b/litewallet/Extensions/NumberFormatter+Additions.swift @@ -1,8 +1,7 @@ import Foundation extension NumberFormatter { - static func formattedString(amount: Satoshis, rate: Rate?, minimumFractionDigits: Int?, maxDigits: Int) -> String - { + static func formattedString(amount: Satoshis, rate: Rate?, minimumFractionDigits: Int?, maxDigits: Int) -> String { let displayAmount = Amount(amount: amount.rawValue, rate: rate ?? Rate.empty, maxDigits: maxDigits) var formatter: NumberFormatter var output = "" diff --git a/litewallet/Extensions/SafariServices+Extension.swift b/litewallet/Extensions/SafariServices+Extension.swift index 19605b897..d3f359a42 100644 --- a/litewallet/Extensions/SafariServices+Extension.swift +++ b/litewallet/Extensions/SafariServices+Extension.swift @@ -67,8 +67,8 @@ class SignupWebView: WKWebView, WKNavigationDelegate { webView.evaluateJavaScript(scriptContent, completionHandler: { height, error in - print(height) - print(error) + debugPrint(height ?? 0.0) + debugPrint(error) }) webView.evaluateJavaScript("document.body.innerHTML", completionHandler: { (value: Any!, error: Error!) in @@ -76,20 +76,8 @@ class SignupWebView: WKWebView, WKNavigationDelegate { // Error logic return } - // webView.invalidateIntrinsicContentSize() - // let js = "document.getElementById(\"MY_TEXTFIELD_ID\").focus();" - // webView.evaluateJavaScript(js) - - // webview.canBecomeFocused = true - - // document.getElementById('myID').focus(); - - // webview.scrollView.setZoomScale(0.3, animated: true) - - let result = value as? String - - print(value) + debugPrint(value ?? "Empty string") }) } } diff --git a/litewallet/Extensions/String+Additions.swift b/litewallet/Extensions/String+Additions.swift index 3808b4e38..c7e83d9a1 100644 --- a/litewallet/Extensions/String+Additions.swift +++ b/litewallet/Extensions/String+Additions.swift @@ -103,6 +103,39 @@ extension String { } } +// MARK: - Language code String + +extension String { + /// 14 Languages + /// Locale.current.identifier) + static func preferredLanguageInterest(currentId: String) -> String { + var codeId = "" + if (currentId == "zh_CN") || (currentId == "zh_SG") { + return "general-chinese-simplified" + } else if (currentId == "zh_TW") || (currentId == "zh_HK") { + return "general-chinese-traditional" + } else { + codeId = String(currentId.suffix(2)) + } + + switch codeId { + case "en": return "general-english" + case "fr": return "general-french" + case "de": return "general-german" + case "id": return "general-indonesian" + case "it": return "general-italian" + case "ja": return "general-japanese" + case "ko": return "general-korean" + case "pt": return "general-portuguese" + case "ru": return "general-russian" + case "es": return "general-spanish" + case "tr": return "general-turkish" + case "uk": return "general-ukrainian" + default: return "general-english" + } + } +} + extension UnicodeScalar { var nibble: UInt8? { if value >= 48, value <= 57 { diff --git a/litewallet/Extensions/UIView+AnimationAdditions.swift b/litewallet/Extensions/UIView+AnimationAdditions.swift index f716102c7..355be2644 100644 --- a/litewallet/Extensions/UIView+AnimationAdditions.swift +++ b/litewallet/Extensions/UIView+AnimationAdditions.swift @@ -1,8 +1,7 @@ import UIKit extension UIView { - static func spring(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) - { + static func spring(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) { if #available(iOS 10.0, *) { UIViewPropertyAnimator.springAnimation(duration, delay: delay, animations: animations, completion: { _ in completion(true) }) } else { @@ -10,8 +9,7 @@ extension UIView { } } - static func spring(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) - { + static func spring(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) { if #available(iOS 10.0, *) { UIViewPropertyAnimator.springAnimation(duration, animations: animations, completion: { _ in completion(true) }) } else { diff --git a/litewallet/Extensions/UIView+BRWAdditions.swift b/litewallet/Extensions/UIView+BRWAdditions.swift index d67869d60..fc0c99593 100644 --- a/litewallet/Extensions/UIView+BRWAdditions.swift +++ b/litewallet/Extensions/UIView+BRWAdditions.swift @@ -42,8 +42,7 @@ extension UIView { NSLayoutConstraint.activate(constraints.compactMap { $0 }) } - func constraint(_ attribute: NSLayoutConstraint.Attribute, toView: UIView, constant: CGFloat?) -> NSLayoutConstraint? - { + func constraint(_ attribute: NSLayoutConstraint.Attribute, toView: UIView, constant: CGFloat?) -> NSLayoutConstraint? { guard superview != nil else { assertionFailure("Superview cannot be nil when adding contraints"); return nil } translatesAutoresizingMaskIntoConstraints = false return NSLayoutConstraint(item: self, attribute: attribute, relatedBy: .equal, toItem: toView, attribute: attribute, multiplier: 1.0, constant: constant ?? 0.0) @@ -94,8 +93,7 @@ extension UIView { return NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal, toItem: toLeading, attribute: .leading, multiplier: 1.0, constant: constant) } - func constrainTopCorners(sidePadding: CGFloat, topPadding: CGFloat, topLayoutGuide: UILayoutSupport) - { + func constrainTopCorners(sidePadding: CGFloat, topPadding: CGFloat, topLayoutGuide: UILayoutSupport) { guard let view = superview else { assertionFailure("Superview cannot be nil when adding contraints"); return } constrain([ constraint(.leading, toView: view, constant: sidePadding), diff --git a/litewallet/Extensions/UIViewPropertyAnimator+BRWAdditions.swift b/litewallet/Extensions/UIViewPropertyAnimator+BRWAdditions.swift index 320650b69..e48569116 100644 --- a/litewallet/Extensions/UIViewPropertyAnimator+BRWAdditions.swift +++ b/litewallet/Extensions/UIViewPropertyAnimator+BRWAdditions.swift @@ -2,8 +2,7 @@ import UIKit @available(iOS 10.0, *) extension UIViewPropertyAnimator { - static func springAnimation(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) - { + static func springAnimation(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) { let springParameters = UISpringTimingParameters(dampingRatio: 0.7) let animator = UIViewPropertyAnimator(duration: duration, timingParameters: springParameters) animator.addAnimations(animations) @@ -11,8 +10,7 @@ extension UIViewPropertyAnimator { animator.startAnimation(afterDelay: delay) } - static func springAnimation(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) - { + static func springAnimation(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) { springAnimation(duration, delay: 0.0, animations: animations, completion: completion) } } diff --git a/litewallet/Extensions/UserDefaults+Additions.swift b/litewallet/Extensions/UserDefaults+Additions.swift index bb595aa6e..7c618dad3 100644 --- a/litewallet/Extensions/UserDefaults+Additions.swift +++ b/litewallet/Extensions/UserDefaults+Additions.swift @@ -53,7 +53,7 @@ extension UserDefaults { } else { currencyCode = defaults.string(forKey: defaultCurrencyCodeKey)! } - let acceptedCurrencyCodes = ["USD", "EUR", "JPY", "BGN", "CZK", "DKK", "GBP", "HUF", "PLN", "RON", "SEK", "CHF", "NOK", "HRK", "RUB", "TRY", "AUD", "BRL", "CAD", "CNY", "HKD", "IDR", "ILS", "INR", "KRW", "MXN", "MYR", "NZD", "PHP", "SDG", "THB", "ZAR"] + let acceptedCurrencyCodes = ["USD", "EUR", "JPY", "BGN", "CZK", "DKK", "GBP", "HUF", "PLN", "RON", "SEK", "CHF", "NOK", "HRK", "TRY", "AUD", "BRL", "CAD", "CNY", "HKD", "IDR", "ILS", "INR", "KRW", "MXN", "MYR", "NZD", "PHP", "SDG", "THB", "ZAR"] if !(acceptedCurrencyCodes.contains(currencyCode)) { return "USD" diff --git a/litewallet/FeeManager.swift b/litewallet/FeeManager.swift index 1ddb579a2..816555bbe 100644 --- a/litewallet/FeeManager.swift +++ b/litewallet/FeeManager.swift @@ -32,17 +32,16 @@ class FeeUpdater: Trackable { private let walletManager: WalletManager private let store: Store - private lazy var minFeePerKB: UInt64 = Fees.usingDefaultValues.economy - - private let maxFeePerKB = Fees.usingDefaultValues.luxury private var timer: Timer? - private let feeUpdateInterval: TimeInterval = 15 // meet Nyquist for api server interval (30) + private let feeUpdateInterval: TimeInterval = 3 + private var exchangeUpdater: ExchangeUpdater // MARK: - Public - init(walletManager: WalletManager, store: Store) { + init(walletManager: WalletManager, store: Store, exchangeUpdater: ExchangeUpdater) { self.walletManager = walletManager self.store = store + self.exchangeUpdater = exchangeUpdater } func refresh(completion: @escaping () -> Void) { @@ -79,5 +78,9 @@ class FeeUpdater: Trackable { @objc func intervalRefresh() { refresh(completion: {}) + exchangeUpdater.refresh(completion: { + /// DEV: For testing + /// NSLog("::: Rate updated") + }) } } diff --git a/litewallet/FlowControllers/MessageUIPresenter.swift b/litewallet/FlowControllers/MessageUIPresenter.swift index 89cf3adbf..6094810fe 100644 --- a/litewallet/FlowControllers/MessageUIPresenter.swift +++ b/litewallet/FlowControllers/MessageUIPresenter.swift @@ -110,15 +110,13 @@ class MessageUIPresenter: NSObject, Trackable { } extension MessageUIPresenter: MFMailComposeViewControllerDelegate { - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) - { + func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) { dismiss(controller) } } extension MessageUIPresenter: MFMessageComposeViewControllerDelegate { - func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) - { + func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) { dismiss(controller) } } diff --git a/litewallet/FlowControllers/StartNavigationDelegate.swift b/litewallet/FlowControllers/StartNavigationDelegate.swift index c6d54b5d4..8ac4726cb 100644 --- a/litewallet/FlowControllers/StartNavigationDelegate.swift +++ b/litewallet/FlowControllers/StartNavigationDelegate.swift @@ -7,8 +7,7 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { self.store = store } - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) - { + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { if viewController is RecoverWalletIntroViewController { navigationController.navigationBar.tintColor = .white navigationController.navigationBar.titleTextAttributes = [ diff --git a/litewallet/ForgotView.swift b/litewallet/ForgotView.swift index 49f4ddc21..e69de29bb 100644 --- a/litewallet/ForgotView.swift +++ b/litewallet/ForgotView.swift @@ -1,115 +0,0 @@ -import SwiftUI - -// DEV: To be removed in following issue https://github.com/litecoin-foundation/litewallet-ios/issues/177 -struct ForgotAlertView: View where Presenting: View { - // MARK: - Combine Variables - - @ObservedObject - var viewModel = ForgotAlertViewModel() - - @Binding - var isShowingForgot: Bool - - @State - var email: String = "" - - let presenting: Presenting - - var mainMessage: String - - @State - var detailMessage: String = S.LitecoinCard.resetPasswordDetail.localize() - - @State - var didCheckEmailAddress: Bool = false - - var body: some View { - GeometryReader { (_: GeometryProxy) in - HStack { - Spacer() - ZStack { - self.presenting.disabled(isShowingForgot) - VStack { - // Dismiss button - Button(action: { - viewModel.shouldDismissView { - self.isShowingForgot.toggle() - UIApplication.shared.endEditing() - } - - }) { - Image("whiteCross") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 15, - height: 15) - } - .frame(minWidth: 0, maxWidth: .infinity, alignment: .trailing) - - Text(S.LitecoinCard.forgotPassword.localize()) - .font(Font(UIFont.barlowSemiBold(size: 21.0))) - .padding(.bottom, 8) - .foregroundColor(Color.white) - - Text(detailMessage) - .font(Font(UIFont.barlowRegular(size: 18.0))) - .foregroundColor(Color.white) - .multilineTextAlignment(.leading) - .padding(.bottom, 12) - .padding([.leading, .trailing], 8) - .onReceive(viewModel.$detailMessage, perform: { updatedMessage in - detailMessage = updatedMessage - }) - - TextField(S.Receive.emailButton.localize(), text: $email) - .font(Font(UIFont.barlowMedium(size: 16.0))) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .keyboardType(.emailAddress) - .autocapitalization(.none) - .disableAutocorrection(true) - .padding(.all, 20) - - HStack { - // Reset password button - Button(action: { - withAnimation { - viewModel.emailString = email - viewModel.resetPassword { - DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) { - self.isShowingForgot.toggle() - UIApplication.shared.endEditing() - didCheckEmailAddress = true - detailMessage = S.LitecoinCard.resetPasswordDetail.localize() - } - } - } - }) { - Text(S.LitecoinCard.resetPassword.localize()) - .frame(minWidth: 0, maxWidth: .infinity) - .font(Font(UIFont.barlowBold(size: 20.0))) - .foregroundColor(Color.white) - .padding(.all, 8) - .overlay( - RoundedRectangle(cornerRadius: 4) - .stroke(Color(UIColor.white), lineWidth: 1) - ) - .padding([.leading, .trailing], 20) - .padding([.top, .bottom], 10) - } - } - } - .padding() - .overlay( - RoundedRectangle(cornerRadius: 8) - .stroke(Color.gray, lineWidth: 1.5) - ) - .background(Color(UIColor.liteWalletBlue)) - .cornerRadius(8) - .shadow(color: .black, radius: 10, x: 5, y: 5) - .opacity(self.isShowingForgot ? 1 : 0) - } - Spacer() - } - } - } -} diff --git a/litewallet/Functions.swift b/litewallet/Functions.swift index 7805bf290..03ad48682 100644 --- a/litewallet/Functions.swift +++ b/litewallet/Functions.swift @@ -23,16 +23,14 @@ func guardProtected(queue: DispatchQueue, callback: @escaping () -> Void) { } } -func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void -{ +func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void { return { [weak context] in guard let strongContext = context else { return } closure(strongContext) } } -func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void -{ +func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void { return { [weak context] arguments in guard let strongContext = context else { return } closure(strongContext, arguments) diff --git a/litewallet/LWActivityIndicator.swift b/litewallet/LWActivityIndicator.swift index c2605d15d..2833168ba 100644 --- a/litewallet/LWActivityIndicator.swift +++ b/litewallet/LWActivityIndicator.swift @@ -8,13 +8,11 @@ struct ActivityIndicator: UIViewRepresentable { let style: UIActivityIndicatorView.Style - func makeUIView(context _: UIViewRepresentableContext) -> UIActivityIndicatorView - { + func makeUIView(context _: UIViewRepresentableContext) -> UIActivityIndicatorView { return UIActivityIndicatorView(style: style) } - func updateUIView(_ uiView: UIActivityIndicatorView, context _: UIViewRepresentableContext) - { + func updateUIView(_ uiView: UIActivityIndicatorView, context _: UIViewRepresentableContext) { isAnimating ? uiView.startAnimating() : uiView.stopAnimating() } } diff --git a/litewallet/LocaleChangeViewModel.swift b/litewallet/LocaleChangeViewModel.swift index a15cb63c5..468372c13 100644 --- a/litewallet/LocaleChangeViewModel.swift +++ b/litewallet/LocaleChangeViewModel.swift @@ -1,4 +1,5 @@ import Foundation + class LocaleChangeViewModel: ObservableObject { // MARK: - Combine Variables diff --git a/litewallet/LockScreenHeaderView.swift b/litewallet/LockScreenHeaderView.swift index d40781860..b26823910 100644 --- a/litewallet/LockScreenHeaderView.swift +++ b/litewallet/LockScreenHeaderView.swift @@ -6,6 +6,12 @@ struct LockScreenHeaderView: View { @ObservedObject var viewModel: LockScreenViewModel + @State + private var fiatValue = "" + + @State + private var currentFiatValue = S.History.currentLitecoinValue.localize() + init(viewModel: LockScreenViewModel) { self.viewModel = viewModel } @@ -17,15 +23,24 @@ struct LockScreenHeaderView: View { .overlay( VStack { Spacer() - Text(" 1 LTC = \(viewModel.currentValueInFiat)") + Text(fiatValue) .font(Font(UIFont.barlowSemiBold(size: 16.0))) .foregroundColor(.white) - Text("\(S.History.currentLitecoinValue.localize()) \(viewModel.currencyCode)") + Text(currentFiatValue) .font(Font(UIFont.barlowRegular(size: 14.0))) .foregroundColor(.white) .padding(.bottom, 10) Divider().background(.white) }) + .onAppear { + Task { + fiatValue = " 1 LTC = \(viewModel.currentValueInFiat)" + currentFiatValue = "\(S.History.currentLitecoinValue.localize()) \(viewModel.currencyCode)" + } + } + .onChange(of: viewModel.currentValueInFiat) { newValue in + fiatValue = " 1 LTC = \(newValue)" + } } } diff --git a/litewallet/LockScreenHeaderViewModel.swift b/litewallet/LockScreenHeaderViewModel.swift index 1b9612bd4..379603b88 100644 --- a/litewallet/LockScreenHeaderViewModel.swift +++ b/litewallet/LockScreenHeaderViewModel.swift @@ -31,11 +31,17 @@ class LockScreenViewModel: ObservableObject, Subscriber { } // Price Label - let fiatRate = Double(round(100 * currentRate.rate / 100)) - let formattedFiatString = String(format: "%.02f", fiatRate) + let formattedRate = String(format: "%.02f", currentRate.rate) currencyCode = currentRate.code - let currencySymbol = Currency.getSymbolForCurrencyCode(code: currencyCode) ?? "" - currentValueInFiat = String(currencySymbol + formattedFiatString) + + if let symbol = Rate.symbolMap[currencyCode] { + currentValueInFiat = String(symbol + formattedRate) + } else { + let properties = ["error_message": "fiat_symbol_not_found", + "missing_code": "\(currencyCode)"] + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) + currentValueInFiat = String("" + formattedRate) + } } // MARK: - Add Subscriptions @@ -45,7 +51,6 @@ class LockScreenViewModel: ObservableObject, Subscriber { else { let errorDescription = "store_not_initialized" LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) - return } diff --git a/litewallet/LoginViewController.swift b/litewallet/LoginViewController.swift index 4f2445f07..96f3785a5 100644 --- a/litewallet/LoginViewController.swift +++ b/litewallet/LoginViewController.swift @@ -116,18 +116,17 @@ class LoginViewController: UIViewController, Subscriber, Trackable { guard let walletManager = self?.walletManager else { return } self?.isResetting = true let nc = UINavigationController() - let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin - { phrase in - let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) - nc.pushViewController(updatePin, animated: true) - updatePin.resetFromDisabledWillSucceed = { - self?.disabledView.isHidden = true - } - updatePin.resetFromDisabledSuccess = { - self?.authenticationSucceded() - LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) - } - }) + let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin { phrase in + let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) + nc.pushViewController(updatePin, animated: true) + updatePin.resetFromDisabledWillSucceed = { + self?.disabledView.isHidden = true + } + updatePin.resetFromDisabledSuccess = { + self?.authenticationSucceded() + LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) + } + }) recover.addCloseNavigationItem() nc.viewControllers = [recover] nc.navigationBar.tintColor = .darkText diff --git a/litewallet/MainViewController.swift b/litewallet/MainViewController.swift index a04291f98..2b9d5f1e3 100644 --- a/litewallet/MainViewController.swift +++ b/litewallet/MainViewController.swift @@ -66,14 +66,16 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, - queue: nil) { _ in + queue: nil) + { _ in self.showJailbreakWarnings(isJailbroken: isJailbroken) } } NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, object: nil, - queue: nil) { _ in + queue: nil) + { _ in if UserDefaults.writePaperPhraseDate != nil {} } @@ -86,29 +88,68 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg func didUnlockLogin() { let hasSeenAnnounce = UserDefaults.standard.bool(forKey: hasSeenAnnounceView) - guard let tabVC = UIStoryboard(name: "Main", bundle: nil) - .instantiateViewController(withIdentifier: "TabBarViewController") - as? TabBarViewController - else { - NSLog("TabBarViewController not intialized") - return + // Check Locale - Assume unsupported if nil + let currentLocaleCountry = Locale.current.regionCode ?? "RU" + var userIsMoonPaySupported = true + for unsupportedLocale in UnsupportedCountries.allCases { + let truncatedCode = unsupportedLocale.localeCode.suffix(2) + + if currentLocaleCountry == truncatedCode { + userIsMoonPaySupported = false + let unsupportedDict: [String: String] = ["unsupported_country": unsupportedLocale.localeCode] + LWAnalytics.logEventWithParameters(itemName: ._20240527_UBM, properties: unsupportedDict) + break + } } - tabVC.store = store - tabVC.walletManager = walletManager + if userIsMoonPaySupported { + guard let tabVC = UIStoryboard(name: "Main", bundle: nil) + .instantiateViewController(withIdentifier: "TabBarViewController") + as? TabBarViewController + else { + NSLog("TabBarViewController not intialized") + return + } - addChildViewController(tabVC, layout: { - tabVC.view.constrain(toSuperviewEdges: nil) - tabVC.view.alpha = 0 - tabVC.view.layoutIfNeeded() - }) + tabVC.store = store + tabVC.walletManager = walletManager + tabVC.userIsMoonPaySupported = userIsMoonPaySupported - UIView.animate(withDuration: 0.3, delay: 0.1, options: .transitionCrossDissolve, animations: { - tabVC.view.alpha = 1 - }) { _ in - NSLog("US MainView Controller presented") - } + addChildViewController(tabVC, layout: { + tabVC.view.constrain(toSuperviewEdges: nil) + tabVC.view.alpha = 0 + tabVC.view.layoutIfNeeded() + }) + + UIView.animate(withDuration: 0.3, delay: 0.1, options: .transitionCrossDissolve, animations: { + tabVC.view.alpha = 1 + }) { _ in + NSLog("US MainView Controller presented") + } + } else { + guard let noBuyTabVC = UIStoryboard(name: "Main", bundle: nil) + .instantiateViewController(withIdentifier: "NoBuyTabBarViewController") + as? NoBuyTabBarViewController + else { + NSLog("TabBarViewController not intialized") + return + } + + noBuyTabVC.store = store + noBuyTabVC.walletManager = walletManager + + addChildViewController(noBuyTabVC, layout: { + noBuyTabVC.view.constrain(toSuperviewEdges: nil) + noBuyTabVC.view.alpha = 0 + noBuyTabVC.view.layoutIfNeeded() + }) + UIView.animate(withDuration: 0.3, delay: 0.1, options: .transitionCrossDissolve, animations: { + noBuyTabVC.view.alpha = 1 + }) { _ in + NSLog("US MainView Controller presented") + } + } delay(4.0) { self.appDelegate.pushNotifications.registerForRemoteNotifications() } @@ -141,23 +182,21 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg } private func addAppLifecycleNotificationEvents() { - NotificationCenter.default.addObserver(forName: UIScene.didActivateNotification, object: nil, queue: nil) - { _ in - UIView.animate(withDuration: 0.1, animations: { - self.blurView.alpha = 0.0 - }, completion: { _ in - self.blurView.removeFromSuperview() - }) - } + NotificationCenter.default.addObserver(forName: UIScene.didActivateNotification, object: nil, queue: nil) { _ in + UIView.animate(withDuration: 0.1, animations: { + self.blurView.alpha = 0.0 + }, completion: { _ in + self.blurView.removeFromSuperview() + }) + } - NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, queue: nil) - { _ in - if !self.isLoginRequired, !self.store.state.isPromptingBiometrics { - self.blurView.alpha = 1.0 - self.view.addSubview(self.blurView) - self.blurView.constrain(toSuperviewEdges: nil) - } + NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, queue: nil) { _ in + if !self.isLoginRequired, !self.store.state.isPromptingBiometrics { + self.blurView.alpha = 1.0 + self.view.addSubview(self.blurView) + self.blurView.constrain(toSuperviewEdges: nil) } + } } private func showJailbreakWarnings(isJailbroken: Bool) { diff --git a/litewallet/MessageUIPresenter.swift b/litewallet/MessageUIPresenter.swift index 89cf3adbf..6094810fe 100644 --- a/litewallet/MessageUIPresenter.swift +++ b/litewallet/MessageUIPresenter.swift @@ -110,15 +110,13 @@ class MessageUIPresenter: NSObject, Trackable { } extension MessageUIPresenter: MFMailComposeViewControllerDelegate { - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) - { + func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) { dismiss(controller) } } extension MessageUIPresenter: MFMessageComposeViewControllerDelegate { - func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) - { + func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) { dismiss(controller) } } diff --git a/litewallet/ModalPresenter.swift b/litewallet/ModalPresenter.swift index 30abfb7ce..8a6ef7f5f 100644 --- a/litewallet/ModalPresenter.swift +++ b/litewallet/ModalPresenter.swift @@ -286,14 +286,6 @@ class ModalPresenter: Subscriber, Trackable { sendVC.onPublishSuccess = { [weak self] in self?.presentAlert(.sendSuccess, completion: {}) } - - sendVC.onResolvedSuccess = { [weak self] in - self?.presentAlert(.resolvedSuccess, completion: {}) - } - - sendVC.onResolutionFailure = { [weak self] failureMessage in - self?.presentFailureAlert(.failedResolution, errorMessage: failureMessage, completion: {}) - } return root } @@ -407,10 +399,9 @@ class ModalPresenter: Subscriber, Trackable { nc.setWhiteStyle() nc.delegate = myself.wipeNavigationDelegate let start = StartWipeWalletViewController { - let recover = EnterPhraseViewController(store: myself.store, walletManager: walletManager, reason: .validateForWipingWallet - { - myself.wipeWallet() - }) + let recover = EnterPhraseViewController(store: myself.store, walletManager: walletManager, reason: .validateForWipingWallet { + myself.wipeWallet() + }) nc.pushViewController(recover, animated: true) } start.addCloseNavigationItem(tintColor: .white) @@ -459,7 +450,17 @@ class ModalPresenter: Subscriber, Trackable { settingsNav.pushViewController(localeView, animated: true) }), Setting(title: S.Settings.sync.localize(), callback: { - settingsNav.pushViewController(ReScanViewController(store: self.store), animated: true) + let alert = UIAlertController(title: S.ReScan.alertTitle.localize(), message: S.ReScan.alertMessage.localize(), preferredStyle: .alert) + alert.addAction(UIAlertAction(title: S.Button.cancel.localize(), style: .default, handler: { _ in + alert.dismiss(animated: true) + })) + alert.addAction(UIAlertAction(title: S.ReScan.alertAction.localize(), style: .default, handler: { _ in + self.store.trigger(name: .rescan) + LWAnalytics.logEventWithParameters(itemName: ._20200112_DSR) + alert.dismiss(animated: true) + self.topViewController?.dismiss(animated: true) + })) + self.topViewController?.present(alert, animated: true) }), Setting(title: S.UpdatePin.updateTitle.localize(), callback: strongify(self) { myself in let updatePin = UpdatePinViewController(store: myself.store, walletManager: walletManager, type: .update) @@ -679,8 +680,7 @@ class ModalPresenter: Subscriber, Trackable { presentLoginScan() } else { LWAnalytics.logEventWithParameters(itemName: ._20210427_HCIEEH) - if let presented = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first?.rootViewController?.presentedViewController - { + if let presented = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first?.rootViewController?.presentedViewController { presented.dismiss(animated: true, completion: { self.presentLoginScan() }) @@ -797,8 +797,7 @@ class ModalPresenter: Subscriber, Trackable { } class SecurityCenterNavigationDelegate: NSObject, UINavigationControllerDelegate { - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) - { + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { guard let coordinator = navigationController.topViewController?.transitionCoordinator else { return } if coordinator.isInteractive { diff --git a/litewallet/MoonpayHelper.swift b/litewallet/MoonpayHelper.swift new file mode 100644 index 000000000..35e76a515 --- /dev/null +++ b/litewallet/MoonpayHelper.swift @@ -0,0 +1,68 @@ +import Foundation + +/// 14 Languages +enum UnsupportedCountries: Int, CaseIterable, Equatable, Identifiable { + case Afghanistan = 0 + case Barbados + case Belarus + case BurkinaFaso + case China + case Iceland + case Iraq + case Jamaica + case Japan + case Kosovo + case Liberia + case Macao + case Malaysia + case Malta + case Mongolia + case Morocco + case Myanmar + case Nicaragua + case Pakistan + case Panama + case Russia + case Senegal + case DemocraticRepCongo + case Uganda + case Ukraine + case Venezuela + case Yemen + case Zimbabwe + + var id: UnsupportedCountries { self } + + var localeCode: String { + switch self { + case .Afghanistan: return "fa_AF" + case .Barbados: return "en_BB" + case .Belarus: return "be_BY" + case .BurkinaFaso: return "fr_BF" + case .China: return "zh_CN" + case .Iceland: return "is_IS" + case .Iraq: return "ar_IQ" + case .Jamaica: return "en_JM" + case .Japan: return "jp_JP" + case .Kosovo: return "sq_XK" + case .Liberia: return "en_LR" + case .Macao: return "zh_MO" + case .Malaysia: return "ms_MY" + case .Malta: return "mt_MT" + case .Mongolia: return "mn_MN" + case .Morocco: return "ar_MA" + case .Myanmar: return "my_MM" + case .Nicaragua: return "es_NI" + case .Pakistan: return "ur_PK" + case .Panama: return "es_PA" + case .Russia: return "ru_RU" + case .Senegal: return "fr_SN" + case .DemocraticRepCongo: return "fr_CD" + case .Uganda: return "en_UG" + case .Ukraine: return "uk_UA" + case .Venezuela: return "es_VE" + case .Yemen: return "ar_YE" + case .Zimbabwe: return "en_ZW" + } + } +} diff --git a/litewallet/NoBuyTabBarViewController.swift b/litewallet/NoBuyTabBarViewController.swift new file mode 100644 index 000000000..b78189ac2 --- /dev/null +++ b/litewallet/NoBuyTabBarViewController.swift @@ -0,0 +1,419 @@ +import Foundation +import UIKit + +class NoBuyTabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDelegate { + let kInitialChildViewControllerIndex = 0 // TransactionsViewController + @IBOutlet var headerView: UIView! + @IBOutlet var containerView: UIView! + @IBOutlet var tabBar: UITabBar! + @IBOutlet var settingsButton: UIButton! + @IBOutlet var walletBalanceLabel: UILabel! + + var primaryBalanceLabel: UpdatingLabel? + var secondaryBalanceLabel: UpdatingLabel? + private let largeFontSize: CGFloat = 24.0 + private let smallFontSize: CGFloat = 12.0 + private var hasInitialized = false + private let dateFormatter = DateFormatter() + private let equalsLabel = UILabel(font: .barlowMedium(size: 12), color: .whiteTint) + private var regularConstraints: [NSLayoutConstraint] = [] + private var swappedConstraints: [NSLayoutConstraint] = [] + private let currencyTapView = UIView() + private let storyboardNames: [String] = ["Transactions", "Send", "Receive"] + var storyboardIDs: [String] = ["TransactionsViewController", "SendLTCViewController", "ReceiveLTCViewController"] + var viewControllers: [UIViewController] = [] + var activeController: UIViewController? + var updateTimer: Timer? + var store: Store? + var walletManager: WalletManager? + var userIsMoonPaySupported: Bool? + var exchangeRate: Rate? { + didSet { setBalances() } + } + + private var balance: UInt64 = 0 { + didSet { setBalances() } + } + + var isLtcSwapped: Bool? { + didSet { setBalances() } + } + + @IBAction func showSettingsAction(_: Any) { + guard let store = store + else { + NSLog("ERROR: Store not set") + return + } + store.perform(action: RootModalActions.Present(modal: .menu)) + } + + override func viewDidLoad() { + super.viewDidLoad() + setupModels() + setupViews() + configurePriceLabels() + addSubscriptions() + dateFormatter.setLocalizedDateFormatFromTemplate("MMM d, h:mm a") + + addViewControllers() + + updateTimer = Timer.scheduledTimer(withTimeInterval: 30.0, repeats: true) { _ in + self.setBalances() + } + + guard let array = tabBar.items + else { + NSLog("ERROR: no items found") + return + } + tabBar.selectedItem = array[kInitialChildViewControllerIndex] + + NotificationCenter.default.addObserver(self, selector: #selector(languageChanged), name: .languageChangedNotification, object: nil) + } + + deinit { + NotificationCenter.default.removeObserver(self, name: .languageChangedNotification, object: nil) + self.updateTimer = nil + } + + @objc + func languageChanged() { + walletBalanceLabel.text = S.ManageWallet.balance.localize() + ":" + localizeTabBar() + viewControllers = [] + addViewControllers() + guard let array = tabBar.items else { return } + tabBar.selectedItem = array[kInitialChildViewControllerIndex] + displayContentController(contentController: viewControllers[0]) + } + + func addViewControllers() { + for (index, storyboardID) in storyboardIDs.enumerated() { + if storyboardID == "BuyHostingController" && (userIsMoonPaySupported != nil) { + let hostingController = BuyHostingController() + viewControllers.append(hostingController) + } else { + let controller = UIStoryboard(name: storyboardNames[index], bundle: nil).instantiateViewController(withIdentifier: storyboardID) + viewControllers.append(controller) + } + } + } + + private func setupModels() { + guard let store = store else { return } + + isLtcSwapped = store.state.isLtcSwapped + + if let rate = store.state.currentRate { + exchangeRate = rate + let placeholderAmount = Amount(amount: 0, rate: rate, maxDigits: store.state.maxDigits) + secondaryBalanceLabel = UpdatingLabel(formatter: placeholderAmount.localFormat) + primaryBalanceLabel = UpdatingLabel(formatter: placeholderAmount.ltcFormat) + } else { + secondaryBalanceLabel = UpdatingLabel(formatter: NumberFormatter()) + primaryBalanceLabel = UpdatingLabel(formatter: NumberFormatter()) + } + } + + private func setupViews() { + walletBalanceLabel.text = S.ManageWallet.balance.localize() + ":" + + headerView.backgroundColor = .liteWalletBlue + tabBar.barTintColor = .liteWalletBlue + containerView.backgroundColor = .liteWalletBlue + view.backgroundColor = .liteWalletBlue + } + + private func configurePriceLabels() { + // TODO: Debug the reizing of label...very important + guard let primaryLabel = primaryBalanceLabel, + let secondaryLabel = secondaryBalanceLabel + else { + NSLog("ERROR: Price labels not initialized") + return + } + + let priceLabelArray = [primaryBalanceLabel, secondaryBalanceLabel, equalsLabel] + + for (_, view) in priceLabelArray.enumerated() { + view?.backgroundColor = .clear + view?.textColor = .white + } + + primaryLabel.font = UIFont.barlowSemiBold(size: largeFontSize) + secondaryLabel.font = UIFont.barlowSemiBold(size: largeFontSize) + + equalsLabel.text = "=" + headerView.addSubview(primaryLabel) + headerView.addSubview(secondaryLabel) + headerView.addSubview(equalsLabel) + headerView.addSubview(currencyTapView) + + secondaryLabel.constrain([ + secondaryLabel.constraint(.firstBaseline, toView: primaryLabel, constant: 0.0), + ]) + + equalsLabel.translatesAutoresizingMaskIntoConstraints = false + primaryLabel.translatesAutoresizingMaskIntoConstraints = false + regularConstraints = [ + primaryLabel.firstBaselineAnchor.constraint(equalTo: headerView.bottomAnchor, constant: -12), + primaryLabel.leadingAnchor.constraint(equalTo: headerView.leadingAnchor, constant: C.padding[1] * 1.25), + equalsLabel.firstBaselineAnchor.constraint(equalTo: primaryLabel.firstBaselineAnchor, constant: 0), + equalsLabel.leadingAnchor.constraint(equalTo: primaryLabel.trailingAnchor, constant: C.padding[1] / 2.0), + secondaryLabel.leadingAnchor.constraint(equalTo: equalsLabel.trailingAnchor, constant: C.padding[1] / 2.0), + ] + + swappedConstraints = [ + secondaryLabel.firstBaselineAnchor.constraint(equalTo: headerView.bottomAnchor, constant: -12), + secondaryLabel.leadingAnchor.constraint(equalTo: headerView.leadingAnchor, constant: C.padding[1] * 1.25), + equalsLabel.firstBaselineAnchor.constraint(equalTo: secondaryLabel.firstBaselineAnchor, constant: 0), + equalsLabel.leadingAnchor.constraint(equalTo: secondaryLabel.trailingAnchor, constant: C.padding[1] / 2.0), + primaryLabel.leadingAnchor.constraint(equalTo: equalsLabel.trailingAnchor, constant: C.padding[1] / 2.0), + ] + + if let isLTCSwapped = isLtcSwapped { + NSLayoutConstraint.activate(isLTCSwapped ? swappedConstraints : regularConstraints) + } + + currencyTapView.constrain([ + currencyTapView.leadingAnchor.constraint(equalTo: headerView.leadingAnchor, constant: 0), + currencyTapView.trailingAnchor.constraint(equalTo: settingsButton.leadingAnchor, constant: -C.padding[5]), + currencyTapView.topAnchor.constraint(equalTo: primaryLabel.topAnchor, constant: 0), + currencyTapView.bottomAnchor.constraint(equalTo: primaryLabel.bottomAnchor, constant: C.padding[1]), + ]) + + let gr = UITapGestureRecognizer(target: self, action: #selector(currencySwitchTapped)) + currencyTapView.addGestureRecognizer(gr) + } + + // MARK: - Adding Subscriptions + + private func addSubscriptions() { + guard let store = store + else { + NSLog("ERROR - Store not passed") + return + } + + guard let primaryLabel = primaryBalanceLabel, + let secondaryLabel = secondaryBalanceLabel + else { + NSLog("ERROR: Price labels not initialized") + return + } + + store.subscribe(self, selector: { $0.walletState.syncProgress != $1.walletState.syncProgress }, + callback: { _ in + self.tabBar.selectedItem = self.tabBar.items?.first + }) + + store.lazySubscribe(self, + selector: { $0.isLtcSwapped != $1.isLtcSwapped }, + callback: { self.isLtcSwapped = $0.isLtcSwapped }) + store.lazySubscribe(self, + selector: { $0.currentRate != $1.currentRate }, + callback: { + if let rate = $0.currentRate { + let placeholderAmount = Amount(amount: 0, rate: rate, maxDigits: $0.maxDigits) + secondaryLabel.formatter = placeholderAmount.localFormat + primaryLabel.formatter = placeholderAmount.ltcFormat + } + self.exchangeRate = $0.currentRate + }) + + store.lazySubscribe(self, + selector: { $0.maxDigits != $1.maxDigits }, + callback: { + if let rate = $0.currentRate { + let placeholderAmount = Amount(amount: 0, rate: rate, maxDigits: $0.maxDigits) + secondaryLabel.formatter = placeholderAmount.localFormat + primaryLabel.formatter = placeholderAmount.ltcFormat + self.setBalances() + } + }) + + store.subscribe(self, + selector: { $0.walletState.balance != $1.walletState.balance }, + callback: { state in + if let balance = state.walletState.balance { + self.balance = balance + self.setBalances() + } + }) + } + + /// This is called when the price changes + private func setBalances() { + guard let rate = exchangeRate, let store = store, let isLTCSwapped = isLtcSwapped + else { + NSLog("ERROR: Rate, Store not initialized") + return + } + guard let primaryLabel = primaryBalanceLabel, + let secondaryLabel = secondaryBalanceLabel + else { + NSLog("ERROR: Price labels not initialized") + return + } + + let amount = Amount(amount: balance, rate: rate, maxDigits: store.state.maxDigits) + + if !hasInitialized { + let amount = Amount(amount: balance, rate: exchangeRate!, maxDigits: store.state.maxDigits) + NSLayoutConstraint.deactivate(isLTCSwapped ? regularConstraints : swappedConstraints) + NSLayoutConstraint.activate(isLTCSwapped ? swappedConstraints : regularConstraints) + primaryLabel.setValue(amount.amountForLtcFormat) + secondaryLabel.setValue(amount.localAmount) + if isLTCSwapped { + primaryLabel.transform = transform(forView: primaryLabel) + } else { + secondaryLabel.transform = transform(forView: secondaryLabel) + } + hasInitialized = true + } else { + if primaryLabel.isHidden { + primaryLabel.isHidden = false + } + + if secondaryLabel.isHidden { + secondaryLabel.isHidden = false + } + } + + primaryLabel.setValue(amount.amountForLtcFormat) + secondaryLabel.setValue(amount.localAmount) + + if !isLTCSwapped { + primaryLabel.transform = .identity + secondaryLabel.transform = transform(forView: secondaryLabel) + } else { + secondaryLabel.transform = .identity + primaryLabel.transform = transform(forView: primaryLabel) + } + } + + /// Transform LTC and Fiat Balances + /// - Parameter forView: Views + /// - Returns: the inverse transform + private func transform(forView: UIView) -> CGAffineTransform { + forView.transform = .identity + let scaleFactor: CGFloat = smallFontSize / largeFontSize + let deltaX = forView.frame.width * (1 - scaleFactor) + let deltaY = forView.frame.height * (1 - scaleFactor) + let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor) + return scale.translatedBy(x: -deltaX, y: deltaY / 2.0) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + localizeTabBar() + } + + func localizeTabBar() { + guard let array = tabBar.items + else { + NSLog("ERROR: no items found") + return + } + + for item in array { + switch item.tag { + case 0: item.title = S.History.barItemTitle.localize() + case 1: item.title = S.Send.barItemTitle.localize() + case 2: item.title = S.Receive.barItemTitle.localize() + default: + item.title = "NO-TITLE" + NSLog("ERROR: UITabbar item count is wrong") + } + } + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + displayContentController(contentController: viewControllers[kInitialChildViewControllerIndex]) + } + + func displayContentController(contentController: UIViewController) { + // MARK: - Tab View Controllers Configuration + + switch NSStringFromClass(contentController.classForCoder) { + case "litewallet.TransactionsViewController": + + guard let transactionVC = contentController as? TransactionsViewController + else { + return + } + + transactionVC.store = store + transactionVC.walletManager = walletManager + transactionVC.isLtcSwapped = store?.state.isLtcSwapped + + case "litewallet.SendLTCViewController": + guard let sendVC = contentController as? SendLTCViewController + else { + return + } + + sendVC.store = store + + case "litewallet.ReceiveLTCViewController": + guard let receiveVC = contentController as? ReceiveLTCViewController + else { + return + } + receiveVC.store = store + + default: + fatalError("Tab viewController not set") + } + exchangeRate = TransactionManager.sharedInstance.rate + + addChild(contentController) + contentController.view.frame = containerView.frame + view.addSubview(contentController.view) + contentController.didMove(toParent: self) + activeController = contentController + } + + func hideContentController(contentController: UIViewController) { + contentController.willMove(toParent: nil) + contentController.view.removeFromSuperview() + contentController.removeFromParent() + } + + func tabBar(_: UITabBar, didSelect item: UITabBarItem) { + if let tempActiveController = activeController { + hideContentController(contentController: tempActiveController) + } + + // DEV: This happens because it relies on the tab in the storyboard tag + displayContentController(contentController: viewControllers[item.tag]) + } +} + +extension NoBuyTabBarViewController { + @objc private func currencySwitchTapped() { + view.layoutIfNeeded() + guard let store = store else { return } + guard let isLTCSwapped = isLtcSwapped else { return } + guard let primaryLabel = primaryBalanceLabel, + let secondaryLabel = secondaryBalanceLabel + else { + NSLog("ERROR: Price labels not initialized") + return + } + + UIView.spring(0.7, animations: { + primaryLabel.transform = primaryLabel.transform.isIdentity ? self.transform(forView: primaryLabel) : .identity + secondaryLabel.transform = secondaryLabel.transform.isIdentity ? self.transform(forView: secondaryLabel) : .identity + NSLayoutConstraint.deactivate(!isLTCSwapped ? self.regularConstraints : self.swappedConstraints) + NSLayoutConstraint.activate(!isLTCSwapped ? self.swappedConstraints : self.regularConstraints) + self.view.layoutIfNeeded() + + LWAnalytics.logEventWithParameters(itemName: ._20200207_DTHB) + + }) { _ in } + store.perform(action: CurrencyChange.toggle()) + } +} diff --git a/litewallet/PartnerData.swift b/litewallet/PartnerData.swift index c867dc892..0b3fbc925 100644 --- a/litewallet/PartnerData.swift +++ b/litewallet/PartnerData.swift @@ -6,7 +6,6 @@ enum PartnerName { case litewalletOps case litewalletStart case pusher - case pusherStaging } struct Partner { @@ -55,7 +54,6 @@ struct Partner { } case .litewalletOps: - if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], let opsArray = dictionary["litewallet-ops"] as? [String] { @@ -67,6 +65,7 @@ struct Partner { LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) return errorDescription } + case .litewalletStart: if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], @@ -90,19 +89,6 @@ struct Partner { LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) return errorDescription } - - case .pusherStaging: - - if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], - let key = dictionary["pusher-staging-instance-id"] as? String - { - return key - } else { - let errorDescription = "error_pusher_id_key" - - LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) - return errorDescription - } } } diff --git a/litewallet/PaymentProtocol.swift b/litewallet/PaymentProtocol.swift index 2f21ce87e..8c5b5f11b 100644 --- a/litewallet/PaymentProtocol.swift +++ b/litewallet/PaymentProtocol.swift @@ -2,10 +2,10 @@ import BRCore import Foundation class PaymentProtocolDetails { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -68,13 +68,13 @@ class PaymentProtocolDetails { } class PaymentProtocolRequest { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool private var cName: String? private var errMsg: String? private var didValidate: Bool = false - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -233,10 +233,10 @@ class PaymentProtocolRequest { } class PaymentProtocolPayment { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -274,8 +274,7 @@ class PaymentProtocolPayment { return [BRTxRef?](UnsafeBufferPointer(start: cPtr.pointee.transactions, count: cPtr.pointee.txCount)) } - var refundTo: [BRTxOutput] - { // where to send refunds, if a refund is necessary, refundTo[n].amount defaults to 0 + var refundTo: [BRTxOutput] { // where to send refunds, if a refund is necessary, refundTo[n].amount defaults to 0 return [BRTxOutput](UnsafeBufferPointer(start: cPtr.pointee.refundTo, count: cPtr.pointee.refundToCount)) } @@ -290,10 +289,10 @@ class PaymentProtocolPayment { } class PaymentProtocolACK { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } diff --git a/litewallet/PaymentRequest.swift b/litewallet/PaymentRequest.swift index 5e56db0ef..b498344a4 100644 --- a/litewallet/PaymentRequest.swift +++ b/litewallet/PaymentRequest.swift @@ -8,8 +8,7 @@ enum PaymentRequestType { struct PaymentRequest { init?(string: String) { - if var url = NSURL(string: string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).replacingOccurrences(of: " ", with: "%20")) - { + if var url = NSURL(string: string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).replacingOccurrences(of: " ", with: "%20")) { if let scheme = url.scheme, let resourceSpecifier = url.resourceSpecifier, url.host == nil { url = NSURL(string: "\(scheme)://\(resourceSpecifier)")! diff --git a/litewallet/PinDigitView.swift b/litewallet/PinDigitView.swift index 5b68de505..2453776d9 100644 --- a/litewallet/PinDigitView.swift +++ b/litewallet/PinDigitView.swift @@ -38,6 +38,7 @@ struct PinDigitView: View { /// Inspired by https://stackoverflow.com/questions/72926965/creating-an-ios-passcode-view-with-swiftui-how-to-hide-a-textview import SwiftUI + struct PasscodeView: View { @EnvironmentObject var viewModel: StartViewModel diff --git a/litewallet/Platform/BRAPIClient.swift b/litewallet/Platform/BRAPIClient.swift index 0e49f977f..d811c5436 100644 --- a/litewallet/Platform/BRAPIClient.swift +++ b/litewallet/Platform/BRAPIClient.swift @@ -278,8 +278,7 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR // MARK: URLSession Delegate - public func urlSession(_: URLSession, task _: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) - { + public func urlSession(_: URLSession, task _: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if challenge.protectionSpace.host == host, challenge.protectionSpace.serverTrust != nil { log("URLSession challenge accepted!") @@ -292,11 +291,9 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR } } - public func urlSession(_: URLSession, task: URLSessionTask, willPerformHTTPRedirection _: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) - { + public func urlSession(_: URLSession, task: URLSessionTask, willPerformHTTPRedirection _: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { var actualRequest = request - if let currentReq = task.currentRequest, var curHost = currentReq.url?.host, let curScheme = currentReq.url?.scheme - { + if let currentReq = task.currentRequest, var curHost = currentReq.url?.host, let curScheme = currentReq.url?.scheme { if let curPort = currentReq.url?.port, curPort != 443, curPort != 80 { curHost = "\(curHost):\(curPort)" } @@ -304,8 +301,7 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR // follow the redirect if we're interacting with our API actualRequest = decorateRequest(request) log("redirecting \(String(describing: currentReq.url)) to \(String(describing: request.url))") - if let curAuth = currentReq.allHTTPHeaderFields?["Authorization"], curAuth.hasPrefix("Litewallet") - { + if let curAuth = currentReq.allHTTPHeaderFields?["Authorization"], curAuth.hasPrefix("Litewallet") { // add authentication because the previous request was authenticated log("adding authentication to redirected request") actualRequest = signRequest(actualRequest) diff --git a/litewallet/Platform/BRActivityView.swift b/litewallet/Platform/BRActivityView.swift index c9daaacdc..883490dbf 100644 --- a/litewallet/Platform/BRActivityView.swift +++ b/litewallet/Platform/BRActivityView.swift @@ -7,10 +7,6 @@ class BRActivityViewController: UIViewController { super.init(nibName: nil, bundle: nil) modalTransitionStyle = .crossDissolve - if #available(iOS 8.0, *) { - modalPresentationStyle = .overFullScreen - } - activityView.messageLabel.text = message view = activityView } diff --git a/litewallet/Platform/BRReplicatedKVStore.swift b/litewallet/Platform/BRReplicatedKVStore.swift index bad0eca03..eb3b2a3a8 100644 --- a/litewallet/Platform/BRReplicatedKVStore.swift +++ b/litewallet/Platform/BRReplicatedKVStore.swift @@ -13,6 +13,12 @@ public enum BRReplicatedKVStoreError: Error { case malformedData } +/// MakeTransactionError: Error +public enum MakeTransactionError: Error { + case replicatedKVStoreNotFound + case rateNotFound +} + public enum BRRemoteKVStoreError: Error { case notFound case conflict @@ -203,7 +209,7 @@ open class BRReplicatedKVStore: NSObject { deleted = sqlite3_column_int(stmt, 3) > 0 ret = Array(UnsafeBufferPointer(start: blob?.assumingMemoryBound(to: UInt8.self), count: Int(blobLength))) } - return (curVer, time, deleted, encrypted ? try decrypt(ret) : ret) + return try (curVer, time, deleted, encrypted ? decrypt(ret) : ret) } /// Set the value of a key locally in the database. If syncImmediately is true (the default) then immediately @@ -330,8 +336,7 @@ open class BRReplicatedKVStore: NSObject { //// return 0 // } - func remoteVersion(_ key: String) throws -> Int - { // this would be UInt64.. but it makes the compiler crash + func remoteVersion(_ key: String) throws -> Int { // this would be UInt64.. but it makes the compiler crash try checkKey(key) var ret: UInt64 = 0 try txn { @@ -737,11 +742,10 @@ open class BRReplicatedKVStore: NSObject { gettimeofday(&tv, nil) var t = UInt64(tv.tv_usec) * 1_000_000 + UInt64(tv.tv_usec) let p = [UInt8](repeating: 0, count: 4) - return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes - { (dat: UnsafePointer) -> [UInt8] in - let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) - return p + Array(buf) - } + return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes { (dat: UnsafePointer) -> [UInt8] in + let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) + return p + Array(buf) + } } fileprivate func log(_ s: String) { diff --git a/litewallet/Platform/BRTar.swift b/litewallet/Platform/BRTar.swift index 027a6be5f..59b10f0b1 100644 --- a/litewallet/Platform/BRTar.swift +++ b/litewallet/Platform/BRTar.swift @@ -137,8 +137,7 @@ class BRTar { } } - fileprivate static func readTypeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> BRTarType - { + fileprivate static func readTypeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> BRTarType { log("reading type at location \(location)") handle.seek(toFileOffset: location + tarTypePosition) let typeDat = handle.readData(ofLength: 1) @@ -147,8 +146,7 @@ class BRTar { return ret } - fileprivate static func readNameAtLocation(_ location: UInt64, fromHandle handle: FileHandle) throws -> String - { + fileprivate static func readNameAtLocation(_ location: UInt64, fromHandle handle: FileHandle) throws -> String { handle.seek(toFileOffset: location + tarNamePosition) let dat = handle.readData(ofLength: Int(tarNameSize)) guard let ret = String(bytes: dat, encoding: String.Encoding.ascii) @@ -159,8 +157,7 @@ class BRTar { return ret } - fileprivate static func readSizeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> UInt64 - { + fileprivate static func readSizeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> UInt64 { handle.seek(toFileOffset: location + tarSizePosition) let sizeDat = handle.readData(ofLength: Int(tarSizeSize)) let octal = NSString(data: sizeDat, encoding: String.Encoding.ascii.rawValue)! diff --git a/litewallet/Platform/BRWebViewController.swift b/litewallet/Platform/BRWebViewController.swift index f92dd38ed..8319d1141 100644 --- a/litewallet/Platform/BRWebViewController.swift +++ b/litewallet/Platform/BRWebViewController.swift @@ -3,8 +3,7 @@ import UIKit import WebKit @available(iOS 8.0, *) -@objc open class BRWebViewController: UIViewController, WKNavigationDelegate, BRWebSocketClient, WKScriptMessageHandler -{ +@objc open class BRWebViewController: UIViewController, WKNavigationDelegate, BRWebSocketClient, WKScriptMessageHandler { var wkProcessPool: WKProcessPool var webView: WKWebView? var server = BRHTTPServer() @@ -30,8 +29,7 @@ import WebKit return URL(string: "http://127.0.0.1:\(server.port)\(mountPoint)")! } - init(partner: String?, mountPoint: String = "/", walletManager: WalletManager, store: Store, noAuthApiClient: BRAPIClient? = nil) - { + init(partner: String?, mountPoint: String = "/", walletManager: WalletManager, store: Store, noAuthApiClient: BRAPIClient? = nil) { wkProcessPool = WKProcessPool() self.mountPoint = mountPoint self.walletManager = walletManager @@ -79,20 +77,18 @@ import WebKit view.addSubview(webView!) let center = NotificationCenter.default - center.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) - { [weak self] _ in - self?.didAppear = true - if let info = self?.webViewInfo { - self?.sendToAllSockets(data: info) - } + center.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in + self?.didAppear = true + if let info = self?.webViewInfo { + self?.sendToAllSockets(data: info) } - center.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: .main) - { [weak self] _ in - self?.didAppear = false - if let info = self?.webViewInfo { - self?.sendToAllSockets(data: info) - } + } + center.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: .main) { [weak self] _ in + self?.didAppear = false + if let info = self?.webViewInfo { + self?.sendToAllSockets(data: info) } + } activityIndicator.activityIndicatorViewStyle = .white activityIndicator.color = .darkGray @@ -154,8 +150,7 @@ import WebKit activityIndicator.isHidden = true } - public func userContentController(_: WKUserContentController, didReceive message: WKScriptMessage) - { + public func userContentController(_: WKUserContentController, didReceive message: WKScriptMessage) { guard let response = message.body as? String else { return } let URLString = URL(string: "https://checkout.simplexcc.com/payments/new") diff --git a/litewallet/Platform/Extensions.swift b/litewallet/Platform/Extensions.swift index b79051f57..60e497dd4 100644 --- a/litewallet/Platform/Extensions.swift +++ b/litewallet/Platform/Extensions.swift @@ -1,5 +1,6 @@ import BRCore import Foundation + // import libbz2 import UIKit @@ -23,8 +24,7 @@ public extension String { } static var urlQuoteCharacterSet: CharacterSet { - if let cset = (NSMutableCharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as? NSMutableCharacterSet - { + if let cset = (NSMutableCharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as? NSMutableCharacterSet { cset.removeCharacters(in: "?=&") return cset as CharacterSet } @@ -40,17 +40,16 @@ public extension String { var result = Data(count: 128 / 8) let resultCount = result.count - return result.withUnsafeMutableBytes - { (resultBytes: UnsafeMutablePointer) -> String in - data.withUnsafeBytes { dataBytes in - BRMD5(resultBytes, dataBytes, data.count) - } - var hash = String() - for i in 0 ..< resultCount { - hash = hash.appendingFormat("%02x", resultBytes[i]) - } - return hash + return result.withUnsafeMutableBytes { (resultBytes: UnsafeMutablePointer) -> String in + data.withUnsafeBytes { dataBytes in + BRMD5(resultBytes, dataBytes, data.count) + } + var hash = String() + for i in 0 ..< resultCount { + hash = hash.appendingFormat("%02x", resultBytes[i]) } + return hash + } } func base58DecodedData() -> Data { @@ -287,30 +286,27 @@ public extension Data { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt8 in - ptr.pointee - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt8 in + ptr.pointee + } } func uInt32(atOffset offset: UInt) -> UInt32 { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt32 in - CFSwapInt32LittleToHost(ptr.pointee) - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt32 in + CFSwapInt32LittleToHost(ptr.pointee) + } } func uInt64(atOffset offset: UInt) -> UInt64 { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt64 in - CFSwapInt64LittleToHost(ptr.pointee) - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt64 in + CFSwapInt64LittleToHost(ptr.pointee) + } } func compactSign(key: BRKey) -> Data { @@ -327,11 +323,10 @@ public extension Data { gettimeofday(&tv, nil) var t = UInt64(tv.tv_usec) * 1_000_000 + UInt64(tv.tv_usec) let p = [UInt8](repeating: 0, count: 4) - return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes - { (dat: UnsafePointer) -> [UInt8] in - let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) - return p + Array(buf) - } + return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes { (dat: UnsafePointer) -> [UInt8] in + let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) + return p + Array(buf) + } } func chacha20Poly1305AEADEncrypt(key: BRKey) -> Data { @@ -399,8 +394,7 @@ public extension Date { // this is lifted from: https://github.com/Fykec/NSDate-RFC1123/blob/master/NSDate%2BRFC1123.swift // Copyright © 2015 Foster Yin. All rights reserved. - fileprivate static func cachedThreadLocalObjectWithKey(_ key: String, create: () -> T) -> T - { + fileprivate static func cachedThreadLocalObjectWithKey(_ key: String, create: () -> T) -> T { let threadDictionary = Thread.current.threadDictionary if let cachedObject = threadDictionary[key] as! T? { return cachedObject diff --git a/litewallet/Platform/TxMetaData.swift b/litewallet/Platform/TxMetaData.swift index 013289982..45bf54b4e 100644 --- a/litewallet/Platform/TxMetaData.swift +++ b/litewallet/Platform/TxMetaData.swift @@ -52,7 +52,7 @@ open class TxMetaData: BRKVStoreObject, BRCoding { var del: Bool var bytes: [UInt8] - print("[BRTxMetadataObject] find \(txHash.txKey)") + print("[BRTxMetadataObject] find txHash \(txHash.txKey)") do { (ver, date, del, bytes) = try store.get(txHash.txKey) let bytesDat = Data(bytes: &bytes, count: bytes.count) @@ -72,7 +72,7 @@ open class TxMetaData: BRKVStoreObject, BRCoding { var del: Bool var bytes: [UInt8] - print("[BRTxMetadataObject] find \(txKey)") + print("[BRTxMetadataObject] find txKey \(txKey)") do { (ver, date, del, bytes) = try store.get(txKey) let bytesDat = Data(bytes: &bytes, count: bytes.count) diff --git a/litewallet/PromptTableViewCell.swift b/litewallet/PromptTableViewCell.swift index dca49aef4..803ac80f0 100644 --- a/litewallet/PromptTableViewCell.swift +++ b/litewallet/PromptTableViewCell.swift @@ -28,9 +28,7 @@ enum PromptType { case noPasscode case shareData - static var defaultOrder: [PromptType] = { - [.recommendRescan, .upgradePin, .paperKey, .noPasscode, .biometrics, .shareData] - }() + static var defaultOrder: [PromptType] = [.recommendRescan, .upgradePin, .paperKey, .noPasscode, .biometrics, .shareData] var title: String { switch self { diff --git a/litewallet/ReachabilityMonitor.swift b/litewallet/ReachabilityMonitor.swift index 7e0ede5cd..f6cef3a29 100644 --- a/litewallet/ReachabilityMonitor.swift +++ b/litewallet/ReachabilityMonitor.swift @@ -1,8 +1,7 @@ import Foundation import SystemConfiguration -private func callback(reachability _: SCNetworkReachability, flags _: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) -{ +private func callback(reachability _: SCNetworkReachability, flags _: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) { guard let info = info else { return } let reachability = Unmanaged.fromOpaque(info).takeUnretainedValue() reachability.notify() @@ -40,8 +39,7 @@ class ReachabilityMonitor: Trackable { private var flags: SCNetworkReachabilityFlags { var flags = SCNetworkReachabilityFlags(rawValue: 0) - if let reachability = networkReachability, withUnsafeMutablePointer(to: &flags, { SCNetworkReachabilityGetFlags(reachability, UnsafeMutablePointer($0)) }) == true - { + if let reachability = networkReachability, withUnsafeMutablePointer(to: &flags, { SCNetworkReachabilityGetFlags(reachability, UnsafeMutablePointer($0)) }) == true { return flags } else { return [] diff --git a/litewallet/ReceiveLTCViewController.swift b/litewallet/ReceiveLTCViewController.swift index 0c95385df..e22cfbba5 100644 --- a/litewallet/ReceiveLTCViewController.swift +++ b/litewallet/ReceiveLTCViewController.swift @@ -1,14 +1,5 @@ import UIKit -struct WalletAddressData { - var address: String - var qrCode: UIImage - var balance: Double - var balanceText: String { - String(balance) + " Ł" - } -} - class ReceiveLTCViewController: UIViewController { var store: Store? override func viewDidLoad() { diff --git a/litewallet/RequestAmountViewController.swift b/litewallet/RequestAmountViewController.swift index cb865c340..052d74947 100644 --- a/litewallet/RequestAmountViewController.swift +++ b/litewallet/RequestAmountViewController.swift @@ -192,8 +192,7 @@ class RequestAmountViewController: UIViewController { presentText?(text, qrCode.image!) } - private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) - { + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) { share.isEnabled = false address.isUserInteractionEnabled = false diff --git a/litewallet/Sender.swift b/litewallet/Sender.swift index 24bfae742..763c73a01 100644 --- a/litewallet/Sender.swift +++ b/litewallet/Sender.swift @@ -88,8 +88,8 @@ class Sender { self.comment = comment self.feePerKb = feePerKb - if UserDefaults.isBiometricsEnabled && - walletManager.canUseBiometrics(forTx: tx) + if UserDefaults.isBiometricsEnabled, + walletManager.canUseBiometrics(forTx: tx) { DispatchQueue.walletQueue.async { [weak self] in guard let myself = self else { return } diff --git a/litewallet/SimpleRedux.swift b/litewallet/SimpleRedux.swift index 1482ceda4..9294681b3 100644 --- a/litewallet/SimpleRedux.swift +++ b/litewallet/SimpleRedux.swift @@ -131,15 +131,13 @@ class Store { // Subscription callback is immediately called with current State value on subscription // and then any time the selected value changes - func subscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) - { + func subscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) { lazySubscribe(subscriber, selector: selector, callback: callback) callback(state) } // Same as subscribe(), but doesn't call the callback with current state upon subscription - func lazySubscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) - { + func lazySubscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) { let key = subscriber.hashValue let subscription = Subscription(selector: selector, callback: callback) if subscriptions[key] != nil { @@ -149,8 +147,7 @@ class Store { } } - func subscribe(_ subscriber: Subscriber, name: TriggerName, callback: @escaping (TriggerName?) -> Void) - { + func subscribe(_ subscriber: Subscriber, name: TriggerName, callback: @escaping (TriggerName?) -> Void) { let key = subscriber.hashValue let trigger = Trigger(name: name, callback: callback) if triggers[key] != nil { diff --git a/litewallet/StartNavigationDelegate.swift b/litewallet/StartNavigationDelegate.swift index c6d54b5d4..8ac4726cb 100644 --- a/litewallet/StartNavigationDelegate.swift +++ b/litewallet/StartNavigationDelegate.swift @@ -7,8 +7,7 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { self.store = store } - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) - { + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { if viewController is RecoverWalletIntroViewController { navigationController.navigationBar.tintColor = .white navigationController.navigationBar.titleTextAttributes = [ diff --git a/litewallet/StartView.swift b/litewallet/StartView.swift index 3525f5cb8..2c85254a0 100644 --- a/litewallet/StartView.swift +++ b/litewallet/StartView.swift @@ -118,20 +118,23 @@ struct StartView: View { alignment: .center) .alert(startViewModel .alertMessage[startViewModel.currentLanguage.rawValue], - isPresented: $delayedSelect) { - HStack { - Button(startViewModel - .yesLabel[startViewModel.currentLanguage.rawValue], role: .cancel) { - // Changes and Dismisses - startViewModel.setLanguage(code: startViewModel.currentLanguage.code) - selectedLang = false - } - Button(startViewModel - .cancelLabel[startViewModel.currentLanguage.rawValue], role: .destructive) { - // Dismisses - selectedLang = false - } + isPresented: $delayedSelect) + { + HStack { + Button(startViewModel + .yesLabel[startViewModel.currentLanguage.rawValue], role: .cancel) + { + // Changes and Dismisses + startViewModel.setLanguage(code: startViewModel.currentLanguage.code) + selectedLang = false } + Button(startViewModel + .cancelLabel[startViewModel.currentLanguage.rawValue], role: .destructive) + { + // Dismisses + selectedLang = false + } + } } Spacer() NavigationLink(destination: diff --git a/litewallet/StartViewModel.swift b/litewallet/StartViewModel.swift index ef96a30bd..c45a68524 100644 --- a/litewallet/StartViewModel.swift +++ b/litewallet/StartViewModel.swift @@ -48,6 +48,8 @@ class StartViewModel: ObservableObject { self.walletManager = walletManager staticTagline = taglines[0] + // loadResourcesWithTag(tags: audioTagArray) + // checkForWalletAndSync() } @@ -66,43 +68,29 @@ class StartViewModel: ObservableObject { didTapRecover = completion } - private func checkForWalletAndSync() { - /// Test seed count - guard seedWords.count == 12 else { return } - - /// Set for default. This model needs a initial value - walletManager.forceSetPin(newPin: Partner.partnerKeyPath(name: .litewalletStart)) - - guard walletManager.setRandomSeedPhrase() != nil else { - walletCreationDidFail = true - let properties: [String: String] = ["error_message": "wallet_creation_fail"] - LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) - return - } - - store.perform(action: WalletChange.setWalletCreationDate(Date())) - DispatchQueue.walletQueue.async { - self.walletManager.peerManager?.connect() - DispatchQueue.main.async { - self.store.trigger(name: .didCreateOrRecoverWallet) - } - } - } - - func updateHeader() { - switch tappedIndex { - case 0: - headerTitle = S.CreateStep.MainTitle.intro.localize() - case 1: - headerTitle = S.CreateStep.MainTitle.checkboxes.localize() - case 2: - headerTitle = S.CreateStep.MainTitle.seedPhrase.localize() - case 3: - headerTitle = S.CreateStep.MainTitle.finished.localize() - default: - headerTitle = S.CreateStep.MainTitle.intro.localize() - } - } + /// DEV: For checking wallet +// private func checkForWalletAndSync() { +// /// Test seed count +// guard seedWords.count == 12 else { return } +// +// /// Set for default. This model needs a initial value +// walletManager.forceSetPin(newPin: Partner.partnerKeyPath(name: .litewalletStart)) +// +// guard walletManager.setRandomSeedPhrase() != nil else { +// walletCreationDidFail = true +// let properties = ["error_message": "wallet_creation_fail"] +// LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) +// return +// } +// +// store.perform(action: WalletChange.setWalletCreationDate(Date())) +// DispatchQueue.walletQueue.async { +// self.walletManager.peerManager?.connect() +// DispatchQueue.main.async { +// self.store.trigger(name: .didCreateOrRecoverWallet) +// } +// } +// } func speakLanguage() { if let url = Bundle.main.url(forResource: currentLanguage.voiceFilename, withExtension: "mp3") { @@ -129,10 +117,6 @@ class StartViewModel: ObservableObject { } } - func generateNewSeedPhrase() -> [String] { - return [""] - } - // MARK: - Lengthy elements /// Set these to the bottom to make the others more readable @@ -205,38 +189,39 @@ class StartViewModel: ObservableObject { "Скасувати", ] - func stringToCurrentLanguage(languageString: String) -> LanguageSelection { - switch languageString { - case "English": - return LanguageSelection(rawValue: 0)! - case "中國人": - return LanguageSelection(rawValue: 1)! - case "中国人": - return LanguageSelection(rawValue: 2)! - case "Français": - return LanguageSelection(rawValue: 3)! - case "Deutsch": - return LanguageSelection(rawValue: 4)! - case "Bahasa Indonesia": - return LanguageSelection(rawValue: 5)! - case "Italiano": - return LanguageSelection(rawValue: 6)! - case "日本語": - return LanguageSelection(rawValue: 7)! - case "한국인": - return LanguageSelection(rawValue: 8)! - case "Português": - return LanguageSelection(rawValue: 9)! - case "Русский": - return LanguageSelection(rawValue: 10)! - case "Español": - return LanguageSelection(rawValue: 11)! - case "Türkçe": - return LanguageSelection(rawValue: 12)! - case "українська": - return LanguageSelection(rawValue: 13)! - default: - return LanguageSelection(rawValue: 0)! - } - } + /// DEV: For debugging +// func stringToCurrentLanguage(languageString: String) -> LanguageSelection { +// switch languageString { +// case "English": +// return LanguageSelection(rawValue: 0)! +// case "中國人": +// return LanguageSelection(rawValue: 1)! +// case "中国人": +// return LanguageSelection(rawValue: 2)! +// case "Français": +// return LanguageSelection(rawValue: 3)! +// case "Deutsch": +// return LanguageSelection(rawValue: 4)! +// case "Bahasa Indonesia": +// return LanguageSelection(rawValue: 5)! +// case "Italiano": +// return LanguageSelection(rawValue: 6)! +// case "日本語": +// return LanguageSelection(rawValue: 7)! +// case "한국인": +// return LanguageSelection(rawValue: 8)! +// case "Português": +// return LanguageSelection(rawValue: 9)! +// case "Русский": +// return LanguageSelection(rawValue: 10)! +// case "Español": +// return LanguageSelection(rawValue: 11)! +// case "Türkçe": +// return LanguageSelection(rawValue: 12)! +// case "українська": +// return LanguageSelection(rawValue: 13)! +// default: +// return LanguageSelection(rawValue: 0)! +// } +// } } diff --git a/litewallet/Storyboards/Buy.storyboard b/litewallet/Storyboards/Buy.storyboard index a7ecdc068..d4ec41840 100644 --- a/litewallet/Storyboards/Buy.storyboard +++ b/litewallet/Storyboards/Buy.storyboard @@ -1,17 +1,14 @@ - + - + - - BarlowSemiCondensed-Bold - BarlowSemiCondensed-Light @@ -20,381 +17,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -500,10 +126,7 @@ - - - diff --git a/litewallet/Storyboards/Main.storyboard b/litewallet/Storyboards/Main.storyboard index c648ac707..080ef3a9d 100644 --- a/litewallet/Storyboards/Main.storyboard +++ b/litewallet/Storyboards/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -32,7 +32,8 @@ - + + @@ -118,7 +119,6 @@ - @@ -127,7 +127,7 @@ - + @@ -137,6 +137,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -145,7 +234,7 @@ - + diff --git a/litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib b/litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib index 86811b641..68dd55123 100644 --- a/litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib +++ b/litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib @@ -1,9 +1,9 @@ - + - + @@ -18,7 +18,7 @@ - + @@ -43,7 +43,7 @@ - + @@ -74,6 +74,6 @@ - + diff --git a/litewallet/Strings/Base.lproj/Localizable.strings b/litewallet/Strings/Base.lproj/Localizable.strings index d07f2e339..385d568fb 100644 --- a/litewallet/Strings/Base.lproj/Localizable.strings +++ b/litewallet/Strings/Base.lproj/Localizable.strings @@ -1069,9 +1069,6 @@ /* $53.09/L + 1.07% */ "Confirmation.amountDetailLabel" = "Exchange details:"; -/* Short Network Fee: ($1.00) */ -"Confirmation.shortFeeLabel" = "FEE:"; - /* Address label */ "Confirmation.staticAddressLabel" = "ADDRESS:"; @@ -1429,18 +1426,6 @@ /* sorry */ "Fragment.sorry" = "sorry"; -/* 2FA Error message */ -"LitecoinCard.twoFAErrorMessage" = "There was an error. Please toggle 2FA to *Enabled*, enter the emailed code, and try again."; - -/* Enter domain */ -"Send.UnstoppableDomains.simpleplaceholder" = "Enter domain"; - -/* Enter a */ -"Send.UnstoppableDomains.enterA" = "Enter a"; - -/* domain */ -"Send.UnstoppableDomains.domain" = "domain"; - /* Change language alert message */ "Settings.ChangeLanguage.alertMessage" = "Are you sure you want to change the language to %l?"; diff --git a/litewallet/Strings/it.lproj/Localizable.strings b/litewallet/Strings/it.lproj/Localizable.strings index 699d1997a..985939b1a 100755 --- a/litewallet/Strings/it.lproj/Localizable.strings +++ b/litewallet/Strings/it.lproj/Localizable.strings @@ -718,12 +718,6 @@ /* Fees: $0.01*/ "Send.fee" = "Commissioni: %1$@"; -/* Fees: $0.01*/ -"Send.fee" = "Commissioni: %1$@"; - -/* Fees Blank: */ -"Send.feeBlank" = "Commissioni:"; - /* Fees Blank: */ "Send.feeBlank" = "Commissioni:"; diff --git a/litewallet/Strings/uk.lproj/Localizable.strings b/litewallet/Strings/uk.lproj/Localizable.strings index 048c8a959..eb3b84c83 100644 --- a/litewallet/Strings/uk.lproj/Localizable.strings +++ b/litewallet/Strings/uk.lproj/Localizable.strings @@ -457,6 +457,24 @@ /* Node Selector view title */ "NodeSelector.title" = "Вузли Litecoin"; +/* "Email address label" */ +"Notifications.emailLabel" = "Адреса електронної пошти"; + +/* "Email address placeholder" */ +"Notifications.emailPlaceholder" = "Введіть тут"; + +/* "Email title" */ +"Notifications.emailTitle" = "Нічого не пропустіть!"; + +/* "Language preference label" */ +"Notifications.languagePreference" = "Бажана мова:"; + +/* "Pitch to get user to sign up" */ +"Notifications.pitchMessage" = "Підпишіться, щоб дізнаватися про оновлення та конкурси."; + +/* Signup cancel */ +"Notifications.signupCancel" = "Ні, дякую"; + /* Bad Payment request alert title */ "PaymentProtocol.Errors.badPaymentRequest" = "Поганий запит на оплату"; @@ -742,6 +760,9 @@ /* Loading request activity view message */ "Send.loadingRequest" = "Запит на завантаження"; +/* Network */ +"Send.networkFee" = "Мережа"; + /* Empty address alert message */ "Send.noAddress" = "Будь ласка, введіть адресу одержувача."; @@ -763,6 +784,9 @@ /* Send button label */ "Send.sendLabel" = "Надіслати"; +/* Service */ +"Send.serviceFee" = "Сервіс"; + /* Send modal title */ "Send.title" = "Надіслати"; @@ -1266,27 +1290,3 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d з %2$d"; - -/* "Email address label" */ -"Notifications.emailLabel" = ""; - -/* "Email address placeholder" */ -"Notifications.emailPlaceholder" = ""; - -/* "Email title" */ -"Notifications.emailTitle" = ""; - -/* "Language preference label" */ -"Notifications.languagePreference" = ""; - -/* "Pitch to get user to sign up" */ -"Notifications.pitchMessage" = ""; - -/* Signup cancel */ -"Notifications.signupCancel" = ""; - -/* Network */ -"Send.networkFee" = ""; - -/* Service */ -"Send.serviceFee" = ""; diff --git a/litewallet/SupportLitecoinFoundationView.swift b/litewallet/SupportLitecoinFoundationView.swift index fd2bce07e..1b7acb452 100644 --- a/litewallet/SupportLitecoinFoundationView.swift +++ b/litewallet/SupportLitecoinFoundationView.swift @@ -9,9 +9,6 @@ struct SupportLitecoinFoundationView: View { @ObservedObject var viewModel: SupportLitecoinFoundationViewModel - @State - private var showSupportLFPage: Bool = false - // MARK: - Public var supportSafariView = SupportSafariView(url: FoundationSupport.url, diff --git a/litewallet/SyncProgressHeaderView.swift b/litewallet/SyncProgressHeaderView.swift index 244e7ef0f..2d0767ab5 100644 --- a/litewallet/SyncProgressHeaderView.swift +++ b/litewallet/SyncProgressHeaderView.swift @@ -39,7 +39,7 @@ class SyncProgressHeaderView: UITableViewCell, Subscriber { headerLabel.text = S.SyncingHeader.rescanning.localize() timestampLabel.text = "" progressView.alpha = 0.0 - noSendImageView.alpha = 0.0 + noSendImageView.alpha = 1.0 } else { headerLabel.text = "" timestampLabel.text = "" diff --git a/litewallet/TabBarViewController.swift b/litewallet/TabBarViewController.swift index de7846f3f..8af223d8a 100644 --- a/litewallet/TabBarViewController.swift +++ b/litewallet/TabBarViewController.swift @@ -20,12 +20,13 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel private var swappedConstraints: [NSLayoutConstraint] = [] private let currencyTapView = UIView() private let storyboardNames: [String] = ["Transactions", "Send", "Receive", "Buy"] - var storyboardIDs: [String] = ["TransactionsViewController", "SendLTCViewController", "ReceiveLTCViewController", "BuyTableViewController"] + var storyboardIDs: [String] = ["TransactionsViewController", "SendLTCViewController", "ReceiveLTCViewController", "BuyHostingController"] var viewControllers: [UIViewController] = [] var activeController: UIViewController? var updateTimer: Timer? var store: Store? var walletManager: WalletManager? + var userIsMoonPaySupported: Bool? var exchangeRate: Rate? { didSet { setBalances() } } @@ -89,8 +90,13 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel func addViewControllers() { for (index, storyboardID) in storyboardIDs.enumerated() { - let controller = UIStoryboard(name: storyboardNames[index], bundle: nil).instantiateViewController(withIdentifier: storyboardID) - viewControllers.append(controller) + if storyboardID == "BuyHostingController" { + let hostingController = BuyHostingController() + viewControllers.append(hostingController) + } else { + let controller = UIStoryboard(name: storyboardNames[index], bundle: nil).instantiateViewController(withIdentifier: storyboardID) + viewControllers.append(controller) + } } } @@ -130,7 +136,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel let priceLabelArray = [primaryBalanceLabel, secondaryBalanceLabel, equalsLabel] - priceLabelArray.enumerated().forEach { _, view in + for (_, view) in priceLabelArray.enumerated() { view?.backgroundColor = .clear view?.textColor = .white } @@ -311,7 +317,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel return } - array.forEach { item in + for item in array { switch item.tag { case 0: item.title = S.History.barItemTitle.localize() case 1: item.title = S.Send.barItemTitle.localize() @@ -344,13 +350,13 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel transactionVC.walletManager = walletManager transactionVC.isLtcSwapped = store?.state.isLtcSwapped - case "litewallet.BuyTableViewController": - guard let buyVC = contentController as? BuyTableViewController + case "litewallet.BuyHostingController": + guard let buyHC = contentController as? BuyHostingController else { return } - buyVC.store = store - buyVC.walletManager = walletManager + + buyHC.isLoaded = true case "litewallet.SendLTCViewController": guard let sendVC = contentController as? SendLTCViewController diff --git a/litewallet/TransactionCellViewModel.swift b/litewallet/TransactionCellViewModel.swift index ca9e88eea..b4db09601 100644 --- a/litewallet/TransactionCellViewModel.swift +++ b/litewallet/TransactionCellViewModel.swift @@ -20,8 +20,6 @@ class TransactionCellViewModel: ObservableObject { var feeText: String = "" - var directionText: String = "" - var directionImageText: String = "" var directionArrowColor: Color = .clear diff --git a/litewallet/TransactionModalView.swift b/litewallet/TransactionModalView.swift index 0dd622c46..84951915b 100644 --- a/litewallet/TransactionModalView.swift +++ b/litewallet/TransactionModalView.swift @@ -1,20 +1,12 @@ import SwiftUI import UIKit -private let qrImageSize = 180.0 - struct TransactionModalView: View { @ObservedObject var viewModel: TransactionCellViewModel let dataRowHeight: CGFloat = 65.0 - @State - var isDisplayed: Bool = false - - @State - var didCopy: Bool = false - @State var copiedData: String = "" diff --git a/litewallet/TransactionsViewController.swift b/litewallet/TransactionsViewController.swift index d43be40f0..b19d65fab 100644 --- a/litewallet/TransactionsViewController.swift +++ b/litewallet/TransactionsViewController.swift @@ -10,16 +10,13 @@ let kQRImageSide: CGFloat = 110.0 let kFiveYears: Double = 157_680_000.0 let kTodaysEpochTime: TimeInterval = Date().timeIntervalSince1970 -class TransactionsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, Subscriber, Trackable -{ +class TransactionsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, Subscriber, Trackable { @IBOutlet var tableView: UITableView! var store: Store? var walletManager: WalletManager? - var selectedIndexes = [IndexPath: NSNumber]() var shouldBeSyncing: Bool = false var syncingHeaderView: SyncProgressHeaderView? - var shouldShowPrompt = true private var transactions: [Transaction] = [] private var allTransactions: [Transaction] = [] { @@ -35,9 +32,12 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable private var currentPromptType: PromptType? { didSet { if currentPromptType != nil, oldValue == nil { - tableView.beginUpdates() - tableView.reloadSections(IndexSet(integer: 0), with: .automatic) - tableView.endUpdates() + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + self.tableView.beginUpdates() + self.tableView.reloadSections(IndexSet(integer: 0), with: .automatic) + self.tableView.endUpdates() + } } } } @@ -82,7 +82,7 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable owner: self, options: nil)?.first as? SyncProgressHeaderView syncingHeaderView?.isRescanning = reduxState.walletState.isRescanning - syncingHeaderView?.progress = 0.02 // Small value to show user it is in process + syncingHeaderView?.progress = 0.02 syncingHeaderView?.headerMessage = reduxState.walletState.syncState syncingHeaderView?.noSendImageView.alpha = 1.0 syncingHeaderView?.timestamp = reduxState.walletState.lastBlockTimestamp @@ -102,8 +102,7 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable } let types = PromptType.defaultOrder - if let type = types.first(where: { $0.shouldPrompt(walletManager: walletManager, state: store.state) }) - { + if let type = types.first(where: { $0.shouldPrompt(walletManager: walletManager, state: store.state) }) { saveEvent("prompt.\(type.name).displayed") currentPromptType = type if type == .biometrics { @@ -120,7 +119,7 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable /// Update displayed transactions. Used mainly when the database needs an update /// - Parameter txHash: String reprsentation of the TX private func updateTransactions(txHash: String) { - transactions.enumerated().forEach { i, tx in + for (i, tx) in transactions.enumerated() { if tx.hash == txHash { DispatchQueue.main.async { self.tableView.beginUpdates() @@ -272,8 +271,7 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable // MARK: - UITableView Support Methods - private func configurePromptCell(promptType: PromptType?, indexPath: IndexPath) -> PromptTableViewCell - { + private func configurePromptCell(promptType: PromptType?, indexPath: IndexPath) -> PromptTableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: "PromptTVC2", for: indexPath) as? PromptTableViewCell else { NSLog("ERROR No cell found") @@ -390,7 +388,7 @@ class TransactionsViewController: UIViewController, UITableViewDelegate, UITable self.shouldBeSyncing = true self.initSyncingHeaderView(reduxState: reduxState, completion: { self.syncingHeaderView?.isRescanning = reduxState.walletState.isRescanning - self.syncingHeaderView?.progress = 0.02 // Small value to show user it is in process + self.syncingHeaderView?.progress = 0.02 self.syncingHeaderView?.headerMessage = reduxState.walletState.syncState self.syncingHeaderView?.noSendImageView.alpha = 1.0 self.syncingHeaderView?.timestamp = reduxState.walletState.lastBlockTimestamp diff --git a/litewallet/TransferAmountViewModel.swift b/litewallet/TransferAmountViewModel.swift index 3519d6456..e69de29bb 100644 --- a/litewallet/TransferAmountViewModel.swift +++ b/litewallet/TransferAmountViewModel.swift @@ -1,73 +0,0 @@ -import BRCore -import Foundation -import KeychainAccess -import UIKit - -// DEV: To be removed in following issue https://github.com/litecoin-foundation/litewallet-ios/issues/177 - -class TransferAmountViewModel: ObservableObject { - // MARK: - Combine Variables - - @Published - var walletType: WalletType - - // MARK: - Private Variables - - private let walletManager: WalletManager - - private let store: Store - - private var sender: Sender? - - // MARK: - Public Variables - - var litewalletBalance: Double = 0.0 - - var litewalletAddress: String = "" - - var cardBalance: Double = 0.0 - - var cardAddress: String = "" - - var currentBalance: Double = 0.0 - - var transferAmount: Double = 0.0 - - /// This is the LTC address the wallet is sending LTC TO - var destinationAddress: String { - return walletType == .litewallet ? cardAddress : litewalletAddress - } - - var transaction: BRTxRef? - - init(walletType: WalletType, - litewalletBalance: Double, - litewalletAddress: String, - cardBalance: Double, - cardAddress: String, - walletManager: WalletManager, - store: Store) - { - self.walletManager = walletManager - - self.store = store - - self.walletType = walletType - - self.litewalletBalance = litewalletBalance - - self.litewalletAddress = litewalletAddress - - // DEV: The Testnet is not implemented in Loafwallet Core. - // This would be used for the Card testing. - #if DEBUG - self.litewalletAddress = MockData.testLTCAddress - #endif - - self.cardBalance = cardBalance - - self.cardAddress = cardAddress - - currentBalance = walletType == .litewallet ? litewalletBalance : cardBalance - } -} diff --git a/litewallet/UnsafeMutablePointerExtension.swift b/litewallet/UnsafeMutablePointerExtension.swift index 1bb39973c..69efafd08 100644 --- a/litewallet/UnsafeMutablePointerExtension.swift +++ b/litewallet/UnsafeMutablePointerExtension.swift @@ -93,8 +93,7 @@ extension UnsafeMutablePointer where Pointee == BRTransaction { return BRTransactionHash(self) } - public static func == (l: UnsafeMutablePointer, r: UnsafeMutablePointer) -> Bool - { + public static func == (l: UnsafeMutablePointer, r: UnsafeMutablePointer) -> Bool { return BRTransactionEq(l, r) != 0 } } diff --git a/litewallet/ViewControllers/AmountViewController.swift b/litewallet/ViewControllers/AmountViewController.swift index 590849700..20b0675d9 100644 --- a/litewallet/ViewControllers/AmountViewController.swift +++ b/litewallet/ViewControllers/AmountViewController.swift @@ -1,7 +1,7 @@ import UIKit private let currencyToggleConstant: CGFloat = 20.0 -private let amountFont: UIFont = UIFont.barlowMedium(size: 14.0) +private let amountFont: UIFont = .barlowMedium(size: 14.0) class AmountViewController: UIViewController, Trackable { private let store: Store private let isPinPadExpandedAtLaunch: Bool diff --git a/litewallet/ViewControllers/BiometricsSpendingLimitViewController.swift b/litewallet/ViewControllers/BiometricsSpendingLimitViewController.swift index 0bc2e72c0..a7e41ddc8 100644 --- a/litewallet/ViewControllers/BiometricsSpendingLimitViewController.swift +++ b/litewallet/ViewControllers/BiometricsSpendingLimitViewController.swift @@ -56,8 +56,7 @@ class BiometricsSpendingLimitViewController: UITableViewController, Subscriber { return limits.count } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) let limit = limits[indexPath.row] if limit == 0 { diff --git a/litewallet/ViewControllers/ConfirmPaperPhraseViewController.swift b/litewallet/ViewControllers/ConfirmPaperPhraseViewController.swift index 45f74fc47..ecac0606f 100644 --- a/litewallet/ViewControllers/ConfirmPaperPhraseViewController.swift +++ b/litewallet/ViewControllers/ConfirmPaperPhraseViewController.swift @@ -41,12 +41,11 @@ class ConfirmPaperPhraseViewController: UITableViewController { return wordArray }() - private lazy var confirmFirstPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.0 + 1)"), word: self.words[self.fourIndices.0]) - }() + private lazy var confirmFirstPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.0 + 1)"), word: self.words[self.fourIndices.0]) - private lazy var confirmSecondPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.1 + 1)"), word: self.words[self.fourIndices.1]) }() - private lazy var confirmThirdPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.2 + 1)"), word: self.words[self.fourIndices.2]) }() - private lazy var confirmFourthPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.3 + 1)"), word: self.words[self.fourIndices.3]) }() + private lazy var confirmSecondPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.1 + 1)"), word: self.words[self.fourIndices.1]) + private lazy var confirmThirdPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.2 + 1)"), word: self.words[self.fourIndices.2]) + private lazy var confirmFourthPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.3 + 1)"), word: self.words[self.fourIndices.3]) var store: Store? var walletManager: WalletManager? @@ -71,7 +70,8 @@ class ConfirmPaperPhraseViewController: UITableViewController { NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, - queue: nil) { [weak self] _ in + queue: nil) + { [weak self] _ in self?.dismiss(animated: true, completion: nil) } diff --git a/litewallet/ViewControllers/EnterPhraseCollectionViewController.swift b/litewallet/ViewControllers/EnterPhraseCollectionViewController.swift index 1c3c479aa..d8b654ea7 100644 --- a/litewallet/ViewControllers/EnterPhraseCollectionViewController.swift +++ b/litewallet/ViewControllers/EnterPhraseCollectionViewController.swift @@ -59,8 +59,7 @@ class EnterPhraseCollectionViewController: UICollectionViewController { return 12 } - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell - { + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) guard let enterPhraseCell = item as? EnterPhraseCell else { return item } enterPhraseCell.index = indexPath.row diff --git a/litewallet/ViewControllers/EnterPhraseViewController.swift b/litewallet/ViewControllers/EnterPhraseViewController.swift index 09d5c449c..8e6a9d9db 100644 --- a/litewallet/ViewControllers/EnterPhraseViewController.swift +++ b/litewallet/ViewControllers/EnterPhraseViewController.swift @@ -8,8 +8,7 @@ enum PhraseEntryReason { typealias EnterPhraseCallback = (String) -> Void -class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomTitleView, Trackable -{ +class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomTitleView, Trackable { init(store: Store, walletManager: WalletManager, reason: PhraseEntryReason) { self.store = store self.walletManager = walletManager @@ -37,7 +36,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT private let enterPhrase: EnterPhraseCollectionViewController private let errorLabel = UILabel.wrapping(font: .customBody(size: 16.0), color: .litewalletOrange) private let instruction = UILabel(font: .customBold(size: 14.0), color: .darkText) - internal let titleLabel = UILabel.wrapping(font: .customBold(size: 26.0), color: .darkText) + let titleLabel = UILabel.wrapping(font: .customBold(size: 26.0), color: .darkText) private let subheader = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) private let faq: UIButton private let scrollView = UIScrollView() @@ -205,8 +204,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT didScrollForCustomTitle(yOffset: scrollView.contentOffset.y) } - func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) - { + func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) { scrollViewWillEndDraggingForCustomTitle(yOffset: targetContentOffset.pointee.y) } diff --git a/litewallet/ViewControllers/Import/StartImportViewController.swift b/litewallet/ViewControllers/Import/StartImportViewController.swift index 3d59c9f1c..8ff5f5d9e 100644 --- a/litewallet/ViewControllers/Import/StartImportViewController.swift +++ b/litewallet/ViewControllers/Import/StartImportViewController.swift @@ -1,9 +1,7 @@ import BRCore import UIKit -private let mainURL = "https://insight.litecore.io/api/addrs/utxo" -private let fallbackURL = "https://insight.litecore.io/api/addrs/utxo" -private let testnetURL = "https://testnet.litecore.io/api/addrs/utxo" +private let mainURL = "https://litecoinspace.org/graphs/mempool" class StartImportViewController: UIViewController { init(walletManager: WalletManager, store: Store) { @@ -158,24 +156,23 @@ class StartImportViewController: UIViewController { return } - let urlString = E.isTestnet ? testnetURL : mainURL + let urlString = mainURL let request = NSMutableURLRequest(url: URL(string: urlString)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20.0) request.httpMethod = "POST" request.httpBody = "addrs=\(address)".data(using: .utf8) - let task = URLSession.shared.dataTask(with: request as URLRequest) - { [weak self] data, _, error in - guard let myself = self else { return } - guard error == nil else { print("error: \(error!)"); return } - guard let data = data, - let jsonData = try? JSONSerialization.jsonObject(with: data, options: []), - let json = jsonData as? [[String: Any]] else { return } + let task = URLSession.shared.dataTask(with: request as URLRequest) { [weak self] data, _, error in + guard let myself = self else { return } + guard error == nil else { print("error: \(error!)"); return } + guard let data = data, + let jsonData = try? JSONSerialization.jsonObject(with: data, options: []), + let json = jsonData as? [[String: Any]] else { return } - DispatchQueue.main.async { - myself.handleData(data: json, key: key) - } + DispatchQueue.main.async { + myself.handleData(data: json, key: key) } + } task.resume() }) } @@ -191,7 +188,7 @@ class StartImportViewController: UIViewController { } let outputs = data.compactMap { SimpleUTXO(json: $0) } let balance = outputs.map { $0.satoshis }.reduce(0, +) - outputs.forEach { output in + for output in outputs { tx.addInput(txHash: output.hash, index: output.index, amount: output.satoshis, script: output.script) } @@ -221,8 +218,7 @@ class StartImportViewController: UIViewController { }) } - private func publish(tx: UnsafeMutablePointer, balance: UInt64, fee: UInt64, key: BRKey) - { + private func publish(tx: UnsafeMutablePointer, balance: UInt64, fee: UInt64, key: BRKey) { present(importingActivity, animated: true, completion: { guard let wallet = self.walletManager.wallet else { return } guard let script = BRAddress(string: wallet.receiveAddress)?.scriptPubKey else { return } diff --git a/litewallet/ViewControllers/LoginViewController.swift b/litewallet/ViewControllers/LoginViewController.swift index 4f2445f07..4e6fca6c1 100644 --- a/litewallet/ViewControllers/LoginViewController.swift +++ b/litewallet/ViewControllers/LoginViewController.swift @@ -31,9 +31,8 @@ class LoginViewController: UIViewController, Subscriber, Trackable { pinView = PinView(style: .login, length: store.state.pinLength) } - let viewModel = LockScreenViewModel(store: self.store) + let viewModel = LockScreenViewModel(store: store) headerView = UIHostingController(rootView: LockScreenHeaderView(viewModel: viewModel)) - super.init(nibName: nil, bundle: nil) } @@ -51,7 +50,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { return view }() - private let headerView: UIHostingController + private var headerView: UIHostingController private let pinPadViewController = PinPadViewController(style: .clear, keyboardType: .pinPad, maxDigits: 0) private let pinViewContainer = UIView() private var pinView: PinView? @@ -59,6 +58,15 @@ class LoginViewController: UIViewController, Subscriber, Trackable { private let disabledView: WalletDisabledView private let activityView = UIActivityIndicatorView(style: .large) private let wipeBannerButton = UIButton() + private let enterPINLabel = UILabel(font: .barlowSemiBold(size: 18), color: .white) + private var pinPadBottom: NSLayoutConstraint? + private var topControlTop: NSLayoutConstraint? + private var unlockTimer: Timer? + private var pinPadBackground = UIView() + private var hasAttemptedToShowBiometrics = false + private var isResetting = false + private let versionLabel = UILabel(font: .barlowRegular(size: 12), color: .white) + private var isWalletEmpty = false var delegate: LoginViewControllerDelegate? @@ -89,17 +97,6 @@ class LoginViewController: UIViewController, Subscriber, Trackable { return button }() - private let enterPINLabel = UILabel(font: .barlowSemiBold(size: 18), color: .white) - private var pinPadBottom: NSLayoutConstraint? - private var topControlTop: NSLayoutConstraint? - private var unlockTimer: Timer? - private var pinPadBackground = UIView() - private var hasAttemptedToShowBiometrics = false - private let lockedOverlay = UIVisualEffectView() - private var isResetting = false - private let versionLabel = UILabel(font: .barlowRegular(size: 12), color: .white) - private var isWalletEmpty = false - override func viewDidLoad() { checkWalletBalance() addSubviews() @@ -116,18 +113,17 @@ class LoginViewController: UIViewController, Subscriber, Trackable { guard let walletManager = self?.walletManager else { return } self?.isResetting = true let nc = UINavigationController() - let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin - { phrase in - let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) - nc.pushViewController(updatePin, animated: true) - updatePin.resetFromDisabledWillSucceed = { - self?.disabledView.isHidden = true - } - updatePin.resetFromDisabledSuccess = { - self?.authenticationSucceded() - LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) - } - }) + let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin { phrase in + let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) + nc.pushViewController(updatePin, animated: true) + updatePin.resetFromDisabledWillSucceed = { + self?.disabledView.isHidden = true + } + updatePin.resetFromDisabledSuccess = { + self?.authenticationSucceded() + LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) + } + }) recover.addCloseNavigationItem() nc.viewControllers = [recover] nc.navigationBar.tintColor = .darkText @@ -432,7 +428,6 @@ class LoginViewController: UIViewController, Subscriber, Trackable { if let disabledUntil = walletManager?.walletDisabledUntil { let now = Date().timeIntervalSince1970 if disabledUntil > now { - saveEvent("login.locked") let disabledUntilDate = Date(timeIntervalSince1970: disabledUntil) let unlockInterval = disabledUntil - now let df = DateFormatter() diff --git a/litewallet/ViewControllers/PinPadViewController.swift b/litewallet/ViewControllers/PinPadViewController.swift index 786400383..53b459595 100644 --- a/litewallet/ViewControllers/PinPadViewController.swift +++ b/litewallet/ViewControllers/PinPadViewController.swift @@ -110,8 +110,7 @@ class PinPadViewController: UICollectionViewController { return items.count } - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell - { + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) guard let pinPadCell = item as? GenericPinPadCell else { return item } pinPadCell.text = items[indexPath.item] @@ -237,10 +236,10 @@ class GenericPinPadCell: UICollectionViewCell { setup() } - internal let topLabel = UILabel(font: .customBody(size: 28.0)) - internal let centerLabel = UILabel(font: .customBody(size: 28.0)) - internal let sublabel = UILabel(font: .customBody(size: 11.0)) - internal let imageView = UIImageView() + let topLabel = UILabel(font: .customBody(size: 28.0)) + let centerLabel = UILabel(font: .customBody(size: 28.0)) + let sublabel = UILabel(font: .customBody(size: 11.0)) + let imageView = UIImageView() private func setup() { setAppearance() diff --git a/litewallet/ViewControllers/ReScanViewController.swift b/litewallet/ViewControllers/ReScanViewController.swift index caef3efd1..2f9a8bf20 100644 --- a/litewallet/ViewControllers/ReScanViewController.swift +++ b/litewallet/ViewControllers/ReScanViewController.swift @@ -3,7 +3,6 @@ import UIKit class ReScanViewController: UIViewController, Subscriber { init(store: Store) { self.store = store - faq = .buildFaqButton(store: store, articleId: ArticleIds.nothing) super.init(nibName: nil, bundle: nil) } @@ -12,7 +11,6 @@ class ReScanViewController: UIViewController, Subscriber { private let button = ShadowButton(title: S.ReScan.buttonTitle.localize(), type: .primary) private let footer = UILabel.wrapping(font: .customBody(size: 16.0), color: .secondaryGrayText) private let store: Store - private let faq: UIButton deinit { store.unsubscribe(self) @@ -26,7 +24,6 @@ class ReScanViewController: UIViewController, Subscriber { private func addSubviews() { view.addSubview(header) - view.addSubview(faq) view.addSubview(body) view.addSubview(button) view.addSubview(footer) @@ -36,21 +33,16 @@ class ReScanViewController: UIViewController, Subscriber { header.constrain([ header.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: C.padding[2]), header.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: C.padding[2]), - ]) - faq.constrain([ - faq.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -C.padding[2]), - faq.centerYAnchor.constraint(equalTo: header.centerYAnchor), - faq.widthAnchor.constraint(equalToConstant: 44.0), - faq.heightAnchor.constraint(equalToConstant: 44.0), + header.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: C.padding[-2]), ]) body.constrain([ body.leadingAnchor.constraint(equalTo: header.leadingAnchor), body.topAnchor.constraint(equalTo: header.bottomAnchor, constant: C.padding[2]), - body.trailingAnchor.constraint(equalTo: faq.trailingAnchor), + body.trailingAnchor.constraint(equalTo: header.trailingAnchor), ]) footer.constrain([ footer.leadingAnchor.constraint(equalTo: header.leadingAnchor), - footer.trailingAnchor.constraint(equalTo: faq.trailingAnchor), + footer.trailingAnchor.constraint(equalTo: header.trailingAnchor), footer.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -C.padding[3]), ]) button.constrain([ @@ -90,10 +82,10 @@ class ReScanViewController: UIViewController, Subscriber { let bodyAttributes = [NSAttributedString.Key.font: UIFont.customBody(size: 16.0), NSAttributedString.Key.foregroundColor: UIColor.darkText] - body.append(NSAttributedString(string: "\(S.ReScan.subheader1)\n", attributes: headerAttributes)) - body.append(NSAttributedString(string: "\(S.ReScan.body1)\n\n", attributes: bodyAttributes)) - body.append(NSAttributedString(string: "\(S.ReScan.subheader2)\n", attributes: headerAttributes)) - body.append(NSAttributedString(string: "\(S.ReScan.body2)\n\n\(S.ReScan.body3)", attributes: bodyAttributes)) + body.append(NSAttributedString(string: "\(S.ReScan.subheader1.localize())\n", attributes: headerAttributes)) + body.append(NSAttributedString(string: "\(S.ReScan.body1.localize())\n\n", attributes: bodyAttributes)) + body.append(NSAttributedString(string: "\(S.ReScan.subheader2.localize())\n", attributes: headerAttributes)) + body.append(NSAttributedString(string: "\(S.ReScan.body2.localize())\n\n\(S.ReScan.body3.localize())", attributes: bodyAttributes)) return body } diff --git a/litewallet/ViewControllers/RequestAmountViewController.swift b/litewallet/ViewControllers/RequestAmountViewController.swift index 7966efee6..3bc1d098a 100644 --- a/litewallet/ViewControllers/RequestAmountViewController.swift +++ b/litewallet/ViewControllers/RequestAmountViewController.swift @@ -193,8 +193,7 @@ class RequestAmountViewController: UIViewController { presentText?(text, qrCode.image!) } - private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) - { + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) { share.isEnabled = false address.isUserInteractionEnabled = false diff --git a/litewallet/ViewControllers/RootModals/ManageWalletViewController.swift b/litewallet/ViewControllers/RootModals/ManageWalletViewController.swift index b47dee2b4..1be5cac79 100644 --- a/litewallet/ViewControllers/RootModals/ManageWalletViewController.swift +++ b/litewallet/ViewControllers/RootModals/ManageWalletViewController.swift @@ -125,8 +125,7 @@ extension ManageWalletViewController: UITextFieldDelegate { return true } - func textField(_ textField: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool - { + func textField(_ textField: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } if text.utf8.count + string.utf8.count > maxWalletNameLength { return false diff --git a/litewallet/ViewControllers/RootModals/MenuViewController.swift b/litewallet/ViewControllers/RootModals/MenuViewController.swift index cc6fa9a7e..4e9207f14 100644 --- a/litewallet/ViewControllers/RootModals/MenuViewController.swift +++ b/litewallet/ViewControllers/RootModals/MenuViewController.swift @@ -14,7 +14,7 @@ class MenuViewController: UIViewController, Trackable { fileprivate let buttons: [MenuButton] = { let types: [MenuButtonType] = [.security, .customerSupport, .settings, .lock] return types.compactMap { - return MenuButton(type: $0) + MenuButton(type: $0) } }() @@ -22,7 +22,7 @@ class MenuViewController: UIViewController, Trackable { override func viewDidLoad() { var previousButton: UIView? - buttons.forEach { button in + for button in buttons { button.addTarget(self, action: #selector(MenuViewController.didTapButton(button:)), for: .touchUpInside) view.addSubview(button) var topConstraint: NSLayoutConstraint? diff --git a/litewallet/ViewControllers/RootModals/ReceiveViewController.swift b/litewallet/ViewControllers/RootModals/ReceiveViewController.swift index 0a389cc7d..4eb9ad1a6 100644 --- a/litewallet/ViewControllers/RootModals/ReceiveViewController.swift +++ b/litewallet/ViewControllers/RootModals/ReceiveViewController.swift @@ -225,8 +225,7 @@ class ReceiveViewController: UIViewController, Subscriber, Trackable { presentText?(address.text!, qrCode.image!) } - private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) - { + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) { share.isEnabled = false address.isUserInteractionEnabled = false diff --git a/litewallet/ViewControllers/RootModals/SendViewController.swift b/litewallet/ViewControllers/RootModals/SendViewController.swift index cbbc4a6ed..14a12b0be 100644 --- a/litewallet/ViewControllers/RootModals/SendViewController.swift +++ b/litewallet/ViewControllers/RootModals/SendViewController.swift @@ -40,8 +40,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka private let keychainPreferences = Keychain(service: "litewallet.user-prefs") private var buttonToBorder: CGFloat = 0.0 - init(store: Store, sender: Sender, walletManager: WalletManager, initialAddress: String? = nil, initialRequest: PaymentRequest? = nil) - { + init(store: Store, sender: Sender, walletManager: WalletManager, initialAddress: String? = nil, initialRequest: PaymentRequest? = nil) { self.store = store self.sender = sender self.walletManager = walletManager @@ -207,8 +206,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka } } - private func balanceTextForAmountWithFormattedFees(enteredAmount: Satoshis?, rate: Rate?) -> (NSAttributedString?, NSAttributedString?) - { + private func balanceTextForAmountWithFormattedFees(enteredAmount: Satoshis?, rate: Rate?) -> (NSAttributedString?, NSAttributedString?) { /// DEV: KCW 12-FEB-24 // The results of this output is doing double duty and the method is a nightmare. // The parent view controller uses the numbers and the text is used in this View Controller @@ -472,6 +470,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka case let .creationError(message): self?.showAlert(title: S.Send.createTransactionError.localize(), message: message, buttonLabel: S.Button.ok.localize()) self?.saveEvent("send.publishFailed", attributes: ["errorMessage": message]) + case let .publishFailure(error): if case let .posixError(code, description) = error { self?.showAlert(title: S.SecurityAlerts.sendFailure.localize(), message: "\(description) (\(code))", buttonLabel: S.Button.ok.localize()) @@ -489,14 +488,13 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka let isValid = protoReq.isValid() var isOutputTooSmall = false - if let errorMessage = protoReq.errorMessage, errorMessage == S.PaymentProtocol.Errors.requestExpired.localize(), !isValid - { + if let errorMessage = protoReq.errorMessage, errorMessage == S.PaymentProtocol.Errors.requestExpired.localize(), !isValid { return showAlert(title: S.PaymentProtocol.Errors.badPaymentRequest.localize(), message: errorMessage, buttonLabel: S.Button.ok.localize()) } // TODO: check for duplicates of already paid requests var requestAmount = Satoshis(0) - protoReq.details.outputs.forEach { output in + for output in protoReq.details.outputs { if output.amount > 0, output.amount < wallet.minOutputAmount { isOutputTooSmall = true } @@ -511,8 +509,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka self?.didIgnoreUsedAddressWarning = true self?.confirmProtocolRequest(protoReq: protoReq) }) - } else if let message = protoReq.errorMessage, !message.utf8.isEmpty, (protoReq.commonName?.utf8.count)! > 0, !didIgnoreIdentityNotCertified - { + } else if let message = protoReq.errorMessage, !message.utf8.isEmpty, (protoReq.commonName?.utf8.count)! > 0, !didIgnoreIdentityNotCertified { return showError(title: S.Send.identityNotCertified.localize(), message: message, ignore: { [weak self] in self?.didIgnoreIdentityNotCertified = true self?.confirmProtocolRequest(protoReq: protoReq) diff --git a/litewallet/ViewControllers/ScanViewController.swift b/litewallet/ViewControllers/ScanViewController.swift index 4690c5b96..92aa009fd 100644 --- a/litewallet/ViewControllers/ScanViewController.swift +++ b/litewallet/ViewControllers/ScanViewController.swift @@ -175,17 +175,16 @@ class ScanViewController: UIViewController, Trackable { } extension ScanViewController: AVCaptureMetadataOutputObjectsDelegate { - func metadataOutput(_: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from _: AVCaptureConnection) - { + func metadataOutput(_: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from _: AVCaptureConnection) { if let data = metadataObjects as? [AVMetadataMachineReadableCodeObject] { if data.isEmpty { guide.state = .normal } else { - data.forEach { - guard let uri = $0.stringValue + for data in data { + guard let uri = data.stringValue else { NSLog("ERROR: URI String not found") - return + continue } if completion != nil, guide.state != .positive { handleURI(uri) diff --git a/litewallet/ViewControllers/SecurityCenter/UpdatePinViewController.swift b/litewallet/ViewControllers/SecurityCenter/UpdatePinViewController.swift index ab00fe2c8..b091aba2f 100644 --- a/litewallet/ViewControllers/SecurityCenter/UpdatePinViewController.swift +++ b/litewallet/ViewControllers/SecurityCenter/UpdatePinViewController.swift @@ -14,8 +14,7 @@ class UpdatePinViewController: UIViewController, Subscriber { var resetFromDisabledSuccess: (() -> Void)? var resetFromDisabledWillSucceed: (() -> Void)? - init(store: Store, walletManager: WalletManager, type: UpdatePinType, showsBackButton: Bool = true, phrase: String? = nil) - { + init(store: Store, walletManager: WalletManager, type: UpdatePinType, showsBackButton: Bool = true, phrase: String? = nil) { self.store = store self.walletManager = walletManager self.phrase = phrase diff --git a/litewallet/ViewControllers/SettingsViewController.swift b/litewallet/ViewControllers/SettingsViewController.swift index 7bf3321c9..8f277f8fb 100644 --- a/litewallet/ViewControllers/SettingsViewController.swift +++ b/litewallet/ViewControllers/SettingsViewController.swift @@ -28,7 +28,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { private let sections: [String] private var rows: [String: [Setting]] private let cellIdentifier = "CellIdentifier" - internal var titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) + var titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) let customTitle: String private var walletIsEmpty = true @@ -68,8 +68,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { return rows[sections[section]]?.count ?? 0 } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) if let setting = rows[sections[indexPath.section]]?[indexPath.row] { @@ -162,8 +161,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { didScrollForCustomTitle(yOffset: scrollView.contentOffset.y) } - override func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) - { + override func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) { scrollViewWillEndDraggingForCustomTitle(yOffset: targetContentOffset.pointee.y) } diff --git a/litewallet/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift b/litewallet/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift index 260a9a72f..87cd73e24 100644 --- a/litewallet/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift +++ b/litewallet/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift @@ -1,8 +1,7 @@ import UIKit class LoginTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate { - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissLoginAnimator() } } diff --git a/litewallet/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift b/litewallet/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift index 6bd995a3d..cf795646b 100644 --- a/litewallet/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift +++ b/litewallet/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift @@ -81,8 +81,7 @@ class ModalTransitionDelegate: NSObject, Subscriber { } extension ModalTransitionDelegate: UIViewControllerTransitioningDelegate { - func animationController(forPresented presented: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forPresented presented: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? { presentedViewController = presented return PresentModalAnimator(shouldCoverBottomGap: type == .regular, completion: { let panGr = UIPanGestureRecognizer(target: self, action: #selector(ModalTransitionDelegate.didUpdate(gr:))) @@ -93,13 +92,11 @@ extension ModalTransitionDelegate: UIViewControllerTransitioningDelegate { }) } - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissModalAnimator() } - func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? - { + func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { return isInteractive ? interactiveTransition : nil } } diff --git a/litewallet/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift b/litewallet/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift index de8527564..7cbf71cdf 100644 --- a/litewallet/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift +++ b/litewallet/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift @@ -5,13 +5,11 @@ private let duration: TimeInterval = 0.4 class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { var shouldShowMaskView = true - func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return PresentGenericAnimator(shouldShowMaskView: shouldShowMaskView) } - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissGenericAnimator() } } diff --git a/litewallet/ViewControllers/WritePaperPhraseViewController.swift b/litewallet/ViewControllers/WritePaperPhraseViewController.swift index 14218dbd8..d16f0bdaf 100644 --- a/litewallet/ViewControllers/WritePaperPhraseViewController.swift +++ b/litewallet/ViewControllers/WritePaperPhraseViewController.swift @@ -62,7 +62,8 @@ class WritePaperPhraseViewController: UIViewController { NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, - queue: nil) { [weak self] _ in + queue: nil) + { [weak self] _ in self?.dismiss(animated: true, completion: nil) } } @@ -87,7 +88,7 @@ class WritePaperPhraseViewController: UIViewController { ]) label.constrainBottomCorners(sidePadding: C.padding[3], bottomPadding: C.padding[2]) - phraseViews.enumerated().forEach { index, phraseView in + for (index, phraseView) in phraseViews.enumerated() { // The first phrase should initially be on the screen let constant = index == 0 ? 0.0 : phraseOffscreenOffset let xConstraint = NSLayoutConstraint(item: phraseView, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1.0, constant: constant) diff --git a/litewallet/ViewModels/Transaction.swift b/litewallet/ViewModels/Transaction.swift index 0478effe2..8dc0b8405 100644 --- a/litewallet/ViewModels/Transaction.swift +++ b/litewallet/ViewModels/Transaction.swift @@ -13,6 +13,7 @@ class Transaction { // MARK: - Public private let opsAddressSet: Set = Partner.litewalletOpsSet() + /// Hassan init?(_ tx: BRTxRef, walletManager: WalletManager, kvStore: BRReplicatedKVStore?, rate: Rate?) { guard let wallet = walletManager.wallet else { return nil } guard let peerManager = walletManager.peerManager else { return nil } @@ -20,13 +21,12 @@ class Transaction { self.tx = tx self.wallet = wallet self.kvStore = kvStore - let fee = wallet.feeForTx(tx) ?? 0 var outputAddresses = Set() var opsAmount = UInt64(0) - tx.outputs.enumerated().forEach { _, output in + for (_, output) in tx.outputs.enumerated() { outputAddresses.insert(output.updatedSwiftAddress) } @@ -100,8 +100,7 @@ class Transaction { } var exchangeRateInfo = "" - if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first - { + if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first { let difference = (currentRate.rate - metaData.exchangeRate) / metaData.exchangeRate * 100.0 let prefix = difference > 0.0 ? "+" : "-" let firstLine = direction == .sent ? S.Transaction.exchangeOnDaySent : S.Transaction.exchangeOnDayReceived @@ -117,28 +116,23 @@ class Transaction { return "\(amountString)\n\(startingString)\n\(endingString)\n\(exchangeRateInfo)" } - func amountDetailsAmountString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsAmountString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { let feeAmount = Amount(amount: fee, rate: rate, maxDigits: maxDigits) let feeString = direction == .sent ? String(format: S.Transaction.fee.localize(), "\(feeAmount.string(isLtcSwapped: isLtcSwapped))") : "" return "\(direction.sign)\(Amount(amount: satoshis, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped)) \(feeString)" } - func amountDetailsStartingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsStartingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { return String(format: S.Transaction.starting.localize(), "\(Amount(amount: startingBalance, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped))") } - func amountDetailsEndingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsEndingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { return String(format: String(format: S.Transaction.ending.localize(), "\(Amount(amount: balanceAfter, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped))")) } - func amountExchangeString(isLtcSwapped _: Bool, rate _: Rate, rates: [Rate], maxDigits _: Int) -> String - { + func amountExchangeString(isLtcSwapped _: Bool, rate _: Rate, rates: [Rate], maxDigits _: Int) -> String { var exchangeRateInfo = "" - if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first - { + if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first { let difference = (currentRate.rate - metaData.exchangeRate) / metaData.exchangeRate * 100.0 let prefix = difference > 0.0 ? "+" : "-" let nf = NumberFormatter() @@ -172,7 +166,7 @@ class Transaction { lazy var toAddress: String? = { var outputAddresses = Set() - tx.outputs.enumerated().forEach { _, output in + for (_, output) in tx.outputs.enumerated() { outputAddresses.insert(output.updatedSwiftAddress) } let usedOpsAddress = outputAddresses.intersection(opsAddressSet).first @@ -210,7 +204,6 @@ class Transaction { case .moved: guard let output = self.tx.outputs.filter({ output in self.wallet.containsAddress(output.updatedSwiftAddress) - }).first else { let properties = ["error": "no_moved_address_found"] LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, @@ -226,6 +219,9 @@ class Transaction { } var comment: String? { + if metaData?.comment != nil { + print("=== memo comments \(metaData?.comment ?? "NO MEMO")") + } return metaData?.comment } @@ -386,8 +382,7 @@ private extension String { } } -private func makeStatus(_ txRef: BRTxRef, wallet: BRWallet, peerManager: BRPeerManager, confirms: Int, direction: TransactionDirection) -> String -{ +private func makeStatus(_ txRef: BRTxRef, wallet: BRWallet, peerManager: BRPeerManager, confirms: Int, direction: TransactionDirection) -> String { let tx = txRef.pointee guard wallet.transactionIsValid(txRef) else { diff --git a/litewallet/Views/AlertView.swift b/litewallet/Views/AlertView.swift index 58a72e7db..42888c32c 100644 --- a/litewallet/Views/AlertView.swift +++ b/litewallet/Views/AlertView.swift @@ -4,7 +4,6 @@ enum AlertType { case pinSet(callback: () -> Void) case paperKeySet(callback: () -> Void) case sendSuccess - case resolvedSuccess case addressesCopied case sweepSuccess(callback: () -> Void) @@ -19,13 +18,10 @@ enum AlertType { return S.SecurityAlerts.paperKeySet.localize() case .sendSuccess: return S.SecurityAlerts.sendSuccess.localize() - case .resolvedSuccess: - return S.SecurityAlerts.resolvedSuccess.localize() case .addressesCopied: return S.SecurityAlerts.copiedAddressesHeader.localize() case .sweepSuccess: return S.Import.success.localize() - // Failure(s) case .failedResolution: return S.SecurityAlerts.sendFailure.localize() @@ -40,13 +36,10 @@ enum AlertType { return S.SecurityAlerts.paperKeySetSubheader.localize() case .sendSuccess: return S.SecurityAlerts.sendSuccessSubheader.localize() - case .resolvedSuccess: - return S.SecurityAlerts.resolvedSuccessSubheader.localize() case .addressesCopied: return S.SecurityAlerts.copiedAddressesSubheader.localize() case .sweepSuccess: return S.Import.successBody.localize() - // Failure(s) case .failedResolution: return S.SecurityAlerts.resolvedSuccessSubheader.localize() @@ -68,17 +61,13 @@ func == (lhs: AlertType, rhs: AlertType) -> Bool { return true case (.sendSuccess, .sendSuccess): return true - case (.resolvedSuccess, .resolvedSuccess): - return true case (.addressesCopied, .addressesCopied): return true case (.sweepSuccess(_), .sweepSuccess(_)): return true - // Failure(s) case (.failedResolution, .failedResolution): return true - default: return false } diff --git a/litewallet/Views/DefaultCurrencyViewController.swift b/litewallet/Views/DefaultCurrencyViewController.swift index 35624ca83..44d8c3db3 100644 --- a/litewallet/Views/DefaultCurrencyViewController.swift +++ b/litewallet/Views/DefaultCurrencyViewController.swift @@ -81,8 +81,7 @@ class DefaultCurrencyViewController: UITableViewController, Subscriber { return rates.count } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) let rate = rates[indexPath.row] cell.textLabel?.text = "\(rate.code) (\(rate.currencySymbol))" diff --git a/litewallet/Views/ModalHeaderView.swift b/litewallet/Views/ModalHeaderView.swift index 84e0ff2f4..21a143fce 100644 --- a/litewallet/Views/ModalHeaderView.swift +++ b/litewallet/Views/ModalHeaderView.swift @@ -12,8 +12,7 @@ class ModalHeaderView: UIView { didSet { close.tap = closeCallback } } - init(title: String, style: ModalHeaderViewStyle, faqInfo _: (Store, String)? = nil, showCloseButton: Bool = true) - { + init(title: String, style: ModalHeaderViewStyle, faqInfo _: (Store, String)? = nil, showCloseButton: Bool = true) { self.title.text = title self.style = style diff --git a/litewallet/Views/PinView.swift b/litewallet/Views/PinView.swift index 82e9056e6..bab6cbf4d 100644 --- a/litewallet/Views/PinView.swift +++ b/litewallet/Views/PinView.swift @@ -39,7 +39,7 @@ class PinView: UIView { } func fill(_ number: Int) { - filled.enumerated().forEach { index, circle in + for (index, circle) in filled.enumerated() { circle.isHidden = index > number - 1 } } @@ -80,7 +80,7 @@ class PinView: UIView { } private func addCircleContraints(_ circles: [Circle]) { - circles.enumerated().forEach { index, circle in + for (index, circle) in circles.enumerated() { addSubview(circle) let leadingConstraint: NSLayoutConstraint? if index == 0 { diff --git a/litewallet/Views/SearchHeaderView.swift b/litewallet/Views/SearchHeaderView.swift index f0eecd854..b96931b24 100644 --- a/litewallet/Views/SearchHeaderView.swift +++ b/litewallet/Views/SearchHeaderView.swift @@ -100,9 +100,6 @@ class SearchHeaderView: UIView { } } - private let sentFilter: TransactionFilter = { $0.direction == .sent } - private let receivedFilter: TransactionFilter = { $0.direction == .received } - override func layoutSubviews() { guard !hasSetup else { return } setup() diff --git a/litewallet/Views/SendViewCells/AddressCell.swift b/litewallet/Views/SendViewCells/AddressCell.swift index 7e0a42942..7cdbd1f83 100644 --- a/litewallet/Views/SendViewCells/AddressCell.swift +++ b/litewallet/Views/SendViewCells/AddressCell.swift @@ -98,8 +98,7 @@ extension AddressCell: UITextFieldDelegate { return true } - func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool - { + func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool { if let request = PaymentRequest(string: string) { didReceivePaymentRequest?(request) return false diff --git a/litewallet/Views/SendViewCells/DescriptionSendCell.swift b/litewallet/Views/SendViewCells/DescriptionSendCell.swift index 80a08fbbd..9a8295713 100644 --- a/litewallet/Views/SendViewCells/DescriptionSendCell.swift +++ b/litewallet/Views/SendViewCells/DescriptionSendCell.swift @@ -84,8 +84,7 @@ extension DescriptionSendCell: UITextViewDelegate { return true } - func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool - { + func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool { guard text.rangeOfCharacter(from: CharacterSet.newlines) == nil else { textView.resignFirstResponder() diff --git a/litewallet/Views/ShadowButton.swift b/litewallet/Views/ShadowButton.swift index 8b3468e1d..8efce3176 100644 --- a/litewallet/Views/ShadowButton.swift +++ b/litewallet/Views/ShadowButton.swift @@ -50,7 +50,6 @@ class ShadowButton: UIControl { private let container = UIView() private let shadowView = UIView() private let label = UILabel() - private let shadowYOffset: CGFloat = 4.0 private let cornerRadius: CGFloat = 4.0 private var imageView: UIImageView? diff --git a/litewallet/Wallet/ExchangeUpdater.swift b/litewallet/Wallet/ExchangeUpdater.swift index 5b52eb0a0..f4f18422f 100644 --- a/litewallet/Wallet/ExchangeUpdater.swift +++ b/litewallet/Wallet/ExchangeUpdater.swift @@ -15,11 +15,13 @@ class ExchangeUpdater: Subscriber { } func refresh(completion: @escaping () -> Void) { - walletManager.apiClient?.exchangeRates { rates, _ in + if walletManager.store.state.walletState.syncState != .syncing { + walletManager.apiClient?.exchangeRates { rates, _ in - guard let currentRate = rates.first(where: { $0.code == self.store.state.defaultCurrencyCode }) else { completion(); return } - self.store.perform(action: ExchangeRates.setRates(currentRate: currentRate, rates: rates)) - completion() + guard let currentRate = rates.first(where: { $0.code == self.store.state.defaultCurrencyCode }) else { completion(); return } + self.store.perform(action: ExchangeRates.setRates(currentRate: currentRate, rates: rates)) + completion() + } } } diff --git a/litewallet/WalletCoordinator.swift b/litewallet/WalletCoordinator.swift index 7f8d0997b..dc1ab8925 100644 --- a/litewallet/WalletCoordinator.swift +++ b/litewallet/WalletCoordinator.swift @@ -121,46 +121,45 @@ class WalletCoordinator: Subscriber, Trackable { updateTimer = nil Task { - guard let txRefs = self.walletManager.wallet?.transactions else { - let properties = ["error_message": "wallet_tx_refs_are_nil"] - LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) - return - } + do { + guard let wallet = self.walletManager.wallet else { + debugPrint("Wallet not found!") + return + } - let transactions = await self.makeTransactionViewModels(transactions: txRefs, walletManager: self.walletManager, kvStore: self.kvStore, rate: self.store.state.currentRate) - if !transactions.isEmpty { - Task { - self.store.perform(action: WalletChange.setTransactions(transactions)) + let transactions = try await self.makeTransactionViewModels(transactions: wallet.transactions, + walletManager: self.walletManager, + kvStore: self.kvStore, + rate: self.store.state.currentRate) + + if !transactions.isEmpty { + Task { + self.store.perform(action: WalletChange.setTransactions(transactions)) + } + } else { + LWAnalytics.logEventWithParameters(itemName: ._20240214_TI, properties: ["transactions_info": "no_txs_found_in_wallet"]) } - } else { - let properties = ["transactions_info": "no_txs_found_in_wallet"] - LWAnalytics.logEventWithParameters(itemName: ._20240214_TI, properties: properties) + } catch { + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error_message": error.localizedDescription]) } } } - func makeTransactionViewModels(transactions: [BRTxRef?], walletManager: WalletManager, kvStore: BRReplicatedKVStore?, rate: Rate?) async -> [Transaction] - { - /// Send analytical data for any nils in this method - if kvStore == nil { - let properties = ["error_message": "replicated_kv_store_is_nil"] - LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) + func makeTransactionViewModels(transactions: [BRTxRef?], walletManager: WalletManager, kvStore: BRReplicatedKVStore?, rate: Rate?) async throws -> [Transaction] { + guard let kvStore = kvStore else { + // throw MakeTransactionError.replicatedKVStoreNotFound + return [] } - if rate == nil { - let properties = ["error_message": "rate_is_nil"] - LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) + guard let rate = rate else { + // throw MakeTransactionError.rateNotFound + return [] } return transactions.compactMap { $0 }.sorted { - if $0.pointee.timestamp == 0 { - return true - } else if $1.pointee.timestamp == 0 { - return false - } else { - return $0.pointee.timestamp > $1.pointee.timestamp - } - }.compactMap { + $0.pointee.timestamp > $1.pointee.timestamp + } + .compactMap { Transaction($0, walletManager: walletManager, kvStore: kvStore, rate: rate) } } diff --git a/litewallet/WalletManager+Auth.swift b/litewallet/WalletManager+Auth.swift index fbe8cb4c9..2c6301962 100644 --- a/litewallet/WalletManager+Auth.swift +++ b/litewallet/WalletManager+Auth.swift @@ -272,8 +272,7 @@ extension WalletManager: WalletAuthenticator { } // sign the given transaction using biometric authentication - func signTransaction(_ tx: BRTxRef, biometricsPrompt: String, completion: @escaping (BiometricsResult) -> Void) - { + func signTransaction(_ tx: BRTxRef, biometricsPrompt: String, completion: @escaping (BiometricsResult) -> Void) { do { let spendLimit: Int64 = try keychainItem(key: KeychainKey.spendLimit) ?? 0 guard let wallet = wallet, wallet.amountSentByTx(tx) - wallet.amountReceivedFromTx(tx) + wallet.totalSent <= UInt64(spendLimit) @@ -592,8 +591,7 @@ private func setKeychainItem(key: String, item: T?, authenticated: Bool = fal if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound { status = SecItemDelete(query as CFDictionary) } - } else if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound - { // update existing item + } else if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound { // update existing item let update = [kSecAttrAccessible as String: accessible, kSecValueData as String: data as Any] status = SecItemUpdate(query as CFDictionary, update as CFDictionary) diff --git a/litewallet/WalletManager.swift b/litewallet/WalletManager.swift index 637aa4dcb..5ddde139c 100644 --- a/litewallet/WalletManager.swift +++ b/litewallet/WalletManager.swift @@ -3,8 +3,8 @@ import Foundation import SQLite3 import SystemConfiguration -internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) -internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) +let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) +let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) enum WalletManagerError: Error { case sqliteError(errorCode: Int32, description: String) @@ -19,13 +19,13 @@ private func SafeSqlite3ColumnBlob(statement: OpaquePointer, iCol: Int32) -> // After instantiating a WalletManager object, call myWalletManager.peerManager.connect() to begin syncing. class WalletManager: BRWalletListener, BRPeerManagerListener { - internal var didInitWallet = false - internal let dbPath: String - internal var db: OpaquePointer? + var didInitWallet = false + let dbPath: String + var db: OpaquePointer? private var txEnt: Int32 = 0 private var blockEnt: Int32 = 0 private var peerEnt: Int32 = 0 - internal let store: Store + let store: Store var masterPubKey = BRMasterPubKey() var earliestKeyTime: TimeInterval = 0 @@ -67,7 +67,7 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { } // TODO: Pass the fpRate from User Preferences - internal lazy var lazyPeerManager: BRPeerManager? = { + lazy var lazyPeerManager: BRPeerManager? = { if let wallet = self.wallet { return BRPeerManager(wallet: wallet, earliestKeyTime: self.earliestKeyTime, blocks: self.loadBlocks(), peers: self.loadPeers(), listener: self, fpRate: FalsePositiveRates.semiPrivate.rawValue) } else { @@ -75,9 +75,9 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { } }() - internal lazy var lazyWallet: BRWallet? = BRWallet(transactions: self.loadTransactions(), - masterPubKey: self.masterPubKey, - listener: self) + lazy var lazyWallet: BRWallet? = BRWallet(transactions: self.loadTransactions(), + masterPubKey: self.masterPubKey, + listener: self) private lazy var lazyAPIClient: BRAPIClient? = { guard let wallet = self.wallet else { return nil } @@ -91,9 +91,8 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { lazy var allWordsLists: [[NSString]] = { var array: [[NSString]] = [] - Bundle.main.localizations.forEach { lang in - if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) - { + for lang in Bundle.main.localizations { + if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) { if let words = NSArray(contentsOfFile: path) as? [NSString] { array.append(words) } @@ -105,9 +104,8 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { lazy var allWords: Set = { var set: Set = Set() - Bundle.main.localizations.forEach { lang in - if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) - { + for lang in Bundle.main.localizations { + if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) { if let words = NSArray(contentsOfFile: path) as? [NSString] { set.formUnion(words.map { $0 as String }) } diff --git a/litewallet/de.lproj/Localizable.strings b/litewallet/de.lproj/Localizable.strings index b5ba77126..b22946220 100755 --- a/litewallet/de.lproj/Localizable.strings +++ b/litewallet/de.lproj/Localizable.strings @@ -904,21 +904,6 @@ /* Fees: $0.01*/ "Send.fee" = "Gebühren: %1$@"; -/* Fees: $0.01*/ -"Send.fee" = "Gebühren: %1$@"; - -/* Fees: $0.01*/ -"Send.fee" = "Gebühren: %1$@"; - -/* Fees Blank: */ -"Send.feeBlank" = "Gebühren:"; - -/* Fees Blank: */ -"Send.feeBlank" = "Gebühren:"; - -/* Fees Blank: */ -"Send.feeBlank" = "Gebühren:"; - /* Fees Blank: */ "Send.feeBlank" = "Gebühren:"; diff --git a/litewallet/en.lproj/Localizable.strings b/litewallet/en.lproj/Localizable.strings index 4cc13379c..d93df6696 100644 --- a/litewallet/en.lproj/Localizable.strings +++ b/litewallet/en.lproj/Localizable.strings @@ -907,18 +907,6 @@ /* Fees: $0.01*/ "Send.fee" = "Fees: %1$@"; -/* Fees: $0.01*/ -"Send.fee" = "Fees: %1$@"; - -/* Fees: $0.01*/ -"Send.fee" = "Fees: %1$@"; - -/* Fees Blank: */ -"Send.feeBlank" = "Fees:"; - -/* Fees Blank: */ -"Send.feeBlank" = "Fees:"; - /* Fees Blank: */ "Send.feeBlank" = "Fees:"; diff --git a/litewallet/src/AppDelegate.swift b/litewallet/src/AppDelegate.swift index 8ae9e44bb..ad04fedf7 100644 --- a/litewallet/src/AppDelegate.swift +++ b/litewallet/src/AppDelegate.swift @@ -9,8 +9,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let applicationController = ApplicationController() let pushNotifications = PushNotifications.shared - func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool - { + func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { setFirebaseConfiguration() updateCurrentUserLocale(localeId: Locale.current.identifier) @@ -64,13 +63,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate { applicationController.willResignActive() } - func application(_: UIApplication, shouldAllowExtensionPointIdentifier _: UIApplication.ExtensionPointIdentifier) -> Bool - { + func application(_: UIApplication, shouldAllowExtensionPointIdentifier _: UIApplication.ExtensionPointIdentifier) -> Bool { return false // disable extensions such as custom keyboards for security purposes } - func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool - { + func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { return applicationController.open(url: url) } diff --git a/litewallet/src/ApplicationController.swift b/litewallet/src/ApplicationController.swift index 2aa0e518e..31d5d45b8 100644 --- a/litewallet/src/ApplicationController.swift +++ b/litewallet/src/ApplicationController.swift @@ -273,8 +273,7 @@ class ApplicationController: Subscriber, Trackable { func performBackgroundFetch() { saveEvent("appController.performBackgroundFetch") let group = DispatchGroup() - if let peerManager = walletManager?.peerManager, peerManager.syncProgress(fromStartHeight: peerManager.lastBlockHeight) < 1.0 - { + if let peerManager = walletManager?.peerManager, peerManager.syncProgress(fromStartHeight: peerManager.lastBlockHeight) < 1.0 { group.enter() LWAnalytics.logEventWithParameters(itemName: ._20200111_DEDG) diff --git a/litewallet/src/Constants/Functions.swift b/litewallet/src/Constants/Functions.swift index 7805bf290..03ad48682 100644 --- a/litewallet/src/Constants/Functions.swift +++ b/litewallet/src/Constants/Functions.swift @@ -23,16 +23,14 @@ func guardProtected(queue: DispatchQueue, callback: @escaping () -> Void) { } } -func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void -{ +func strongify(_ context: Context, closure: @escaping (Context) -> Void) -> () -> Void { return { [weak context] in guard let strongContext = context else { return } closure(strongContext) } } -func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void -{ +func strongify(_ context: Context?, closure: @escaping (Context, Arguments) -> Void) -> (Arguments) -> Void { return { [weak context] arguments in guard let strongContext = context else { return } closure(strongContext, arguments) diff --git a/litewallet/src/Environment.swift b/litewallet/src/Environment.swift index 8541978fa..942cdce17 100644 --- a/litewallet/src/Environment.swift +++ b/litewallet/src/Environment.swift @@ -126,7 +126,7 @@ struct E { }() static var isIPhone4: Bool { - return (UIScreen.main.bounds.size.height == 480.0) + return UIScreen.main.bounds.size.height == 480.0 } static var isIPhone5: Bool { @@ -134,24 +134,22 @@ struct E { } static var isIPhoneX: Bool { - return (UIScreen.main.bounds.size.height == 812.0) + return UIScreen.main.bounds.size.height == 812.0 } static var isIPhone8Plus: Bool { - return (UIScreen.main.bounds.size.height == 736.0) + return UIScreen.main.bounds.size.height == 736.0 } static var isIPhoneXsMax: Bool { - return (UIScreen.main.bounds.size.height == 812.0) + return UIScreen.main.bounds.size.height == 812.0 } static var isIPad: Bool { - return (UIDevice.current.userInterfaceIdiom == .pad) + return UIDevice.current.userInterfaceIdiom == .pad } - static let is32Bit: Bool = { - MemoryLayout.size == MemoryLayout.size - }() + static let is32Bit: Bool = MemoryLayout.size == MemoryLayout.size static var screenHeight: CGFloat { return UIScreen.main.bounds.size.height diff --git a/litewallet/src/Extensions/Async.swift b/litewallet/src/Extensions/Async.swift index 22dbf25c6..ed43c3625 100644 --- a/litewallet/src/Extensions/Async.swift +++ b/litewallet/src/Extensions/Async.swift @@ -1,10 +1,9 @@ import Foundation enum Async { - static func parallel(callbacks: [(@escaping () -> Void) -> Void], completion: @escaping () -> Void) - { + static func parallel(callbacks: [(@escaping () -> Void) -> Void], completion: @escaping () -> Void) { let dispatchGroup = DispatchGroup() - callbacks.forEach { cb in + for cb in callbacks { dispatchGroup.enter() cb { dispatchGroup.leave() diff --git a/litewallet/src/Extensions/CGContext+Additions.swift b/litewallet/src/Extensions/CGContext+Additions.swift index 29b720a3a..c5196c930 100644 --- a/litewallet/src/Extensions/CGContext+Additions.swift +++ b/litewallet/src/Extensions/CGContext+Additions.swift @@ -4,8 +4,8 @@ extension CGContext { func addLineThrough(_ points: [(CGFloat, CGFloat)]) { guard let first = points.first else { return } move(to: CGPoint(x: first.0, y: first.1)) - points.dropFirst().forEach { - addLine(to: CGPoint(x: $0.0, y: $0.1)) + for point in points.dropFirst() { + addLine(to: CGPoint(x: point.0, y: point.1)) } } } diff --git a/litewallet/src/Extensions/NumberFormatter+Additions.swift b/litewallet/src/Extensions/NumberFormatter+Additions.swift index 7875041e4..8505fb57b 100644 --- a/litewallet/src/Extensions/NumberFormatter+Additions.swift +++ b/litewallet/src/Extensions/NumberFormatter+Additions.swift @@ -1,8 +1,7 @@ import Foundation extension NumberFormatter { - static func formattedString(amount: Satoshis, rate: Rate?, minimumFractionDigits: Int?, maxDigits: Int) -> String - { + static func formattedString(amount: Satoshis, rate: Rate?, minimumFractionDigits: Int?, maxDigits: Int) -> String { let displayAmount = Amount(amount: amount.rawValue, rate: rate ?? Rate.empty, maxDigits: maxDigits) var formatter: NumberFormatter var output = "" diff --git a/litewallet/src/Extensions/UIView+AnimationAdditions.swift b/litewallet/src/Extensions/UIView+AnimationAdditions.swift index f716102c7..355be2644 100644 --- a/litewallet/src/Extensions/UIView+AnimationAdditions.swift +++ b/litewallet/src/Extensions/UIView+AnimationAdditions.swift @@ -1,8 +1,7 @@ import UIKit extension UIView { - static func spring(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) - { + static func spring(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) { if #available(iOS 10.0, *) { UIViewPropertyAnimator.springAnimation(duration, delay: delay, animations: animations, completion: { _ in completion(true) }) } else { @@ -10,8 +9,7 @@ extension UIView { } } - static func spring(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) - { + static func spring(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (Bool) -> Void) { if #available(iOS 10.0, *) { UIViewPropertyAnimator.springAnimation(duration, animations: animations, completion: { _ in completion(true) }) } else { diff --git a/litewallet/src/Extensions/UIView+BRWAdditions.swift b/litewallet/src/Extensions/UIView+BRWAdditions.swift index d67869d60..fc0c99593 100644 --- a/litewallet/src/Extensions/UIView+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIView+BRWAdditions.swift @@ -42,8 +42,7 @@ extension UIView { NSLayoutConstraint.activate(constraints.compactMap { $0 }) } - func constraint(_ attribute: NSLayoutConstraint.Attribute, toView: UIView, constant: CGFloat?) -> NSLayoutConstraint? - { + func constraint(_ attribute: NSLayoutConstraint.Attribute, toView: UIView, constant: CGFloat?) -> NSLayoutConstraint? { guard superview != nil else { assertionFailure("Superview cannot be nil when adding contraints"); return nil } translatesAutoresizingMaskIntoConstraints = false return NSLayoutConstraint(item: self, attribute: attribute, relatedBy: .equal, toItem: toView, attribute: attribute, multiplier: 1.0, constant: constant ?? 0.0) @@ -94,8 +93,7 @@ extension UIView { return NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal, toItem: toLeading, attribute: .leading, multiplier: 1.0, constant: constant) } - func constrainTopCorners(sidePadding: CGFloat, topPadding: CGFloat, topLayoutGuide: UILayoutSupport) - { + func constrainTopCorners(sidePadding: CGFloat, topPadding: CGFloat, topLayoutGuide: UILayoutSupport) { guard let view = superview else { assertionFailure("Superview cannot be nil when adding contraints"); return } constrain([ constraint(.leading, toView: view, constant: sidePadding), diff --git a/litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift b/litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift index 320650b69..e48569116 100644 --- a/litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift @@ -2,8 +2,7 @@ import UIKit @available(iOS 10.0, *) extension UIViewPropertyAnimator { - static func springAnimation(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) - { + static func springAnimation(_ duration: TimeInterval, delay: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) { let springParameters = UISpringTimingParameters(dampingRatio: 0.7) let animator = UIViewPropertyAnimator(duration: duration, timingParameters: springParameters) animator.addAnimations(animations) @@ -11,8 +10,7 @@ extension UIViewPropertyAnimator { animator.startAnimation(afterDelay: delay) } - static func springAnimation(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) - { + static func springAnimation(_ duration: TimeInterval, animations: @escaping () -> Void, completion: @escaping (UIViewAnimatingPosition) -> Void) { springAnimation(duration, delay: 0.0, animations: animations, completion: completion) } } diff --git a/litewallet/src/FlowControllers/MessageUIPresenter.swift b/litewallet/src/FlowControllers/MessageUIPresenter.swift index 89cf3adbf..6094810fe 100644 --- a/litewallet/src/FlowControllers/MessageUIPresenter.swift +++ b/litewallet/src/FlowControllers/MessageUIPresenter.swift @@ -110,15 +110,13 @@ class MessageUIPresenter: NSObject, Trackable { } extension MessageUIPresenter: MFMailComposeViewControllerDelegate { - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) - { + func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith _: MFMailComposeResult, error _: Error?) { dismiss(controller) } } extension MessageUIPresenter: MFMessageComposeViewControllerDelegate { - func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) - { + func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith _: MessageComposeResult) { dismiss(controller) } } diff --git a/litewallet/src/FlowControllers/StartNavigationDelegate.swift b/litewallet/src/FlowControllers/StartNavigationDelegate.swift index c6d54b5d4..8ac4726cb 100644 --- a/litewallet/src/FlowControllers/StartNavigationDelegate.swift +++ b/litewallet/src/FlowControllers/StartNavigationDelegate.swift @@ -7,8 +7,7 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { self.store = store } - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) - { + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { if viewController is RecoverWalletIntroViewController { navigationController.navigationBar.tintColor = .white navigationController.navigationBar.titleTextAttributes = [ diff --git a/litewallet/src/ModalPresenter.swift b/litewallet/src/ModalPresenter.swift index b54f6d4f1..35fd280dc 100644 --- a/litewallet/src/ModalPresenter.swift +++ b/litewallet/src/ModalPresenter.swift @@ -443,10 +443,9 @@ class ModalPresenter: Subscriber, Trackable { nc.setWhiteStyle() nc.delegate = myself.wipeNavigationDelegate let start = StartWipeWalletViewController { - let recover = EnterPhraseViewController(store: myself.store, walletManager: walletManager, reason: .validateForWipingWallet - { - myself.wipeWallet() - }) + let recover = EnterPhraseViewController(store: myself.store, walletManager: walletManager, reason: .validateForWipingWallet { + myself.wipeWallet() + }) nc.pushViewController(recover, animated: true) } start.addCloseNavigationItem(tintColor: .white) @@ -715,8 +714,7 @@ class ModalPresenter: Subscriber, Trackable { presentLoginScan() } else { LWAnalytics.logEventWithParameters(itemName: ._20210427_HCIEEH) - if let presented = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first?.rootViewController?.presentedViewController - { + if let presented = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first?.rootViewController?.presentedViewController { presented.dismiss(animated: true, completion: { self.presentLoginScan() }) @@ -833,8 +831,7 @@ class ModalPresenter: Subscriber, Trackable { } class SecurityCenterNavigationDelegate: NSObject, UINavigationControllerDelegate { - func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) - { + func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated _: Bool) { guard let coordinator = navigationController.topViewController?.transitionCoordinator else { return } if coordinator.isInteractive { diff --git a/litewallet/src/PaymentProtocol.swift b/litewallet/src/PaymentProtocol.swift index 2f21ce87e..8c5b5f11b 100644 --- a/litewallet/src/PaymentProtocol.swift +++ b/litewallet/src/PaymentProtocol.swift @@ -2,10 +2,10 @@ import BRCore import Foundation class PaymentProtocolDetails { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -68,13 +68,13 @@ class PaymentProtocolDetails { } class PaymentProtocolRequest { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool private var cName: String? private var errMsg: String? private var didValidate: Bool = false - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -233,10 +233,10 @@ class PaymentProtocolRequest { } class PaymentProtocolPayment { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } @@ -274,8 +274,7 @@ class PaymentProtocolPayment { return [BRTxRef?](UnsafeBufferPointer(start: cPtr.pointee.transactions, count: cPtr.pointee.txCount)) } - var refundTo: [BRTxOutput] - { // where to send refunds, if a refund is necessary, refundTo[n].amount defaults to 0 + var refundTo: [BRTxOutput] { // where to send refunds, if a refund is necessary, refundTo[n].amount defaults to 0 return [BRTxOutput](UnsafeBufferPointer(start: cPtr.pointee.refundTo, count: cPtr.pointee.refundToCount)) } @@ -290,10 +289,10 @@ class PaymentProtocolPayment { } class PaymentProtocolACK { - internal let cPtr: UnsafeMutablePointer - internal var isManaged: Bool + let cPtr: UnsafeMutablePointer + var isManaged: Bool - internal init(_ cPtr: UnsafeMutablePointer) { + init(_ cPtr: UnsafeMutablePointer) { self.cPtr = cPtr isManaged = false } diff --git a/litewallet/src/PaymentRequest.swift b/litewallet/src/PaymentRequest.swift index 5e56db0ef..b498344a4 100644 --- a/litewallet/src/PaymentRequest.swift +++ b/litewallet/src/PaymentRequest.swift @@ -8,8 +8,7 @@ enum PaymentRequestType { struct PaymentRequest { init?(string: String) { - if var url = NSURL(string: string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).replacingOccurrences(of: " ", with: "%20")) - { + if var url = NSURL(string: string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).replacingOccurrences(of: " ", with: "%20")) { if let scheme = url.scheme, let resourceSpecifier = url.resourceSpecifier, url.host == nil { url = NSURL(string: "\(scheme)://\(resourceSpecifier)")! diff --git a/litewallet/src/PinDigitView.swift b/litewallet/src/PinDigitView.swift index 5b68de505..2453776d9 100644 --- a/litewallet/src/PinDigitView.swift +++ b/litewallet/src/PinDigitView.swift @@ -38,6 +38,7 @@ struct PinDigitView: View { /// Inspired by https://stackoverflow.com/questions/72926965/creating-an-ios-passcode-view-with-swiftui-how-to-hide-a-textview import SwiftUI + struct PasscodeView: View { @EnvironmentObject var viewModel: StartViewModel diff --git a/litewallet/src/Platform/BRAPIClient.swift b/litewallet/src/Platform/BRAPIClient.swift index c7834643a..f37028991 100644 --- a/litewallet/src/Platform/BRAPIClient.swift +++ b/litewallet/src/Platform/BRAPIClient.swift @@ -283,8 +283,7 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR // MARK: URLSession Delegate - public func urlSession(_: URLSession, task _: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) - { + public func urlSession(_: URLSession, task _: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { if challenge.protectionSpace.host == host, challenge.protectionSpace.serverTrust != nil { log("URLSession challenge accepted!") @@ -297,11 +296,9 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR } } - public func urlSession(_: URLSession, task: URLSessionTask, willPerformHTTPRedirection _: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) - { + public func urlSession(_: URLSession, task: URLSessionTask, willPerformHTTPRedirection _: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { var actualRequest = request - if let currentReq = task.currentRequest, var curHost = currentReq.url?.host, let curScheme = currentReq.url?.scheme - { + if let currentReq = task.currentRequest, var curHost = currentReq.url?.host, let curScheme = currentReq.url?.scheme { if let curPort = currentReq.url?.port, curPort != 443, curPort != 80 { curHost = "\(curHost):\(curPort)" } @@ -309,8 +306,7 @@ open class BRAPIClient: NSObject, URLSessionDelegate, URLSessionTaskDelegate, BR // follow the redirect if we're interacting with our API actualRequest = decorateRequest(request) log("redirecting \(String(describing: currentReq.url)) to \(String(describing: request.url))") - if let curAuth = currentReq.allHTTPHeaderFields?["Authorization"], curAuth.hasPrefix("Litewallet") - { + if let curAuth = currentReq.allHTTPHeaderFields?["Authorization"], curAuth.hasPrefix("Litewallet") { // add authentication because the previous request was authenticated log("adding authentication to redirected request") actualRequest = signRequest(actualRequest) diff --git a/litewallet/src/Platform/BRReplicatedKVStore.swift b/litewallet/src/Platform/BRReplicatedKVStore.swift index bad0eca03..50aea3948 100644 --- a/litewallet/src/Platform/BRReplicatedKVStore.swift +++ b/litewallet/src/Platform/BRReplicatedKVStore.swift @@ -203,7 +203,7 @@ open class BRReplicatedKVStore: NSObject { deleted = sqlite3_column_int(stmt, 3) > 0 ret = Array(UnsafeBufferPointer(start: blob?.assumingMemoryBound(to: UInt8.self), count: Int(blobLength))) } - return (curVer, time, deleted, encrypted ? try decrypt(ret) : ret) + return try (curVer, time, deleted, encrypted ? decrypt(ret) : ret) } /// Set the value of a key locally in the database. If syncImmediately is true (the default) then immediately @@ -330,8 +330,7 @@ open class BRReplicatedKVStore: NSObject { //// return 0 // } - func remoteVersion(_ key: String) throws -> Int - { // this would be UInt64.. but it makes the compiler crash + func remoteVersion(_ key: String) throws -> Int { // this would be UInt64.. but it makes the compiler crash try checkKey(key) var ret: UInt64 = 0 try txn { @@ -737,11 +736,10 @@ open class BRReplicatedKVStore: NSObject { gettimeofday(&tv, nil) var t = UInt64(tv.tv_usec) * 1_000_000 + UInt64(tv.tv_usec) let p = [UInt8](repeating: 0, count: 4) - return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes - { (dat: UnsafePointer) -> [UInt8] in - let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) - return p + Array(buf) - } + return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes { (dat: UnsafePointer) -> [UInt8] in + let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) + return p + Array(buf) + } } fileprivate func log(_ s: String) { diff --git a/litewallet/src/Platform/BRTar.swift b/litewallet/src/Platform/BRTar.swift index 027a6be5f..59b10f0b1 100644 --- a/litewallet/src/Platform/BRTar.swift +++ b/litewallet/src/Platform/BRTar.swift @@ -137,8 +137,7 @@ class BRTar { } } - fileprivate static func readTypeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> BRTarType - { + fileprivate static func readTypeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> BRTarType { log("reading type at location \(location)") handle.seek(toFileOffset: location + tarTypePosition) let typeDat = handle.readData(ofLength: 1) @@ -147,8 +146,7 @@ class BRTar { return ret } - fileprivate static func readNameAtLocation(_ location: UInt64, fromHandle handle: FileHandle) throws -> String - { + fileprivate static func readNameAtLocation(_ location: UInt64, fromHandle handle: FileHandle) throws -> String { handle.seek(toFileOffset: location + tarNamePosition) let dat = handle.readData(ofLength: Int(tarNameSize)) guard let ret = String(bytes: dat, encoding: String.Encoding.ascii) @@ -159,8 +157,7 @@ class BRTar { return ret } - fileprivate static func readSizeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> UInt64 - { + fileprivate static func readSizeAtLocation(_ location: UInt64, fromHandle handle: FileHandle) -> UInt64 { handle.seek(toFileOffset: location + tarSizePosition) let sizeDat = handle.readData(ofLength: Int(tarSizeSize)) let octal = NSString(data: sizeDat, encoding: String.Encoding.ascii.rawValue)! diff --git a/litewallet/src/Platform/BRWebViewController.swift b/litewallet/src/Platform/BRWebViewController.swift index 19f419cba..340cd7a88 100644 --- a/litewallet/src/Platform/BRWebViewController.swift +++ b/litewallet/src/Platform/BRWebViewController.swift @@ -3,8 +3,7 @@ import UIKit import WebKit @available(iOS 8.0, *) -@objc open class BRWebViewController: UIViewController, WKNavigationDelegate, BRWebSocketClient, WKScriptMessageHandler -{ +@objc open class BRWebViewController: UIViewController, WKNavigationDelegate, BRWebSocketClient, WKScriptMessageHandler { var wkProcessPool: WKProcessPool var webView: WKWebView? var server = BRHTTPServer() @@ -36,8 +35,7 @@ import WebKit private let messageUIPresenter = MessageUIPresenter() - init(partner: String?, mountPoint: String = "/", walletManager: WalletManager, store: Store, noAuthApiClient: BRAPIClient? = nil) - { + init(partner: String?, mountPoint: String = "/", walletManager: WalletManager, store: Store, noAuthApiClient: BRAPIClient? = nil) { wkProcessPool = WKProcessPool() self.mountPoint = mountPoint self.walletManager = walletManager @@ -85,20 +83,18 @@ import WebKit view.addSubview(webView!) let center = NotificationCenter.default - center.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) - { [weak self] _ in - self?.didAppear = true - if let info = self?.webViewInfo { - self?.sendToAllSockets(data: info) - } + center.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in + self?.didAppear = true + if let info = self?.webViewInfo { + self?.sendToAllSockets(data: info) } - center.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: .main) - { [weak self] _ in - self?.didAppear = false - if let info = self?.webViewInfo { - self?.sendToAllSockets(data: info) - } + } + center.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: .main) { [weak self] _ in + self?.didAppear = false + if let info = self?.webViewInfo { + self?.sendToAllSockets(data: info) } + } activityIndicator.activityIndicatorViewStyle = .white activityIndicator.color = .darkGray @@ -160,8 +156,7 @@ import WebKit activityIndicator.isHidden = true } - public func userContentController(_: WKUserContentController, didReceive message: WKScriptMessage) - { + public func userContentController(_: WKUserContentController, didReceive message: WKScriptMessage) { guard let response = message.body as? String else { return } let URLString = URL(string: "https://checkout.simplexcc.com/payments/new") diff --git a/litewallet/src/Platform/Extensions.swift b/litewallet/src/Platform/Extensions.swift index b79051f57..60e497dd4 100644 --- a/litewallet/src/Platform/Extensions.swift +++ b/litewallet/src/Platform/Extensions.swift @@ -1,5 +1,6 @@ import BRCore import Foundation + // import libbz2 import UIKit @@ -23,8 +24,7 @@ public extension String { } static var urlQuoteCharacterSet: CharacterSet { - if let cset = (NSMutableCharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as? NSMutableCharacterSet - { + if let cset = (NSMutableCharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as? NSMutableCharacterSet { cset.removeCharacters(in: "?=&") return cset as CharacterSet } @@ -40,17 +40,16 @@ public extension String { var result = Data(count: 128 / 8) let resultCount = result.count - return result.withUnsafeMutableBytes - { (resultBytes: UnsafeMutablePointer) -> String in - data.withUnsafeBytes { dataBytes in - BRMD5(resultBytes, dataBytes, data.count) - } - var hash = String() - for i in 0 ..< resultCount { - hash = hash.appendingFormat("%02x", resultBytes[i]) - } - return hash + return result.withUnsafeMutableBytes { (resultBytes: UnsafeMutablePointer) -> String in + data.withUnsafeBytes { dataBytes in + BRMD5(resultBytes, dataBytes, data.count) + } + var hash = String() + for i in 0 ..< resultCount { + hash = hash.appendingFormat("%02x", resultBytes[i]) } + return hash + } } func base58DecodedData() -> Data { @@ -287,30 +286,27 @@ public extension Data { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt8 in - ptr.pointee - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt8 in + ptr.pointee + } } func uInt32(atOffset offset: UInt) -> UInt32 { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt32 in - CFSwapInt32LittleToHost(ptr.pointee) - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt32 in + CFSwapInt32LittleToHost(ptr.pointee) + } } func uInt64(atOffset offset: UInt) -> UInt64 { let offt = Int(offset) let size = MemoryLayout.size if count < offt + size { return 0 } - return subdata(in: offt ..< (offt + size)).withUnsafeBytes - { (ptr: UnsafePointer) -> UInt64 in - CFSwapInt64LittleToHost(ptr.pointee) - } + return subdata(in: offt ..< (offt + size)).withUnsafeBytes { (ptr: UnsafePointer) -> UInt64 in + CFSwapInt64LittleToHost(ptr.pointee) + } } func compactSign(key: BRKey) -> Data { @@ -327,11 +323,10 @@ public extension Data { gettimeofday(&tv, nil) var t = UInt64(tv.tv_usec) * 1_000_000 + UInt64(tv.tv_usec) let p = [UInt8](repeating: 0, count: 4) - return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes - { (dat: UnsafePointer) -> [UInt8] in - let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) - return p + Array(buf) - } + return Data(bytes: &t, count: MemoryLayout.size).withUnsafeBytes { (dat: UnsafePointer) -> [UInt8] in + let buf = UnsafeBufferPointer(start: dat, count: MemoryLayout.size) + return p + Array(buf) + } } func chacha20Poly1305AEADEncrypt(key: BRKey) -> Data { @@ -399,8 +394,7 @@ public extension Date { // this is lifted from: https://github.com/Fykec/NSDate-RFC1123/blob/master/NSDate%2BRFC1123.swift // Copyright © 2015 Foster Yin. All rights reserved. - fileprivate static func cachedThreadLocalObjectWithKey(_ key: String, create: () -> T) -> T - { + fileprivate static func cachedThreadLocalObjectWithKey(_ key: String, create: () -> T) -> T { let threadDictionary = Thread.current.threadDictionary if let cachedObject = threadDictionary[key] as! T? { return cachedObject diff --git a/litewallet/src/ReachabilityMonitor.swift b/litewallet/src/ReachabilityMonitor.swift index 7e0ede5cd..f6cef3a29 100644 --- a/litewallet/src/ReachabilityMonitor.swift +++ b/litewallet/src/ReachabilityMonitor.swift @@ -1,8 +1,7 @@ import Foundation import SystemConfiguration -private func callback(reachability _: SCNetworkReachability, flags _: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) -{ +private func callback(reachability _: SCNetworkReachability, flags _: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) { guard let info = info else { return } let reachability = Unmanaged.fromOpaque(info).takeUnretainedValue() reachability.notify() @@ -40,8 +39,7 @@ class ReachabilityMonitor: Trackable { private var flags: SCNetworkReachabilityFlags { var flags = SCNetworkReachabilityFlags(rawValue: 0) - if let reachability = networkReachability, withUnsafeMutablePointer(to: &flags, { SCNetworkReachabilityGetFlags(reachability, UnsafeMutablePointer($0)) }) == true - { + if let reachability = networkReachability, withUnsafeMutablePointer(to: &flags, { SCNetworkReachabilityGetFlags(reachability, UnsafeMutablePointer($0)) }) == true { return flags } else { return [] diff --git a/litewallet/src/Sender.swift b/litewallet/src/Sender.swift index 62b0d11ca..4ea09d554 100644 --- a/litewallet/src/Sender.swift +++ b/litewallet/src/Sender.swift @@ -88,8 +88,8 @@ class Sender { self.comment = comment self.feePerKb = feePerKb - if UserDefaults.isBiometricsEnabled && - walletManager.canUseBiometrics(forTx: tx) + if UserDefaults.isBiometricsEnabled, + walletManager.canUseBiometrics(forTx: tx) { DispatchQueue.walletQueue.async { [weak self] in guard let myself = self else { return } diff --git a/litewallet/src/SimpleRedux.swift b/litewallet/src/SimpleRedux.swift index 1482ceda4..9294681b3 100644 --- a/litewallet/src/SimpleRedux.swift +++ b/litewallet/src/SimpleRedux.swift @@ -131,15 +131,13 @@ class Store { // Subscription callback is immediately called with current State value on subscription // and then any time the selected value changes - func subscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) - { + func subscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) { lazySubscribe(subscriber, selector: selector, callback: callback) callback(state) } // Same as subscribe(), but doesn't call the callback with current state upon subscription - func lazySubscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) - { + func lazySubscribe(_ subscriber: Subscriber, selector: @escaping Selector, callback: @escaping (ReduxState) -> Void) { let key = subscriber.hashValue let subscription = Subscription(selector: selector, callback: callback) if subscriptions[key] != nil { @@ -149,8 +147,7 @@ class Store { } } - func subscribe(_ subscriber: Subscriber, name: TriggerName, callback: @escaping (TriggerName?) -> Void) - { + func subscribe(_ subscriber: Subscriber, name: TriggerName, callback: @escaping (TriggerName?) -> Void) { let key = subscriber.hashValue let trigger = Trigger(name: name, callback: callback) if triggers[key] != nil { diff --git a/litewallet/src/StartView.swift b/litewallet/src/StartView.swift index 60cacbd9e..47bc6ffa4 100644 --- a/litewallet/src/StartView.swift +++ b/litewallet/src/StartView.swift @@ -118,17 +118,18 @@ struct StartView: View { alignment: .center) .alert(startViewModel .alertMessage[startViewModel.currentLanguage.rawValue], - isPresented: $delayedSelect) { - HStack { - Button(S.Button.yes.localize(), role: .cancel) { - startViewModel.setLanguage(code: startViewModel.currentLanguage.code) - selectedLang = false - } - Button(S.Button.cancel.localize(), role: .destructive) { - // Dismisses - selectedLang = false - } + isPresented: $delayedSelect) + { + HStack { + Button(S.Button.yes.localize(), role: .cancel) { + startViewModel.setLanguage(code: startViewModel.currentLanguage.code) + selectedLang = false } + Button(S.Button.cancel.localize(), role: .destructive) { + // Dismisses + selectedLang = false + } + } } Spacer() NavigationLink(destination: diff --git a/litewallet/src/ViewControllers/AmountViewController.swift b/litewallet/src/ViewControllers/AmountViewController.swift index ef3048d71..b3177e314 100644 --- a/litewallet/src/ViewControllers/AmountViewController.swift +++ b/litewallet/src/ViewControllers/AmountViewController.swift @@ -1,7 +1,7 @@ import UIKit private let currencyToggleConstant: CGFloat = 20.0 -private let amountFont: UIFont = UIFont.barlowMedium(size: 14.0) +private let amountFont: UIFont = .barlowMedium(size: 14.0) class AmountViewController: UIViewController, Trackable { private let store: Store private let isPinPadExpandedAtLaunch: Bool diff --git a/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift b/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift index 0bc2e72c0..a7e41ddc8 100644 --- a/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift +++ b/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift @@ -56,8 +56,7 @@ class BiometricsSpendingLimitViewController: UITableViewController, Subscriber { return limits.count } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) let limit = limits[indexPath.row] if limit == 0 { diff --git a/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift b/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift index 45f74fc47..ecac0606f 100644 --- a/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift +++ b/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift @@ -41,12 +41,11 @@ class ConfirmPaperPhraseViewController: UITableViewController { return wordArray }() - private lazy var confirmFirstPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.0 + 1)"), word: self.words[self.fourIndices.0]) - }() + private lazy var confirmFirstPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.0 + 1)"), word: self.words[self.fourIndices.0]) - private lazy var confirmSecondPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.1 + 1)"), word: self.words[self.fourIndices.1]) }() - private lazy var confirmThirdPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.2 + 1)"), word: self.words[self.fourIndices.2]) }() - private lazy var confirmFourthPhrase: ConfirmPhrase = { ConfirmPhrase(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.3 + 1)"), word: self.words[self.fourIndices.3]) }() + private lazy var confirmSecondPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.1 + 1)"), word: self.words[self.fourIndices.1]) + private lazy var confirmThirdPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.2 + 1)"), word: self.words[self.fourIndices.2]) + private lazy var confirmFourthPhrase: ConfirmPhrase = .init(text: String(format: S.ConfirmPaperPhrase.word.localize(), "\(self.fourIndices.3 + 1)"), word: self.words[self.fourIndices.3]) var store: Store? var walletManager: WalletManager? @@ -71,7 +70,8 @@ class ConfirmPaperPhraseViewController: UITableViewController { NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, - queue: nil) { [weak self] _ in + queue: nil) + { [weak self] _ in self?.dismiss(animated: true, completion: nil) } diff --git a/litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift b/litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift index 1c3c479aa..d8b654ea7 100644 --- a/litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift +++ b/litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift @@ -59,8 +59,7 @@ class EnterPhraseCollectionViewController: UICollectionViewController { return 12 } - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell - { + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) guard let enterPhraseCell = item as? EnterPhraseCell else { return item } enterPhraseCell.index = indexPath.row diff --git a/litewallet/src/ViewControllers/EnterPhraseViewController.swift b/litewallet/src/ViewControllers/EnterPhraseViewController.swift index 15a0e1bf8..ba7819911 100644 --- a/litewallet/src/ViewControllers/EnterPhraseViewController.swift +++ b/litewallet/src/ViewControllers/EnterPhraseViewController.swift @@ -8,8 +8,7 @@ enum PhraseEntryReason { typealias EnterPhraseCallback = (String) -> Void -class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomTitleView, Trackable -{ +class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomTitleView, Trackable { init(store: Store, walletManager: WalletManager, reason: PhraseEntryReason) { self.store = store self.walletManager = walletManager @@ -37,7 +36,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT private let enterPhrase: EnterPhraseCollectionViewController private let errorLabel = UILabel.wrapping(font: .customBody(size: 16.0), color: .litewalletOrange) private let instruction = UILabel(font: .customBold(size: 14.0), color: .darkText) - internal let titleLabel = UILabel.wrapping(font: .customBold(size: 26.0), color: .darkText) + let titleLabel = UILabel.wrapping(font: .customBold(size: 26.0), color: .darkText) private let subheader = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) private let faq: UIButton private let scrollView = UIScrollView() @@ -206,8 +205,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT didScrollForCustomTitle(yOffset: scrollView.contentOffset.y) } - func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) - { + func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) { scrollViewWillEndDraggingForCustomTitle(yOffset: targetContentOffset.pointee.y) } diff --git a/litewallet/src/ViewControllers/Import/StartImportViewController.swift b/litewallet/src/ViewControllers/Import/StartImportViewController.swift index 3d59c9f1c..b9eb28a37 100644 --- a/litewallet/src/ViewControllers/Import/StartImportViewController.swift +++ b/litewallet/src/ViewControllers/Import/StartImportViewController.swift @@ -164,18 +164,17 @@ class StartImportViewController: UIViewController { timeoutInterval: 20.0) request.httpMethod = "POST" request.httpBody = "addrs=\(address)".data(using: .utf8) - let task = URLSession.shared.dataTask(with: request as URLRequest) - { [weak self] data, _, error in - guard let myself = self else { return } - guard error == nil else { print("error: \(error!)"); return } - guard let data = data, - let jsonData = try? JSONSerialization.jsonObject(with: data, options: []), - let json = jsonData as? [[String: Any]] else { return } + let task = URLSession.shared.dataTask(with: request as URLRequest) { [weak self] data, _, error in + guard let myself = self else { return } + guard error == nil else { print("error: \(error!)"); return } + guard let data = data, + let jsonData = try? JSONSerialization.jsonObject(with: data, options: []), + let json = jsonData as? [[String: Any]] else { return } - DispatchQueue.main.async { - myself.handleData(data: json, key: key) - } + DispatchQueue.main.async { + myself.handleData(data: json, key: key) } + } task.resume() }) } @@ -191,7 +190,7 @@ class StartImportViewController: UIViewController { } let outputs = data.compactMap { SimpleUTXO(json: $0) } let balance = outputs.map { $0.satoshis }.reduce(0, +) - outputs.forEach { output in + for output in outputs { tx.addInput(txHash: output.hash, index: output.index, amount: output.satoshis, script: output.script) } @@ -221,8 +220,7 @@ class StartImportViewController: UIViewController { }) } - private func publish(tx: UnsafeMutablePointer, balance: UInt64, fee: UInt64, key: BRKey) - { + private func publish(tx: UnsafeMutablePointer, balance: UInt64, fee: UInt64, key: BRKey) { present(importingActivity, animated: true, completion: { guard let wallet = self.walletManager.wallet else { return } guard let script = BRAddress(string: wallet.receiveAddress)?.scriptPubKey else { return } diff --git a/litewallet/src/ViewControllers/LoginViewController.swift b/litewallet/src/ViewControllers/LoginViewController.swift index 4f2445f07..96f3785a5 100644 --- a/litewallet/src/ViewControllers/LoginViewController.swift +++ b/litewallet/src/ViewControllers/LoginViewController.swift @@ -116,18 +116,17 @@ class LoginViewController: UIViewController, Subscriber, Trackable { guard let walletManager = self?.walletManager else { return } self?.isResetting = true let nc = UINavigationController() - let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin - { phrase in - let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) - nc.pushViewController(updatePin, animated: true) - updatePin.resetFromDisabledWillSucceed = { - self?.disabledView.isHidden = true - } - updatePin.resetFromDisabledSuccess = { - self?.authenticationSucceded() - LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) - } - }) + let recover = EnterPhraseViewController(store: store, walletManager: walletManager, reason: .validateForResettingPin { phrase in + let updatePin = UpdatePinViewController(store: store, walletManager: walletManager, type: .creationWithPhrase, showsBackButton: false, phrase: phrase) + nc.pushViewController(updatePin, animated: true) + updatePin.resetFromDisabledWillSucceed = { + self?.disabledView.isHidden = true + } + updatePin.resetFromDisabledSuccess = { + self?.authenticationSucceded() + LWAnalytics.logEventWithParameters(itemName: ._20200217_DUWP) + } + }) recover.addCloseNavigationItem() nc.viewControllers = [recover] nc.navigationBar.tintColor = .darkText diff --git a/litewallet/src/ViewControllers/PinPadViewController.swift b/litewallet/src/ViewControllers/PinPadViewController.swift index 786400383..53b459595 100644 --- a/litewallet/src/ViewControllers/PinPadViewController.swift +++ b/litewallet/src/ViewControllers/PinPadViewController.swift @@ -110,8 +110,7 @@ class PinPadViewController: UICollectionViewController { return items.count } - override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell - { + override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let item = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) guard let pinPadCell = item as? GenericPinPadCell else { return item } pinPadCell.text = items[indexPath.item] @@ -237,10 +236,10 @@ class GenericPinPadCell: UICollectionViewCell { setup() } - internal let topLabel = UILabel(font: .customBody(size: 28.0)) - internal let centerLabel = UILabel(font: .customBody(size: 28.0)) - internal let sublabel = UILabel(font: .customBody(size: 11.0)) - internal let imageView = UIImageView() + let topLabel = UILabel(font: .customBody(size: 28.0)) + let centerLabel = UILabel(font: .customBody(size: 28.0)) + let sublabel = UILabel(font: .customBody(size: 11.0)) + let imageView = UIImageView() private func setup() { setAppearance() diff --git a/litewallet/src/ViewControllers/RequestAmountViewController.swift b/litewallet/src/ViewControllers/RequestAmountViewController.swift index 7966efee6..3bc1d098a 100644 --- a/litewallet/src/ViewControllers/RequestAmountViewController.swift +++ b/litewallet/src/ViewControllers/RequestAmountViewController.swift @@ -193,8 +193,7 @@ class RequestAmountViewController: UIViewController { presentText?(text, qrCode.image!) } - private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) - { + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) { share.isEnabled = false address.isUserInteractionEnabled = false diff --git a/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift b/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift index b47dee2b4..1be5cac79 100644 --- a/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift @@ -125,8 +125,7 @@ extension ManageWalletViewController: UITextFieldDelegate { return true } - func textField(_ textField: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool - { + func textField(_ textField: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } if text.utf8.count + string.utf8.count > maxWalletNameLength { return false diff --git a/litewallet/src/ViewControllers/RootModals/MenuViewController.swift b/litewallet/src/ViewControllers/RootModals/MenuViewController.swift index cc6fa9a7e..4e9207f14 100644 --- a/litewallet/src/ViewControllers/RootModals/MenuViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/MenuViewController.swift @@ -14,7 +14,7 @@ class MenuViewController: UIViewController, Trackable { fileprivate let buttons: [MenuButton] = { let types: [MenuButtonType] = [.security, .customerSupport, .settings, .lock] return types.compactMap { - return MenuButton(type: $0) + MenuButton(type: $0) } }() @@ -22,7 +22,7 @@ class MenuViewController: UIViewController, Trackable { override func viewDidLoad() { var previousButton: UIView? - buttons.forEach { button in + for button in buttons { button.addTarget(self, action: #selector(MenuViewController.didTapButton(button:)), for: .touchUpInside) view.addSubview(button) var topConstraint: NSLayoutConstraint? diff --git a/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift b/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift index 0a389cc7d..4eb9ad1a6 100644 --- a/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift @@ -225,8 +225,7 @@ class ReceiveViewController: UIViewController, Subscriber, Trackable { presentText?(address.text!, qrCode.image!) } - private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) - { + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) { share.isEnabled = false address.isUserInteractionEnabled = false diff --git a/litewallet/src/ViewControllers/RootModals/SendViewController.swift b/litewallet/src/ViewControllers/RootModals/SendViewController.swift index 218370beb..0ed63ba17 100644 --- a/litewallet/src/ViewControllers/RootModals/SendViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/SendViewController.swift @@ -42,8 +42,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka private var adjustmentHeight: CGFloat = 0.0 private var buttonToBorder: CGFloat = 0.0 - init(store: Store, sender: Sender, walletManager: WalletManager, initialAddress: String? = nil, initialRequest: PaymentRequest? = nil) - { + init(store: Store, sender: Sender, walletManager: WalletManager, initialAddress: String? = nil, initialRequest: PaymentRequest? = nil) { self.store = store self.sender = sender self.walletManager = walletManager @@ -207,8 +206,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka } } - private func balanceTextForAmount(amount: Satoshis?, rate: Rate?) -> (NSAttributedString?, NSAttributedString?) - { + private func balanceTextForAmount(amount: Satoshis?, rate: Rate?) -> (NSAttributedString?, NSAttributedString?) { let balanceAmount = DisplayAmount(amount: Satoshis(rawValue: balance), state: store.state, selectedRate: rate, minimumFractionDigits: 2) let balanceText = balanceAmount.description @@ -447,6 +445,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka case let .creationError(message): self?.showAlert(title: S.Send.createTransactionError.localize(), message: message, buttonLabel: S.Button.ok.localize()) self?.saveEvent("send.publishFailed", attributes: ["errorMessage": message]) + case let .publishFailure(error): if case let .posixError(code, description) = error { self?.showAlert(title: S.SecurityAlerts.sendFailure.localize(), message: "\(description) (\(code))", buttonLabel: S.Button.ok.localize()) @@ -464,14 +463,13 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka let isValid = protoReq.isValid() var isOutputTooSmall = false - if let errorMessage = protoReq.errorMessage, errorMessage == S.PaymentProtocol.Errors.requestExpired.localize(), !isValid - { + if let errorMessage = protoReq.errorMessage, errorMessage == S.PaymentProtocol.Errors.requestExpired.localize(), !isValid { return showAlert(title: S.PaymentProtocol.Errors.badPaymentRequest.localize(), message: errorMessage, buttonLabel: S.Button.ok.localize()) } // TODO: check for duplicates of already paid requests var requestAmount = Satoshis(0) - protoReq.details.outputs.forEach { output in + for output in protoReq.details.outputs { if output.amount > 0, output.amount < wallet.minOutputAmount { isOutputTooSmall = true } @@ -486,8 +484,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka self?.didIgnoreUsedAddressWarning = true self?.confirmProtocolRequest(protoReq: protoReq) }) - } else if let message = protoReq.errorMessage, !message.utf8.isEmpty, (protoReq.commonName?.utf8.count)! > 0, !didIgnoreIdentityNotCertified - { + } else if let message = protoReq.errorMessage, !message.utf8.isEmpty, (protoReq.commonName?.utf8.count)! > 0, !didIgnoreIdentityNotCertified { return showError(title: S.Send.identityNotCertified.localize(), message: message, ignore: { [weak self] in self?.didIgnoreIdentityNotCertified = true self?.confirmProtocolRequest(protoReq: protoReq) diff --git a/litewallet/src/ViewControllers/ScanViewController.swift b/litewallet/src/ViewControllers/ScanViewController.swift index 4690c5b96..92aa009fd 100644 --- a/litewallet/src/ViewControllers/ScanViewController.swift +++ b/litewallet/src/ViewControllers/ScanViewController.swift @@ -175,17 +175,16 @@ class ScanViewController: UIViewController, Trackable { } extension ScanViewController: AVCaptureMetadataOutputObjectsDelegate { - func metadataOutput(_: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from _: AVCaptureConnection) - { + func metadataOutput(_: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from _: AVCaptureConnection) { if let data = metadataObjects as? [AVMetadataMachineReadableCodeObject] { if data.isEmpty { guide.state = .normal } else { - data.forEach { - guard let uri = $0.stringValue + for data in data { + guard let uri = data.stringValue else { NSLog("ERROR: URI String not found") - return + continue } if completion != nil, guide.state != .positive { handleURI(uri) diff --git a/litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift b/litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift index ab00fe2c8..b091aba2f 100644 --- a/litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift +++ b/litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift @@ -14,8 +14,7 @@ class UpdatePinViewController: UIViewController, Subscriber { var resetFromDisabledSuccess: (() -> Void)? var resetFromDisabledWillSucceed: (() -> Void)? - init(store: Store, walletManager: WalletManager, type: UpdatePinType, showsBackButton: Bool = true, phrase: String? = nil) - { + init(store: Store, walletManager: WalletManager, type: UpdatePinType, showsBackButton: Bool = true, phrase: String? = nil) { self.store = store self.walletManager = walletManager self.phrase = phrase diff --git a/litewallet/src/ViewControllers/SettingsViewController.swift b/litewallet/src/ViewControllers/SettingsViewController.swift index 7bf3321c9..8f277f8fb 100644 --- a/litewallet/src/ViewControllers/SettingsViewController.swift +++ b/litewallet/src/ViewControllers/SettingsViewController.swift @@ -28,7 +28,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { private let sections: [String] private var rows: [String: [Setting]] private let cellIdentifier = "CellIdentifier" - internal var titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) + var titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) let customTitle: String private var walletIsEmpty = true @@ -68,8 +68,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { return rows[sections[section]]?.count ?? 0 } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) if let setting = rows[sections[indexPath.section]]?[indexPath.row] { @@ -162,8 +161,7 @@ class SettingsViewController: UITableViewController, CustomTitleView { didScrollForCustomTitle(yOffset: scrollView.contentOffset.y) } - override func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) - { + override func scrollViewWillEndDragging(_: UIScrollView, withVelocity _: CGPoint, targetContentOffset: UnsafeMutablePointer) { scrollViewWillEndDraggingForCustomTitle(yOffset: targetContentOffset.pointee.y) } diff --git a/litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift index 260a9a72f..87cd73e24 100644 --- a/litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift +++ b/litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift @@ -1,8 +1,7 @@ import UIKit class LoginTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate { - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissLoginAnimator() } } diff --git a/litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift index 6bd995a3d..cf795646b 100644 --- a/litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift +++ b/litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift @@ -81,8 +81,7 @@ class ModalTransitionDelegate: NSObject, Subscriber { } extension ModalTransitionDelegate: UIViewControllerTransitioningDelegate { - func animationController(forPresented presented: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forPresented presented: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? { presentedViewController = presented return PresentModalAnimator(shouldCoverBottomGap: type == .regular, completion: { let panGr = UIPanGestureRecognizer(target: self, action: #selector(ModalTransitionDelegate.didUpdate(gr:))) @@ -93,13 +92,11 @@ extension ModalTransitionDelegate: UIViewControllerTransitioningDelegate { }) } - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissModalAnimator() } - func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? - { + func interactionControllerForDismissal(using _: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { return isInteractive ? interactiveTransition : nil } } diff --git a/litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift index de8527564..7cbf71cdf 100644 --- a/litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift +++ b/litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift @@ -5,13 +5,11 @@ private let duration: TimeInterval = 0.4 class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { var shouldShowMaskView = true - func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return PresentGenericAnimator(shouldShowMaskView: shouldShowMaskView) } - func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? - { + func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DismissGenericAnimator() } } diff --git a/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift b/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift index 383ab57e2..216b00976 100644 --- a/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift +++ b/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift @@ -64,7 +64,8 @@ class WritePaperPhraseViewController: UIViewController { NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, - queue: nil) { [weak self] _ in + queue: nil) + { [weak self] _ in self?.dismiss(animated: true, completion: nil) } } @@ -89,7 +90,7 @@ class WritePaperPhraseViewController: UIViewController { ]) label.constrainBottomCorners(sidePadding: C.padding[3], bottomPadding: C.padding[2]) - phraseViews.enumerated().forEach { index, phraseView in + for (index, phraseView) in phraseViews.enumerated() { // The first phrase should initially be on the screen let constant = index == 0 ? 0.0 : phraseOffscreenOffset let xConstraint = NSLayoutConstraint(item: phraseView, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1.0, constant: constant) diff --git a/litewallet/src/ViewModels/Transaction.swift b/litewallet/src/ViewModels/Transaction.swift index 9e02031ea..6dd29bcea 100644 --- a/litewallet/src/ViewModels/Transaction.swift +++ b/litewallet/src/ViewModels/Transaction.swift @@ -84,8 +84,7 @@ class Transaction { } var exchangeRateInfo = "" - if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first - { + if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first { let difference = (currentRate.rate - metaData.exchangeRate) / metaData.exchangeRate * 100.0 let prefix = difference > 0.0 ? "+" : "-" let firstLine = direction == .sent ? S.Transaction.exchangeOnDaySent : S.Transaction.exchangeOnDayReceived @@ -101,28 +100,23 @@ class Transaction { return "\(amountString)\n\(startingString)\n\(endingString)\n\(exchangeRateInfo)" } - func amountDetailsAmountString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsAmountString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { let feeAmount = Amount(amount: fee, rate: rate, maxDigits: maxDigits) let feeString = direction == .sent ? String(format: S.Transaction.fee.localize(), "\(feeAmount.string(isLtcSwapped: isLtcSwapped))") : "" return "\(direction.sign)\(Amount(amount: satoshis, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped)) \(feeString)" } - func amountDetailsStartingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsStartingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { return String(format: S.Transaction.starting.localize(), "\(Amount(amount: startingBalance, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped))") } - func amountDetailsEndingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String - { + func amountDetailsEndingBalanceString(isLtcSwapped: Bool, rate: Rate, rates _: [Rate], maxDigits: Int) -> String { return String(format: String(format: S.Transaction.ending.localize(), "\(Amount(amount: balanceAfter, rate: rate, maxDigits: maxDigits).string(isLtcSwapped: isLtcSwapped))")) } - func amountExchangeString(isLtcSwapped _: Bool, rate _: Rate, rates: [Rate], maxDigits _: Int) -> String - { + func amountExchangeString(isLtcSwapped _: Bool, rate _: Rate, rates: [Rate], maxDigits _: Int) -> String { var exchangeRateInfo = "" - if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first - { + if let metaData = metaData, let currentRate = rates.filter({ $0.code.lowercased() == metaData.exchangeRateCurrency.lowercased() }).first { let difference = (currentRate.rate - metaData.exchangeRate) / metaData.exchangeRate * 100.0 let prefix = difference > 0.0 ? "+" : "-" let nf = NumberFormatter() @@ -355,8 +349,7 @@ private extension String { } } -private func makeStatus(_ txRef: BRTxRef, wallet: BRWallet, peerManager: BRPeerManager, confirms: Int, direction: TransactionDirection) -> String -{ +private func makeStatus(_ txRef: BRTxRef, wallet: BRWallet, peerManager: BRPeerManager, confirms: Int, direction: TransactionDirection) -> String { let tx = txRef.pointee guard wallet.transactionIsValid(txRef) else { diff --git a/litewallet/src/Views/AlertView.swift b/litewallet/src/Views/AlertView.swift index 58a72e7db..b1fee561b 100644 --- a/litewallet/src/Views/AlertView.swift +++ b/litewallet/src/Views/AlertView.swift @@ -25,7 +25,6 @@ enum AlertType { return S.SecurityAlerts.copiedAddressesHeader.localize() case .sweepSuccess: return S.Import.success.localize() - // Failure(s) case .failedResolution: return S.SecurityAlerts.sendFailure.localize() @@ -46,7 +45,6 @@ enum AlertType { return S.SecurityAlerts.copiedAddressesSubheader.localize() case .sweepSuccess: return S.Import.successBody.localize() - // Failure(s) case .failedResolution: return S.SecurityAlerts.resolvedSuccessSubheader.localize() @@ -74,11 +72,9 @@ func == (lhs: AlertType, rhs: AlertType) -> Bool { return true case (.sweepSuccess(_), .sweepSuccess(_)): return true - // Failure(s) case (.failedResolution, .failedResolution): return true - default: return false } diff --git a/litewallet/src/Views/DefaultCurrencyViewController.swift b/litewallet/src/Views/DefaultCurrencyViewController.swift index 35624ca83..44d8c3db3 100644 --- a/litewallet/src/Views/DefaultCurrencyViewController.swift +++ b/litewallet/src/Views/DefaultCurrencyViewController.swift @@ -81,8 +81,7 @@ class DefaultCurrencyViewController: UITableViewController, Subscriber { return rates.count } - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell - { + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) let rate = rates[indexPath.row] cell.textLabel?.text = "\(rate.code) (\(rate.currencySymbol))" diff --git a/litewallet/src/Views/ModalHeaderView.swift b/litewallet/src/Views/ModalHeaderView.swift index 84e0ff2f4..21a143fce 100644 --- a/litewallet/src/Views/ModalHeaderView.swift +++ b/litewallet/src/Views/ModalHeaderView.swift @@ -12,8 +12,7 @@ class ModalHeaderView: UIView { didSet { close.tap = closeCallback } } - init(title: String, style: ModalHeaderViewStyle, faqInfo _: (Store, String)? = nil, showCloseButton: Bool = true) - { + init(title: String, style: ModalHeaderViewStyle, faqInfo _: (Store, String)? = nil, showCloseButton: Bool = true) { self.title.text = title self.style = style diff --git a/litewallet/src/Views/PinView.swift b/litewallet/src/Views/PinView.swift index 39b266ed1..1785db214 100644 --- a/litewallet/src/Views/PinView.swift +++ b/litewallet/src/Views/PinView.swift @@ -39,7 +39,7 @@ class PinView: UIView { } func fill(_ number: Int) { - filled.enumerated().forEach { index, circle in + for (index, circle) in filled.enumerated() { circle.isHidden = index > number - 1 } } @@ -81,7 +81,7 @@ class PinView: UIView { } private func addCircleContraints(_ circles: [Circle]) { - circles.enumerated().forEach { index, circle in + for (index, circle) in circles.enumerated() { addSubview(circle) let leadingConstraint: NSLayoutConstraint? if index == 0 { diff --git a/litewallet/src/Views/SendViewCells/AddressCell.swift b/litewallet/src/Views/SendViewCells/AddressCell.swift index 7e0a42942..7cdbd1f83 100644 --- a/litewallet/src/Views/SendViewCells/AddressCell.swift +++ b/litewallet/src/Views/SendViewCells/AddressCell.swift @@ -98,8 +98,7 @@ extension AddressCell: UITextFieldDelegate { return true } - func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool - { + func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool { if let request = PaymentRequest(string: string) { didReceivePaymentRequest?(request) return false diff --git a/litewallet/src/Views/SendViewCells/DescriptionSendCell.swift b/litewallet/src/Views/SendViewCells/DescriptionSendCell.swift index 80a08fbbd..9a8295713 100644 --- a/litewallet/src/Views/SendViewCells/DescriptionSendCell.swift +++ b/litewallet/src/Views/SendViewCells/DescriptionSendCell.swift @@ -84,8 +84,7 @@ extension DescriptionSendCell: UITextViewDelegate { return true } - func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool - { + func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool { guard text.rangeOfCharacter(from: CharacterSet.newlines) == nil else { textView.resignFirstResponder() diff --git a/litewallet/src/WalletCoordinator.swift b/litewallet/src/WalletCoordinator.swift index 83695f719..821d8559e 100644 --- a/litewallet/src/WalletCoordinator.swift +++ b/litewallet/src/WalletCoordinator.swift @@ -130,8 +130,7 @@ class WalletCoordinator: Subscriber, Trackable { } } - func makeTransactionViewModels(transactions: [BRTxRef?], walletManager: WalletManager, kvStore: BRReplicatedKVStore?, rate: Rate?) -> [Transaction] - { + func makeTransactionViewModels(transactions: [BRTxRef?], walletManager: WalletManager, kvStore: BRReplicatedKVStore?, rate: Rate?) -> [Transaction] { return transactions.compactMap { $0 }.sorted { if $0.pointee.timestamp == 0 { return true diff --git a/litewallet/src/WalletManager+Auth.swift b/litewallet/src/WalletManager+Auth.swift index 6393cc4fc..064325b6c 100644 --- a/litewallet/src/WalletManager+Auth.swift +++ b/litewallet/src/WalletManager+Auth.swift @@ -270,8 +270,7 @@ extension WalletManager: WalletAuthenticator { } // sign the given transaction using biometric authentication - func signTransaction(_ tx: BRTxRef, biometricsPrompt: String, completion: @escaping (BiometricsResult) -> Void) - { + func signTransaction(_ tx: BRTxRef, biometricsPrompt: String, completion: @escaping (BiometricsResult) -> Void) { do { let spendLimit: Int64 = try keychainItem(key: KeychainKey.spendLimit) ?? 0 guard let wallet = wallet, wallet.amountSentByTx(tx) - wallet.amountReceivedFromTx(tx) + wallet.totalSent <= UInt64(spendLimit) @@ -590,8 +589,7 @@ private func setKeychainItem(key: String, item: T?, authenticated: Bool = fal if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound { status = SecItemDelete(query as CFDictionary) } - } else if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound - { // update existing item + } else if SecItemCopyMatching(query as CFDictionary, nil) != errSecItemNotFound { // update existing item let update = [kSecAttrAccessible as String: accessible, kSecValueData as String: data as Any] status = SecItemUpdate(query as CFDictionary, update as CFDictionary) diff --git a/litewallet/src/WalletManager.swift b/litewallet/src/WalletManager.swift index 71250d313..86bfa0134 100644 --- a/litewallet/src/WalletManager.swift +++ b/litewallet/src/WalletManager.swift @@ -1,11 +1,12 @@ import BRCore import Foundation + // import sqlite3 import SQLite3 import SystemConfiguration -internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) -internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) +let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) +let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) enum WalletManagerError: Error { case sqliteError(errorCode: Int32, description: String) @@ -20,13 +21,13 @@ private func SafeSqlite3ColumnBlob(statement: OpaquePointer, iCol: Int32) -> // After instantiating a WalletManager object, call myWalletManager.peerManager.connect() to begin syncing. class WalletManager: BRWalletListener, BRPeerManagerListener { - internal var didInitWallet = false - internal let dbPath: String - internal var db: OpaquePointer? + var didInitWallet = false + let dbPath: String + var db: OpaquePointer? private var txEnt: Int32 = 0 private var blockEnt: Int32 = 0 private var peerEnt: Int32 = 0 - internal let store: Store + let store: Store var masterPubKey = BRMasterPubKey() var earliestKeyTime: TimeInterval = 0 @@ -68,7 +69,7 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { } // TODO: Pass the fpRate from User Preferences - internal lazy var lazyPeerManager: BRPeerManager? = { + lazy var lazyPeerManager: BRPeerManager? = { if let wallet = self.wallet { return BRPeerManager(wallet: wallet, earliestKeyTime: self.earliestKeyTime, blocks: self.loadBlocks(), peers: self.loadPeers(), listener: self, fpRate: FalsePositiveRates.semiPrivate.rawValue) } else { @@ -76,9 +77,9 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { } }() - internal lazy var lazyWallet: BRWallet? = BRWallet(transactions: self.loadTransactions(), - masterPubKey: self.masterPubKey, - listener: self) + lazy var lazyWallet: BRWallet? = BRWallet(transactions: self.loadTransactions(), + masterPubKey: self.masterPubKey, + listener: self) private lazy var lazyAPIClient: BRAPIClient? = { guard let wallet = self.wallet else { return nil } @@ -92,9 +93,8 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { lazy var allWordsLists: [[NSString]] = { var array: [[NSString]] = [] - Bundle.main.localizations.forEach { lang in - if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) - { + for lang in Bundle.main.localizations { + if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) { if let words = NSArray(contentsOfFile: path) as? [NSString] { array.append(words) } @@ -106,9 +106,8 @@ class WalletManager: BRWalletListener, BRPeerManagerListener { lazy var allWords: Set = { var set: Set = Set() - Bundle.main.localizations.forEach { lang in - if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) - { + for lang in Bundle.main.localizations { + if let path = Bundle.main.path(forResource: "BIP39Words", ofType: "plist", inDirectory: nil, forLocalization: lang) { if let words = NSArray(contentsOfFile: path) as? [NSString] { set.formUnion(words.map { $0 as String }) } diff --git a/litewalletTests/Class Tests/TabBarViewControllerTests.swift b/litewalletTests/Class Tests/TabBarViewControllerTests.swift index d8a2fa4c8..053a9493e 100644 --- a/litewalletTests/Class Tests/TabBarViewControllerTests.swift +++ b/litewalletTests/Class Tests/TabBarViewControllerTests.swift @@ -4,6 +4,8 @@ import XCTest class TabBarViewControllerTests: XCTestCase { var viewController: TabBarViewController! + var noBuyVewController: NoBuyTabBarViewController! + override func setUpWithError() throws { viewController = UIStoryboard(name: "Main", bundle: nil) @@ -11,16 +13,26 @@ class TabBarViewControllerTests: XCTestCase { TabBarViewController viewController.loadViewIfNeeded() + + noBuyVewController = UIStoryboard(name: "Main", + bundle: nil) + .instantiateViewController(withIdentifier: "NoBuyTabBarViewController") as? + NoBuyTabBarViewController + + noBuyVewController.loadViewIfNeeded() } override func tearDownWithError() throws { viewController = nil + noBuyVewController = nil } func testTabBarItemCount() throws { // There should be 4 tabs in this version for all users XCTAssertTrue(viewController.tabBar.items?.count == 4) + + XCTAssertTrue(noBuyVewController.tabBar.items?.count == 3) } func testTabBarItemRange() throws { @@ -33,5 +45,11 @@ class TabBarViewControllerTests: XCTestCase { XCTAssertTrue(viewController.tabBar.items?[2].tag == 2) XCTAssertTrue(viewController.tabBar.items?[3].tag == 3) + + XCTAssertTrue(noBuyVewController.tabBar.items?[0].tag == 0) + + XCTAssertTrue(noBuyVewController.tabBar.items?[1].tag == 1) + + XCTAssertTrue(noBuyVewController.tabBar.items?[2].tag == 2) } } diff --git a/litewalletTests/Language Selection Tests/LocaleTests.swift b/litewalletTests/Language Selection Tests/LocaleTests.swift new file mode 100644 index 000000000..efbfc489c --- /dev/null +++ b/litewalletTests/Language Selection Tests/LocaleTests.swift @@ -0,0 +1,140 @@ +@testable import litewallet +import XCTest + +final class LocaleTests: XCTestCase { + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testFilteringUnsupportedCountries() throws { + /// Based on the live list: https://support.moonpay.com/customers/docs/moonpays_unsupported_countries + + // Afghanistan: `fa_AF`, `ps_AF`, `uz_AF` + let afghanistanLocale = Locale(identifier: "fa_AF") + XCTAssertTrue(afghanistanLocale.identifier == "fa_AF") + + // Barbados: `en_BB` + let barbadosLocale = Locale(identifier: "en_BB") + XCTAssertTrue(barbadosLocale.identifier == "en_BB") + + // Belarus: `be_BY`, `ru_BY` + let belarusLocale = Locale(identifier: "be_BY") + XCTAssertTrue(belarusLocale.identifier == "be_BY") + + // Burkina Faso: `fr_BF` + let burkinaFasoLocale = Locale(identifier: "fr_BF") + XCTAssertTrue(burkinaFasoLocale.identifier == "fr_BF") + + // China: `zh_CN`, `zh_Hans_CN`, `zh_Hant_CN`, `ug_CN` + let chinaLocale = Locale(identifier: "zh_CN") + XCTAssertTrue(chinaLocale.identifier == "zh_CN") + + // Iceland: `is_IS` + let icelandLocale = Locale(identifier: "is_IS") + XCTAssertTrue(icelandLocale.identifier == "is_IS") + + // Iraq: `ar_IQ`, `ku_IQ` + let iraqLocale = Locale(identifier: "ar_IQ") + XCTAssertTrue(iraqLocale.identifier == "ar_IQ") + + // Jamaica: `en_JM`, `jam_JM` + let jamaicaLocale = Locale(identifier: "en_JM") + XCTAssertTrue(jamaicaLocale.identifier == "en_JM") + + // Japan: `ja_JP` + let japanLocale = Locale(identifier: "ja_JP") + XCTAssertTrue(japanLocale.identifier == "ja_JP") + + // Kosovo: `sq_XK`, `sr_XK` + let kosovoLocale = Locale(identifier: "sq_XK") + XCTAssertTrue(kosovoLocale.identifier == "sq_XK") + + // Liberia: `en_LR` + let liberiaLocale = Locale(identifier: "en_LR") + XCTAssertTrue(liberiaLocale.identifier == "en_LR") + + // Macao: `zh_MO`, `pt_MO` + let macaoLocale = Locale(identifier: "zh_MO") + XCTAssertTrue(macaoLocale.identifier == "zh_MO") + + // Malaysia: `ms_MY`, `zh_MY`, `ta_MY`, `en_MY` + let malaysiaLocale = Locale(identifier: "ms_MY") + XCTAssertTrue(malaysiaLocale.identifier == "ms_MY") + + // Malta: `mt_MT`, `en_MT` + let maltaLocale = Locale(identifier: "mt_MT") + XCTAssertTrue(maltaLocale.identifier == "mt_MT") + + // Mongolia: `mn_MN` + let mongoliaLocale = Locale(identifier: "mn_MN") + XCTAssertTrue(mongoliaLocale.identifier == "mn_MN") + + // Morocco: `ar_MA`, `fr_MA`, `ber_MA` + let moroccoLocale = Locale(identifier: "ar_MA") + XCTAssertTrue(moroccoLocale.identifier == "ar_MA") + + // Myanmar: `my_MM` + let myanmarLocale = Locale(identifier: "my_MM") + XCTAssertTrue(myanmarLocale.identifier == "my_MM") + + // Nicaragua: `es_NI` + let nicaraguaLocale = Locale(identifier: "es_NI") + XCTAssertTrue(nicaraguaLocale.identifier == "es_NI") + + // Pakistan: `ur_PK`, `en_PK` + let pakistanLocale = Locale(identifier: "ur_PK") + XCTAssertTrue(pakistanLocale.identifier == "ur_PK") + + // Panama: `es_PA` + let panamaLocale = Locale(identifier: "es_PA") + XCTAssertTrue(panamaLocale.identifier == "es_PA") + + // Russia: `ru_RU` + let russiaLocale = Locale(identifier: "ru_RU") + XCTAssertTrue(russiaLocale.identifier == "ru_RU") + + // Senegal: `fr_SN`, `wo_SN` + let senegalLocale = Locale(identifier: "fr_SN") + XCTAssertTrue(senegalLocale.identifier == "fr_SN") + + // The Democratic Republic Of The Congo: `fr_CD`, `ln_CD`, `sw_CD` + let drCongoLocale = Locale(identifier: "fr_CD") + XCTAssertTrue(drCongoLocale.identifier == "fr_CD") + + // Uganda: `en_UG`, `sw_UG` + let ugandaLocale = Locale(identifier: "en_UG") + XCTAssertTrue(ugandaLocale.identifier == "en_UG") + + // Ukraine: `uk_UA`, `ru_UA` + let ukraineLocale = Locale(identifier: "uk_UA") + XCTAssertTrue(ukraineLocale.identifier == "uk_UA") + + // Venezuela: `es_VE` + let venezuelaLocale = Locale(identifier: "es_VE") + XCTAssertTrue(venezuelaLocale.identifier == "es_VE") + + // Yemen: `ar_YE` + let yemenLocale = Locale(identifier: "ar_YE") + XCTAssertTrue(yemenLocale.identifier == "ar_YE") + + // Zimbabwe: `en_ZW`, `sn_ZW`, `nd_ZW` + let zimbabweLocale = Locale(identifier: "en_ZW") + XCTAssertTrue(zimbabweLocale.identifier == "en_ZW") + } + + func testUnsupportedCountriesEnum() throws { + let unsupportedCases = UnsupportedCountries.allCases + XCTAssertTrue(unsupportedCases.count == 28) + + let supportedCountry = Locale(identifier: "en_US").identifier + + for unsupportedLocale in unsupportedCases { + let unsupportedCode = unsupportedLocale.localeCode + XCTAssertTrue(unsupportedCode != supportedCountry) + } + } +} diff --git a/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift b/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift index 6edc4df58..395242cf5 100644 --- a/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift +++ b/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift @@ -10,8 +10,7 @@ class BRReplicatedKVStoreTestAdapter: BRRemoteKVStoreAdaptor { self.testCase = testCase } - func keys(_ completionFunc: @escaping ([(String, UInt64, Date, BRRemoteKVStoreError?)], BRRemoteKVStoreError?) -> Void) - { + func keys(_ completionFunc: @escaping ([(String, UInt64, Date, BRRemoteKVStoreError?)], BRRemoteKVStoreError?) -> Void) { print("[TestRemoteKVStore] KEYS") DispatchQueue.main.async { let res = self.db.map { t -> (String, UInt64, Date, BRRemoteKVStoreError?) in @@ -32,8 +31,7 @@ class BRReplicatedKVStoreTestAdapter: BRRemoteKVStoreAdaptor { } } - func get(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, [UInt8], BRRemoteKVStoreError?) -> Void) - { + func get(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, [UInt8], BRRemoteKVStoreError?) -> Void) { print("[TestRemoteKVStore] GET \(key) \(version)") DispatchQueue.main.async { guard let obj = self.db[key] @@ -47,8 +45,7 @@ class BRReplicatedKVStoreTestAdapter: BRRemoteKVStoreAdaptor { } } - func put(_ key: String, value: [UInt8], version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) - { + func put(_ key: String, value: [UInt8], version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) { print("[TestRemoteKVStore] PUT \(key) \(version)") DispatchQueue.main.async { guard let obj = self.db[key] @@ -69,8 +66,7 @@ class BRReplicatedKVStoreTestAdapter: BRRemoteKVStoreAdaptor { } } - func del(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) - { + func del(_ key: String, version: UInt64, completionFunc: @escaping (UInt64, Date, BRRemoteKVStoreError?) -> Void) { print("[TestRemoteKVStore] DEL \(key) \(version)") DispatchQueue.main.async { guard let obj = self.db[key] diff --git a/litewalletTests/TestHelpers.swift b/litewalletTests/TestHelpers.swift index 5bb834e28..a2008052e 100644 --- a/litewalletTests/TestHelpers.swift +++ b/litewalletTests/TestHelpers.swift @@ -7,7 +7,7 @@ func clearKeychain() { kSecClassCertificate as String, kSecClassKey as String, kSecClassIdentity as String] - classes.forEach { className in + for className in classes { SecItemDelete([kSecClass as String: className] as CFDictionary) } }