From f28c55f14f5dea53c07250917295b37baf0e3432 Mon Sep 17 00:00:00 2001 From: Kerry Washington Date: Sun, 21 Jan 2024 08:40:28 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80[Release=20v3.12.0]=20Merge=20into?= =?UTF-8?q?=20Main=20=20(#222)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release/v3.9.0 (#128) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * reemvoed conflict tags * 🚀[Release v3.10.1] Merge into Develop (#162) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🚧[Techdebt] Firebase polish 121 (#139) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * Create sync-mirror.yml * Changed the clone sig * Update sync-mirror.yml - added sync branches and tags * Update sync-mirror.yml refactor * Update sync-mirror.yml fixed uname * Update sync-mirror.yml * Update sync-mirror.yml * Create PubtoPrivate.yml * Update sync-mirror.yml * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * build bump -clean up strings file - Udpated to iOS 14.0 as a target https://www.statista.com/statistics/1118925/mobile-apple-ios-version-share-worldwide/ * Removed cruft * Updated the Firebase constants - changed it to lowercase * updated links * fixed constants -build bump * Mark unused code (#147) * Added and modified a ruby script that shows a warining if a class, function or variable is not used * Fixed static function partnersDataArray * Updated build number * build bump * clean up duplicate scripts * readded "Send.UnstoppableDomains.udSystemError" = "System lookup problem. [Error: %2$d]"; -bumped the version and build to test Bitrise * fixed today extension version and build number * fixed coding norm (space after colon) - fixed Turkish - Italian mixup - version bump * Add SwiftFormat to the codebase (#159) * Added SwiftFormat to the run scripts * Removed --elseOnSameLine from rules as it is on by default * Added --disable enumNamespaces rule * Using SwiftFormat to auto-format current code * Removed --allman rule * 🚀[Release v3.10.1] Merge into Develop (#162) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🚧[Techdebt] Firebase polish 121 (#139) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * Create sync-mirror.yml * Changed the clone sig * Update sync-mirror.yml - added sync branches and tags * Update sync-mirror.yml refactor * Update sync-mirror.yml fixed uname * Update sync-mirror.yml * Update sync-mirror.yml * Create PubtoPrivate.yml * Update sync-mirror.yml * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * build bump -clean up strings file - Udpated to iOS 14.0 as a target https://www.statista.com/statistics/1118925/mobile-apple-ios-version-share-worldwide/ * Removed cruft * Updated the Firebase constants - changed it to lowercase * updated links * fixed constants -build bump * Mark unused code (#147) * Added and modified a ruby script that shows a warining if a class, function or variable is not used * Fixed static function partnersDataArray * Updated build number * build bump * clean up duplicate scripts * readded "Send.UnstoppableDomains.udSystemError" = "System lookup problem. [Error: %2$d]"; -bumped the version and build to test Bitrise * fixed today extension version and build number * fixed coding norm (space after colon) - fixed Turkish - Italian mixup - version bump * Added SwiftFormat to the run scripts * Removed --elseOnSameLine from rules as it is on by default * Added --disable enumNamespaces rule * Using SwiftFormat to auto-format current code * Removed --allman rule * PartnerData auto-format * Added marking of unused code back to runscripts * Delete PubtoPrivate.yml * Delete sync-mirror.yml Co-authored-by: Kerry Washington * 🤬[Techdebt] #167 add custom user agent++ (#168) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * Create sync-mirror.yml * Changed the clone sig * Update sync-mirror.yml - added sync branches and tags * Update sync-mirror.yml refactor * Update sync-mirror.yml fixed uname * Update sync-mirror.yml * Update sync-mirror.yml * Create PubtoPrivate.yml * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🚧[Techdebt] Firebase polish 121 (#139) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * Create sync-mirror.yml * Changed the clone sig * Update sync-mirror.yml - added sync branches and tags * Update sync-mirror.yml refactor * Update sync-mirror.yml fixed uname * Update sync-mirror.yml * Update sync-mirror.yml * Create PubtoPrivate.yml * Update sync-mirror.yml * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * build bump -clean up strings file - Udpated to iOS 14.0 as a target https://www.statista.com/statistics/1118925/mobile-apple-ios-version-share-worldwide/ * Removed cruft * Updated the Firebase constants - changed it to lowercase * updated links * fixed constants -build bump * Mark unused code (#147) * Added and modified a ruby script that shows a warining if a class, function or variable is not used * Fixed static function partnersDataArray * Updated build number * changed the urtl - change the deployment target * removed staging server url normalizing to the prod server only * aded small test - build bump * Retired old https server code (#154) * Updated * 🚀[Release v3.10.1] Merge into Develop (#162) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🚧[Techdebt] Firebase polish 121 (#139) * 🚀[Release v3.10.0] Merge into Main (#136) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * Create sync-mirror.yml * Changed the clone sig * Update sync-mirror.yml - added sync branches and tags * Update sync-mirror.yml refactor * Update sync-mirror.yml fixed uname * Update sync-mirror.yml * Update sync-mirror.yml * Create PubtoPrivate.yml * Update sync-mirror.yml * 🚀[Release v3.10.0] Merge into Develop (#135) * 🦺[Techdebt] fix firebase (#115) * Update firebase config auto clean up strings - version bump - Commented out debug FB file * Checked the version is sending FB data - bump build number * 🥳[Techdebt] relayout address view controller (#120) * Successfully placed in UIHosting Address Updated the strings file * Added event * added delay - used for animating U Domain * Added function of subviews in SendViewController Layout is updated * Adding the function to the send Cleaned up and wired up Cells - UD View/Model - Send Address View/Model Reset the amount Label in SendViewController * Refactored SendButton - Using UIHostingViewController * Successfully send LTC -WIP: fix white space * Refactored the layout of the send button * buiid bump (#125) * [Techdebt] ci cd refactor (#132) * Removed flaky tests * build bump * build bump * removed unused file - build bump * build bump * fixed scan QR (#130) * fixed scan QR * update gitignore * Feature/add bitrefill new (#134) * Added llocalView - added bitrefill - basic function is available - build bump * bump * added basic web widget * updated logo * build bump * changed the Bitrefill link - build bump * pre-bump version - to get a binary to TestFlight * build bump * build bump again * Clean up background * build bump * build bump -clean up strings file - Udpated to iOS 14.0 as a target https://www.statista.com/statistics/1118925/mobile-apple-ios-version-share-worldwide/ * Removed cruft * Updated the Firebase constants - changed it to lowercase * updated links * fixed constants -build bump * Mark unused code (#147) * Added and modified a ruby script that shows a warining if a class, function or variable is not used * Fixed static function partnersDataArray * Updated build number * build bump * clean up duplicate scripts * readded "Send.UnstoppableDomains.udSystemError" = "System lookup problem. [Error: %2$d]"; -bumped the version and build to test Bitrise * fixed today extension version and build number * fixed coding norm (space after colon) - fixed Turkish - Italian mixup - version bump * added custom var * build bump * Add codesigndoc ignore * Added Swift Packages to the project - Closes : https://github.com/litecoin-foundation/litewallet-ios/issues/156 * Removed pods * Added Litewallet PartnerAPI to project * SUCCESS! - Added PartnerAPI as a Submodule * Rebase from SwiftFormat * Update .gitignore * Removed submodule * resetting add the submodule * updated config * Removed PartnerAPI #170 Removed references to the LitewalletPartnerAPI lib - Compiled the app - Added LitecoinCard View for CardView - Added CardWebViewController - Deleted unused views and viewModels * change build number * Rmeoved all LitecoinCard Tests * build bump * Failed Test for Bitrise CI * Unbroken tests * small change build bump * another build bump * build again * build bump * yet again bump * small change * matching build number with bitrise run * nonsense change * Fixed the UDSystem Error issues - removed commented out PartnerAPI Code Co-authored-by: Iferencak * bump to match current prod build number * nit…format (#203) * Update the loafwallet-core submodule * #207 resolve core update issue missing labels (#211) * move the git submodule to the latest - v1.0.0 releease of loafwallet-core # Conflicts: # Modules/loafwallet-core * ISSUE: Not able to type and display recv addresses - There is a failiure in the conversion from CChar to Int8 - Have send working - updated loafwallet-core v1.1.0 - Added falsePositived interface - Added enum and set values for - low privacy - semi-private - anonymous - Updated the loafwallet-core - adds the fpRate var * Resolved PeerManager set with proper optional setting. * WIP: Cannot unwrap ltc1 addresses to retain them in the UILabel - ltc1 addresses are present but not unwrapping properly @Iferencak this is the disappearing error you saw when we updated the loafwallet-core. - Not able to figure this out yet. - All ideas are welcome * WIP: Still debugging - The issue is the BRCore methods compare the `ltc1` address against the set of addresses and it fails because the BRSet is not setup for the address. The issue is this worked before and I need to investigate what happened before and how things changed Signed-off-by: kcw-grunt * move the git submodule to the latest - v1.0.0 releease of loafwallet-core * Bugfix!: Duplicated char in converter Added optic enum Signed-off-by: kcw-grunt * Move all the extensions from BRCore to separate files - Moved these into separate files to help debug Signed-off-by: kcw-grunt * Refactored the conversion - Fixed a bug where a element is duplicated `unichar(charArray.20),unichar(charArray.21), unichar(charArray.22), unichar(charArray.23), unichar(charArray.23), unichar(charArray.24)` Signed-off-by: kcw-grunt --------- Signed-off-by: kcw-grunt * 🚀[Release v3.11.1] Merge into Develop (#214) * bump build to date based number Signed-off-by: kcw-grunt * Removed Ternio Card code Signed-off-by: kcw-grunt * Polished the version tag in the lock screen Signed-off-by: kcw-grunt * Build bump Signed-off-by: kcw-grunt * Removed TabBarVC - Cleanup to remove old references Signed-off-by: kcw-grunt * Updated the Infura and partner IPFS access - Required in the latest UD library Signed-off-by: kcw-grunt * Added commit to partner keys Signed-off-by: kcw-grunt --------- Signed-off-by: kcw-grunt * Removed all ArticleIds (#216) Signed-off-by: kcw-grunt # Conflicts: # loafwallet/ArticleIds.swift * updated the gitignore Signed-off-by: kcw-grunt * 😍[Feature] Exploration/update create restore wallet (#219) * RENAMED the project to Litewallet - Added new litewallet.entitlements - Remapped files - build bumped - Updated to Swift 4.2 - Version bump - Added PaddedUILabel (unused - removed UD - refactored layouts of SendViewController - bumped build number * Updated the fee words for all languages Signed-off-by: kcw-grunt updated the strings’ fees’ Signed-off-by: kcw-grunt WIP Adding in the ops fees Signed-off-by: kcw-grunt adjustment of the Send VW layout Signed-off-by: kcw-grunt Removed ifdef for old versions of iOS other refactor Signed-off-by: kcw-grunt * Added new EnterPhraseView HostingController Signed-off-by: kcw-grunt * WIP: Pusher waiting for https://github.com/pusher/push-notifications-swift/issues/187 Signed-off-by: kcw-grunt * Integrating the ops fee Debugging to find where the amount was set re-add Satoshis * Successfully send to 2 outputs Sent 2 outputs with 1 input Need to readd refactor remove cruft refactored constant fixed dupe constant Further polish for confirmation for sending * Integrated Push Notifications Signed-off-by: kcw-grunt * Refactored legacy code - Moved Application Extension funcs to different file - Added new HostingController Signed-off-by: kcw-grunt * Refactored the Launch - Added SwiftUI Font for more widespread use - Cleaned up logo Signed-off-by: kcw-grunt * WIP: Adding more create views Signed-off-by: kcw-grunt * Began added CreateViews Signed-off-by: kcw-grunt * Updated the localization files - update the schemes - Refactor to fix old code / delete unused files - Added audio that plays when user selects language - Working! The word billboard is working - updated the taglines - updated the alert message for the language alert - Good language switching Signed-off-by: kcw-grunt * Added pusher and paths for devices - Re-add the partner plist - Fixes the iPad idiom by giving those users a legacy UIKit path - refactor unused code - auto linting - updated the pusher option Signed-off-by: kcw-grunt * Finished layout of Acceptance for notifications propgated language to Accepted notification auto format Signed-off-by: kcw-grunt * Fixes a memory leak solved by @hectorchu - We had strong reference to the observer(s) and this was causing lingering issues causing the app to crash at rutime - Updated the key file references Signed-off-by: kcw-grunt * updated loafwallet-core version -Updated to loafwallet-core v1.6.1 -update urls -Signup sheet is working!!!!! -polished the signup - Re added some callbacks that were updating the recall big bug was fixed Signed-off-by: kcw-grunt * Need to work in the Showing and hiding the announce view Haven’t figured out how to show and hide the AnnounceView then show the tabVC - Sometimes it reads the evaluation and sometimes it doesnt - removed the current user signup sheet Signed-off-by: kcw-grunt * added LWAnalytics notifications Signed-off-by: kcw-grunt * added amount field Signed-off-by: kcw-grunt * prelayout of the amount in the send SwiftUI send Signed-off-by: kcw-grunt * added memo and Amount Signed-off-by: kcw-grunt * added hack to make it work Signed-off-by: kcw-grunt * cleanup of unused code Signed-off-by: kcw-grunt * cleanup of other efforts to debug Signed-off-by: kcw-grunt * readded the didStartEditing Signed-off-by: kcw-grunt * Readded then Address Cell View - Still have the issues the ModalViewController height Signed-off-by: kcw-grunt --------- Signed-off-by: kcw-grunt * updated filesystem --------- Signed-off-by: kcw-grunt Co-authored-by: Iferencak --- .gitignore | 6 +- .swift-version | 1 + Modules/libbz2/Info.plist | 28 - Modules/libbz2/iphone.modulemap | 5 - Modules/libbz2/iphonesim.modulemap | 5 - Modules/loafwallet-core | 2 +- Modules/sqlite3/Info.plist | 28 - Modules/sqlite3/iphone.modulemap | 5 - Modules/sqlite3/iphonesim.modulemap | 5 - .../xcshareddata/breadwallet.xcscmblueprint | 0 ...419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist | 0 ...5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist | 0 ...89EB5553-73DB-40A4-831A-A7FB476230EB.plist | 0 .../Info.plist | 0 .../xcshareddata/xcschemes/BRCore.xcscheme | 66 + .../xcshareddata/xcschemes/Testnet.xcscheme | 30 +- .../xcschemes/TodayExtension.xcscheme | 96 + .../xcschemes/litewalle-indo.xcscheme | 83 + .../xcschemes/litewallet-french.xcscheme | 84 + .../xcschemes/litewallet.xcscheme | 32 +- .../xcshareddata/xcschemes/nettle.xcscheme | 66 + .../xcschemes/submodules.xcscheme | 66 + .../xcshareddata/xcschemes/unbound.xcscheme | 66 + .../AddressFieldView.swift | 19 +- .../AlertFailureView.swift | 1 + litewallet/ArticleIds.swift | 4 + .../Assets.xcassets/Back.imageset/Back.pdf | Bin .../Back.imageset/Contents.json | 0 .../Assets.xcassets/Branding/Contents.json | 0 .../Branding/Logo.imageset/Contents.json | 0 .../Branding/Logo.imageset/Logo_ltcnew.png | Bin .../Logo_ltcnew.imageset/Contents.json | 0 .../Logo_ltcnew.imageset/Logo_ltcnew.png | Bin .../Branding/NewLogo/Contents.json | 0 .../new-logo-white.imageset/Contents.json | 0 .../Litewallet-fin_white_icon711.png | Bin .../Litewallet_white_icon.png | Bin .../Litewallet_white_icon_355.png | Bin .../new-logotype-white.imageset/Contents.json | 0 .../litewallet-logotype_white-100.png | Bin .../litewallet-logotype_white-200.png | Bin .../litewallet-logotype_white-300.png | Bin .../newLogo-clear.imageset/Contents.json | 0 .../Litewallet-fin_icon.png | Bin .../Contents.json | 0 .../Litewallet-fin_icon200.png | Bin .../Contents.json | 0 .../Litewallet-fin_color.png | Bin .../coinBlueWhite.imageset/Contents.json | 0 .../coinBlueWhite.imageset/coinBlueWhite.png | Bin .../Contents.json | 0 .../litewalletLaunchLogo.png | Bin .../Contents.json | 0 .../lfLaunchLogo.png | Bin .../litecoin_cutout24.imageset/Contents.json | 0 .../litecoin_cutout24x24.png | Bin .../Branding/lofigirl.imageset}/Contents.json | 2 +- ... 2023-12-12 at 12.16.04\342\200\257PM.png" | Bin 0 -> 144386 bytes .../BrokenCloud.imageset/BrokenCloud.pdf | Bin .../BrokenCloud.imageset/Contents.json | 0 .../CircleCheck.imageset/CircleCheck.pdf | Bin .../CircleCheck.imageset/Contents.json | 0 .../Assets.xcassets/Close.imageset/Close.pdf | Bin .../Close.imageset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Delete.imageset/Contents.json | 0 .../Delete.imageset/Delete.pdf | Bin .../Edit.imageset/Contents.json | 0 .../Assets.xcassets/Edit.imageset/Edit.pdf | Bin .../FaceId-Large.imageset/Contents.json | 0 .../FaceId-Large.imageset/FaceId-Large.pdf | Bin .../FaceId.imageset/Contents.json | 0 .../FaceId.imageset/FaceId.pdf | Bin .../Faq.imageset/Contents.json | 0 .../Assets.xcassets/Faq.imageset/Faq.pdf | Bin .../HeaderGradient.imageset/Contents.json | 0 .../HeaderGradient.imageset/grad.png | Bin .../ImportIllustration.imageset/Contents.json | 0 .../ImportIllustration.pdf | Bin .../LeftArrow.imageset/Contents.json | 0 .../LeftArrow.imageset/LeftArrow.pdf | Bin .../MenuButtonIcon.imageset/Contents.json | 0 .../MenuButtonIcon.imageset/MenuTabIcon.pdf | Bin .../Assets.xcassets/MenuIcons/Contents.json | 0 .../MenuIcons/FaqFill.imageset/Contents.json | 0 .../MenuIcons/FaqFill.imageset/FaqFill.pdf | Bin .../MenuIcons/Lock.imageset/Contents.json | 0 .../MenuIcons/Lock.imageset/Lock.pdf | Bin .../MenuIcons/Profile.imageset/Contents.json | 0 .../MenuIcons/Profile.imageset/Profile.pdf | Bin .../MenuIcons/Settings.imageset/Contents.json | 0 .../MenuIcons/Settings.imageset/Settings.pdf | Bin .../MenuIcons/Shield.imageset/Contents.json | 0 .../MenuIcons/Shield.imageset/Shield.pdf | Bin .../buy_icon_gray.imageset/BuyLitecoin.pdf | Bin .../buy_icon_gray.imageset/Contents.json | 0 .../OpenBrowser.imageset/Contents.json | 0 .../OpenBrowser.imageset/OpenBrowser.pdf | Bin .../PaperKey.imageset/Contents.json | 0 .../PaperKey.imageset/PaperKey.pdf | Bin .../Contents.json | 0 .../bokeh.imageset/Contents.json | 0 .../bokeh.imageset/bokeh.png | Bin .../spark.imageset/Contents.json | 0 .../spark.imageset/spark.png | Bin .../Assets.xcassets/Partners/Contents.json | 0 .../bitrefillLogo.imageset/Contents.json | 0 .../bitrefill-logo-app.png | Bin .../Contents.json | 0 .../bitrefillLogoType.png | Bin .../changellyLogo.imageset/Contents.json | 0 .../changellyLogo@1x.png | Bin .../changellyLogo@3x.png | Bin .../Contents.json | 0 .../ltcfdfrontv7@1x.png | Bin .../ltcfdfrontv7@3x.png | Bin .../coinbaseLogo.imageset/Contents.json | 0 ...33afa2e1a58c16072fd244684232454e66a114.png | Bin .../Partners/litecoincard/Contents.json | 0 .../card-front.imageset/Contents.json | 0 .../litecoin-card-front-border-2-3x.png | Bin .../litecoin-card-back.imageset/Contents.json | 0 .../litecoin-back-1x.png | Bin .../litecoin-back-2x.png | Bin .../litecoin-back-3x.png | Bin .../Contents.json | 0 .../litecoin-card-3x.png | Bin .../litecoin-front-1x.png | Bin .../litecoin-front-2x.png | Bin .../Contents.json | 0 .../litecoin-card-front-border1x.png | Bin .../litecoin-card-front-border2x.png | Bin .../litecoin-card-front-border3x.png | Bin .../moonpay-logo.imageset/Contents.json | 0 .../moonpay-logo.imageset/moonpay-logo.png | Bin .../simplexLogo.imageset/Contents.json | 0 .../simplexLogo.imageset/simplexLogo@1x.png | Bin .../simplexLogo.imageset/simplexLogo@3x.png | Bin .../Contents.json | 0 .../simplexColor@1x.png | Bin .../simplexColor@3x.png | Bin .../ud-color-logo.imageset/Contents.json | 0 .../ud-Logo-Full-Light@1x.png | Bin .../ud-Logo-Full-Light@2x.png | Bin .../ud-Logo-Full-Light@3x.png | Bin .../ud-monotone-logo.imageset/Contents.json | 0 .../Logo-Full-Mono.png | Bin .../Logo-Full-Mono@2x.png | Bin .../Logo-Full-Mono@3x.png | Bin .../Pencil.imageset/Contents.json | 0 .../Pencil.imageset/Pencil.pdf | Bin .../Contents.json | 0 .../RecoverWalletIllustration.pdf | Bin .../Contents.json | 0 .../RestoreIllustration.pdf | Bin .../RightArrow.imageset/Contents.json | 0 .../RightArrow.imageset/RightArrow.pdf | Bin .../SearchIcon.imageset/Contents.json | 0 .../SearchIcon.imageset/SearchIcon.pdf | Bin .../Share.imageset/Contents.json | 0 .../Assets.xcassets/Share.imageset/Share.pdf | Bin .../Assets.xcassets/TabBar/Contents.json | 0 .../TabBar/receiveIcon.imageset/Contents.json | 0 .../receiveIcon.imageset/LW_RecieveV2.png | Bin .../TouchId-Large.imageset/Contents.json | 0 .../TouchId-Large.imageset/TouchId-Large.pdf | Bin .../TouchId.imageset/Contents.json | 0 .../TouchId.imageset/TouchId.pdf | Bin .../Assets.xcassets/Transaction/Contents.json | 0 .../movedTransaction.imageset/Contents.json | 0 .../movedTransaction.imageset/fullscreen.png | Bin .../CircleArrow.png | Bin .../CircleArrow@2x.png | Bin .../CircleArrow@3x.png | Bin .../Contents.json | 0 .../blackRightArrow.imageset/Contents.json | 0 .../blackRightArrow.png | Bin .../buy_icon.imageset/BuyIcon.pdf | Bin .../buy_icon.imageset/BuyIcon.pxm | Bin .../buy_icon.imageset/Contents.json | 0 .../camera-btn-pressed.imageset/Contents.json | 0 .../camera-btn-pressed.png | Bin .../camera-btn-pressed@2x.png | Bin .../camera-btn-pressed@3x.png | Bin .../camera-btn.imageset/Contents.json | 0 .../camera-btn.imageset/camera-btn.png | Bin .../camera-btn.imageset/camera-btn@2x.png | Bin .../camera-btn.imageset/camera-btn@3x.png | Bin .../card_icon.imageset/Contents.json | 0 .../card_icon.imageset/card_icon.png | Bin .../colorImageBlue.imageset/Contents.json | 0 .../colorImageBlue.imageset/colorBlue.png | Bin .../Contents.json | 0 .../colorModesText.colorset/Contents.json | 0 .../copyIcon.imageset/Contents.json | 0 .../copyIcon.imageset/copyicon40.pdf | Bin .../deletecircle.imageset/Contents.json | 0 .../deletecircle.imageset/deletecircle.pdf | Bin .../dropArrow.imageset/Contents.json | 0 .../dropArrow.imageset/dropArrow4.png | Bin .../flashIcon.imageset/Contents.json | 0 .../flashIcon.imageset/Flash.pdf | Bin .../genericqricon.imageset/Contents.json | 0 .../genericqricon.imageset/invert-qr-code.png | Bin .../genericqricon.imageset/qr-code.png | Bin .../history_icon.imageset/Contents.json | 0 .../history_icon.imageset/history1x.png | Bin .../modeDropArrow.imageset/Contents.json | 0 .../modeDropArrow.imageset/grayDropArrow.png | Bin .../modeDropArrow.imageset/whiteDropArrow.png | Bin .../receive_icon.imageset/Contents.json | 0 .../receive_icon.imageset/ReceiveTabIcon.pdf | Bin .../send.imageset/Contents.json | 0 .../send.imageset/history1x.png | Bin .../send_icon.imageset/Contents.json | 0 .../send_icon.imageset/SendTabIcon.pdf | Bin .../settingsWhite.imageset/Contents.json | 0 .../settingsWhite.imageset/whiteSettings.png | Bin .../shield.imageset/Contents.json | 0 .../shield.imageset/shield.pdf | Bin .../simplexRightArrow.imageset/Contents.json | 0 .../simplexRightArrow.png | Bin .../unlock.imageset/Contents.json | 0 .../unlock.imageset/unlock.pdf | Bin .../whiteCross.imageset/Contents.json | 0 .../whiteCross.imageset/whiteCross.png | Bin .../Contents.json | 0 .../downarrow1.png | Bin .../downarrow2.png | Bin .../downarrow3.png | Bin .../whiteDropArrow.imageset/Contents.json | 0 .../whiteDropArrow.png | Bin .../whiteRightArrow.imageset/Contents.json | 0 .../whiteRightArrow small.png | Bin .../whiteUpArrowCutout.imageset/Contents.json | 0 .../whiteUpArrowCutout.imageset/uparrow1.png | Bin .../whiteUpArrowCutout.imageset/uparrow2.png | Bin .../whiteUpArrowCutout.imageset/uparrow3.png | Bin .../Contents.json | 0 .../sendTabIconwhiteinterdit.pdf | Bin .../whiteleftarrow.imageset/Contents.json | 0 .../whiteBackArrow.png | Bin .../AssociatedObject.swift | 0 .../BRAPIClient+Events.swift | 23 +- .../BRAPIClient+Features.swift | 0 .../BRAPIClient+KV.swift | 0 .../BRAPIClient+Wallet.swift | 0 .../BRAddressExtension.swift | 0 .../BRCalculationExtension.swift | 0 .../BRKeyExtension.swift | 0 .../BRMasterKeyExtension.swift | 0 .../BRPeerManager.swift | 0 .../BRTxInputExtension.swift | 0 .../BRTxOutputExtension.swift | 0 {loafwallet => litewallet}/BRWallet.swift | 8 +- {loafwallet => litewallet}/BartyCrouch.swift | 0 .../Base.lproj/LaunchScreen.storyboard | 19 +- .../Base.lproj/Localizable.strings | 20 +- .../BundleExtension.swift | 0 .../BuyCenterWebViewController.swift | 0 .../BuyTableViewController.swift | 16 +- .../BuyWKWebViewController.swift | 0 {loafwallet => litewallet}/CHANGELOG.md | 0 .../CardV1ToastView.swift | 0 litewallet/CheckboxesStepView.swift | 35 + .../ChildViewTransitioningDelegate.swift | 0 .../Color+Extension.swift | 6 +- litewallet/Constant+Events.swift | 113 + .../ContainerViewController.swift | 0 .../CopyButtonView.swift | 0 litewallet/CreateStepConfiguration.swift | 101 + litewallet/CreateStepTabView.swift | 76 + litewallet/CreateStepView.swift | 46 + litewallet/CreateWalletView.swift | 32 + {loafwallet => litewallet}/Currency.swift | 0 .../DataValidation.swift | 0 .../Debug-GoogleService-Info.plist | 0 .../DomainResolutionFailure.swift | 0 .../EmailValidation.swift | 0 .../EmptyTableViewCell.swift | 0 litewallet/EnterPhraseHostingController.swift | 43 + litewallet/EnterPhraseView.swift | 10 + litewallet/EnterPhraseViewModel.swift | 19 + .../FailedAlertView.swift | 0 .../FeeSelectorView.swift | 1 + litewallet/FinishedStepView.swift | 11 + .../Fonts/BarlowSemiCondensed-Bold.ttf | Bin .../Fonts/BarlowSemiCondensed-Italic.ttf | Bin .../Fonts/BarlowSemiCondensed-Light.ttf | Bin .../Fonts/BarlowSemiCondensed-Medium.ttf | Bin .../Fonts/BarlowSemiCondensed-Regular.ttf | Bin .../Fonts/BarlowSemiCondensed-SemiBold.ttf | Bin .../ForgotAlertViewModel.swift | 0 {loafwallet => litewallet}/ForgotView.swift | 12 - .../HostingTransactionCell.swift | 2 +- .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/icon@2x.png | Bin .../AppIcon.appiconset/icon_20pt.png | Bin .../AppIcon.appiconset/icon_20pt@2x-1.png | Bin .../AppIcon.appiconset/icon_20pt@2x-2.png | Bin .../AppIcon.appiconset/icon_20pt@2x.png | Bin .../AppIcon.appiconset/icon_20pt@3x.png | Bin .../AppIcon.appiconset/icon_29pt-1.png | Bin .../AppIcon.appiconset/icon_29pt.png | Bin .../AppIcon.appiconset/icon_29pt@2x-1.png | Bin .../AppIcon.appiconset/icon_29pt@2x.png | Bin .../AppIcon.appiconset/icon_29pt@3x.png | Bin .../AppIcon.appiconset/icon_40pt@2x-1.png | Bin .../AppIcon.appiconset/icon_40pt@2x.png | Bin .../AppIcon.appiconset/icon_40pt@3x-1.png | Bin .../AppIcon.appiconset/icon_40pt@3x.png | Bin .../AppIcon.appiconset/icon_50pt@1x.png | Bin .../AppIcon.appiconset/icon_50pt@2x.png | Bin .../AppIcon.appiconset/icon_57pt@1x.png | Bin .../AppIcon.appiconset/icon_57pt@2x.png | Bin .../AppIcon.appiconset/icon_60pt@3x.png | Bin .../AppIcon.appiconset/icon_72pt@1x.png | Bin .../AppIcon.appiconset/icon_72pt@2x.png | Bin .../AppIcon.appiconset/icon_76pt.png | Bin .../AppIcon.appiconset/icon_76pt@2x.png | Bin .../AppIcon.appiconset/icon_83.5@2x.png | Bin litewallet/Icon.xcassets/Contents.json | 6 + {loafwallet => litewallet}/Info.plist | 0 litewallet/IntroStepView.swift | 107 + .../LFColorPalette.xcassets}/Contents.json | 0 .../Contents.json | 0 .../headerTextColor.colorset/Contents.json | 0 .../Contents.json | 0 .../inverseTextColor.colorset/Contents.json | 0 .../labelTextColor.colorset/Contents.json | 38 +- .../lfBackgroundColor.colorset/Contents.json | 0 .../mainColor.colorset/Contents.json | 0 .../staticWhiteColor.colorset/Contents.json | 0 .../LFModalReceiveQRViewController.swift | 2 +- .../LWActivityIndicator.swift | 2 +- {loafwallet => litewallet}/LWAnalytics.swift | 0 .../LanguageSelectionViewController.swift | 2 +- .../LanguageSelectionViewModel.swift | 0 litewallet/LaunchCardHostingController.swift | 16 + litewallet/LaunchView.swift | 15 + .../LitewalletIconView.swift | 0 {loafwallet => litewallet}/LocalWebView.swift | 0 .../LocalWebViewModel.swift | 0 litewallet/LocaleChangeView.swift | 29 + .../LocaleChangeViewModel.swift | 0 {loafwallet => litewallet}/Localization.swift | 0 litewallet/LockScreenHeaderView.swift | 31 + .../LockScreenViewModel.swift | 8 +- .../MainViewController.swift | 61 +- {loafwallet => litewallet}/MockSeeds.swift | 0 .../NSNotificationNameExtension.swift | 0 {loafwallet => litewallet}/PartnerData.swift | 73 +- {loafwallet => litewallet}/PartnersView.swift | 0 .../PartnersViewModel.swift | 0 .../PromptModalViewController.swift | 0 .../PromptTableViewCell.swift | 0 {loafwallet => litewallet}/RELEASE_NOTES.md | 0 .../ReceiveLTCViewController.swift | 0 litewallet/RecoverWalletView.swift | 23 + .../RequestAmountViewController.swift | 6 +- litewallet/SeedPhraseStepView.swift | 115 + litewallet/SeedWordView.swift | 36 + .../SendAddressCellView.swift | 53 +- .../SendAddressCellViewModel.swift | 3 - .../SendAddressHostingController.swift | 5 +- .../SendButtonHostingController.swift | 0 .../SendButtonView.swift | 0 .../SendLTCViewController.swift | 4 +- litewallet/Sounds/BahasaIndonesia.mp3 | Bin 0 -> 8928 bytes litewallet/Sounds/Deutsch.mp3 | Bin 0 -> 3936 bytes litewallet/Sounds/English.mp3 | Bin 0 -> 3936 bytes "litewallet/Sounds/Espa\303\261ol.mp3" | Bin 0 -> 4032 bytes "litewallet/Sounds/Fran\303\247ais.mp3" | Bin 0 -> 3648 bytes litewallet/Sounds/Italiano.mp3 | Bin 0 -> 4416 bytes "litewallet/Sounds/Portugu\303\252s.mp3" | Bin 0 -> 5280 bytes "litewallet/Sounds/T\303\274rk\303\247e.mp3" | Bin 0 -> 3552 bytes .../Sounds}/coinflip.aiff | Bin ...1\201\321\201\320\272\320\270\320\271.mp3" | Bin 0 -> 4224 bytes ...0\275\321\201\321\214\320\272\320\260.mp3" | Bin 0 -> 5184 bytes .../\344\270\255\345\234\213\344\272\272.mp3" | Bin 0 -> 5088 bytes .../\346\227\245\346\234\254\350\252\236.mp3" | Bin 0 -> 4320 bytes .../\355\225\234\352\265\255\354\235\270.mp3" | Bin 0 -> 4416 bytes .../StandardDividerView.swift | 0 litewallet/StartHostingController.swift | 21 + litewallet/StartViewModel.swift | 205 + litewallet/StoreReview+Extension.swift | 15 + .../Storyboards/Alerts.storyboard | 0 .../Storyboards/Animate.storyboard | 0 .../Storyboards/Buy.storyboard | 0 .../Storyboards/Main.storyboard | 0 .../Storyboards/Phrase.storyboard | 0 .../Storyboards/Receive.storyboard | 0 .../Storyboards/Send.storyboard | 11 +- .../Storyboards/Settings.storyboard | 0 .../Storyboards/Transactions.storyboard | 0 .../WarningConfirmation.storyboard | 0 .../XIBs/SyncProgressHeaderView.xib | 0 .../SupportLFViewModel.swift | 0 .../SupportLitecoinFoundationView.swift | 0 .../SupportLitecoinFoundationViewModel.swift | 0 .../SupportSafariViewModel.swift | 0 .../SyncProgressHeaderView.swift | 0 .../TabBarViewController.swift | 34 +- {loafwallet => litewallet}/TestnetData.swift | 0 .../TextView+Extension.swift | 0 .../TransactionCellView.swift | 0 .../TransactionCellViewModel.swift | 3 +- .../TransactionManager.swift | 0 .../TransactionModalView.swift | 0 .../TransactionsViewController.swift | 0 .../TransactionsViewModel.swift | 0 litewallet/TransferAmountViewModel.swift | 73 + .../UIApplication+Extension.swift | 0 .../UITableViewExtension.swift | 0 .../UnsafeMutablePointerExtension.swift | 0 .../UnstoppableDomainView.swift | 17 +- .../UnstoppableDomainViewModel.swift | 0 .../View+Extension.swift | 41 +- .../WarningConfirmationViewController.swift | 0 .../WipeEmptyWalletViewController.swift | 0 .../bitrefill_index.html | 0 .../de.lproj}/BIP39Words.plist | 0 .../de.lproj/Localizable.strings | 21 +- .../en.lproj}/BIP39Words.plist | 0 .../en.lproj/Localizable.strings | 13 +- .../es.lproj/BIP39Words.plist | 0 .../es.lproj/Localizable.strings | 17 +- .../fr.lproj/BIP39Words.plist | 0 .../fr.lproj/Localizable.strings | 17 +- {loafwallet => litewallet}/general.css | 0 .../id.lproj}/BIP39Words.plist | 0 .../id.lproj/Localizable.strings | 17 +- .../it.lproj/BIP39Words.plist | 0 .../it.lproj/Localizable.strings | 16 +- .../ja.lproj/BIP39Words.plist | 0 .../ja.lproj/Localizable.strings | 19 +- .../ko.lproj/BIP39Words.plist | 0 .../ko.lproj/Localizable.strings | 18 +- .../litewallet.entitlements | 4 - .../pt.lproj}/BIP39Words.plist | 0 .../pt.lproj/Localizable.strings | 18 +- .../ru.lproj}/BIP39Words.plist | 0 .../ru.lproj/Localizable.strings | 21 +- litewallet/src/AnnounceUpdatesView.swift | 129 + .../src}/AppDelegate.swift | 57 +- .../src/ApplicationController.swift | 47 +- {loafwallet => litewallet}/src/BRCore.swift | 24 + litewallet/src/Constants/ArticleIds.swift | 5 + .../src/Constants/Constants.swift | 165 +- litewallet/src/Constants/Functions.swift | 62 + litewallet/src/Constants/Strings.swift | 724 +++ .../src/Controls/MenuButton.swift | 0 .../src/Controls/MenuButtonType.swift | 0 .../src/Controls/SegmentedButton.swift | 0 litewallet/src/Environment.swift | 159 + .../ApplicationController+Extension.swift | 35 + .../src/Extensions/Async.swift | 0 .../src/Extensions/CGContext+Additions.swift | 0 .../src/Extensions/CGRect+Additions.swift | 0 .../src/Extensions/CustomTitleView.swift | 0 .../src/Extensions/Date+Additions.swift | 0 .../Extensions/DispatchQueue+Additions.swift | 0 .../src/Extensions/LAContext+Extensions.swift | 0 .../NumberFormatter+Additions.swift | 0 .../Extensions/SafariServices+Extension.swift | 98 + .../src/Extensions/String+Additions.swift | 19 +- .../UIBarButtonItem+Additions.swift | 0 .../Extensions/UIButton+BRWAdditions.swift | 10 +- .../src/Extensions/UIColor+Extension.swift | 29 +- .../src/Extensions/UIControl+Callback.swift | 0 .../src/Extensions/UIFont+BRWAdditions.swift | 27 + .../src/Extensions/UIImage+Utils.swift | 2 +- .../src/Extensions/UILabel+BRWAdditions.swift | 8 +- .../UINavigationController+Extension.swift | 16 +- .../src/Extensions/UIScreen+Additions.swift | 0 .../src/Extensions/UISlider+Gradient.swift | 0 .../Extensions/UITableView+Additions.swift | 2 +- .../UIView+AnimationAdditions.swift | 0 .../src/Extensions/UIView+BRWAdditions.swift | 6 +- .../UIView+FrameChangeBlocking.swift | 0 .../src/Extensions/UIView+InitAdditions.swift | 0 .../Extensions/UIViewController+Alerts.swift | 0 .../UIViewController+BRWAdditions.swift | 16 +- ...llerContextTransitioning+BRAdditions.swift | 0 .../UIViewPropertyAnimator+BRWAdditions.swift | 0 .../Extensions/UserDefaults+Additions.swift | 6 - .../src/FeeManager.swift | 10 +- .../FlowControllers/MessageUIPresenter.swift | 6 +- .../FlowControllers/StartFlowPresenter.swift | 83 +- .../StartNavigationDelegate.swift | 12 +- .../src/FlowControllers/URLController.swift | 0 .../src/KVStoreCoordinator.swift | 0 litewallet/src/LoginView.swift | 30 + .../src/LoginViewHostingController.swift | 26 + litewallet/src/LoginViewModel.swift | 18 + .../src/ModalPresenter.swift | 48 +- .../src/Models/KeyboardNotificationInfo.swift | 35 + .../src/Models/Rate.swift | 0 .../src/Models/Setting.swift | 0 .../src/Models/SimpleUTXO.swift | 0 .../src/Models/Types.swift | 3 +- litewallet/src/PINFieldView.swift | 105 + .../src/PaymentProtocol.swift | 0 .../src/PaymentRequest.swift | 0 litewallet/src/PinDigitView.swift | 97 + .../src/Platform/BRAPIClient.swift | 0 .../src/Platform/BRActivityView.swift | 2 +- .../src/Platform/BRCoding.swift | 5 +- .../src/Platform/BRReplicatedKVStore.swift | 2 +- .../src/Platform/BRSocketHelpers.c | 0 .../src/Platform/BRSocketHelpers.h | 0 .../src/Platform/BRTar.swift | 0 .../src/Platform/BRWebViewController.swift | 0 .../src/Platform/Extensions.swift | 180 +- .../src/Platform/TxMetaData.swift | 0 .../src/Platform/WalletInfo.swift | 0 .../src/Platform/module.modulemap | 0 .../src/ReachabilityMonitor.swift | 0 .../src/RetryTimer.swift | 0 litewallet/src/ScanViewController.swift | 1 + {loafwallet => litewallet}/src/Sender.swift | 41 +- litewallet/src/SignupWebView.swift | 83 + litewallet/src/SignupWebViewModel.swift | 14 + .../src/SimpleRedux.swift | 2 +- .../src/SimpleRedux/Actions.swift | 9 - .../src/SimpleRedux/ReduxState.swift | 0 litewallet/src/StartView.swift | 212 + .../src/UserDefaultsUpdater.swift | 0 .../ViewControllers/AboutViewController.swift | 0 .../AmountViewController.swift | 106 +- .../BiometricsSettingsViewController.swift | 0 ...iometricsSpendingLimitViewController.swift | 4 +- .../ConfirmPaperPhraseViewController.swift | 11 +- .../ConfirmationViewController.swift | 23 +- .../EnterPhraseCollectionViewController.swift | 0 .../EnterPhraseViewController.swift | 16 +- .../Import/StartImportViewController.swift | 0 .../ViewControllers/LoginViewController.swift | 34 +- .../ModalNavigationController.swift | 0 .../NodeSelectorViewController.swift | 13 +- .../PinPadViewController.swift | 2 +- .../ReScanViewController.swift | 10 +- .../RecoverWalletIntroViewController.swift | 0 .../RequestAmountViewController.swift | 250 + .../ManageWalletViewController.swift | 6 +- .../RootModals/MenuViewController.swift | 0 .../RootModals/ModalDisplayable.swift | 0 .../RootModals/ModalViewController.swift | 8 +- .../RootModals/ReceiveViewController.swift | 6 +- .../RootModals/SendViewController.swift | 371 +- .../ViewControllers/ScanViewController.swift | 2 +- .../SecurityCenterViewController.swift | 2 +- .../UpdatePinViewController.swift | 0 .../SettingsViewController.swift | 32 +- .../ShareDataViewController.swift | 0 .../StartPaperPhraseViewController.swift | 0 .../ViewControllers/StartViewController.swift | 1 - .../StartWipeWalletViewController.swift | 0 .../VerifyPinViewController.swift | 0 .../DismissLoginAnimator.swift | 0 .../DismissModalAnimator.swift | 0 .../LoginTransitionDelegate.swift | 0 .../ModalTransitionDelegate.swift | 0 .../PinTransitioningDelegate.swift | 0 .../PresentModalAnimator.swift | 6 +- .../WritePaperPhraseViewController.swift | 9 +- .../src/ViewModels/Amount.swift | 0 .../src/ViewModels/Transaction.swift | 2 +- .../src/ViewModels/TransactionDirection.swift | 0 .../src/Views/AboutCell.swift | 0 .../src/Views/AlertView.swift | 0 .../Views/AnimatedIcons/AnimatableIcon.swift | 0 .../src/Views/AnimatedIcons/CheckView.swift | 8 +- .../src/Views/BlinkingView.swift | 0 .../src/Views/CameraGuideView.swift | 2 +- .../src/Views/Circle.swift | 0 .../src/Views/ConfirmPhrase.swift | 2 +- .../Views/DefaultCurrencyViewController.swift | 4 +- .../src/Views/DrawableCircle.swift | 10 +- .../src/Views/EnterPhraseCell.swift | 4 +- .../src/Views/GradientCircle.swift | 0 .../src/Views/GradientSwitch.swift | 0 .../src/Views/GradientView.swift | 4 +- .../src/Views/InAppAlert.swift | 0 .../src/Views/InViewAlert.swift | 2 +- .../src/Views/LightWeightAlert.swift | 2 +- .../src/Views/LoadingProgressView.swift | 0 .../src/Views/LoginBackgroundTriangle.swift | 0 .../src/Views/ModalHeaderView.swift | 0 .../Views/NonScrollingCollectionView.swift | 0 .../src/Views/PhraseView.swift | 0 .../src/Views/PinPadCells/PinPadCells.swift | 0 .../src/Views/PinView.swift | 4 +- .../src/Views/RadialGradientView.swift | 0 .../src/Views/SearchHeaderView.swift | 2 +- .../src/Views/SecurityCenterCell.swift | 0 .../src/Views/SendAmountCell.swift | 6 +- .../src/Views/SendViewCells/AddressCell.swift | 110 + .../SendViewCells/DescriptionSendCell.swift | 0 .../src/Views/SendViewCells/SendCell.swift | 2 +- .../src/Views/SeparatorCell.swift | 2 +- .../src/Views/ShadowButton.swift | 0 .../src/Views/SyncingView.swift | 0 .../src/Views/UnEditableTextView.swift | 0 .../src/Views/UpdatingLabel.swift | 4 +- .../src/Views/WalletDisabledView.swift | 2 +- .../src/Wallet/ExchangeUpdater.swift | 1 + .../src/WalletCoordinator.swift | 21 +- .../src/WalletManager+Auth.swift | 20 +- .../src/WalletManager.swift | 3 +- .../tr.lproj}/BIP39Words.plist | 0 .../tr.lproj/Localizable.strings | 15 +- .../uk.lproj}/BIP39Words.plist | 0 .../uk.lproj/LaunchScreen.strings | 0 .../uk.lproj/Localizable.strings | 15 +- .../zh-Hans.lproj/BIP39Words.plist | 0 .../zh-Hans.lproj/Localizable.strings | 16 +- .../zh-Hant.lproj}/BIP39Words.plist | 0 .../zh-Hant.lproj/Localizable.strings | 21 +- .../APIManagerTests.swift | 2 +- .../Class Tests/AmountTests.swift | 2 +- .../ApplicationControllerTests.swift | 19 + .../Class Tests/BuyWKWebVCTests.swift | 2 +- .../TabBarViewControllerTests.swift | 2 +- .../UnstoppableDomainViewModelTests.swift | 2 +- .../Constants Tests/ConstantsTests.swift | 2 +- .../File Tests/FileTests.swift | 2 +- .../Info.plist | 0 .../LanguageSelectionTests.swift | 2 +- .../Legacy BRTests/BRAPIClientTests.swift | 2 +- .../Legacy BRTests/BRCoderTests.swift | 30 +- .../BRReplicatedKVStoreTests.swift | 2 +- .../DefaultFiatCurrencyTests.swift | 2 +- .../Legacy BRTests/NSDataExtensionTests.swift | 12 + .../Legacy BRTests/PaymentRequestTests.swift | 2 +- .../Legacy BRTests/PhraseTests.swift | 2 +- .../Legacy BRTests/SpendingLimitTests.swift | 2 +- .../Legacy BRTests/TouchIdEnabledTests.swift | 2 +- .../WalletAuthenticationTests.swift | 2 +- .../Legacy BRTests/WalletCreationTests.swift | 2 +- .../Legacy BRTests/WalletInfoTest.swift | 2 +- .../Lock Screen Tests/LockScreenTests.swift | 4 +- .../TestHelpers.swift | 0 .../WalletManagerTests.swift | 2 +- loafwallet.xcodeproj/project.pbxproj | 5532 ----------------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../Litewallet-fin_white-65.png | Bin 10250 -> 0 bytes loafwallet/DataValidation.swift | 127 - .../LFColorPalette.xcassets/Contents.json | 6 - loafwallet/LocaleChangeView.swift | 44 - loafwallet/LockScreenHeaderView.swift | 52 - loafwallet/TransferAmountViewModel.swift | 120 - loafwallet/pl.lproj/BIP39Words.plist | 2054 ------ loafwallet/pt.lproj/BIP39Words.plist | 2054 ------ loafwallet/ru.lproj/BIP39Words.plist | 2054 ------ loafwallet/src/Constants/ArticleIds.swift | 26 - loafwallet/src/Constants/Functions.swift | 36 - loafwallet/src/Constants/Strings.swift | 756 --- loafwallet/src/Environment.swift | 83 - .../src/Models/KeyboardNotificationInfo.swift | 33 - loafwallet/src/POSTBouncer.html | 31 - .../src/Platform/BRAPIClient+Assets.swift | 296 - loafwallet/src/Platform/BRBSPatch.swift | 213 - .../src/Strings/da.lproj/Localizable.strings | 1451 ----- .../src/Strings/nl.lproj/Localizable.strings | 1451 ----- .../src/Strings/sv.lproj/Localizable.strings | 1451 ----- .../PushNotificationsViewController.swift | 78 - .../WelcomeViewController.swift | 86 - .../src/Views/SendViewCells/AddressCell.swift | 165 - loafwallet/sv.lproj/BIP39Words.plist | 2054 ------ loafwallet/tr.lproj/BIP39Words.plist | 2054 ------ loafwallet/uk.lproj/BIP39Words.plist | 2054 ------ loafwallet/zh-Hant.lproj/BIP39Words.plist | 2054 ------ .../Legacy BRTests/NSDataExtensionTests.swift | 30 - 675 files changed, 5199 insertions(+), 27759 deletions(-) create mode 100644 .swift-version delete mode 100644 Modules/libbz2/Info.plist delete mode 100644 Modules/libbz2/iphone.modulemap delete mode 100644 Modules/libbz2/iphonesim.modulemap delete mode 100644 Modules/sqlite3/Info.plist delete mode 100644 Modules/sqlite3/iphone.modulemap delete mode 100644 Modules/sqlite3/iphonesim.modulemap rename {loafwallet.xcodeproj => litewallet.xcodeproj}/project.xcworkspace/xcshareddata/breadwallet.xcscmblueprint (100%) rename {loafwallet.xcodeproj => litewallet.xcodeproj}/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist (100%) rename {loafwallet.xcodeproj => litewallet.xcodeproj}/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist (100%) rename {loafwallet.xcodeproj => litewallet.xcodeproj}/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/89EB5553-73DB-40A4-831A-A7FB476230EB.plist (100%) rename {loafwallet.xcodeproj => litewallet.xcodeproj}/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/Info.plist (100%) create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/BRCore.xcscheme rename {loafwallet.xcodeproj => litewallet.xcodeproj}/xcshareddata/xcschemes/Testnet.xcscheme (84%) create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/TodayExtension.xcscheme create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/litewalle-indo.xcscheme create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/litewallet-french.xcscheme rename loafwallet.xcodeproj/xcshareddata/xcschemes/loafwallet.xcscheme => litewallet.xcodeproj/xcshareddata/xcschemes/litewallet.xcscheme (80%) create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/nettle.xcscheme create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/submodules.xcscheme create mode 100644 litewallet.xcodeproj/xcshareddata/xcschemes/unbound.xcscheme rename {loafwallet => litewallet}/AddressFieldView.swift (84%) rename {loafwallet => litewallet}/AlertFailureView.swift (96%) create mode 100644 litewallet/ArticleIds.swift rename {loafwallet => litewallet}/Assets.xcassets/Back.imageset/Back.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Back.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/Logo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/Logo.imageset/Logo_ltcnew.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/Logo_ltcnew.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/Logo_ltcnew.imageset/Logo_ltcnew.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet-fin_white_icon711.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon_355.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-100.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-200.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-300.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Litewallet-fin_icon.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Litewallet-fin_icon200.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Litewallet-fin_color.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/coinBlueWhite.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/coinBlueWhite.imageset/coinBlueWhite.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/launchLiteWalletImage.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/launchLiteWalletImage.imageset/litewalletLaunchLogo.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/lfLaunchLogo.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/litecoin_cutout24.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Branding/litecoin_cutout24.imageset/litecoin_cutout24x24.png (100%) rename {loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset => litewallet/Assets.xcassets/Branding/lofigirl.imageset}/Contents.json (80%) create mode 100644 "litewallet/Assets.xcassets/Branding/lofigirl.imageset/Screenshot 2023-12-12 at 12.16.04\342\200\257PM.png" rename {loafwallet => litewallet}/Assets.xcassets/BrokenCloud.imageset/BrokenCloud.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/BrokenCloud.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/CircleCheck.imageset/CircleCheck.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/CircleCheck.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Close.imageset/Close.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Close.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Delete.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Delete.imageset/Delete.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Edit.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Edit.imageset/Edit.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/FaceId-Large.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/FaceId-Large.imageset/FaceId-Large.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/FaceId.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/FaceId.imageset/FaceId.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Faq.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Faq.imageset/Faq.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/HeaderGradient.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/HeaderGradient.imageset/grad.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/ImportIllustration.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/ImportIllustration.imageset/ImportIllustration.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/LeftArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/LeftArrow.imageset/LeftArrow.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuButtonIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuButtonIcon.imageset/MenuTabIcon.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/FaqFill.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/FaqFill.imageset/FaqFill.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Lock.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Lock.imageset/Lock.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Profile.imageset/Profile.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Settings.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Settings.imageset/Settings.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Shield.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/Shield.imageset/Shield.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/BuyLitecoin.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/OpenBrowser.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/OpenBrowser.imageset/OpenBrowser.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/PaperKey.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/PaperKey.imageset/PaperKey.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/bitrefillLogo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/bitrefillLogo.imageset/bitrefill-logo-app.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/bitrefillLogoType.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/coinbaseLogo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/coinbaseLogo.imageset/square-blue-5d2184a32860bee22d0f30233233afa2e1a58c16072fd244684232454e66a114.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/card-front.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/card-front.imageset/litecoin-card-front-border-2-3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-card-3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/moonpay-logo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/moonpay-logo.imageset/moonpay-logo.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-color-logo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-monotone-logo.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/Pencil.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Pencil.imageset/Pencil.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/RecoverWalletIllustration.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/RecoverWalletIllustration.imageset/RecoverWalletIllustration.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/RestoreIllustration.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/RestoreIllustration.imageset/RestoreIllustration.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/RightArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/RightArrow.imageset/RightArrow.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/SearchIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/SearchIcon.imageset/SearchIcon.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Share.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Share.imageset/Share.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/TabBar/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/TabBar/receiveIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/TabBar/receiveIcon.imageset/LW_RecieveV2.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/TouchId-Large.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/TouchId-Large.imageset/TouchId-Large.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/TouchId.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/TouchId.imageset/TouchId.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/Transaction/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Transaction/movedTransaction.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/Transaction/movedTransaction.imageset/fullscreen.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/black-circle-arrow-right.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/blackRightArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/blackRightArrow.imageset/blackRightArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/buy_icon.imageset/BuyIcon.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/buy_icon.imageset/BuyIcon.pxm (100%) rename {loafwallet => litewallet}/Assets.xcassets/buy_icon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn-pressed.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn.imageset/camera-btn.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn.imageset/camera-btn@2x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/camera-btn.imageset/camera-btn@3x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/card_icon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/card_icon.imageset/card_icon.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/colorImageBlue.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/colorImageBlue.imageset/colorBlue.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/colorLitewalletBlue.colorset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/colorModesText.colorset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/copyIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/copyIcon.imageset/copyicon40.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/deletecircle.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/deletecircle.imageset/deletecircle.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/dropArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/dropArrow.imageset/dropArrow4.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/flashIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/flashIcon.imageset/Flash.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/genericqricon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/genericqricon.imageset/invert-qr-code.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/genericqricon.imageset/qr-code.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/history_icon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/history_icon.imageset/history1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/modeDropArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/modeDropArrow.imageset/grayDropArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/modeDropArrow.imageset/whiteDropArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/receive_icon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/receive_icon.imageset/ReceiveTabIcon.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/send.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/send.imageset/history1x.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/send_icon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/send_icon.imageset/SendTabIcon.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/settingsWhite.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/settingsWhite.imageset/whiteSettings.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/shield.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/shield.imageset/shield.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/simplexRightArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/simplexRightArrow.imageset/simplexRightArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/unlock.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/unlock.imageset/unlock.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteCross.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteCross.imageset/whiteCross.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDownArrowCutout.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow1.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow2.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow3.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDropArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteDropArrow.imageset/whiteDropArrow.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteRightArrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteRightArrow.imageset/whiteRightArrow small.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteUpArrowCutout.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow1.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow2.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow3.png (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteinterditsendIcon.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteinterditsendIcon.imageset/sendTabIconwhiteinterdit.pdf (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteleftarrow.imageset/Contents.json (100%) rename {loafwallet => litewallet}/Assets.xcassets/whiteleftarrow.imageset/whiteBackArrow.png (100%) rename {loafwallet => litewallet}/AssociatedObject.swift (100%) rename {loafwallet => litewallet}/BRAPIClient+Events.swift (91%) rename {loafwallet => litewallet}/BRAPIClient+Features.swift (100%) rename {loafwallet => litewallet}/BRAPIClient+KV.swift (100%) rename {loafwallet => litewallet}/BRAPIClient+Wallet.swift (100%) rename {loafwallet => litewallet}/BRAddressExtension.swift (100%) rename {loafwallet => litewallet}/BRCalculationExtension.swift (100%) rename {loafwallet => litewallet}/BRKeyExtension.swift (100%) rename {loafwallet => litewallet}/BRMasterKeyExtension.swift (100%) rename {loafwallet => litewallet}/BRPeerManager.swift (100%) rename {loafwallet => litewallet}/BRTxInputExtension.swift (100%) rename {loafwallet => litewallet}/BRTxOutputExtension.swift (100%) rename {loafwallet => litewallet}/BRWallet.swift (94%) rename {loafwallet => litewallet}/BartyCrouch.swift (100%) rename {loafwallet => litewallet}/Base.lproj/LaunchScreen.storyboard (71%) rename {loafwallet/src/Strings => litewallet}/Base.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/BundleExtension.swift (100%) rename {loafwallet => litewallet}/BuyCenterWebViewController.swift (100%) rename {loafwallet => litewallet}/BuyTableViewController.swift (96%) rename {loafwallet => litewallet}/BuyWKWebViewController.swift (100%) rename {loafwallet => litewallet}/CHANGELOG.md (100%) rename {loafwallet => litewallet}/CardV1ToastView.swift (100%) create mode 100644 litewallet/CheckboxesStepView.swift rename {loafwallet => litewallet}/ChildViewTransitioningDelegate.swift (100%) rename {loafwallet => litewallet}/Color+Extension.swift (80%) create mode 100644 litewallet/Constant+Events.swift rename {loafwallet => litewallet}/ContainerViewController.swift (100%) rename {loafwallet => litewallet}/CopyButtonView.swift (100%) create mode 100644 litewallet/CreateStepConfiguration.swift create mode 100644 litewallet/CreateStepTabView.swift create mode 100644 litewallet/CreateStepView.swift create mode 100644 litewallet/CreateWalletView.swift rename {loafwallet => litewallet}/Currency.swift (100%) rename loafwallet/src/ScanViewController.swift => litewallet/DataValidation.swift (100%) rename {loafwallet => litewallet}/Debug-GoogleService-Info.plist (100%) rename {loafwallet => litewallet}/DomainResolutionFailure.swift (100%) rename {loafwallet => litewallet}/EmailValidation.swift (100%) rename {loafwallet => litewallet}/EmptyTableViewCell.swift (100%) create mode 100644 litewallet/EnterPhraseHostingController.swift create mode 100644 litewallet/EnterPhraseView.swift create mode 100644 litewallet/EnterPhraseViewModel.swift rename {loafwallet => litewallet}/FailedAlertView.swift (100%) rename {loafwallet => litewallet}/FeeSelectorView.swift (99%) create mode 100644 litewallet/FinishedStepView.swift rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-Bold.ttf (100%) rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-Italic.ttf (100%) rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-Light.ttf (100%) rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-Medium.ttf (100%) rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-Regular.ttf (100%) rename {loafwallet => litewallet}/Fonts/BarlowSemiCondensed-SemiBold.ttf (100%) rename {loafwallet => litewallet}/ForgotAlertViewModel.swift (100%) rename {loafwallet => litewallet}/ForgotView.swift (91%) rename {loafwallet => litewallet}/HostingTransactionCell.swift (95%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/Contents.json (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_20pt.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-2.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_20pt@3x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_29pt-1.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_29pt.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_29pt@3x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x-1.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_50pt@1x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_50pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_57pt@1x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_57pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_60pt@3x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_72pt@1x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_72pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_76pt.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_76pt@2x.png (100%) rename {loafwallet => litewallet}/Icon.xcassets/AppIcon.appiconset/icon_83.5@2x.png (100%) create mode 100644 litewallet/Icon.xcassets/Contents.json rename {loafwallet => litewallet}/Info.plist (100%) create mode 100644 litewallet/IntroStepView.swift rename {loafwallet/Icon.xcassets => litewallet/LFColorPalette.xcassets}/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/buttonSelectionColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/headerTextColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/inverseBackgroundViewColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/inverseTextColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json (66%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/lfBackgroundColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/mainColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFColorPalette.xcassets/staticWhiteColor.colorset/Contents.json (100%) rename {loafwallet => litewallet}/LFModalReceiveQRViewController.swift (95%) rename {loafwallet => litewallet}/LWActivityIndicator.swift (87%) rename {loafwallet => litewallet}/LWAnalytics.swift (100%) rename {loafwallet => litewallet}/LanguageSelectionViewController.swift (97%) rename {loafwallet => litewallet}/LanguageSelectionViewModel.swift (100%) create mode 100644 litewallet/LaunchCardHostingController.swift create mode 100644 litewallet/LaunchView.swift rename {loafwallet => litewallet}/LitewalletIconView.swift (100%) rename {loafwallet => litewallet}/LocalWebView.swift (100%) rename {loafwallet => litewallet}/LocalWebViewModel.swift (100%) create mode 100644 litewallet/LocaleChangeView.swift rename {loafwallet => litewallet}/LocaleChangeViewModel.swift (100%) rename {loafwallet => litewallet}/Localization.swift (100%) create mode 100644 litewallet/LockScreenHeaderView.swift rename loafwallet/LockScreenHeaderViewModel.swift => litewallet/LockScreenViewModel.swift (88%) rename {loafwallet => litewallet}/MainViewController.swift (77%) rename {loafwallet => litewallet}/MockSeeds.swift (100%) rename {loafwallet => litewallet}/NSNotificationNameExtension.swift (100%) rename {loafwallet => litewallet}/PartnerData.swift (52%) rename {loafwallet => litewallet}/PartnersView.swift (100%) rename {loafwallet => litewallet}/PartnersViewModel.swift (100%) rename {loafwallet => litewallet}/PromptModalViewController.swift (100%) rename {loafwallet => litewallet}/PromptTableViewCell.swift (100%) rename {loafwallet => litewallet}/RELEASE_NOTES.md (100%) rename {loafwallet => litewallet}/ReceiveLTCViewController.swift (100%) create mode 100644 litewallet/RecoverWalletView.swift rename {loafwallet/src/ViewControllers => litewallet}/RequestAmountViewController.swift (99%) create mode 100644 litewallet/SeedPhraseStepView.swift create mode 100644 litewallet/SeedWordView.swift rename {loafwallet => litewallet}/SendAddressCellView.swift (62%) rename {loafwallet => litewallet}/SendAddressCellViewModel.swift (85%) rename {loafwallet => litewallet}/SendAddressHostingController.swift (82%) rename {loafwallet => litewallet}/SendButtonHostingController.swift (100%) rename {loafwallet => litewallet}/SendButtonView.swift (100%) rename {loafwallet => litewallet}/SendLTCViewController.swift (81%) create mode 100644 litewallet/Sounds/BahasaIndonesia.mp3 create mode 100644 litewallet/Sounds/Deutsch.mp3 create mode 100644 litewallet/Sounds/English.mp3 create mode 100644 "litewallet/Sounds/Espa\303\261ol.mp3" create mode 100644 "litewallet/Sounds/Fran\303\247ais.mp3" create mode 100644 litewallet/Sounds/Italiano.mp3 create mode 100644 "litewallet/Sounds/Portugu\303\252s.mp3" create mode 100644 "litewallet/Sounds/T\303\274rk\303\247e.mp3" rename {loafwallet => litewallet/Sounds}/coinflip.aiff (100%) create mode 100644 "litewallet/Sounds/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.mp3" create mode 100644 "litewallet/Sounds/\321\203\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260.mp3" create mode 100644 "litewallet/Sounds/\344\270\255\345\234\213\344\272\272.mp3" create mode 100644 "litewallet/Sounds/\346\227\245\346\234\254\350\252\236.mp3" create mode 100644 "litewallet/Sounds/\355\225\234\352\265\255\354\235\270.mp3" rename {loafwallet => litewallet}/StandardDividerView.swift (100%) create mode 100644 litewallet/StartHostingController.swift create mode 100644 litewallet/StartViewModel.swift create mode 100644 litewallet/StoreReview+Extension.swift rename {loafwallet => litewallet}/Storyboards/Alerts.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Animate.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Buy.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Main.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Phrase.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Receive.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Send.storyboard (84%) rename {loafwallet => litewallet}/Storyboards/Settings.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/Transactions.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/WarningConfirmation.storyboard (100%) rename {loafwallet => litewallet}/Storyboards/XIBs/SyncProgressHeaderView.xib (100%) rename {loafwallet => litewallet}/SupportLFViewModel.swift (100%) rename {loafwallet => litewallet}/SupportLitecoinFoundationView.swift (100%) rename {loafwallet => litewallet}/SupportLitecoinFoundationViewModel.swift (100%) rename {loafwallet => litewallet}/SupportSafariViewModel.swift (100%) rename {loafwallet => litewallet}/SyncProgressHeaderView.swift (100%) rename {loafwallet => litewallet}/TabBarViewController.swift (93%) rename {loafwallet => litewallet}/TestnetData.swift (100%) rename {loafwallet => litewallet}/TextView+Extension.swift (100%) rename {loafwallet => litewallet}/TransactionCellView.swift (100%) rename {loafwallet => litewallet}/TransactionCellViewModel.swift (94%) rename {loafwallet => litewallet}/TransactionManager.swift (100%) rename {loafwallet => litewallet}/TransactionModalView.swift (100%) rename {loafwallet => litewallet}/TransactionsViewController.swift (100%) rename {loafwallet => litewallet}/TransactionsViewModel.swift (100%) create mode 100644 litewallet/TransferAmountViewModel.swift rename {loafwallet => litewallet}/UIApplication+Extension.swift (100%) rename {loafwallet => litewallet}/UITableViewExtension.swift (100%) rename {loafwallet => litewallet}/UnsafeMutablePointerExtension.swift (100%) rename {loafwallet => litewallet}/UnstoppableDomainView.swift (84%) rename {loafwallet => litewallet}/UnstoppableDomainViewModel.swift (100%) rename {loafwallet => litewallet}/View+Extension.swift (69%) rename {loafwallet => litewallet}/WarningConfirmationViewController.swift (100%) rename {loafwallet => litewallet}/WipeEmptyWalletViewController.swift (100%) rename {loafwallet => litewallet}/bitrefill_index.html (100%) rename {loafwallet/da.lproj => litewallet/de.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/de.lproj/Localizable.strings (99%) rename {loafwallet/de.lproj => litewallet/en.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/en.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/es.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/es.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/fr.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/fr.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/general.css (100%) rename {loafwallet/el.lproj => litewallet/id.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/id.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/it.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/it.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/ja.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/ja.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/ko.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/ko.lproj/Localizable.strings (99%) rename loafwallet/loafwallet.entitlements => litewallet/litewallet.entitlements (74%) rename {loafwallet/en.lproj => litewallet/pt.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/pt.lproj/Localizable.strings (99%) rename {loafwallet/hu.lproj => litewallet/ru.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/ru.lproj/Localizable.strings (99%) create mode 100644 litewallet/src/AnnounceUpdatesView.swift rename {loafwallet => litewallet/src}/AppDelegate.swift (57%) rename {loafwallet => litewallet}/src/ApplicationController.swift (89%) rename {loafwallet => litewallet}/src/BRCore.swift (94%) create mode 100644 litewallet/src/Constants/ArticleIds.swift rename {loafwallet => litewallet}/src/Constants/Constants.swift (50%) create mode 100644 litewallet/src/Constants/Functions.swift create mode 100644 litewallet/src/Constants/Strings.swift rename {loafwallet => litewallet}/src/Controls/MenuButton.swift (100%) rename {loafwallet => litewallet}/src/Controls/MenuButtonType.swift (100%) rename {loafwallet => litewallet}/src/Controls/SegmentedButton.swift (100%) create mode 100644 litewallet/src/Environment.swift create mode 100644 litewallet/src/Extensions/ApplicationController+Extension.swift rename {loafwallet => litewallet}/src/Extensions/Async.swift (100%) rename {loafwallet => litewallet}/src/Extensions/CGContext+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/CGRect+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/CustomTitleView.swift (100%) rename {loafwallet => litewallet}/src/Extensions/Date+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/DispatchQueue+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/LAContext+Extensions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/NumberFormatter+Additions.swift (100%) create mode 100644 litewallet/src/Extensions/SafariServices+Extension.swift rename {loafwallet => litewallet}/src/Extensions/String+Additions.swift (85%) rename {loafwallet => litewallet}/src/Extensions/UIBarButtonItem+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIButton+BRWAdditions.swift (80%) rename {loafwallet => litewallet}/src/Extensions/UIColor+Extension.swift (85%) rename {loafwallet => litewallet}/src/Extensions/UIControl+Callback.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIFont+BRWAdditions.swift (72%) rename {loafwallet => litewallet}/src/Extensions/UIImage+Utils.swift (97%) rename {loafwallet => litewallet}/src/Extensions/UILabel+BRWAdditions.swift (81%) rename {loafwallet => litewallet}/src/Extensions/UINavigationController+Extension.swift (67%) rename {loafwallet => litewallet}/src/Extensions/UIScreen+Additions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UISlider+Gradient.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UITableView+Additions.swift (59%) rename {loafwallet => litewallet}/src/Extensions/UIView+AnimationAdditions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIView+BRWAdditions.swift (96%) rename {loafwallet => litewallet}/src/Extensions/UIView+FrameChangeBlocking.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIView+InitAdditions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIViewController+Alerts.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIViewController+BRWAdditions.swift (66%) rename {loafwallet => litewallet}/src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift (100%) rename {loafwallet => litewallet}/src/Extensions/UserDefaults+Additions.swift (96%) rename {loafwallet => litewallet}/src/FeeManager.swift (85%) rename {loafwallet => litewallet}/src/FlowControllers/MessageUIPresenter.swift (97%) rename {loafwallet => litewallet}/src/FlowControllers/StartFlowPresenter.swift (73%) rename {loafwallet => litewallet}/src/FlowControllers/StartNavigationDelegate.swift (79%) rename {loafwallet => litewallet}/src/FlowControllers/URLController.swift (100%) rename {loafwallet => litewallet}/src/KVStoreCoordinator.swift (100%) create mode 100644 litewallet/src/LoginView.swift create mode 100644 litewallet/src/LoginViewHostingController.swift create mode 100644 litewallet/src/LoginViewModel.swift rename {loafwallet => litewallet}/src/ModalPresenter.swift (96%) create mode 100644 litewallet/src/Models/KeyboardNotificationInfo.swift rename {loafwallet => litewallet}/src/Models/Rate.swift (100%) rename {loafwallet => litewallet}/src/Models/Setting.swift (100%) rename {loafwallet => litewallet}/src/Models/SimpleUTXO.swift (100%) rename {loafwallet => litewallet}/src/Models/Types.swift (98%) create mode 100644 litewallet/src/PINFieldView.swift rename {loafwallet => litewallet}/src/PaymentProtocol.swift (100%) rename {loafwallet => litewallet}/src/PaymentRequest.swift (100%) create mode 100644 litewallet/src/PinDigitView.swift rename {loafwallet => litewallet}/src/Platform/BRAPIClient.swift (100%) rename {loafwallet => litewallet}/src/Platform/BRActivityView.swift (96%) rename {loafwallet => litewallet}/src/Platform/BRCoding.swift (96%) rename {loafwallet => litewallet}/src/Platform/BRReplicatedKVStore.swift (99%) rename {loafwallet => litewallet}/src/Platform/BRSocketHelpers.c (100%) rename {loafwallet => litewallet}/src/Platform/BRSocketHelpers.h (100%) rename {loafwallet => litewallet}/src/Platform/BRTar.swift (100%) rename {loafwallet => litewallet}/src/Platform/BRWebViewController.swift (100%) rename {loafwallet => litewallet}/src/Platform/Extensions.swift (84%) rename {loafwallet => litewallet}/src/Platform/TxMetaData.swift (100%) rename {loafwallet => litewallet}/src/Platform/WalletInfo.swift (100%) rename {loafwallet => litewallet}/src/Platform/module.modulemap (100%) rename {loafwallet => litewallet}/src/ReachabilityMonitor.swift (100%) rename {loafwallet => litewallet}/src/RetryTimer.swift (100%) create mode 100644 litewallet/src/ScanViewController.swift rename {loafwallet => litewallet}/src/Sender.swift (90%) create mode 100644 litewallet/src/SignupWebView.swift create mode 100644 litewallet/src/SignupWebViewModel.swift rename {loafwallet => litewallet}/src/SimpleRedux.swift (99%) rename {loafwallet => litewallet}/src/SimpleRedux/Actions.swift (99%) rename {loafwallet => litewallet}/src/SimpleRedux/ReduxState.swift (100%) create mode 100644 litewallet/src/StartView.swift rename {loafwallet => litewallet}/src/UserDefaultsUpdater.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/AboutViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/AmountViewController.swift (94%) rename {loafwallet => litewallet}/src/ViewControllers/BiometricsSettingsViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/BiometricsSpendingLimitViewController.swift (97%) rename {loafwallet => litewallet}/src/ViewControllers/ConfirmPaperPhraseViewController.swift (96%) rename {loafwallet => litewallet}/src/ViewControllers/ConfirmationViewController.swift (91%) rename {loafwallet => litewallet}/src/ViewControllers/EnterPhraseCollectionViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/EnterPhraseViewController.swift (94%) rename {loafwallet => litewallet}/src/ViewControllers/Import/StartImportViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/LoginViewController.swift (95%) rename {loafwallet => litewallet}/src/ViewControllers/ModalNavigationController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/NodeSelectorViewController.swift (94%) rename {loafwallet => litewallet}/src/ViewControllers/PinPadViewController.swift (99%) rename {loafwallet => litewallet}/src/ViewControllers/ReScanViewController.swift (90%) rename {loafwallet => litewallet}/src/ViewControllers/RecoverWalletIntroViewController.swift (100%) create mode 100644 litewallet/src/ViewControllers/RequestAmountViewController.swift rename {loafwallet => litewallet}/src/ViewControllers/RootModals/ManageWalletViewController.swift (95%) rename {loafwallet => litewallet}/src/ViewControllers/RootModals/MenuViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/RootModals/ModalDisplayable.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/RootModals/ModalViewController.swift (97%) rename {loafwallet => litewallet}/src/ViewControllers/RootModals/ReceiveViewController.swift (98%) rename {loafwallet => litewallet}/src/ViewControllers/RootModals/SendViewController.swift (59%) rename {loafwallet => litewallet}/src/ViewControllers/ScanViewController.swift (98%) rename {loafwallet => litewallet}/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift (99%) rename {loafwallet => litewallet}/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/SettingsViewController.swift (86%) rename {loafwallet => litewallet}/src/ViewControllers/ShareDataViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/StartPaperPhraseViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/StartViewController.swift (98%) rename {loafwallet => litewallet}/src/ViewControllers/StartWipeWalletViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/VerifyPinViewController.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift (100%) rename {loafwallet => litewallet}/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift (89%) rename {loafwallet => litewallet}/src/ViewControllers/WritePaperPhraseViewController.swift (95%) rename {loafwallet => litewallet}/src/ViewModels/Amount.swift (100%) rename {loafwallet => litewallet}/src/ViewModels/Transaction.swift (99%) rename {loafwallet => litewallet}/src/ViewModels/TransactionDirection.swift (100%) rename {loafwallet => litewallet}/src/Views/AboutCell.swift (100%) rename {loafwallet => litewallet}/src/Views/AlertView.swift (100%) rename {loafwallet => litewallet}/src/Views/AnimatedIcons/AnimatableIcon.swift (100%) rename {loafwallet => litewallet}/src/Views/AnimatedIcons/CheckView.swift (94%) rename {loafwallet => litewallet}/src/Views/BlinkingView.swift (100%) rename {loafwallet => litewallet}/src/Views/CameraGuideView.swift (97%) rename {loafwallet => litewallet}/src/Views/Circle.swift (100%) rename {loafwallet => litewallet}/src/Views/ConfirmPhrase.swift (98%) rename {loafwallet => litewallet}/src/Views/DefaultCurrencyViewController.swift (98%) rename {loafwallet => litewallet}/src/Views/DrawableCircle.swift (86%) rename {loafwallet => litewallet}/src/Views/EnterPhraseCell.swift (98%) rename {loafwallet => litewallet}/src/Views/GradientCircle.swift (100%) rename {loafwallet => litewallet}/src/Views/GradientSwitch.swift (100%) rename {loafwallet => litewallet}/src/Views/GradientView.swift (95%) rename {loafwallet => litewallet}/src/Views/InAppAlert.swift (100%) rename {loafwallet => litewallet}/src/Views/InViewAlert.swift (96%) rename {loafwallet => litewallet}/src/Views/LightWeightAlert.swift (85%) rename {loafwallet => litewallet}/src/Views/LoadingProgressView.swift (100%) rename {loafwallet => litewallet}/src/Views/LoginBackgroundTriangle.swift (100%) rename {loafwallet => litewallet}/src/Views/ModalHeaderView.swift (100%) rename {loafwallet => litewallet}/src/Views/NonScrollingCollectionView.swift (100%) rename {loafwallet => litewallet}/src/Views/PhraseView.swift (100%) rename {loafwallet => litewallet}/src/Views/PinPadCells/PinPadCells.swift (100%) rename {loafwallet => litewallet}/src/Views/PinView.swift (93%) rename {loafwallet => litewallet}/src/Views/RadialGradientView.swift (100%) rename {loafwallet => litewallet}/src/Views/SearchHeaderView.swift (98%) rename {loafwallet => litewallet}/src/Views/SecurityCenterCell.swift (100%) rename {loafwallet => litewallet}/src/Views/SendAmountCell.swift (95%) create mode 100644 litewallet/src/Views/SendViewCells/AddressCell.swift rename {loafwallet => litewallet}/src/Views/SendViewCells/DescriptionSendCell.swift (100%) rename {loafwallet => litewallet}/src/Views/SendViewCells/SendCell.swift (92%) rename {loafwallet => litewallet}/src/Views/SeparatorCell.swift (89%) rename {loafwallet => litewallet}/src/Views/ShadowButton.swift (100%) rename {loafwallet => litewallet}/src/Views/SyncingView.swift (100%) rename {loafwallet => litewallet}/src/Views/UnEditableTextView.swift (100%) rename {loafwallet => litewallet}/src/Views/UpdatingLabel.swift (94%) rename {loafwallet => litewallet}/src/Views/WalletDisabledView.swift (99%) rename {loafwallet => litewallet}/src/Wallet/ExchangeUpdater.swift (99%) rename {loafwallet => litewallet}/src/WalletCoordinator.swift (95%) rename {loafwallet => litewallet}/src/WalletManager+Auth.swift (97%) rename {loafwallet => litewallet}/src/WalletManager.swift (99%) rename {loafwallet/id.lproj => litewallet/tr.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/tr.lproj/Localizable.strings (99%) rename {loafwallet/nb.lproj => litewallet/uk.lproj}/BIP39Words.plist (100%) rename {loafwallet => litewallet}/uk.lproj/LaunchScreen.strings (100%) rename {loafwallet/src/Strings => litewallet}/uk.lproj/Localizable.strings (99%) rename {loafwallet => litewallet}/zh-Hans.lproj/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/zh-Hans.lproj/Localizable.strings (99%) rename {loafwallet/nl.lproj => litewallet/zh-Hant.lproj}/BIP39Words.plist (100%) rename {loafwallet/src/Strings => litewallet}/zh-Hant.lproj/Localizable.strings (99%) rename {loafwalletTests => litewalletTests}/APIManagerTests.swift (95%) rename {loafwalletTests => litewalletTests}/Class Tests/AmountTests.swift (93%) create mode 100644 litewalletTests/Class Tests/ApplicationControllerTests.swift rename {loafwalletTests => litewalletTests}/Class Tests/BuyWKWebVCTests.swift (94%) rename {loafwalletTests => litewalletTests}/Class Tests/TabBarViewControllerTests.swift (97%) rename {loafwalletTests => litewalletTests}/Class Tests/UnstoppableDomainViewModelTests.swift (94%) rename {loafwalletTests => litewalletTests}/Constants Tests/ConstantsTests.swift (87%) rename {loafwalletTests => litewalletTests}/File Tests/FileTests.swift (93%) rename {loafwalletTests => litewalletTests}/Info.plist (100%) rename {loafwalletTests => litewalletTests}/Language Selection Tests/LanguageSelectionTests.swift (97%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/BRAPIClientTests.swift (98%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/BRCoderTests.swift (51%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/BRReplicatedKVStoreTests.swift (99%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/DefaultFiatCurrencyTests.swift (96%) create mode 100644 litewalletTests/Legacy BRTests/NSDataExtensionTests.swift rename {loafwalletTests => litewalletTests}/Legacy BRTests/PaymentRequestTests.swift (98%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/PhraseTests.swift (97%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/SpendingLimitTests.swift (96%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/TouchIdEnabledTests.swift (97%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/WalletAuthenticationTests.swift (98%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/WalletCreationTests.swift (93%) rename {loafwalletTests => litewalletTests}/Legacy BRTests/WalletInfoTest.swift (76%) rename {loafwalletTests => litewalletTests}/Lock Screen Tests/LockScreenTests.swift (61%) rename {loafwalletTests => litewalletTests}/TestHelpers.swift (100%) rename {loafwalletTests => litewalletTests}/WalletManagerTests.swift (95%) delete mode 100644 loafwallet.xcodeproj/project.pbxproj delete mode 100644 loafwallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 loafwallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Litewallet-fin_white-65.png delete mode 100644 loafwallet/DataValidation.swift delete mode 100644 loafwallet/LFColorPalette.xcassets/Contents.json delete mode 100644 loafwallet/LocaleChangeView.swift delete mode 100644 loafwallet/LockScreenHeaderView.swift delete mode 100644 loafwallet/TransferAmountViewModel.swift delete mode 100644 loafwallet/pl.lproj/BIP39Words.plist delete mode 100644 loafwallet/pt.lproj/BIP39Words.plist delete mode 100644 loafwallet/ru.lproj/BIP39Words.plist delete mode 100644 loafwallet/src/Constants/ArticleIds.swift delete mode 100644 loafwallet/src/Constants/Functions.swift delete mode 100644 loafwallet/src/Constants/Strings.swift delete mode 100644 loafwallet/src/Environment.swift delete mode 100644 loafwallet/src/Models/KeyboardNotificationInfo.swift delete mode 100644 loafwallet/src/POSTBouncer.html delete mode 100644 loafwallet/src/Platform/BRAPIClient+Assets.swift delete mode 100644 loafwallet/src/Platform/BRBSPatch.swift delete mode 100755 loafwallet/src/Strings/da.lproj/Localizable.strings delete mode 100755 loafwallet/src/Strings/nl.lproj/Localizable.strings delete mode 100755 loafwallet/src/Strings/sv.lproj/Localizable.strings delete mode 100644 loafwallet/src/ViewControllers/PushNotificationsViewController.swift delete mode 100644 loafwallet/src/ViewControllers/WelcomeViewController.swift delete mode 100644 loafwallet/src/Views/SendViewCells/AddressCell.swift delete mode 100644 loafwallet/sv.lproj/BIP39Words.plist delete mode 100644 loafwallet/tr.lproj/BIP39Words.plist delete mode 100644 loafwallet/uk.lproj/BIP39Words.plist delete mode 100644 loafwallet/zh-Hant.lproj/BIP39Words.plist delete mode 100644 loafwalletTests/Legacy BRTests/NSDataExtensionTests.swift diff --git a/.gitignore b/.gitignore index 93ad6af30..cbe0c791a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ ## Litewallet related -loafwallet/partner-keys.plist -loafwallet/GoogleService-Info.plist +litewallet/partner-keys.plist +litewallet/GoogleService-Info.plist ## Build generated build/ @@ -40,5 +40,5 @@ BuildTools/.swiftpm # Sensitive Partner API Modules/litewallet-partner-api-ios litewallet-partner-api-ios - /partner-keys.plist +partner-keys.plist diff --git a/.swift-version b/.swift-version new file mode 100644 index 000000000..8012ebbba --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +4.2 \ No newline at end of file diff --git a/Modules/libbz2/Info.plist b/Modules/libbz2/Info.plist deleted file mode 100644 index 65fdef40a..000000000 --- a/Modules/libbz2/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSApplicationCategoryType - - NSPrincipalClass - - - diff --git a/Modules/libbz2/iphone.modulemap b/Modules/libbz2/iphone.modulemap deleted file mode 100644 index 0adf99e0d..000000000 --- a/Modules/libbz2/iphone.modulemap +++ /dev/null @@ -1,5 +0,0 @@ -module libbz2 [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/bzlib.h" - link "bz2" - export * -} diff --git a/Modules/libbz2/iphonesim.modulemap b/Modules/libbz2/iphonesim.modulemap deleted file mode 100644 index 77df699c5..000000000 --- a/Modules/libbz2/iphonesim.modulemap +++ /dev/null @@ -1,5 +0,0 @@ -module libbz2 [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/bzlib.h" - link "bz2" - export * -} diff --git a/Modules/loafwallet-core b/Modules/loafwallet-core index 1a15ac045..45105ddba 160000 --- a/Modules/loafwallet-core +++ b/Modules/loafwallet-core @@ -1 +1 @@ -Subproject commit 1a15ac045ab96330afbf59be99b7d6d2e8712542 +Subproject commit 45105ddbaad9dd1beca87136483d80b0c870e494 diff --git a/Modules/sqlite3/Info.plist b/Modules/sqlite3/Info.plist deleted file mode 100644 index 65fdef40a..000000000 --- a/Modules/sqlite3/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSApplicationCategoryType - - NSPrincipalClass - - - diff --git a/Modules/sqlite3/iphone.modulemap b/Modules/sqlite3/iphone.modulemap deleted file mode 100644 index e5292c132..000000000 --- a/Modules/sqlite3/iphone.modulemap +++ /dev/null @@ -1,5 +0,0 @@ -module sqlite3 [system] [extern_c] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h" - link "sqlite3" - export * -} diff --git a/Modules/sqlite3/iphonesim.modulemap b/Modules/sqlite3/iphonesim.modulemap deleted file mode 100644 index b4fa323c7..000000000 --- a/Modules/sqlite3/iphonesim.modulemap +++ /dev/null @@ -1,5 +0,0 @@ -module sqlite3 [system] [extern_c] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/sqlite3.h" - link "sqlite3" - export * -} diff --git a/loafwallet.xcodeproj/project.xcworkspace/xcshareddata/breadwallet.xcscmblueprint b/litewallet.xcodeproj/project.xcworkspace/xcshareddata/breadwallet.xcscmblueprint similarity index 100% rename from loafwallet.xcodeproj/project.xcworkspace/xcshareddata/breadwallet.xcscmblueprint rename to litewallet.xcodeproj/project.xcworkspace/xcshareddata/breadwallet.xcscmblueprint diff --git a/loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist b/litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist similarity index 100% rename from loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist rename to litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/419C3555-E6FE-4B02-99FB-D144CEECF5EB.plist diff --git a/loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist b/litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist similarity index 100% rename from loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist rename to litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/5A9ACF7E-C65D-4B2E-8AC5-583AF4150D99.plist diff --git a/loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/89EB5553-73DB-40A4-831A-A7FB476230EB.plist b/litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/89EB5553-73DB-40A4-831A-A7FB476230EB.plist similarity index 100% rename from loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/89EB5553-73DB-40A4-831A-A7FB476230EB.plist rename to litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/89EB5553-73DB-40A4-831A-A7FB476230EB.plist diff --git a/loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/Info.plist b/litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/Info.plist similarity index 100% rename from loafwallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/Info.plist rename to litewallet.xcodeproj/xcshareddata/xcbaselines/2465873523A5AAD000A32E9E.xcbaseline/Info.plist diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/BRCore.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/BRCore.xcscheme new file mode 100644 index 000000000..80e0d3a68 --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/BRCore.xcscheme @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/loafwallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme similarity index 84% rename from loafwallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme rename to litewallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme index a4404995b..f4d35590b 100644 --- a/loafwallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/Testnet.xcscheme @@ -16,8 +16,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -32,8 +32,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -42,9 +42,9 @@ + BuildableName = "litewalletTests.xctest" + BlueprintName = "litewalletTests" + ReferencedContainer = "container:litewallet.xcodeproj"> + ReferencedContainer = "container:litewallet.xcodeproj"> + ReferencedContainer = "container:litewallet.xcodeproj"> + ReferencedContainer = "container:litewallet.xcodeproj"> + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -105,8 +105,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -122,8 +122,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/TodayExtension.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/TodayExtension.xcscheme new file mode 100644 index 000000000..85ad4299b --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/TodayExtension.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/litewalle-indo.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/litewalle-indo.xcscheme new file mode 100644 index 000000000..3933f2be9 --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/litewalle-indo.xcscheme @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/litewallet-french.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/litewallet-french.xcscheme new file mode 100644 index 000000000..80e271a15 --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/litewallet-french.xcscheme @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/loafwallet.xcodeproj/xcshareddata/xcschemes/loafwallet.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/litewallet.xcscheme similarity index 80% rename from loafwallet.xcodeproj/xcshareddata/xcschemes/loafwallet.xcscheme rename to litewallet.xcodeproj/xcshareddata/xcschemes/litewallet.xcscheme index d00599e44..4a857a40e 100644 --- a/loafwallet.xcodeproj/xcshareddata/xcschemes/loafwallet.xcscheme +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/litewallet.xcscheme @@ -1,7 +1,7 @@ + LastUpgradeVersion = "1500" + version = "1.7"> @@ -16,8 +16,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -42,8 +42,8 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -54,9 +54,9 @@ + BuildableName = "litewalletTests.xctest" + BlueprintName = "litewalletTests" + ReferencedContainer = "container:litewallet.xcodeproj"> @@ -65,6 +65,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "en" + region = "US" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -77,10 +79,14 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "75A2A78F1DA5934300A983D8" BuildableName = "Litewallet.app" - BlueprintName = "loafwallet" - ReferencedContainer = "container:loafwallet.xcodeproj"> + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> + + + BlueprintName = "litewallet" + ReferencedContainer = "container:litewallet.xcodeproj"> diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/nettle.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/nettle.xcscheme new file mode 100644 index 000000000..da474d9cb --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/nettle.xcscheme @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/submodules.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/submodules.xcscheme new file mode 100644 index 000000000..8e9760c26 --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/submodules.xcscheme @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/litewallet.xcodeproj/xcshareddata/xcschemes/unbound.xcscheme b/litewallet.xcodeproj/xcshareddata/xcschemes/unbound.xcscheme new file mode 100644 index 000000000..fd4af8d38 --- /dev/null +++ b/litewallet.xcodeproj/xcshareddata/xcschemes/unbound.xcscheme @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/loafwallet/AddressFieldView.swift b/litewallet/AddressFieldView.swift similarity index 84% rename from loafwallet/AddressFieldView.swift rename to litewallet/AddressFieldView.swift index 1568e6a10..76c956edf 100644 --- a/loafwallet/AddressFieldView.swift +++ b/litewallet/AddressFieldView.swift @@ -1,13 +1,24 @@ import Foundation import SwiftUI +enum LWTextFieldType { + case genericType + case email +} + struct AddressFieldView: UIViewRepresentable { + @Binding var text: String + private var placeholder: String - @Binding var text: String + var fieldType: LWTextFieldType - init(_ placeholder: String, text: Binding) { + init(placeholder: String, + text: Binding, + fieldType: LWTextFieldType = .genericType) + { self.placeholder = placeholder + self.fieldType = fieldType _text = text } @@ -26,7 +37,9 @@ struct AddressFieldView: UIViewRepresentable { } func updateUIView(_ uiView: UITextField, context _: Context) { - uiView.text = text + DispatchQueue.main.async { + uiView.text = text + } } func makeCoordinator() -> Coordinator { diff --git a/loafwallet/AlertFailureView.swift b/litewallet/AlertFailureView.swift similarity index 96% rename from loafwallet/AlertFailureView.swift rename to litewallet/AlertFailureView.swift index 9910e0b69..6e55c10cf 100644 --- a/loafwallet/AlertFailureView.swift +++ b/litewallet/AlertFailureView.swift @@ -46,5 +46,6 @@ struct AlertFailureView_Previews: PreviewProvider { static var previews: some View { AlertFailureView(alertFailureType: alert, errorMessage: errorMessage) + .environment(\.locale, .init(identifier: "en")) } } diff --git a/litewallet/ArticleIds.swift b/litewallet/ArticleIds.swift new file mode 100644 index 000000000..1f4406487 --- /dev/null +++ b/litewallet/ArticleIds.swift @@ -0,0 +1,4 @@ +import Foundation +enum ArticleIds { + static let nothing = "nothing" +} diff --git a/loafwallet/Assets.xcassets/Back.imageset/Back.pdf b/litewallet/Assets.xcassets/Back.imageset/Back.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Back.imageset/Back.pdf rename to litewallet/Assets.xcassets/Back.imageset/Back.pdf diff --git a/loafwallet/Assets.xcassets/Back.imageset/Contents.json b/litewallet/Assets.xcassets/Back.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Back.imageset/Contents.json rename to litewallet/Assets.xcassets/Back.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/Contents.json b/litewallet/Assets.xcassets/Branding/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/Contents.json rename to litewallet/Assets.xcassets/Branding/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/Logo.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/Logo.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/Logo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/Logo.imageset/Logo_ltcnew.png b/litewallet/Assets.xcassets/Branding/Logo.imageset/Logo_ltcnew.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/Logo.imageset/Logo_ltcnew.png rename to litewallet/Assets.xcassets/Branding/Logo.imageset/Logo_ltcnew.png diff --git a/loafwallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Logo_ltcnew.png b/litewallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Logo_ltcnew.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Logo_ltcnew.png rename to litewallet/Assets.xcassets/Branding/Logo_ltcnew.imageset/Logo_ltcnew.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet-fin_white_icon711.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet-fin_white_icon711.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet-fin_white_icon711.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet-fin_white_icon711.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon_355.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon_355.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon_355.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logo-white.imageset/Litewallet_white_icon_355.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-100.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-100.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-100.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-100.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-200.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-200.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-200.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-200.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-300.png b/litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-300.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-300.png rename to litewallet/Assets.xcassets/Branding/NewLogo/new-logotype-white.imageset/litewallet-logotype_white-300.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Litewallet-fin_icon.png b/litewallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Litewallet-fin_icon.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Litewallet-fin_icon.png rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogo-clear.imageset/Litewallet-fin_icon.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Litewallet-fin_icon200.png b/litewallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Litewallet-fin_icon200.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Litewallet-fin_icon200.png rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogo-white-background.imageset/Litewallet-fin_icon200.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Litewallet-fin_color.png b/litewallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Litewallet-fin_color.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Litewallet-fin_color.png rename to litewallet/Assets.xcassets/Branding/NewLogo/newLogotype-clear-background.imageset/Litewallet-fin_color.png diff --git a/loafwallet/Assets.xcassets/Branding/coinBlueWhite.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/coinBlueWhite.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/coinBlueWhite.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/coinBlueWhite.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/coinBlueWhite.imageset/coinBlueWhite.png b/litewallet/Assets.xcassets/Branding/coinBlueWhite.imageset/coinBlueWhite.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/coinBlueWhite.imageset/coinBlueWhite.png rename to litewallet/Assets.xcassets/Branding/coinBlueWhite.imageset/coinBlueWhite.png diff --git a/loafwallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/litewalletLaunchLogo.png b/litewallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/litewalletLaunchLogo.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/litewalletLaunchLogo.png rename to litewallet/Assets.xcassets/Branding/launchLiteWalletImage.imageset/litewalletLaunchLogo.png diff --git a/loafwallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/lfLaunchLogo.png b/litewallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/lfLaunchLogo.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/lfLaunchLogo.png rename to litewallet/Assets.xcassets/Branding/litecoinFoundationLogo.imageset/lfLaunchLogo.png diff --git a/loafwallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/litecoin_cutout24x24.png b/litewallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/litecoin_cutout24x24.png similarity index 100% rename from loafwallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/litecoin_cutout24x24.png rename to litewallet/Assets.xcassets/Branding/litecoin_cutout24.imageset/litecoin_cutout24x24.png diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json b/litewallet/Assets.xcassets/Branding/lofigirl.imageset/Contents.json similarity index 80% rename from loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json rename to litewallet/Assets.xcassets/Branding/lofigirl.imageset/Contents.json index bd7cc85ab..2d4119bf2 100644 --- a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Contents.json +++ b/litewallet/Assets.xcassets/Branding/lofigirl.imageset/Contents.json @@ -9,7 +9,7 @@ "scale" : "2x" }, { - "filename" : "Litewallet-fin_white-65.png", + "filename" : "Screenshot 2023-12-12 at 12.16.04 PM.png", "idiom" : "universal", "scale" : "3x" } diff --git "a/litewallet/Assets.xcassets/Branding/lofigirl.imageset/Screenshot 2023-12-12 at 12.16.04\342\200\257PM.png" "b/litewallet/Assets.xcassets/Branding/lofigirl.imageset/Screenshot 2023-12-12 at 12.16.04\342\200\257PM.png" new file mode 100644 index 0000000000000000000000000000000000000000..31d20b09e9644880db986f9b1bd72dd8fa5b942a GIT binary patch literal 144386 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⁡#AtK zw4Q#|>z96e}C$Ko6D^g;O40 zrEe@5Q*DeS*CVh>-O zMTwwAm`l+PEYWC8sbYEn+++8qP!dDMGl+2}uTI*pAAFo6DztO2GQ^)pfO`zOBPfg2 zD;_BP;lqC*8E#_?qt@V($RWPMH-8p|XI*GYxPl?Lh0+PS_7cJq-?YMxpc7_FQUcr& z$U3(2dw$8$Q5v+Eg9hm>nub4*9T}UchTLQd^$rLLI`D^}SKdU$pQc9zr;4f&t7Kum zAYAV@qH3tdr2&yMFZ*I0gvfI4vynmQICds4>K>n{`;_ss>?4An(wilm;eI1bOC4NWQVM-hTAM zKVWD6`)%8$&C(+@;hWl=(klTys>RNaBbS>uHnZd2qhvg?e*w7RGk99z<2h&V+`ZF& zczZeLo^5Vypinr8!BuC(J)-mA{;fZ|f4hC~(S!E>g9rI?=`4N<6A$GSq!m4x2saB_ zRcMbw#k4hx6<~p7*o!0K@tJB&)a!Imo-tpz%bpgOzAvp}QGnn4F3$#K+2d@qeL989 z@WCcW4@qZ7MVibks5~|du8WwLt|5yA`4UdKXl-fc+ogkf`zCx3e{~nK8zEjL#HQOp z7i>Mg_s*-{d)w7I;3A>x+$6^#MimN9EEf~&rNp8o_D1dT$|nJJ5peM5L7vOY5YBs! zbLZ7gLm!C^p(zJZaMivw!|%bPog8&9x!Thhe?UDX>(BZdUr$leNuOdVXr93GpIj|f zup+W|QzDCyvrbTS3ykHG4?EnHa>%giVgm8<)BM6YHbG2E>wJ6t{DkGdFZSDC{mJ)O z+S=N$KYEm7u>~?e$GT(~++2Lm{*R!~2dCKYVdK5Qu^Z-_PubEFwO8V|*!|AAjN;JW zb0vHH}DUca`U$K6{H0;gsH83=tPApIW zfBy729S%lq@4U-Ku)X#v--JmWN@Y!yrll^Dsd=X$g=pUxCTv~G0UxCiL1U0lnVloC z)M3qvih!mL;IZ%AyWf8O!3Wu??nuH3d)+E4uipL6ci6@LX-qWklJ{IKS7X_~oY`lE z9`Ki-lcz2J@V$5GY~4pm(Rn&}OuK<*o`*siTrH_vq9)E6<&4-^yZHy-Y2UwptNrZP zAGY6o`j`!;eAa;;yqd$h*Lh8Ohxhmm{Nbk1Gt9lG(8l>Tj}W?nz@FtpW_!%995OOl z++^;MG95sexf{3I{4%E>u-fV~R@2>HWxo}?$_RPYT+?>zUIyP z&{>E1LL>C{I1g7rt)uWPox+YBsAM9`UsR^%X46dCXd;d2Qg2+zz`7PU@21yDzmD;M zLj2$KBK}D~F1&4Z;4^aVbEqO9e~GhC7Rt8ft9V6sQn0iW-u?4A+Z2X|CyNyA9pCay zcvke$a*Th$kx}vkmU)bw(WC)+n<_3yR5_|Vl}6d5Z_zKAkxm&NjozIm0)PI<-K+>G1B$QGvkGBwkI*a~|YZY*!Kw=f;9!BvZtX)XeTe2H$B4m;C;$RkWp zNG4p!#=F*8`MQomy-i(vKp;)|U;UWf%hH5$Mp;T<@TuM+d4+MLMLkLz-9VPBf#RD{ z7y|s54#qO3my?qhj9_oK@4ff^_S=ttoL*3lUWYb2d@H9bcll1t?Rcc8ByIEnk1+Uj zj`(E*o~A|8d6=D1C&Xd&Bk!3%LSBCK^z6U>Pd{d|cq^u_F*x$^lgB^&;g8yHA3TJY zce6py(MtG(63N@Y|IRz@&%giu_V!H|i_pp8^Udc7b9vYg(N+HP3s2RW!&@$9$FprR zg7^=A_NVRcy~ph*zj!}$CmjdVLixbbPtwZ@5uAG9oO5&|+Bu5og#9e%jM_IS-)&A? z*r$w7A3tuV95-}!_cpO+lpa*j-j!6)%&Uv`zg6^!TFCbd)Q;Uxo9N z2QS#Cwu%C^9cpFhplt`@VHxXDDwONB+24x;D!fMav^?74Y}ejBB6s1ZW0)E-P0w*E z(kmW|*D8%d)?ezBG-avb&R?0QCF2CXk9|tO7Jiiznl0H5c`ON->XoNR%c_^li2~nx zu|rDRph!wNp+`~hKFO09y!TQ^Ru1@?XO)G#wGgDPS?(+x5{>v|xv)!4`Y=JH*ttBW zyeAQ+p5`ssB7)eJUSYKCHR1SnPLF;2&IWTTFIdL7kFaOyD~X^7Pzl5@vEn(95$TWrHViidg8B;$AZ<{I8S21mGoSJv~vy_jpC!Z))?)EaL zT^L57{LD902L@6PLBe+s<~YWMGTvuN=mtt~gd&;G$ZY620MZ5m3km=yD-;;*+K#H6 zh)*Cj*L!LespC?mir@HBa02ggF!U^VXZY}|I;?$B=O?oaJKILeAj@%b2AY76=>zoRB zKKlIg_P_q`{~J8NkD@YH4o79z_ul>t^C8RafBYZ*s(t_78Y2{x1N|=NeMV>*L_sRD z<|PDcIR+OnYHMl;d@~Eh>ZdOIznA>X{? zCsK|z5}Ql<(8L!n_v-2LS@zt)30m7m+!dcN2&p2;bFLR_Y6z+bQ&%ifPUutxi-H(H zyY|VW$L;?8wu5=M6zmd>~o#H3sbY}(F<4$i?SRp!b z#`j{v9zWFfMXJyMBy*y2A$#8WBdp9^Ln)~+D=u-N^c<^e?En3LyuE3Vrq^}fcYB%X zo}PUMGlPAwkOaV;6nBcUWLXNO#Bw4hR!VW=NUm7rDp#daE?4rwsd7FkRVl?;KB!W5 z97nQciIQVUrdCswLJ|Z(Vj&3-#E!u-1I)hmHq+gc-|v5(`}RA7nZbYra=YL6eV)6V zd(OG%o_p@T1045qcgQwQE#82lafnY^Mlft>0SbrtkeZSePBk)vP$W+gk|>e7lIsM& zG2D=Ar5uN*xF}94U&~b`vg!eF@GmRV;Io2mB`{vi;es;?RI6qrWdqQWMKinyJK|kH zk+@RNw)ZgSX`QF5qj)>ysq)W07t_dSoE%!CEV3F8zr-O$DkC^Lp>9R!Ly{VF=3SMt z$|$`X(#FWKk!1b`u&MN2S(+wFlWfh|WsqwcQ}P4j$R3u?#T}Cnf6wjrw41T|UwZX< zuGgJoNi+u_0wZVOfuDR|#ZsQ2oQuLF=bbR<5t_Qzc(k(c`Yfv#r`wNx`iI&Bk3HUA z;UtPEbdix4$v&}7F>+RJeZ#K$ipP?5i1J!RNxS6#Ms5#0!$}1T^vGtwbwN5Q`8#qvMlk+N+QQeO-%A)vEn67*NfKM6$&RK0@u7^>ul%MrMol_)RQ!FOG%T?pS zyZ;KHLC_qshj_y1^}DC@R~|*t!t*FH%3%z&QLgR=wmU2onwL>}z_S6f$FeR4%kh@*&}}PTi)G9w8q7*f^{+ zYK+cH9>rOgUF4U9NLjf8S8p=4;({LmR>Tbqx9p)IxoP|63~x;{dF#MO@(=t{Ho~z; z(u7Eu{~>VrH9LUz%F**LEc&-luHgt)j7%GzTn1m*sibC(GdPIwZ6oX)PZ|))#*=I> zY6QSw%R=iq79Yi)l|m-PQ7j|ZE0*~<0c_A_8j~Yf`L3q&5K8Zt@nmCZ^+eirr5@z* zhXR7_nK+p(_grRc1w?p~mrHCr-pYV!bbcF>uDrAYqbM~rStgQnnc z6mob(T4mJ3@T|PY55L+@?3!&q`?G%?n5*snzu-t0Cd1vlxx#Y$G(eVL%Gi28mh4*Q!XG=hiWIq!OCOrnqV9m*38 z5pt?_=kX0+@@9Gi0=Phl)w;^d zIg$-LpQd|zh$A)5BHU{#Cj{N04dHB}(V5AhJQfuMdAx`UZS$Tv_Oe{a4&iyy+fwSX z@o->n8Z>YkS*VGz{*}#`z_LLc3EqgQmkR89sw+G}l<6m!i7q8vE%ka#S;~pF_DtBQ zxD69y+D6ur@r$%2;6vs^Lf@=2i8lDXy*~w6fiiz-KsKot;HzL_5ahG~-W_J#D5?st z<;o5%=LuMohx}CIpF=2Bx(d3=6=X+a>^x_wp?vaVM!-|}-Nd<(E0eWIXKfJhGfd(2 zG4G`J7q2uRyrnT1854vkW93YYNJe8?!2yCxr~q+(cen;9BhKH&L6`jm_eY4cqna8| z!gn}pCqt|D9J0B!Qji^gz*h9^d4KPzXWA3bJ=gAd_nqx;{Pn*I?^fGG_kR_Bt#LzX z85lJfr@F+Ezr4tE*Gza9p5m&30k467@7;G0f3iLG>gxoQ^(Tm{xhpShq7ejGdPNM| z!K}80dOAao>eRxy+(7F2brUEq_jF+{MJURRjY)Avz917aMTfWV`IHae%C*YfvMnAP-SV=yO-qVV?5jNpQwX{~993_Z zep`l)m}E{Bz4HA!z{GV3!4o0W_)|{Z_p-w3R>zAS?zg@oK%w2bDox^&UKx;t7Y>9E zJX`aRaFddEYj|OmT_3Lp_J|YL(4RZE)LuIJdOLR! zYlK?s?t)c@9ITYI7BpHeDdsFI8kUV--r?{9gT4lHfJ%gGj&rv*uqtK=p+AoTndS6i z4>oiup39RZO-9;is*Y3~RzV9~A&U}n5I?b`v6v*G{h7d#bBM(;9ak0wPeX<@;i#`5 zD2}H0*Fv%J+y&ipOpLk{9uy;Z7QS&zTfaOc?`o7NrwD#wHAEb6wcy_127y77kAk#o z-q@%TE`Bh>`&>N1SEcFgX`zjV+aZxPCICHsz(!*cA$KEOi07~K<^J}h(I>)faS(mXcu}FaiWtQdUi!5JtKZUB*)l!)k zK~`W>@dv760FbYB$l(#u$=(&-9j4+tmBC>hX~|Aq0f+}scq&*lWEm>Zgh&32V%pd* zz@a%oPTf)qJ>ayRUbOo)G@=}qa|mlFz2paY@(2iMhkrc3@Zy2?KmPJRZlC+)54B(X zn?K(ke)z%m{8LZTGex!o*RlZ*;&#~-3k6nCss_=rY>eb-0b8h3AAR3@vMKi|HiAaN z39C3E0xC#Dh`$0z@_g%2XbRsWiy^xN53dWOx%j_SG6&J!oJgqM&5%Q=XN z7Xs+ewM&ydRa_Uv7e?gunqR&7?2*>xSw+Zb2Xm*Jwlg$HWwB00CWw@toAk;vKFY67 zda9>s-Ib@ku_Zig5nrCuIGe^eL)-`$&q5K<;DkT++Pz1=B{QSfOCFr_(WP8`7=zU@ z)4R)1+Mmb*l$ta+gC}tED!*ltJp$_AI{xT1>YNqA;o(KfN@3o~jgT4XA&J!LMqu-t z4Di$!M;gnohKzYlRy}VGLZwl81U~>;{uit}{s(Z+rNHGI*fuQvxlX$f5BKtM;s=f4 z^sy5sGijFVU{^P=D|Zu#Y%a(E%Xb3z9K=t>iS3xhsMwkjHxl~Rb+h~=8Z@{&entMjTIs7K@ayl(5%hml2Z*(Bb zzXnBQinujYVWk2VU+L2D4NB^^b&uzP>&dCtPpR*9Sl$J< zXuS}MoLeWX`?y5#2M&ZZ!`7j8IGq%EYnk^Lc_Ll(2>_x|g#80Bq@b*qp?Qj?XsI(V zY6MdzIl04W1U7eTe7XGE!(3?r)-qvH^vnnG0G|m{NQ0A zG(XbKgLTmPZSP2moZ%Pa960t^Y|Q<5aA|so>SpkqVJk`X>^1DcfbyGm#f_V{T;9uU zM-Z}0ZieYvQc18Ild+1#O>bVZV!<3eaUw%pQ#1hXpxl50qAJHimOv5o#MO%|tBmm2 z%s6X}OiyvV^#&Ce@w8$M@4KF*+lp&tzvv0YgiWxbDzOQSp7IUm8W-NzhmwLfBiDte z|BeE9xKuy_S%O1%aar&kSp7=dMsT@-p%NC^K?ckgM+=-Ni3KPym#pxpJjIU!SCTGs zw)ieMNIcVAAx`%!ky!_j!j%EKC{wS+wa0~(37%^XbI^<2!bu3**tve&?d+ep?bdb! zpKUjB5(0v}%Fb)HiqlAFy=&2XL=H+eG%;s}7#xtH_Is4p)HTGT*hW z%!_T_-9E5yZ+rLq-rv6V*!SAQ4}3El{HzFKX*tMJ-#1~+IC<{8h;;S22Q9&>;8jIJ zBMrBfmX+MOJ1YqiA;82HPAVXc&2~59@^|XY=?rsOX>DXYcgeBp8+PufgG{l)ovD%W zT4$Y&vU1!h5q>scW-4dm4~N-%b*}yL|NN`%^FR5c?ZJWzS+s^U5%h>`&43Rfk3jGoFdjzB+6&o9F)B=1I15?#-indnF>@0{~=UTiaS zo69_}GQ90jv%|_~rk7Ya!JRymv2rXA(xW8Z$Pz7RZ~0rkj~swiP#(uJw{0_ZonEr# zNu1u8C>uVj*mPBAi-+Rnhws6^Xp1}f-96n~}yRP_{$Kh*8(-juwEiqCk&liu0|gcVvekS7Q>(vap9BbJgA>oF|n<&e<{?XCde^ zlu?gR%|8Vqt}2>Q4+R11?$QRN`>y|X#)~C@a@R}l&Y(Z20#l(nuj29ZuK%B=wYEk$ zS)T&vh^>RX}l!Ufy_ zA6`S7H(RDCX;hR2Y=w3nMP&nIVcAHm(D+}Vye4RH-~Evfv?E{obCeiocG=)a1kOE8 zHVT^&0`K2;n9SPW!^3~#DQ3z=xB)VjuLz}=1Ok(Gr9?80fIP0H=j_E;HYnB^B|zoi zAgwE$%-7*M_Xz3Ck7!qMskY&CdQ!x7tT}U0B-%u8@8A6Xmw`Xie&%QYM*G6Q{FiMX zJ;IG3?;wUKS>gN@{c#t(@KAczi0{=A4$1wcPkglf#Wx-A-G)mS5vWiSLg7wd&hZY9u(Usmo(qkQ#! zsI#e$yjQ)o!7v4Y)HBy`h7MKc8nLb&RC8R&hrq;rB%MBAJAY%0JIlW`M5P>oB$ArW zb%nGi(PvZ4F*`ZG#$86zZ5hdzT-#wILm8@bQL*%FYY&Ne$r4m~GC)(47PxwnHa&IH zMHZMVj0*|&<}u=l=c~O7%r??hoah;Fv%a~7!|9IbRhjEQ_$gEA0Rcl?o#&iB528*m zd))LSp$wg=fcN%HvS@v*FRhmMq7qm>CLcg3TFS@B8W*t`3)&N65yuXt$(`X{2RYBy3&sEUfScsA-Jr@lWnt&r75}E!V(zg+zI!mLl0-qY>mopx`LeG@)Vel$tV^0u-f*(IPpA|Bb zsvgA-O89Z?G~;UErJ^jMA`viFm*nJz_Jx1*hi%~u@Uebpre--ofE7MOo}|*)B3YR( z*eLrXeP(LDMXH&?Gcx1XBk(7)@fPO5vvit_3gd`g{PBtR1I$CHq{36n7T6jlyBX%& z#^Mo$KFeiIPa*kNPDqzKX)atv%s+}esA|c}lkFR~w%_^Jf5=erw)QuF@o%?Z`)B_r zLrIOD><%X(L&}jx$pAXPW(6E8Xf?G0WnloG8zyJl2k*PLedXbAC*1t6 zTCxw1BBO=8^5N5XzLEVA*}TO39N;+C@jh&=EHm(RgPG;NJcK06+jqL_t)` zGFR-Tu_8Z*KW8@BHZZr%vt{Oxnj6?XQQDCzY16IP%c3pGS%GHadUjWA0h3-ZH`3f^BKlYa?{ zvq6@RP?@l#pf@_?;u1)htLr#b;qor9E4m6u18Cv$Y9W^!8eLv&Vs$ybg2L0ulI(-Ue} zmpRH~=^Pe{3dK@UaY7UEj4M4_LJDu*`6XI}TzEdagiqyE@R5Vz+^&E9#V@z7Kk`Id zwCEj9f#_{Ea5#r@Ja)uYgXdQ^w516e9hhMr^229K(U<6KVCb(=P)bRVs@~#%fD&$_ zVVOyr%iD_<>_2$s0t$zA#Mj=671jTgSpZz?tI8t@h(<2_m6JC%@^cJz{gYq&SMA1I zZ*2eZfBJLncfRmjxqOZj=qUy3M5hT48%Z7cr>;V zGBw3eM!i(6e;S&>2QZfA2reMpfARa;Fv&;W&n9Se$RgFo_ ze+teG!p_;IpR`2eOsFs}?r?#Z`#6by`>nUMM;?2EMuQvV$uPIz#k#!6`8=B$RyY$2 z6e*zcQ?1%fiW#7kRlwk4ijFeWH5x=L-FIdxn~l0%cu*ImXr!EjRVYPlnnU1 zDO55}K*>vh<;s#F&d|E++Y2`_#{46!mY5D4vUC=pGVUU+ufUxbaD3mJ9=FWQwfpY8 zyB$CFdRt|(IUHB6LQu~K!Ju$#fW+}q^iV2BPo4u$cvkkr#b5KTLiJtVX=Q^0{woyn z6o+KaF?4nJhdQ;Tc^lX*_|+c+!0^4e&rY{{Mk;q6c{4CFsv0F%4I%_JkZ z$T#uNu%wv;K^wb^9EZb6&-B2(sH(=t&EN-dN@d|9Kc|^bnuYeIiyPao{BQrH{V%`r zKeV6vnSa0i*02A1yMy^8d$QtfT+?0d(tFm>f(II8D)%+!wC>%1b34r0Vn;dZC=XDP&40BV2wVc@D7Wmrdyh=93{`+%^lS8FCi_jka zIp&^racJl)R&Osqxl?suJ+F>)0!VMTPB`*F*wGjGY51tPGY>}ub%FAc`rm((dH~R$ zukxF$WZ97Cc)7uRt7nFdgzrI4>HGi%d7vyS*Oj2%i`X!a)|(IFJ{i>>UvYQyGtNV7eE~#zZDK zYURli(MRh4)K~bdQ4l<#i)UTNL?q3Y$7N~`TWA4ppy%O*QS$&3>17(7Wh_fk*Bab` zmGQ(g&$iu+*V}+79G>3=d|F%@7sq8?eo7arHuaccF;RH=04IM^!c)G1WB#jJlO(Z4 zt$PoskU@T|NMTNQVJz@11pj3G^|-{hw1?=X6_+lIV!e%f=-+$qz3tfRTiO%fegr%U z*W_8HNvr}8YcsvBtLJWI*G1V%Uu79SdMvr{a}eOn=C?lq)D#4a+^%RZCg(YsZJa;k&3);I-NEAH2 zIt!AHFU1c3Xy*WNd1DmdD5ed#xAIN3$G`hR`_13}!}dJqVQu7mDR;)Jdd*v*J;%~w zovXvlPl3(_W%6=pfVIZ*M?QuRY$ESaPmgHg#?A*p`F1q65 z)K%(&c`2l~`et3Bg1f+k-kDe5{-a<1mG-~?PyeX>m7n;_?ScRI>+QDf+rfoX6;jAz z$0stQWUV{pjiR?iqF7u+@ZP&_WjFoF+yh8;lUWXFY>vBAA<*T`s6&duR(Wte zet-Xde*+OJ|OcT#JbxIHWhOw%8( z@T*k5Q5Gtnq)XnsCy$iY6`)+*tMILGKn4E+^{Ust3<#Uwc8+Vhk%bCp7ztW9$KkyA zIsdUr{jnjj_9ebXM+XE2&I39GMFvAHGa_mEqlq9a8Kty+nskZ+qMXNaQHHK!pjQ#C zGPb}7kS6u=IeL(BcavPMsOW?!5X1Lfx<*r z!X4*oVUIB<=Rrsa0}r#RB301EB`T53giWtyW^fuwVk)##__e)OSJ21!z%w)=tT(8p&|27@94XK&IInv-(k7Yi};xB*Y=MFGd4KylkdEOT}53MU<$J+<6^ z_xFCUJ@oMR+KJQi1ZnMP6gWsI1McD~L+duuke!cyJzx#LE3r{^4i+qkkmoA4%ExSxanP@cp1>eC@++FD;T}+?1TlehX z*cZ;uJ9H$&31-!0o9I_`UFP9nc=N_cmnL+@&Kk-|{02RfB%@dZ8?Kh$8{uE(L;9rU zSNxTKEnb~@NVBq4GN&&-$Zj<##wbjB*$Jb&lqv7=a%d3dgun3sBK$6=e?66t`IVEO zri;~$m(j#0IOLbd${-1>)0etSJv8)m9lp=0iFk;Puxbe|0Ze{42kogL(_1loRQ6ba zD^zGNDpZL}PtL{*;p;V8V>Sz7%r9ZR9uLZZw9-{QJu=P63pzPHiOz2+Eh9`F?GdoOX(ztzlXbK?+gWy`lzk}A4ie;tZm4yD{Yx*#mSw)};f$k2x@t1fO5Lq68De)@AyBaxrXauv!kpm^k2RXH9aaAX=rnl@gdSLwxvur7p&aFwqJ-~h^;ByyAve<#1r zvW)X94}2Y^#8K?@0u2YFVC-DSkW93aznCgCy>hDzRoAdw@FS%l-KkoXg11lZz2oNg z{tthkedN=hXgA(|XPel4GpnNZw2KTMx>Q$HFKjuAXi(UL;uisetYBK8#xhRzPN-<^ zby#Fy$T?4nUSOz;GNXYhWO@}72u^YcDk%JhzCyajv7Hs*#z2JXYxh6g{@@S3+z!5W zobq%{Izw$_E+48ALh(?OZ3uN%^4JPQTH|4bg#xMgUAfX=tyqZwlw;e;Uj-{o!uB`L z2Qn%AtOyQ2S(&JiTs^#vAr&jDlkip>$$Gn8a3Vh&Gxw=nWT<%OmhBug`4{a&_uSKd z>aYHE`{)1k|884%GJj+*Ndn%)b(xoKO4vPj-_c%v{Y23&U*9DCn+LB$u;k^e4Y3!J zDc26ATo0aao=?RnIVgDmJY~dcQbs#6WNK-`la#J}B;2}^I!W^02n>+&lM9}Rr|#$m zNrhkEclc_ymqj=4NQrn5mQjMs;#}*s^GqJ9dwd`1k+Fp4)15kDfl-4gt|3@rkqkS9 zFvRKcgIwym@*JblIzQ$HP+Z#^R7v0rUC=K1N9y`aT zg+tc5g{PbWa3!Bm5q8_uZ#o7z(`@ zZ6PnQRPE*)_b{9_)sDH&U&|E%v}cmT-ee*f+KBL!iZ*KbLV+z>2~I5!2KHb@bml97 zMvY)&IavTQCCox;WReRQ#*rQMUX9R2tZNgPMtB`2(MGNpydH+9Pyi+@6ZSuqoN*n3 zuxGVEfixzNXDINjkRYYFO1Fw!$CLFV>9SdAP?Ew)6s-gPeV(POOVYNPJ45y}wDFNo zeze{9fqUBK-MiQ@!R>()+&{z6!1w?5)qQxPA6y<C`Ftz4*O)UL=md2+se^WjI^ zzx&by?ZpGHq`{qF71s*GUK$RHwLKBOuv+v9XM?i)lw4Quq_9}l;t4ASdBS@uqMwo< z4GQGSG6%8Rui(2Zv~2kBV#Tonj>?sMJ=xkT6QoeM%C(%*jpEho5Bx2sl_O=q1rMt% zLb3PwfBcItv|s(lzuZ3hv5&R`Pkk?EXA$kn4mvY`7nvJyBr+h|o*g^et^00hFTQ>> zN7AcMOGz8*=lgf!)62(;@!Wjq{-r2tXnA`bnE}!~WBp={vtBYDnY4ze7#~DXnd>gC zzg2>D2GtO52_wrYH2GiYc^E@oSOd5bIlgzg6PLWLQbJ8{JPDLgWfB<^mxS`$fl&@| zL)v<&tfN;1h>N@#mvq(Z_t)0}N%(9dCtV`p&9(|KZ&N|WyJFA8W0wX--7XO3rBy(UWO5%&%fF(_@fCg&`<+_aG_Wo{yNEA-< zz&n{5UszJqm2{4HA-+3db7l^4ws5HAhdy{;`_vDAs@?wX{cQq^+G8oK&=#C0*j`-Y znD+%%R51TA#l-SP?(LYw3YfxDaGZ-_n7;=3u-DSLQH zys9LFph!2k)>%IIMUhB^Fj?A57s?GyufF_xd+Fs@+i!f~i|yIxUqR`k3@AI-&1dli z<*Dmcpejn}t3j#Es?4QaCx;2QGKY7SMmRF5>ar08#3!=zW|RixWnV)YWJoN8 z>tEdUfJ@e{kfQev9&X@_U~~mA%)GKB~>1`}ytlM8u zhh`Zue2ZL|kTgnv!5d*pfQaxja#cr+k$MRaebNP%Y?fzy>>OmnIx%eA%AQCr_!J@5 zr!?TyWA|XW8Q$|21rc3O%;}d-EOL*P{Yd!F$KJJymY;Cl+uQWWNP8%T3sUTWZvnsKm5t|*&q2#yYa4D+B^f-iz0@rLJ=ox z>1Yp3kX}DT$hmG(m*x*#Z()y&=YB17FFJ^!^o0T55q8o6Lok-7qENk+!WkmLot$Vm zvI;F_RGBGn7v?!?gvBH?tT2P32z&4_;XB~OFZ>K_@P>vAwZahZnE$tb@TK;XpZi?< zk)QbS_O&m6nM<}fQG$llbHBX1#O2x!AZEo5)H;7Drpn|3LyG6QbnXmCrnq6%&1LhH zE4dI8o(*~Chxf}Js9fSK^UGcLGp;h=e2T~Ecyfm4^_kcA@5a)ach8JR7hGfkMioxV z+q}|C8>7Wx<8pABx>~&xWTh&9WTnWWBto#7L3yhD`p_AHq#y7Z@=TQjC(BC#R^dhl ziI+yN>ml9?^~y&^IZ}BiC@kM#v_#NYOq;W7*@GhOIgjzoxlkhj(h;GgV zKEND;&i(f41i~HunqkkDw7B^-i-#@~sOU`b5LZ5)8z^FGr7S_hBOZc zoMQ4|GdrL?mR?0*^D644jEm{0hrkjxAV8WJwqO*POLJWk=}3x-Gm}FIMq1wigH%Ss zWLkFxpEo6d|KY0#*RS~CY!I^R8$49T#n6i4cPb4q0-t;wu96`tG#kGHFN1{T;7vIj z6eqyMb%9~Ob5!gtOrC4eO9>z`_M(;_wiY_veWRYjGWMpK$}y9v9Bc3mz^FHZC;q z5q?BK{0J9z=2~pPVZt=SZHEsZYY#vAt@dYs_O3*2RbV$*Uwc<68%lA0GIJxFUj zlrt~*$*UM=lPf-=qn~+uL*p~gJ)eC}38;iACxVlI8qp!0dCt0xY$eC60+VJdeP!6PT;Kh*5JMshf%Sq$F3jN$PNUPX>?Kgg>{lowEziEGQ z{{!t9^AtN!+LISp5yq+7CzxzsVs+0sR`;l+TsoTL?S)8LIPPsNJCAT(fNu8!OfhVj zO_gtvxULVZ-dA&$tH;NjA9iZP?9`RZ>(SNHU+NDt1{|$#!m!@ki;K~NF&4c-S(V-> zPSz^I%OH`ioN#1~yj5QG2OdAEgO?_|{x_Kt#>gBq;3GPEcPP-HkvPpfp?JHnKx1*w z&YfH#UB~^LWF%or_B(-RR|q|Q|1}@^K?bUL&B5HQL-}hIVb9^Hqvl8E*46>5&^ZDV z%tSDelBU9pjSJ%Hm*V{_i+a@8ehMb_#uG!SU5*meFZ)2lL%{H_z^DSKwrG8WB|p4tbd}Wq<{0dX-WdY@T)9Pk#}Rk6PR^ zKDYqi3K1bAvO{X2x{{B+)0m9jE_(o|aCL#>JCvmOU6W0iYWgIbKKF1>w$tQQ4af?9 zR}Tk#z{SXpci(Ws&i08DJ&CWTB4eZceLy;|_)E;^CJMC)^ zJcQDJu^l;lJgF6Xpg0gW z(&xj2?0Em$H@?+A{bTe}zV;RFlt0=IJpOzRXWT+dKI1Zd;%f1-P#?N$UqX7iG^S~n z|yyq&*vS2TH&UoXczn3=>~hcjKQY~l)QlEoM4`37g? zUW11^ntBG%$gpwCO7els*XgTxr40LXmbV%40oH!_p>9z3ef1;X2 z03eU_=rydh;O&vPy!I6LM%lnv_TB>|UXkGex5zhu^mD>oHE+Y}Z)!0Gkojm(Rxhq_ zo)@)+JgbLhto#KAxbT}H`vEV13|9$>gYUjlntV!&dO>1%Oj@1a_JGuxF~5m6YFMam z>T5hgcK9ti8m9coALp9Vh!aOfNsIMv+G|>G*~`hn-12r|x$fYW47+8RLapZjiL~n?y)$U^veOxNc@M7Jp_20MqIQdh6v1 z-=;~XV_{atE?hOlR26hAN**oHtoj)W+D!dR&qjvgALzxS2!LVnXS^#%s55MHcHw+G zab_WxYppDDXd7@9#VGgzJ=cAIkj;nx(O>)NcI%z{+X_3}mzX$HoILs0o$q!wlHq`8 zSpwP&;9?7fgH5qasyj{s-@(;v6d?hkvKp6)kt zX|nYRrlgsFyUCN)uro@gkEdtBji|k)%)ps6q91wWHx3xqFl92U42hr)u^Jenvp&94 zu4E7BozN>~BoB<@pZHqkC?B2jzKOZao$M`g?(i4}))I3cYQ$N3_QJOj)pfbe%N4#l z3d*=V@}o1Idqs5dDz@ake;HH$+3bj*28q9wXC)B-Y8Zv1-qWD#K=~z_ye{2|&K~gY zc?d-qG9$k{I85#&eAfv!NZI}&4JPDk`aSQuBg0QBhD^i-5CzSzinM+~h-Zxk!E5X) z1|q6(7%R9U91#d!w7fTSzX^xd(^W_DVQs9i%4plx*{pCfzDKK+H~~-!aOQKlGj2J< z>QhIO2xDNRd8$}DUIW~trx)7Z z9eX)X3ne$qPuOF+z-Nvw@Mk{z@%H1N|I2MVORE>?)dfDdX%Rp)JrooJjI8sh3^fCk zr1UFEG(K5qQ2pM@7ua2BVl5EW1`2{CE%P7%i6GfEw|vgqm}~W9ZiKrrXb8Xiy{Frw zkA1g2^v!Rz*N<>OBtu%eckiYlA=~rk0OxQYB_pl^=Ho`wDsOSqOG|A_yZ1fsX)nI~ z5~m2zqai=>+emNj-gmvLy?*p)d+q3viXO&7r@x_*=)s?c6Tc$U+LoAlL z|LLc(h~brGnYv~Q_;UqUb>IpCSMlocJG*8m!$lF~Ouo+NlD(?{7EDuz_R(h(|3 z=OhixmF_e;;?}tmo{9%BW6=5(nDUc&Dbp%rd1@OnefzC9wd1cHPM~ENHkb&^>)80p z!gs)?(Ge#|GAF(H7{8i^_*qI+j7|EX*v`|1LnGzsZlfIoI(kJnc#62m`}Kdff54&Zxr4^a^=)j3$1;bj(wwzldPHz|k0Y z@7vCV8r7QBF$%?&?Q`vC{==VapJ3vB5^H(IrL!mC42HgyiyIpUATq8Rw~(h-+Nznzo$XLTOqec z`+@hrzpXs}o%Z^%qo5=VyY=9#&;q*~FE%DF%dQoD1(@g%-t);z#zLcd4w%n-=|uF~gG;TB*^d`_nJ}ar^uK-QREj?4SQDCfpY|qJF8} zweJ>|6PJqH#?J8_+)cBQxiyD0&tasTWtHB-S$0sLm~YdYwqW=%1O_aRp5MTH(L3$5 zMl)B1LcNl#UN!%)zLXk;5gt@}0t`zL>8}z(dgW8f%(`_c)b1bO%fc>=dG$BzjWP%8 zB1g_$s3Yo+bcCnJYlHzsp>5|3xNUwoX6g(JK3;m|Q1G>3*~;c)ab5I=Oxzh7d>en^ zWRxVn;}S7=3_s?r?CPuoHbTbsd(^YY+m(qntq{b$!x2`=ex8cg!()Q@vU&)yr}tfF z{_4)u^PwyZ5>H)y3!W!okkCi@C?7KAkKUhNX7~3T8|Ti;Tp?MD8RDu%Y|G#TOo^JV5OkI6~El2p&?1!vWjbQfC{~P4Z=&cy4%yKq??Wt!EwE44(8G78vFl6QJ5=Z$^<+}}KW?4+SbeUn5bcH2Y-uQ=dF}pZ^6+Y>m zXRpkuQ>QCTyr@vF{(Am}1Ki}u&iTunu!JosfleBEpYkxhaCN}w*|}6vx?(sGCyhqM zN<15A8>EXlp1K-bc@_x7ehTZ|BO4uQY3hIN#@j7KiiH z4U}@C`)!$0`hl%n`y9io*V{y`__k{6heQU%HNV8rTBcrzkOhqTqi`=g`ZE#LEBsiN z#@V-b4-LsedzE=FPs?z~%UcbxTk9yQoGQXfJyylqGjWd3c|Bd^0bnCNWH!>TLRIgP zhdN1Vm0u1g;Q@c(kk7b67o2$2e}p%%l&gxBsG~1Ww$^Nwl_9ePaTG34Q4x0LYkA2p zbftd5u!JQAPso{dRo#$Hr7AUC$Hk40ju!Q5i~3+<8I03CN=jn~g7l?ubGN%n8Y*0! zrNYQD#X>gf@MmLEipGGV+GTN}z&OAyWfGE;I07QaWHv~bP!UAlGCY=rObHM&@YkQ= zSH}4%%fK)gLq7f`Ug8?RoO-dGjTp>Nr4+CF49NCK`IXULZ)xvv*^LONN@eP?pgTXH6 z?z};L0-9LR>2C7{tfzwqUu{o5^>lmWTiFAJ`SNj%hbHxom_44+8 zcY2g}8{o>QQzeJXNxjCH*JS_Zzxd7e^S|_q?caX!kJ=PhW`FnTXWH5=H(_{9wjE6L z-oAThTb$=AW%##De3ixm4b9X>Ca^bi49kuC+H(vcdSI!$&E2ywNYL9y*cc?sCg^vq&1xR+V?pBH|oKgog?g@Djj#xK){oO9TWzcgibx z5j1{lpGKi7N!>}DzUejb7+sQlWfuPAsR-KTiYOYLjHQT&qLimDKtAf+_3gTFCzW(6 z20yaYbTYp~AtU}7YG6-57f#o1+t4f${dp$mmYIbA?1w(mHtyKW)yN!vH@PW1iWZg! zxa^$>T;M^!{LuwdqTm&mLZzfs)KlyS$mBZn1`FKFeTuwJBIt)$a{AQM&$VZteW|_j z>TB&J*D%YBf~g?F4G#XZ;lo@=CgQ8GdvoCw6+xcLL)V+X_|mK7U2`Ql&Vh<8tZsRS zOW-Ge>^+&TR#;VIlGYXoE~AzV$CCqppwaj?MBSJe;-s-Oa3&&@X_bu~Z zyn8TStSZXS-iwWirz@{9bT(?3Oa|qaVd{{?`~Yq|b#SuwfQ$P@vPsiSQh>@%WfUv2 zqNR-Qf9MkkP=7bj6Z*(&UfKEcw!Pj14KiEvJD0V5TiejEC zvyYrO(-ux0Yddb;-?s1A))raTZDZYgDJ8)_0C87LD(9@*4Ew^{RgPD8m@;f7zC)L~ zQ3H@NikECjJZ&zWGEI1aWQg({hkq_GUoy{}qw~YtSslBV zWy71?Ut}*D9pUh;4N~P9$_Lub0Dt8MmtGusM7(*=FJDsWslfJxI(4ZR;zn2+5Po%@ zdeMz%f2~`lkz7YcvQQ^-YHwB}wDLA>#Fe;qn3QLS%x%jjDC^v^JAz03fu|n766lsk zz*PBomx?R%gy&~^X`V^VPy-_TYE2oxvKBcjJ05-zaPJbf&~kCLYi7Q5GG zp-Xyx%_ju|4Z4bptxw#HdCIgNAWnlz8lJV1oiJ0*({l$cgl}e?_LC-v(brk~u*TO2xZEZjvd^-lOx|U-<3z znNNJO-GBc>Y!GJS=;5R7R^~AmIJk2Yrzh-V5r<{y9q^7ExagA483^CXZx6 z`O)>E>gWgFOOYyH)^#M*Iy0_alZr2xow`4;#vf%~7vt7Pg?n(yXRtHfpfub=Vh_-v zEYDW6TrXfCIZw8Oxs$CNm$Z>y^(qTN&YWhe1r3V5Y@wcI2)KF|mBD&eLq0>k{YQR< z)*+%WyqC(2zgf|ji0H-q5;v&JIqN{pABOMvJ74Pjt}K+U$f?iKLrEAMeNtarM(TX& zmqn(j9+5ui3U#A#c@B?KQatltxyVz8>(u>);WT^AYJzVV(;p!ry2*sZBI#06dBVqx zIGmob-{p4f$nmxdMZ0>I9B=$9u~IZ3%rQ9Q>uaWY zCQlxN4}MXS;*k`RtDhKYl>6H$+KjT44~+ zc?lVw$SO>|Q7X2V^5!B||3i;|uYK#8XWL!-xwjq5W&4h;xnCxg!j{C;G6uqOw+p{6 z)7A1hkHETN?=%8>j)OP7Ds_QzTM4p9z(Z&*Ae>%6e%^|?#$44RyZAjv$2)0qFlTt8 zaF}7?93BKp@zn|~ZQ-%7Q^5(d0WnEjXLLPwP%1w zsT2o@(DO_NZ{wFr#)f2yjcisp_YN$vQ7pT99JY$wrlLynxdxCgr*F4(lhzy(=W9pC*-p73SjV}vgtWU;E=J8 zZ;P|6RH_2A?o?hqM}H%ply@mo;y}E7Q0`;Em^gJ2S$24kDz^nAR32HDomU!my&=j_ zw>b`7mqB8B_Jmx`4RQuzaw6Cd$ZD`3bS%j1|8Zz!>GU{Ltfm)L0zA0 zJK3PD%*T*LCwLUnM$hFV59e7I4jTI98WOU zxx{L+bQ|;rm((kmmuUjzKAXiU6U|cjXz94)U1zn2TKu|cIn*V>GEBv9=6#766=9;0 zt41`_CBn0SgFnASu0Q;fhh>eo*%CH=>g4&hZLgd35*kJY0O2x8hGavM3X4?LY5@{y znWrMeItG}xeo5ep1wle987YTS5@~!yo-VZZdaMBuwKw5#=>^~gHt#E*Jq4qCBT|Jj zqV|%9;743{_D{P1UtlQ3>7me#Y#bRr?o@jUw_WxWDwFRjS%=QXUC+A|g*@!x!jv99 zcmXN+vUsX}@416KA4*KS&bk!1h!KTp{;}e5pL4NiX@$U>iCB! zqD?Ubw`=Iod3qL_>yH7V=lbMQ<%cjg{MZ=kIxLc@*N)qujHT_5 zML!jgKO4SOW&*A7Ueu+WxHrJYgl;V%Nzs$PL%+&!5iD=CUcQfQPw#+K zy;vnqB31Ng>nNrw2ogi|A$C*S>tLuJqsiV0&szDU6Gn}j77P+dAusH}XZ(H>pN+s( z5uZ7Wg7oO*C_)mC9I(Jk#D!Q+tjY;acBkUTLNA47x7tl$RpE`>(;6QJKvNAi8HZ3m z6oxLacrSr2KmE4JXV-*3{W=LOO9OC0;lQr;5%-5Ui94 z3en1|U<4vxHs&hKITXnSCJN=F0+Uk*=;2|o#5q=K!U%KthL8mcbX)kr9iLdgieQK( ztSB(Kn3=C%4l()et!~m;d?AiZ1O6;KhIg`3>G%n(sU#8+%gk_%2)?DscL~Dj7u51L z(OzfRM`xt0G?&nfcq$dByZ@talac1cr#ffl@>ShsvtsU9jHx{iflU zC9#31CYs7drS~KO5E%097)ui_-j*XcG zUKXTPGkHdxjp~Rr>tm1C`mQX@vN?Jy7xQgpp3!S>V^m&-a5r!|8KXuT-daZTFiH&Q zzSo~D7M_`!vcgK~)qAJM`CX$Vop~FK6IXGJgCIr(L|0k)SV;1P$Yy(Tp_2d^u#yi6}6@u`KMF?fp_wvF zZ)%ui9+uxUiDC@$?q+rOnYq$UcwQav5&Vu|ta@OuX9u0($Q3Ol^A(LkW_aO8zzHQn zhJe866hkv7uqt;ltaBbEw1U8ioX7^oKm@O(rw~DU&2dkyaQ|V10mpgG=%ed@~9Gv*7OGhar>Cu&?P`sF9 zm#!Cl&K_DSkPxz=n6;=6U@1anAgDG?v+gVMtKB!Sq74F$!m}ZtUe2NZ|&t{5a(G8vA*I?2unC zHzAF?ShNzw$1)VYSE#yAASWJE1}gag9#8lVK1);I*?gsJz;>iqBs=KwV7XW(r&(ZO zE0A-#2>jjO`{VWx|NFnk=?b^C6Wl33VOJDccK*&&hYue9R@*pKvZ09Hd2-1}B^Sk) z=PHBLDc=3N)JYrneAvjRI4)vw@5qqQXxBM3)sj=tw@k0%G|F_bNv;y-YTi|k-xyjT zfh%qi{>$PJ!E@m@G9Ra*vP?rd!3c=UyFDrT<{Njn+xF~jI~ndg!9J_Q3|*cdmK8_* z1q*ER506IR@ifoDNttovgD!E^mGJa5^Qiu2q$02^=BlswMn5=&mj(r$$LV$q^B8WZ zV?e?z9jKA7((ML*>DEG}8zSZ}K0%LshX=hYfV}+c&U)+SS0gUc`*caM`iEu!K?wj` zJ%UkWT``5%`jPA`vj$=Y$$=__!CI0G{^jj7KibIkZC%mY8VKzJ7nYF zkW`dEOvo|TFu+~dN?zG9Jc2_elCZpGO?B@`OS~|QOk755hz%l{0n4+UfB}$fp0p7f zl(J0dD;!)LKu8qQMSC?6EzZf)_YjaTlU>!hCf&4Ifd!tG4pdTjK?%6Pk(vBBXHsdv z9jLLigl<8Bt1Fc};Z+N*gmK7P0po8Yy{=7!XBdii%SM-tXApfcLt*qZ$*a?p#)JxB zL!aJ~w8AR|SmkW7+jHV)Br0X8$P<0b*{Ed)Z~TTX3`0E5`J7}Aio+Y`6*v-SIpgQB zfjupuPgXJUYy=#U-Sw_TXUbHb;Ac7W4&F8n`giA3;^CJoP-#%MuuRyF-9>JbROQL7 zPR)AC4&m+lRlKcWF;1?a?Z)#aYVkJ&6#bTy{MkH3A4EB&ZeC!#^u-rnqBpXk-F^3+ z?e!<0!O&y6)65tu+dj9sZKkZxGw-$$`8zLfslnkFyerpp?(g3}%~dl@U-Dp4SS|>% zVjF+I_3zoo;)S@~yLPmltb%%l&43%x5u2DBvN2hq%rZnvoaq=x0P2Z_$m>{<3qDSX zx|078Jo>RNWrfoKR(RHjH@XNaKnVetidS-{{CYd#+@?+Krkf_(!6Po!o@`r~=eqN* z+j27S>BA@56Hh&p-sTi?yrpk6C9B?pGEejNPo0-Ta)+90e(7=Jzm@~r)Mdnjw;CvC z*~68Q4|!WC=2v`0x#|UV#PU!}>Q6nTKfyZ=oS>$j^9~es5iYu!yfWePFi4m28~+J0}zSM$(aMY zSI~*89Hb?VIa-0nZAHZfvgXy5ujx`y@TEJ4#1w`IE)V8=O}CzuL|2L_5zcAQl|+c^ z3SI@nDnv*a=;kR`l5jC>P6$nqfrT^taBjs7My?KV)svY8Phl9{xc=f){-Z_<&j>xg z_S(eJm=SgW7?wRg_CWn3ieX}?gczQ}Kv4uXUm42amtJ@>S14n&7-8V0Kd2Xd;*2Ay zF;ege-2=ZWjJyrchm;IGxLkAdoa3!Fr1H_vkSI{!*)MU-(4?vbmJ71pLNbj-yD0?GpNXyd@B;$xLSOUve~M5C#R+XS>ql-e$)9^J`AmT{#hpk|JG7W|? zR{sJPzwlzGVE8HY;g_`o{)L4wt>#$^u00YzHbPD>SeLKFSBovW*<{5e!80(yz8Ywe zZ8m5we|GUyuDGaS2NUqI9@fF0F(S=GTuJZz`SeLHV%p+mN0VEFw25q3JSM}{MFLfM zdaSjAf9D-{w$sN>qWB%Z-_UNN>v#A5cQKA8TunuoBqtzfjfO*EkI0Z&h(VZExj1Tt zn*=Xjbnb==W_B=avAo(AILdo<(es*0iFw?8mcbE6K52nk5yL!iD_SJbyz5tZGT*#p zZWs*B_F!}>L-*TQd=6q8Kg>`1b(rCUn8OQVC9OXSi@g%pRCm(2 zCe7Z~B!klLzWes}=}&&J{Xf6``)vmX#0}m$iNU3EnxuC+&pB*!+c&Wah~cA`89OKa zW+pJbkm(FcV8QxAPu4Qaf&~!*fiWGX&vm+@pyO|uXjs^QT8_^72wSPJ%;mi$C!MK( zhENZ7ZQG1&(Ni57l<~|>mU8vWiZ$jg$60Jt`YOZXwX#5drsdb?vaA!6*uf0H{yqkL zcq9ofSj0HBo@7X$fb9&UQq7UUOYelM z3mQ>M-eD*Cr9luU8wY=+anKzZ8qWWF9aV~d? ztNsc~FBtt~kRO?Xl7`z3C3FFk&=ln0XQAlFOiMCQVW|*CLs$cx1P-vPsLZSQVB8*G zloSdPFi|?htG_b{j^mbA zQhO@;ML39C0wzQbbH=igre%gjbWwPD5~1RkW2rap+t=Q8_ucIwRvew^C`m*;Em{u6zI7C{cD!f$=K@8-qWW|k=Dev-7*{K937{YO% zk?+z~o90x`MfdJqyW3u_zCC^B45zwQgQ8;EzyvnraUTr56Xuk1jQ_y$!f;^x7|w6U zqclg3#(>HHG;RZxV?m?Gan$68%gkk%!^Xj##$*daLVxe?{+Dg{jXOB$;1T%01EcK( zbe~C?SQn|QS@AQ&j{1p4nK_zuOp+@UT^aoeHl-pJCQLc2Ichb_|tB&$6o}&sbapW6vK2lbWq#!4mk;I$At$_@e4pOPf**PjQKH1PVIAl58+s(g ztt+CS4$-i(@efyMP@Lpm!Z>ggM#D}e-6@c-a^Hq^199E2VnbpaKoG_sd`bC4?;&Hr z5q6Gp5&*#5^VS={;+=^JfOzj6nnTa4N0semDqH69QjXS57FW=@FfaL^)7t^-u002M$NklrLCP11lw zP$|HUhYijWe4MrcB8_Vu(jbA~4Azq?L~1v4Rd7g8JTdZf=(X3{v17+rEmWH!6(-L^ z`}Px$XGp~z+Q};k%i@X9ruK*j_je#fx$H^UIIUMp-FT@az|>iy8)y)v(eAy@#>X;I zL~{cpG}vJDGCO?abxtdOEkbKgc!D_+A+0e)>xl)MIqPZ`zSK$2gvcA==Gz?JK9>d* z`1051?oy$sbj8u`yZ#&TO!S_HdPZGh)R%iuFbs&GC4B4t8{6SS2insIIJN^TaT#Ob z0xP4o@7dYzU~>L_9KdQ%Jn?uHRf*)fp4R zHR=qDYdH8*p6F0d3- z;bD2`O3nY zE^_vgcb!L7 zA)U`UeTC!~`1>>;hFWe%w9 zI0!2|l1XHlUH{^WfA}MOa9(6d7+xv z(_s3{M;F|{Z+N{T3cWImqm%0!P{wn7ZrZr1?PW-71&jAgR?D4gTW{Wt@i5iiO&$95 zk9?X2Wmha>ha#ao#@R(SHk$h^jmuB`%#XJ_ckOFm|C6t@#~**Hon_c`#^w7oT8mn( zlmm#Th^~m-TktebrNuwXv6jPE5oAb)7Q+T@mWF;S=h}JV^aR6rh9!K&BnwNq7(Vh7 zpEP{ez^B*SfB}SZ37E*3$$GfYm4i?C8}BVSQd6cE=;6<1WP$X^TP;fQF-@Aa-)L3q zjWXmhGRi?zgHF7P{!5Vv9e63v(PF^x*}88Xi%_Yo@egfg5Y&9Aydf_2VwL?b7c?S> zZ!bYZ-YY2LlusUl7Y~&i-|4v!6C++1K2g79SC%WI2e#1JnBx@h<;i6x<1svm=k?=m zRS*~Tm!n#xuUxiI_<62Rbz0QyZu8B(#)O3fRa6}jQ$mEI zhwHU;ERGf4d(=|^{Myk=4}xTI(K=-Tm+)a96WQIZ8>yV(ah1l~Zhdb|DnIire6O6TcoRZ2e^{eW zB{|>j-oBFt#og7+8!oQ2)0k8TQ3^lui4V4){ZIZ{+r(-vFJE&HfJfCII&h%9_{_8I z^wASpqAfg^OW%9v-EHs2?d_IZ_cf2d|N5if;&j~kwh25P-(IH7!)Fs*w-eKHrmDC4 z)-==c>+f z`~r_uyxMc-U4%MP{;FsO7aWnbp1M;M7=rMlVat#6wbq+>@t#J@Mu9@~FkEHQA`E^4 z#5i+qp++Wn*U_lzT>YoS%CUmJ4!6rh8W8BW-mhVpYp^7idF8L_jR=WTzQa($$=_41 zbI+7Kl)?;48MErokiwtfC`?^?djr3E&o4xoCsD*#Lzb2TsOWNZwNDpmv^@6_4FDA0 z#UER`xvvG6aY@tjAMdWg(l)zYuNK`9LwLeV|!XA@6=eG))t*)b;=3O zDq?5n$&>AtJ8nlop@c{prDq9{A>VPUFv4THJ+5Msp$yYau&mHi7R;`C88XwxOsf_Q z_~a|d390Zch!h+XNlt7U*Ys8-(<`*qfWR68vjY}Q>U@pwhSkRmuHeY3_ZH+w4PPlR z7LF=TK8awbu3!KazUYE*Xit9eGj4HOdMke>rRlXbj#5c}fV8La-uv!r4?Or#bHqo1 z_Lyu1z4KL^RQ_gQ<#G6^FY!&$B|o!U$HV2mse^c@(eal*$8WPE7FxDoWSEDr{Y@J9 zwUMF3NRIR}_P^(jTiY3WoHN|;c8aI9(fsW7p2cK&{_qTpNhL(w@>1{mo_>vx}8*SJ?*m4nn zaq5dQ!uuh;#WIM(2%-(TGGd*~p|6(F;M6r9PAfi+%FGa#oakw*i^z#Dhpk;8RAmdT zXE`$CMi`X)x&bP<4l?I(nG)x>2ck_bO;EA6aKRMg_cRjcY>8K=SOxJi6YGc%$2(tK zINP>z$ejwbCgf567pmfGRW6)6#pi5}5K%c^xM^3r$VxBU=Wc0Kt`s4)Qjzcz#3}%6 zV4nEu&BunKhPiB1Y$&R+a06Z%C{pO3Nn{c@$7128S4NoW*PYMBdefMJ1(rsN5G#R| z$@J!Jp~R2h?qUE~>1=q^B*c?edpG_SRfT^~(;KWTjsR9HBmy1Qnwgr-az4hke`(=>h~R(TS5BwE`kq)5(C8mcI~m z{nxTcMI!&qDG^!AO59)qF$=HpH2S_>&T>#Gd6o6$E;x*NuH#%JRbxVhMeeuI6W-0a zPg67|9#4OS)pf_IowvRF&h~fy>tAXoSoLVHedW}A`^KMtwLQcgDto!aY!j>5Oyh7_ z2C~WTB61zY!5H}L)+z3&KZ8Qr(0=Is_q6*T`EFaFzPYP;i89q%M!?6gy#B{=iYbMZ zNs0@?*2HNJ#eKuy9DuB``B`;tR zd4Y~Zjx-|vjJgyU6Y$P?q-pST4SZys*Mwfx#GwDAeRUeX=Q|;aRG7d`hKYl?3C+TaJn`#$r7FKta(Iqh6|ELkR&7Lx zEB~aUhHCM-T(4I)mHS!dG9LT(w*hJeLcuEy{`0Q$*Pf$uCuvM5Wc~aIx8hY?Jqlmx zk~c&c<3)I$cf=z#&K$}WoWfThqX|`xtun+i1703v=sb#wzM3Bb#aGfbX?%cDci(+i zhSY3S?tkFx8T-}xnV{VKb7hdqqRN9*(oJ&tmN^Wz)Q=E?S7{exd>rSz-@&5#!@CAN^qa@<%fKTe7#-o@YlOl)QHi4hUSN*FHp%@pvn=0r z*j)Lr;mPO>sqC59lgOyXI82A`dAFu`HMdtuWSKDU7EsCbdQr*mPEBwKE&8nco3CNk zajPA<^Ne&12`im@0F765)mWO1hB+rTiH^388N)j4#?$$nO3u(bLvlK~mIW|m;22Ux*b5~P5tHgzoo*aHUEhwW!XaJcWC&Qy! zSIZowe(;$WSi-BEu=$lcS=>t!`iHz!rs5HF0OCA^h}h`6kl+Gy2(qR30IOn^{G}oW z2dpg`SlKEs(wi3Gz-QCH{SM1(46gJoGwij-lHHD1WH5x0yY%XYG>8&Bs~7pajUL>M z+>tZKsOBPKbztdCJ44U)^FQ``{IF8Z&TOI>Fb>Jb2IZ|d!N@~Xl|JBEJk94aP&Pao8bRS|nP>syghiJb|wfs4*nP&3O5nmOa`R9n|+nukV;)?D>T5|xf~8L2c_ zAe#(~iW7GpQqVkCFNHB%#?uzq?83goc9=EtXV2Ao_XEccv&@uT-YBD^+~45@zg?ou z48`nVuBDg(VhnQLRlvh2WLHJ7XaV0ro(&zy)@CC{Ux|nU(TB zWS&N`8cDn&lm?dTip)3D4O|GG8=OGr&tV`L6Tvbbc&jktlO9#2(QW`98PoLF=PR#b~_7-Ve!6;bbQQn40|D~={T1i(i6~1#vUZ&=fUK_MjErskFU`(emYIZv~b8QZ-DVt9-f4Iz8$OM-C zkAD6~Ie73Qz0uQLPISI~`H%ms?O>h%B=d_dFZCB?NENK!Z&W22(7&&zT zBMrc*NqJ>{kb6=G-%;HD0KcS9H-N2|^>6d-a$nS_ztkV)QlEGcjCHif6`+l~bu}o1 zs-qv4xrclTw~v$zpzSCp$Ha9p1{2pOUMN-COxB36dT!1#|Jtc}E%??ywG7pQv+|kyu>K zspq?kWGSG21}A>KQR#mD*B*k))w3);o}?S&b&pqaVMhI9NYA(wYJXGCm5-5&yp;Tv zky!Od?X9s>x~1?{S7=0g4wqvh&OfYBz7G9|TfAQY-sq}y^D!&Y=DF*x${SBur+gJZ z%tL-^h}DRT5h`c+4K4$y5$dKJqhu(H5p*-Djh< z!z?ZKX)4+z7fbD8#m5cp9LKA8%=6?7Lu3CRYi}B)XOi6aRo{0v8fe_W02mAgbI`p9CpZ-EJ}=^#Fb5oq)ADf zT`sxzF*}R7Ff+K%ZZy#M?ceWT&-3;R%(1(Y3wZmvsxxgyuJGj9f!Sh7|SFeqRron?hAa5Zp#DhV2`Po2A0oT2ZOn(>A*c1$;gP}V`t+v zjfq5(Oh)a5=HB#ea0ghQ{2BlKg7mdM?F0;V3Y(jrKhJ4=XquJ&@0WV_z4_RvY-mf2 zB1V``RCrpyYOAiIcC_3bcAuaNc*HM*vMdmHopi1f`PipEiem$-qd7jJpY-Rx@~yI; zxy(T()E(s;?lJ<@Ot{Es?vWEm%jLP-jA&?6bWBT2oMnV$(BzS_ki_!ZdFZ`)_`pm$ z6es81<1KW=U|+y@5PIHFIPzgrq{rJ^bud2IwUIPA8eT`CwaN}T3y?k#`&)oVODd8^4w1v{1& z%A%re%sV%4mwi(lkmX|=$TLb&``lb3yAshqwl~_N%NW9&%2_CGrYLKh2=opjrf-oV zDXlhTNgD|~?kI>+S{l{zo3IJKNL+ZEn8uBX)^-o?$?tW+Bp;xaZP)oZ&rt$+fQVZI z0)DWK(8eUNt8=w~1|Tsk*lzFzj6~#UzO2m70z=}=FDx@WAIXYehf|(V==lyeZ`>$r zOzEQNGPsPM0z3<$ePlqGj zQ(xqhAl=0aq$^|_f~9yc7|~FXa+Ia{!DE=mPBjxjH+*T5F2R8k*dA;I0dl zd^W_y>mnWM5@y5E>@F)p!qFD)+!3i722pq$T+FD$iN;Asf(y7++XeSB@_6j2C(&xx z*d`ql3W8{bz3fIYlXyy@U^YN%ozCViCX{`gYPn3OevPv^tT-34F}N-}tZ0^rYul1f zd_*wOQCX*Z5pJ`0*`tME+2WQ8YSv5KKfTY_cmI*Atvfpq@v+m_X@b?47PRtl=maA2 z;{zdWkoUEY(BeZN>00ATb?0MiH`OG5H<)~IJ|V&K8HYdev*n4*@Y!}AWQjoi$|p6; zDtk=dX#=z=VMvGISwZsLu1yyDfE;Ijm*oHMbG+ke9kdsbX>JGU<%%NvkR@ z>r7@>?Og~Jj>WF+*f-KlzQeI^)mo(0IRMh!M z96=kewsEeJaK3Nar7@tFZs_u-brN|?O#6XsQp@7Vb~I#k-H1nMudX8$h45Ukuqai* z>bIxeVS_Ilc`yK2H^O-zO3(|#P#ywh1GOi$a>iMBH^*K}ZccRU2$PF6j@$RtqWah{ z(vAv*A_Pe-j=w&4-@&3{H;E3 zg7ZYQSeAw?5X}75lRo^aIL|o3ez0&A6N|waaE{Pn$-C9Zzp}= zRTzRapUf3emxiPTAA@*rAmE%lw?4*LaA!_7xwbr&w!9-vXjoI`Z}*?XBSSS)_Z!qnyZR}%8H7GosFOrq%HvV zd>h?FbuFD^wfrJZ4ikfHO4!g+7TvRFPg%t?a*{*DJVIg&k0Oh+k8S%WF>NVDY@VH9 zrIL^JWd|_H`R6x*>liI!0GJARJ+nwQ|>oebffI9BGO3aIeTB%rUAQp8Ky ziKp<)Bs?k81{(Sc-VRP73-|e0@4acV4I02pnTVGTA~=v1xYDUIB{bD8O~U-Egcedl z1O;~r{a0UOuQnE}#yuI>3Mxm0mLu_~W4ENxv}b;8!xg2LDgnxi2q9k9#$da2=u%>#E(x z^D0kL8_=a*xg>OA(ZNpc!NkibM-4yg0LXh2I5CSw0;iy4UNH<$0i|mAG<@>*2najY z)xOQLh#5@tuyY@*Yn4brTpqZ^h;5e1->j2@KKrM}aDJIBlf(PS-)_P>RzQ%3@>yQr zxfAU?ZEJ>Y*S~r35)0tK5k=1SI7HpaYj$@2d#@lIzxd0X33*dPw4ufkL=;U=SqyEx zw%5FT;7^(%WiyT~!g8i_vb=2o<_CxNyERg4<-Yi~&qR?Ai9uNfpFFv?;C~`m~-RKX_79SZXQgU+doWD|ROGx1$SV8{}p4tTF3- zwpD?1lo#OcW~9iOUBCwE^*R*yc#c(**;IM0O~a&rlglVEjV- zyiSG3%$4_G7Yf#Bp;V35`CB`nN@VY2;^1mNE#nxu=GsZtxe)_P>`}aCC0^;kFex}P z34X>AURU8;ChUfr{E2G_+Tv3m@B1sPxEq@n0ED5Cb7C>^`O|8BF_ZD#v*N$>)vt!h z#8=dGi_~`9tBOkyKeZZ9f!x5$s|}L8{wn>AXIgxmI$mU+!~OCr->LbNFhZF+wDWT$ zY=`B)PB6>1-YB?V+IsH9>AE3mXlsM9Oc^CJqR?cdIkp#GvEg-xD&)YOqNHBP$0lXN z-ivv5FLQvCj4m$XB0o0Cs%a#bc5l}ds7tnW6rQ%zCB0N}Wqjog>7OQB>z?#_P_gc55y^zMor6r!1eG0erUdB#qQpSG9khd(wT)_TLK-_0N1v-qwvRC) z9Azv1b?QXgB$~9b9s=8%;3y8ZrSde}nkO(Nai^WMag(4)SMU9+#V1f8cuSMyBSR#D z9YC#f-x$YP?UW&9;$4$aa)ghFQ&YDPt<5&jhAG1qX4QM(%)vDoRYhTh(M%DgQNHt@ zxVD>(EkKLYHaF<}=PcZ@+ zWl`hw;eBQQ!P8}OdV)C<&TANTyLOlt={U?VO4EodNuA(!_~;mAZLMxgu(ZVX^?2Qk zVjhe80L0O5uJ&%@&9*BcamX6V1S`IYY1Pre7+h`CCbHzO0$*5FLZ3+q=nM4o$-i;^?muL*=5L5GcZ6)(FFlSj1Cpkj`|N&cM+| zMv5ZFe>(P3^TSQDqo-*$QI(19|J6M)VWq9(tdK7Kq`w=lXk zJC9WWK>*yb9#3^-K9YLZwOc^W*|3xaPea<3of!DpsidlGcHm+SwSg=uEyP~|r*LId zwu3pOjy#)kh@_ZPADJWLQT!}q6{ZcuhUR%9UpY^Z!g3!f^ETP{AH=!-gxVd_#z7_{ z4L-_u@w0Rf$5LYW^1wXk+~tKff?1Wsugq^O3)Nt1{20 z@NROemLH?o@foXzHb)(egyRo6e%5Fex2c5n zI)0r7$|1~nnt(2IAevrvH>CHVVWAnW&1aLz;latQj8|aN1frq0T9;)qh(mhrmM-;m z{no))hOx5~j*S4Kgo8q^t`zk)4FdvYRB0s2}T3Hd2(q=%gv1F#PWyB~$wmcgrn)34@R z%TO`!owQhD(WjdrYCm@P9l@98u?y3Z*m<-a{SfniiwK7-0AwUM$%OSh?znpN*?|tB z#ha-`leE^=1{2}?7?qqpb+k;6GIv5cM+8$xrppih#HY$D9NqAHfA9qoIr^akQ>kbQ z9dj`Nt#9WnG!ti(Kz_>zq(wZqcE;UhyNB)R_odA47+?v+T^df(nV8;@-x?i=uBk(4 z%^tWm&wf$U`wrk%JdlHt=5Jgod*Xp+e9P|K4ye)avlV(sBOQg@)+~=*!6*t(uLH6G z9n(I%I0wh3%4N37S+)hE90o^ut}%gif%vYsnf#T$3Jk9IwbJ1DT|qn$!7>TOtH17` zEZ{Bt^nl@FYoNV_b#c1ZdA7cJZ9vx!0@=%j>^3C-dH}PcE zX`zl}>bKgaYMoZtpf(BFP&b{4eu$f&!a&;z-^>7yy<@_=alY=AAKZKOmDd z7A~QQ$Gx459YLGc&&Cf=hzx1c`nUxY0jP~*fMql&M^tF|lyZk7_||_D?~+j%bezrP zYL+#De?{1WX@cn=>?yZcSQSe1$AxvHXi)uhmm7Km3^O8OSiZ%AEGAIsV9+kf&z14w z;3|6EE3v}CNt{3^lcNQwg?T#IDvP~b8(^W{9fT0_G@pEyff}MUZ@oyYw$L3WYKU6R zIq!xap<`l*CIS7)U@D*Lr zkCMlTd{3S-n%cKGDVS0gSd;e^7ny_4sd?U0_>4$MAa8^Rx!Iv4aYRSe5LZEF z8m~13e&B*4`Bgh_jVFzb7j!_>w84RwH7_+AL@3T0j!vtYgHpm!ZWmK=?5F=pOy{T-LIW%S;w5?xhT9%x(4-J+78P4-GCntAD$_%&0oN|V5r>0 zl(gsgVR(Cuc|2_65NdTzvz9Ux69=09el*V+I+7{kk5J&ftgSk6>_C}3xVH@K-&6XS zd_A=PqnQu+_22vh+^dH;5KOO0Iu3A5y@T{7b$*w8JP@fzdpyEv0d4S&%a_a1sS_+* z94tqU9*yUi=e>CDkU{O=pYt>~z;_&zgllNrlvUFM@~zzCER-+4{!ZD?x|A~q@RqY9 zfo@A|IytrPV0nYZ#^D>8L74pH9P6QSg0*;m*rZylUpJ`aY{>HL!2?X%;zY2#Uf!I) zU6zJ>aD8?ZtrlO?+E#>JbGaX0=gA7ROuVSM%JsV{SonvIS>AZ>U`pHlZg?{*JM}=Msn-fw$Xl&@56uLBz6Fx{+(yjf~!~S79*28cbMy=eg>Iqn8aDaX5lXAnjEITYN}c|M9}?Is`M4`8C%jzIEj*=^WNVUTGn!Gi>6fhS@Nk zNn3H{aK{43loo264#GuwYTWCb<=u-L@es`BH<4ebQQBBGT{@~}1))Sv2GzT3hhce7 z?V6;m4^V+)*20$ z@++*wOLD2181w$n2v1%Ly&lC&QJYkz^=AmlrJZovmPewRuEr5f<4bzqw+&1ISy`q= zkS2x!}T+f>VV^v#s00&#llXLfT$#U9 zKJ&?s;Fdej=BAfpO7OS}psvEe z`REHDD#wl;FaOiu{y)GEj-hd_BY-rU4nW5>XnKQ=bq$q&74y*&>258omv4UO^>X4v zkHmy9$!^{gAZ}3&t~h_T#~M z7o~_gVkG4;w2sPDe4;&vW8Mp@d_khh9GwX1a63vWZhrT4&DyPHlp(4K3+Y2iz)l$Bugd8ZH19#sMezo8vA&N2 z+vF;dxs@%NY&tAr4Bxf%uZinl%h?^jy*IAxqmIR)O_m4jUd}5+0Ziv*s7>(fgxe z^3AQGZPlKU(gtrOVsP>gY4}f@m6%?MDc;1hP@RU71T7T5RhZQ@Qr}x?btp$!1nq18 zKo6U;S_L{7&r~IXK^S076uz04QHh%cd%>etU`h@=pf~Zz&BtnlR+h_-6MU+FpIEgCZ3F?9 zc!ATxHHtsswe$s!L3^wrpMmE3i>w{+nle@RZpVL@iT(k+kpAT#y_7W0xvAmlp6prn z!a8>3SUG&?5S__djsbS!-Uc_u-ce$^hHJ_S?!+DgyvRJk6qC;tr-nXcXI*Q8a$`qF zHl7zUg_eKj;ge;W(Zu9vUpcmSqCEA;k#d<4hj9BC`HT+jVNKOkdHd@5a*mbemuIiD zGJUcfI<$}Z8f$mE?59JSgiM12Bb0B0vp~km-}vwTQu#-}@jK<*Yj2ggc{&{OU7;hz zeWskl6R4k^W)wQT6CB~o{#?KJ`(G+Q{%1audB;UY=m(#CxP0+XzKZz@cVKMumc%(o zJJ3CQr^>7B=>4r5x5^Jb|1>*1vr2w=l+n{LWtd`gG*+f@5$?why@0@*WZlXbtFGP5Ae2%t0GeCB^5yo70Dqw;3*pV3z*aPgG3+mUIxz_I(1+YOT{eb;8e4h z@l_d|ur<_6m6f(sIz(4<}yR%rwt@S~kr z_*RsYqW+t}OJWZ;>s}h{>iTj#A<%=eNN9=eBMfSptuV_A{)7p;3X=B?p-IqCvyJ`z zU(K(wjd@u$H8U$tns~-TnoQdnRPL`tG%k@uCvugm%-w(p?j6%dMV!B>{^aQ^)0$5e z{r6FxhZ>j9U7^F8yB&=%8k*F~uk=sDVuau@G#v<6SCf(nKA>FyeuI5PS2SH6lsKMj2HB!XtGdbpR5ya+)s4MKM}Lez}9 zz!p6Qg|TIFw85ekcxWDhYX`~B*5GA1tW9%G*@(N1c{R!h8l7HB*XQTTqmP~}KlPJ8 zUdH;FN14EMhI)AF;ge)Q_u4x_hj69*oqzC;v6J_dU;M?N!BnzT;iHm=Rrfp0%PeIT{sGdw^7civY}QOLvP)G#qfY%0KXsUt^^f2B5pKiC zgR_jx4q}QMU~be7)S%Eg#Cn*~J6Is-aJG6;5($9iV{SWtx>%$0?z`Psw*keqzg zmlcMt%to>1mlt1OGYz9eZ;@Y7BM!FZAE8&~wTfMqe zG(1k-g`~G{-$`3a8v||2C9mX487zr)>*Tu5I>Q4vUGNqcCL|(r)AF&AX#dhys<;}a z69h+Hv=orrW9sI;O1g=(Lny*R09Hb?a~t&~<~ioEH80aZ`)D|;oX)pG<2tx^ znjRek0Hzmr#@(Tdlw_VTyhWp1XXtFlvW{6x(}hITU05#{XDVGNne)%VRPPx(6-^W( zZOgS1svzOncNPeOMSvm2CAjx`DWyy9qI*-Y54^;-PaZO^tEUyd<_$DTKtqD6l?4FL zo!jn9_S(e26B<}OPS(X_Lj}PmpsHP8{7DZ$J=P3i8OzZXQXx{^o3;~C3*%V^6NBBb zo7hSZEt>C{uqVFw={_oEVLRxk??($Ij9$@6dLsEhos6TG_F32&eW4{&g4BiTlU`QZ zc!ekb)`nvos|;H*oq^v%H|XO=hM^rXt}_p}fBy`^5K6%8p66m63sXLjhVIw209 zo~2&4%RLr78Z?a=kF4Xqsku=T(g=djNp3x%{3xy>U}uBn2{SAU&w%FvVxtIyZ?LZB z$;TckKlZ5)QK>lL(?6|XhH{kj)?06uU-?^qul&dle!Tp`zxQc?ERi$3?A%7Zt3!LU zu&yKknbk$Km5+`b-CK?xJXk*S<3CdV&ToFU{PTbHC$L0aELKN^p*H#Tl;8gB|64x# z{Bz~$$4(;nhs&pb<}>BjXMerixiwFxqH8ZM$?(#^z*gDMsff0#Dbh_dpR)<>gU(Yy z^Nczv>^zldXyd9<$=K z$9Ev-ocrC2NmdiA%;4zIt!*}uX#*qhwS3p|VRGC3qhwH4dElC>&WFic=LZZqWt1{l z-*y(3C9RkCXxVGo8aN;>j|YDWl6IOB@m)EXZ?(-i7n}_|for|Qq)i$-A;!)qS-|(1 zZ?-L{&OU9lMP49=V*#pi#_^!(&CeXDC+-b_>mNcLq2v~%eMbXs?cOFWp1N$cNlOHQXEV|m}a4m(X6S4aKuPn0P5blJJxY!bCauN&{zH(r0JWeZ-v;es4I{O$WI%%zrI(QDV!lGqnY~1W z5HJTF0}obOSe*vyC`6|OVXC!i>pzG&WCD}J61LR4cUR~%8L3eN?NBn4@Wc;e09$l~ znS3FPjP8>Hpc9y%l4debHk0IoaVl!WQ~RL4Gz;087!)4S)WN-m+K4MtG@^yLfl(7A znw|FWFk6wUvG8UC2MQ;C#cPDofP1hR%*J^Qw=WTYwYX6{i~1wjEE5yOOE4w^-nO4} z?p@tYT460B*w4T9R=H~9BV;A2| zy``u#>muD6buWFL581>sMAv8CYMpc0;C>nJ!@vCx{|R#tJ>|J)&p=z^Q_m|1;je$^ z8|5c{@{{GKKJz08g+;VQ1uDSPafor{%{q5RXUVe-R^`iJT~PrjM@(FAE|t62Z?Sbf zdugH38#`BB?&a%F5`WJWenQx*Ua-Ly2+-!K7PPo!6?anO8q{`PiUouRZaoW0_ ziSLJa9%h1F8c3JW!Yi4JpHmBl4jW3Z`l|LJRz{wimwAK_P0g!b5D6S%)QIHk0>+AG z6klY!E>t>Mx!%Sds$GMVV@KpwLGzPiG@^9^d?9R6pu^-rEylma9dz3u{B3WUlMU<~jvVxg-IB{EhW{44tO%X&>3BIy2d{aaBLv1L;;1lYz>%9GI1wHy zM`}VMmboWq#Dqb5M|u6$X)>*h*RCycdxr>E;F$yn(6HV}7vJgjs7Ic`dJwWJg&nQv zIAQcOM$6Xx^yX8@dsc+n`i`0$_2&e)d895a7HQ|$ioNIVUEZ6XcfRJmIr+}8xmksw z=B;#?M3Cop(4eie>MY<0gmENDi>E1N^FSc)KEA0ONk88?YBLvwo*qiS_V@m2`SBn6 zSo!&%#r%b4X`vM6IuHyFVx}Ud4N{>Adva%T3qe#KYUhR0;RgyLO)QT`GPoOWAEWQ7 z$-1RQFAfQ|vv~0tou4X74~cJK`ucDFt6wgk`C&Z97|A?>8S9BNkCt!U`$ksD4|0~u z2y;KH2=T$jO|>7vEU#fj$`&nWEqeSx8^$Vu=Z<1FnviXoJR)ol;QqaI%KPIke4Y6! zWtDt$0Q%b&uQ7UY9&(&}(UkX8NHY%zpUq+pG!JpH+?I`};9@6k10DkJaq6ByXUtrV zN_?-wlckRA6S_1dNkFKb5`^g+=^F&fk40Sz^i(RH0|+@GsyPA8M9@g8 zU6k_5w8X1hv(z+JW~DF;r(oo<3N1%&2oEYk`lhdlE&u>P07*naRBS*KmG;NZo?wC* zA$jL!;#=<{>^?BTq;K3iF+)fXwS8&jb{nId%*UbPq#wjRbr@J2)&p&<7;;40WU(Iy zPo;~~GDt=dLvI5zw1$+e(ko?ZUboH+n)Cb`4U;@wPoQU2 zgsGk^*y7tD4P4CRV!66mdiy0+7^c^>X>c8dtHAr><>$zN2F<8%3#CLsk(Itp1J7hV z@1##~>8^A#74J3qClZFdxH>3LXUw@2Jl;i4sqPIVFlj% zt>67z`TDodmB031{>8Fy-x###NQEKt=+%Q!!RVsjwsRJA451)xSp>|D|Dm_RH}wy- zhf?z5^Ust&{Nr!YLD`KBK=u2Bv=Xk>A`tX~fPNzFoS-K7PyY zKubh^wi);NbB`-ct`ZF&xEbgYO7%8n8b(g_ zu}ng5uMH>bX~$N-%9#7k)ttzZXT^}{xIdf4a$klq+C)Ec)T28b^&}99sGYJ_v2A;{ z^ziX6)I|498^U|ivUy?o+L4W~%t9Ot(pY45u&{F)gx+2aDt#hsTw&PZ4)NV`Ioa z5X*W9Fy2}tSGaEmS4B14YfM@V!{F15S~eC|g1Bc<W($5IzuegJW>fa6JmNp9P%< zrf0CbZg7~??Q)HuUL2!rmvMmY#HZN9X^YW|4S9qGp+mUA_CqgCHx*Na#X5p?b*tRC zF^3o23i*SdlL0WJm8)pd%whdU^Y<#Q;BC3T@3n) zn>5ZldVt=u9MkNIb~O;|NjFMe!3XHv)JkikG|QcG_~4;*Xu4Rs>Efj;SIA79^pF_{ zT<1jI#$##$cULvYEVLs|;1JK!nNM4fqGheX@M+%daxYZ#~yKvN&)x$a+J& z>K`drQOY(}&Xp%lohXkUJBaC!4KwNJXW%FKR&$ENF2Ok{_;(W=^tRNDcmBeq^7Yp* zuu&mA-b+0JSMX|$189w>_8%w@ADg1BQO9eWWroFy<9M@;fY&=a-zm?t$a$HLZ4}yM z?M2fQ+mWo&GjH>Jm(j}_9oz|o#{ssTaUIzXe#Fw;&R}D8vne)YCD#OO9tPhiymDuSNEhkEttiOjfU6Nn*VdsaI)TWcr^(y6fn`TwtYpBI zc)mAY6H>D@KSv_YBWQ-Y{Pv|X%~mT1INxa%FGA-Y+``85lSY`BR{<2F-mAJ!kJ70u zEIP7lL4%FifUkA#`RmHZQR;JuTPNAG0v#B(XDLC6!>gi|cG0}^c{l7Lo^tTP;@H;2 zr%mTWNS$}W-c2Vg)8-9-#4|zCRv>{{UkV8P@*cd2YX@vQ+oUsz7p0luoMoreze8{7 zOuySktRVO-TqbeI4z|LI3ekw~wi;mw8exR3=$Hw%0JV)VY~nL}XUZxkIZhv*C?9+7 z!)#)Ar#y9r;V=>JarTLb4Ir2-${2q4iV-z~0fu^52FmKf9G#oENnYUR$K`#3L`pfS zur=@>pr=tA4q_(vtDGp6cy@u48ta>HzQbAV-=;APmW!7!qnW#?(|`8PR%(+52n|o> z8jSd39{ZU$nw%Vk*_P-WC<6p_%Wx&W_Qhd3i~VSRBXlxvU%ZNab`+tEHn6kGH##4F zBWO9gc@FX(;@XDjNclr8I0`v@WU}m8A1!mYm&)uc`!U()Sf&Sp_;!AjLd|~%I21LV zvTm~h?laniBhej)r4200XnxL(c;cU?t2VSu3)qb8R6eBVt{DNk0k1vBp`B|Hben_M zgxnAx9Mt;cui(&JBzu({HF~FU)W`fyJ%O-P_P%Wm_r(n$(Ii$U3vYIVc}s6AR-OCe z_1W?(|HJ=M{_>yy`EvHmQ4-fhxD^KTFb*5xjse_+Pn|x*sBr*O5jD-8b&D%K<+H!_ z&&o$%e6}2YXbf`+9RXx=F>fCujX(DbKUd}#H_97t-vF*AL)u%=v4*G{gpO^bA8(&) z99}m!|LyYfx!21x4<9cl_U(f?b(%eF2_F2lPJ>y8 zJ(p1~W-;Y%5a+Q2`|0Qyi4%|FQ6B3v!c6qb=qe#_@jgT-MY& z@l+~^P3cKXno19l7bXvqNBj-d0fY~oP~UeRxe1?|zv%&FD`KjX5z?A!?F?9CYQerZTst#qH`m@P2inEJ}-D_=hA`6vq{9+5E}48&QsR= z?0rj%hG@PBJh8MBp}9uM>f}Qj6&0neGE+SD8tWfMix_9v3^yCbJYgt?803jOhAin(TXjYp`ZZA=LeN9ZY==`NXNiPWSa!3al|EIU~wfDNmfs)zO zz`Z+Y&fS`0#Bd`XM(fz37cr~#PBBTWd5to=UlP40f`Wt)DtUn~WJ!>|a)^Y}<#U+$ z>%@1i#QmTY9%ihD;wo;1gv57_WMUjwLtd?}FXAnS^8xE_?k(2Jth?QAmyt0v7o`wQ zte3eLI~pAxG>uJ6JDH5P(_MVy(FWT&0}&HF8KctHH=+TPSPbf^dYIW%YC&o@L*6{v zP@}m^OQ`p)m%l|_G73_`AidhBbhJ$IttZ+FE53cHmR6arr;bQSU&R19klxPKjrCSA zoqg$RUrGH@Fc!h0$$(e-#vm&q;!HUdeBP6vgijf)3*+%OofydYU2+?8-^Q?#c;Q&v z(pq*$LNSRY_U<2Plx&OxEWOjN-<&JI_P_qa@>l<}Uo1zC;pU6kYugS$_gGuh)(E?5 zA1<$*zk(7rP~N(FD+>!RT)J5P%3t{p%ac!@M)TLDmQe(Bvg44hT*Hr0;4|XHC;q$ znh172=G07WJH&S$sgJhh$&Qo5xMG8no<<4*-KF)+T)8t}o;rQHTz%~g0MoUBPmcMe zV_KlD?hx;OQO3H;d)Ud3_m`tT%6LxPYWAm=g9kem( z)wBk{0-GDJ^%5c4i!$hXlq)xHXCE)urz|t4;#`&^6xRpYE~aobR;DO;!;k<`c3K|- z)~uY73p_MH`RYlh@O3hUpGhVU_$5_OeLa)VQ<4v=!S)=|f!ymge%_L0lw+ypcH|9{krbi@RvP`sy3y`qdl6 z>nX3i@;cwDU%4Zwjj5_PdDg|c6L3t*OB@Mh>5O}SfK_M^%eYN%xV}JJJFUw6+|FOd zb)nk;Hu?xoI;)v|6M?4ttmndv(72uSHci{1IFGWx>gh2&Y=-IJ^^WRiq_DomUQ-B@ z>8U|RIRoYLm09*v!qbP~NW?t+J&32UrL{uZ(3%%yty-?Oe14o^nP^jb-8JU`My2vc)Y1T^^yr((qS`q+tU62G>=@~RQn zU@1(_cW-l%_TBM;OkQfbHt^jb&UTpe@&wI&wk)@`zc#m0{`>#=|15v~zy76iVE+j3 zEQ7m4*klLFH@|hU{OaHR2jvc?9nE_WKYF_S`M>ZBY70xMa2p6!T7ek<`PsTX(=uF1c*Tzva-`N^lnD2>5{JjKc|Lb*NtZ;$>9B&j+;g%n{%GoU+Jt^{PNbqlMboHa_CdJnKa$nk#9M~h)yfl- zG_`R$DO;(WzhGXg92B}jh$24T5Mo0I-_O7Fr#WxKtu!RyFhg0j3s)82qwM!^4w&GZ zf@nooSjy$3x|5#OlL!e0oSG+%l=7Lw5(_xT5I}qOU`J;BKjvXj2zDpxvKvOB+SAXpvmtX$te+d&TT+WEY1(tX3Y?c50|N2e% zf4iJGdW6nr9%q!>e<*=&YU??o_qfB^7U_=NAQ3p ztx|JyIswYBDC!Q)whv>3d8{z5sscYis?T*|qZUykC~b~fg(8F>%N%{YouOf__>y_Svi8RAm1 z7LAGx&lR1ZDmGK#)`!L6Svr+BFqth=p8f-j&rr&o+*M|nwyiQp%!cOD@DT0JJo%|% zJ2!PdZyF zWTIT#Pls}gg^W??Xaova`LDUdfPoy~WZNF(i6a%IX6@*xf8wRwwa88Tgn#@XAv;tN zr#3W^+sF60HpS@r`tEdbO->APu|*ncyjDSNC-)ucOFHMmv;ygx9#3DcVymUzx!%5m zGb6t&vns@Oja=8`2nLX{BV)s*Uu_xyb|#KgoT6}x40k-0_$fO`OhD*^zNGKf;3GZ@hJhdzguanVW9`a3i>J_z@3BS4J+#of^UJJ`UV>TY>GW2yZR2sr zs8Oc|X_OHFFr;@J32IBA+y=Y9$^f;6R1=V$hLg)12$n(WYG!HzFFPh0d8d1=Jf)Xc zuTl|svWkB9S(ijzt3a5SdAA`Q7zw@R$A^qSh+n^1AJ#_w?!EQd;w=6(tzT;3RVUbJ zjnn?DcYvjQM)JKO{Lm&0Eh?iEfxIdV^9+Ca?md2XK3kZwygKJ6kDobxk~);HFo|8C z!xL=0{JH<&-zh))XMO?!uv5PM%4>A^cc{DDpf`7WHvghjZ}1{PiT}fQ4i3_x=;(=aDqRjG=^mdAK+$u;D`r2Tx1!M z!25Wo(XI|LZ}CIVJW@`v?fMXK=o>Q^Kw--5**j&OHB&$T?DOT;<*RIP$RS?l(c%kI zo_9Y4ul7SXjGvgLdB=TlY5u6}#ZyqH9&p$KmkoYiUB4jD2zM0WGL6#o>b===@aRE+ zQD)?WyX=Nffaevmy(`r3@EqT3XW}jUrO_6yT)j@)#Hv6g*``FxkrKmz(8$H3dT#{= z-@Nia>AN$sU8*QhQDvObA<5|UcqZHMD3Im)WsclXmK?yuKY`i%IwKc5I~A$`_ToQi z<>+h`rhG^5T}x&4q℘uXp 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 literal 0 HcmV?d00001 diff --git a/loafwallet/Assets.xcassets/BrokenCloud.imageset/BrokenCloud.pdf b/litewallet/Assets.xcassets/BrokenCloud.imageset/BrokenCloud.pdf similarity index 100% rename from loafwallet/Assets.xcassets/BrokenCloud.imageset/BrokenCloud.pdf rename to litewallet/Assets.xcassets/BrokenCloud.imageset/BrokenCloud.pdf diff --git a/loafwallet/Assets.xcassets/BrokenCloud.imageset/Contents.json b/litewallet/Assets.xcassets/BrokenCloud.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/BrokenCloud.imageset/Contents.json rename to litewallet/Assets.xcassets/BrokenCloud.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/CircleCheck.imageset/CircleCheck.pdf b/litewallet/Assets.xcassets/CircleCheck.imageset/CircleCheck.pdf similarity index 100% rename from loafwallet/Assets.xcassets/CircleCheck.imageset/CircleCheck.pdf rename to litewallet/Assets.xcassets/CircleCheck.imageset/CircleCheck.pdf diff --git a/loafwallet/Assets.xcassets/CircleCheck.imageset/Contents.json b/litewallet/Assets.xcassets/CircleCheck.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/CircleCheck.imageset/Contents.json rename to litewallet/Assets.xcassets/CircleCheck.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Close.imageset/Close.pdf b/litewallet/Assets.xcassets/Close.imageset/Close.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Close.imageset/Close.pdf rename to litewallet/Assets.xcassets/Close.imageset/Close.pdf diff --git a/loafwallet/Assets.xcassets/Close.imageset/Contents.json b/litewallet/Assets.xcassets/Close.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Close.imageset/Contents.json rename to litewallet/Assets.xcassets/Close.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Contents.json b/litewallet/Assets.xcassets/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Contents.json rename to litewallet/Assets.xcassets/Contents.json diff --git a/loafwallet/Assets.xcassets/Delete.imageset/Contents.json b/litewallet/Assets.xcassets/Delete.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Delete.imageset/Contents.json rename to litewallet/Assets.xcassets/Delete.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Delete.imageset/Delete.pdf b/litewallet/Assets.xcassets/Delete.imageset/Delete.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Delete.imageset/Delete.pdf rename to litewallet/Assets.xcassets/Delete.imageset/Delete.pdf diff --git a/loafwallet/Assets.xcassets/Edit.imageset/Contents.json b/litewallet/Assets.xcassets/Edit.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Edit.imageset/Contents.json rename to litewallet/Assets.xcassets/Edit.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Edit.imageset/Edit.pdf b/litewallet/Assets.xcassets/Edit.imageset/Edit.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Edit.imageset/Edit.pdf rename to litewallet/Assets.xcassets/Edit.imageset/Edit.pdf diff --git a/loafwallet/Assets.xcassets/FaceId-Large.imageset/Contents.json b/litewallet/Assets.xcassets/FaceId-Large.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/FaceId-Large.imageset/Contents.json rename to litewallet/Assets.xcassets/FaceId-Large.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/FaceId-Large.imageset/FaceId-Large.pdf b/litewallet/Assets.xcassets/FaceId-Large.imageset/FaceId-Large.pdf similarity index 100% rename from loafwallet/Assets.xcassets/FaceId-Large.imageset/FaceId-Large.pdf rename to litewallet/Assets.xcassets/FaceId-Large.imageset/FaceId-Large.pdf diff --git a/loafwallet/Assets.xcassets/FaceId.imageset/Contents.json b/litewallet/Assets.xcassets/FaceId.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/FaceId.imageset/Contents.json rename to litewallet/Assets.xcassets/FaceId.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/FaceId.imageset/FaceId.pdf b/litewallet/Assets.xcassets/FaceId.imageset/FaceId.pdf similarity index 100% rename from loafwallet/Assets.xcassets/FaceId.imageset/FaceId.pdf rename to litewallet/Assets.xcassets/FaceId.imageset/FaceId.pdf diff --git a/loafwallet/Assets.xcassets/Faq.imageset/Contents.json b/litewallet/Assets.xcassets/Faq.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Faq.imageset/Contents.json rename to litewallet/Assets.xcassets/Faq.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Faq.imageset/Faq.pdf b/litewallet/Assets.xcassets/Faq.imageset/Faq.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Faq.imageset/Faq.pdf rename to litewallet/Assets.xcassets/Faq.imageset/Faq.pdf diff --git a/loafwallet/Assets.xcassets/HeaderGradient.imageset/Contents.json b/litewallet/Assets.xcassets/HeaderGradient.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/HeaderGradient.imageset/Contents.json rename to litewallet/Assets.xcassets/HeaderGradient.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/HeaderGradient.imageset/grad.png b/litewallet/Assets.xcassets/HeaderGradient.imageset/grad.png similarity index 100% rename from loafwallet/Assets.xcassets/HeaderGradient.imageset/grad.png rename to litewallet/Assets.xcassets/HeaderGradient.imageset/grad.png diff --git a/loafwallet/Assets.xcassets/ImportIllustration.imageset/Contents.json b/litewallet/Assets.xcassets/ImportIllustration.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/ImportIllustration.imageset/Contents.json rename to litewallet/Assets.xcassets/ImportIllustration.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/ImportIllustration.imageset/ImportIllustration.pdf b/litewallet/Assets.xcassets/ImportIllustration.imageset/ImportIllustration.pdf similarity index 100% rename from loafwallet/Assets.xcassets/ImportIllustration.imageset/ImportIllustration.pdf rename to litewallet/Assets.xcassets/ImportIllustration.imageset/ImportIllustration.pdf diff --git a/loafwallet/Assets.xcassets/LeftArrow.imageset/Contents.json b/litewallet/Assets.xcassets/LeftArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/LeftArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/LeftArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/LeftArrow.imageset/LeftArrow.pdf b/litewallet/Assets.xcassets/LeftArrow.imageset/LeftArrow.pdf similarity index 100% rename from loafwallet/Assets.xcassets/LeftArrow.imageset/LeftArrow.pdf rename to litewallet/Assets.xcassets/LeftArrow.imageset/LeftArrow.pdf diff --git a/loafwallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json b/litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuButtonIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuButtonIcon.imageset/MenuTabIcon.pdf b/litewallet/Assets.xcassets/MenuButtonIcon.imageset/MenuTabIcon.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuButtonIcon.imageset/MenuTabIcon.pdf rename to litewallet/Assets.xcassets/MenuButtonIcon.imageset/MenuTabIcon.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/FaqFill.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/FaqFill.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/FaqFill.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/FaqFill.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/FaqFill.imageset/FaqFill.pdf b/litewallet/Assets.xcassets/MenuIcons/FaqFill.imageset/FaqFill.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/FaqFill.imageset/FaqFill.pdf rename to litewallet/Assets.xcassets/MenuIcons/FaqFill.imageset/FaqFill.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/Lock.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Lock.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Lock.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/Lock.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/Lock.imageset/Lock.pdf b/litewallet/Assets.xcassets/MenuIcons/Lock.imageset/Lock.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Lock.imageset/Lock.pdf rename to litewallet/Assets.xcassets/MenuIcons/Lock.imageset/Lock.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/Profile.imageset/Profile.pdf b/litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Profile.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Profile.imageset/Profile.pdf rename to litewallet/Assets.xcassets/MenuIcons/Profile.imageset/Profile.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/Settings.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Settings.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Settings.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/Settings.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/Settings.imageset/Settings.pdf b/litewallet/Assets.xcassets/MenuIcons/Settings.imageset/Settings.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Settings.imageset/Settings.pdf rename to litewallet/Assets.xcassets/MenuIcons/Settings.imageset/Settings.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/Shield.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/Shield.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Shield.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/Shield.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/MenuIcons/Shield.imageset/Shield.pdf b/litewallet/Assets.xcassets/MenuIcons/Shield.imageset/Shield.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/Shield.imageset/Shield.pdf rename to litewallet/Assets.xcassets/MenuIcons/Shield.imageset/Shield.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/BuyLitecoin.pdf b/litewallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/BuyLitecoin.pdf similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/BuyLitecoin.pdf rename to litewallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/BuyLitecoin.pdf diff --git a/loafwallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/Contents.json b/litewallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/Contents.json rename to litewallet/Assets.xcassets/MenuIcons/buy_icon_gray.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/OpenBrowser.imageset/Contents.json b/litewallet/Assets.xcassets/OpenBrowser.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/OpenBrowser.imageset/Contents.json rename to litewallet/Assets.xcassets/OpenBrowser.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/OpenBrowser.imageset/OpenBrowser.pdf b/litewallet/Assets.xcassets/OpenBrowser.imageset/OpenBrowser.pdf similarity index 100% rename from loafwallet/Assets.xcassets/OpenBrowser.imageset/OpenBrowser.pdf rename to litewallet/Assets.xcassets/OpenBrowser.imageset/OpenBrowser.pdf diff --git a/loafwallet/Assets.xcassets/PaperKey.imageset/Contents.json b/litewallet/Assets.xcassets/PaperKey.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/PaperKey.imageset/Contents.json rename to litewallet/Assets.xcassets/PaperKey.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/PaperKey.imageset/PaperKey.pdf b/litewallet/Assets.xcassets/PaperKey.imageset/PaperKey.pdf similarity index 100% rename from loafwallet/Assets.xcassets/PaperKey.imageset/PaperKey.pdf rename to litewallet/Assets.xcassets/PaperKey.imageset/PaperKey.pdf diff --git a/loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json b/litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json rename to litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/Contents.json diff --git a/loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json b/litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json rename to litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png b/litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png similarity index 100% rename from loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png rename to litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/bokeh.imageset/bokeh.png diff --git a/loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json b/litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json rename to litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png b/litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png similarity index 100% rename from loafwallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png rename to litewallet/Assets.xcassets/Particle Sprite Atlas.spriteatlas/spark.imageset/spark.png diff --git a/loafwallet/Assets.xcassets/Partners/Contents.json b/litewallet/Assets.xcassets/Partners/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/Contents.json rename to litewallet/Assets.xcassets/Partners/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/bitrefillLogo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/bitrefillLogo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/bitrefillLogo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/bitrefillLogo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/bitrefillLogo.imageset/bitrefill-logo-app.png b/litewallet/Assets.xcassets/Partners/bitrefillLogo.imageset/bitrefill-logo-app.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/bitrefillLogo.imageset/bitrefill-logo-app.png rename to litewallet/Assets.xcassets/Partners/bitrefillLogo.imageset/bitrefill-logo-app.png diff --git a/loafwallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/bitrefillLogoType.png b/litewallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/bitrefillLogoType.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/bitrefillLogoType.png rename to litewallet/Assets.xcassets/Partners/bitrefillLogoTypeColor.imageset/bitrefillLogoType.png diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/changellyLogo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/changellyLogo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@1x.png b/litewallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@1x.png rename to litewallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@1x.png diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@3x.png b/litewallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@3x.png rename to litewallet/Assets.xcassets/Partners/changellyLogo.imageset/changellyLogo@3x.png diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@1x.png b/litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@1x.png rename to litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@1x.png diff --git a/loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@3x.png b/litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@3x.png rename to litewallet/Assets.xcassets/Partners/changellyLogoTypeColor.imageset/ltcfdfrontv7@3x.png diff --git a/loafwallet/Assets.xcassets/Partners/coinbaseLogo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/coinbaseLogo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/coinbaseLogo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/coinbaseLogo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/coinbaseLogo.imageset/square-blue-5d2184a32860bee22d0f30233233afa2e1a58c16072fd244684232454e66a114.png b/litewallet/Assets.xcassets/Partners/coinbaseLogo.imageset/square-blue-5d2184a32860bee22d0f30233233afa2e1a58c16072fd244684232454e66a114.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/coinbaseLogo.imageset/square-blue-5d2184a32860bee22d0f30233233afa2e1a58c16072fd244684232454e66a114.png rename to litewallet/Assets.xcassets/Partners/coinbaseLogo.imageset/square-blue-5d2184a32860bee22d0f30233233afa2e1a58c16072fd244684232454e66a114.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/Contents.json b/litewallet/Assets.xcassets/Partners/litecoincard/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/Contents.json rename to litewallet/Assets.xcassets/Partners/litecoincard/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/litecoin-card-front-border-2-3x.png b/litewallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/litecoin-card-front-border-2-3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/litecoin-card-front-border-2-3x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/card-front.imageset/litecoin-card-front-border-2-3x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-1x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-1x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-1x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-2x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-2x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-2x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-2x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-3x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-3x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-back.imageset/litecoin-back-3x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-card-3x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-card-3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-card-3x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-card-3x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-1x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-1x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-1x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-2x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-2x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-2x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-card-front.imageset/litecoin-front-2x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border1x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border1x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border1x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border2x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border2x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border2x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border2x.png diff --git a/loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border3x.png b/litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border3x.png rename to litewallet/Assets.xcassets/Partners/litecoincard/litecoin-front-card-border.imageset/litecoin-card-front-border3x.png diff --git a/loafwallet/Assets.xcassets/Partners/moonpay-logo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/moonpay-logo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/moonpay-logo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/moonpay-logo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/moonpay-logo.imageset/moonpay-logo.png b/litewallet/Assets.xcassets/Partners/moonpay-logo.imageset/moonpay-logo.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/moonpay-logo.imageset/moonpay-logo.png rename to litewallet/Assets.xcassets/Partners/moonpay-logo.imageset/moonpay-logo.png diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/simplexLogo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/simplexLogo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@1x.png b/litewallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@1x.png rename to litewallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@1x.png diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@3x.png b/litewallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@3x.png rename to litewallet/Assets.xcassets/Partners/simplexLogo.imageset/simplexLogo@3x.png diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@1x.png b/litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@1x.png rename to litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@1x.png diff --git a/loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@3x.png b/litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@3x.png rename to litewallet/Assets.xcassets/Partners/simplexLogoTypeColor.imageset/simplexColor@3x.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@1x.png b/litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@1x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@1x.png rename to litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@1x.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@2x.png b/litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@2x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@2x.png rename to litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@2x.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@3x.png b/litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@3x.png rename to litewallet/Assets.xcassets/Partners/ud-color-logo.imageset/ud-Logo-Full-Light@3x.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Contents.json b/litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Contents.json rename to litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono.png b/litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono.png rename to litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@2x.png b/litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@2x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@2x.png rename to litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@2x.png diff --git a/loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@3x.png b/litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@3x.png rename to litewallet/Assets.xcassets/Partners/ud-monotone-logo.imageset/Logo-Full-Mono@3x.png diff --git a/loafwallet/Assets.xcassets/Pencil.imageset/Contents.json b/litewallet/Assets.xcassets/Pencil.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Pencil.imageset/Contents.json rename to litewallet/Assets.xcassets/Pencil.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Pencil.imageset/Pencil.pdf b/litewallet/Assets.xcassets/Pencil.imageset/Pencil.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Pencil.imageset/Pencil.pdf rename to litewallet/Assets.xcassets/Pencil.imageset/Pencil.pdf diff --git a/loafwallet/Assets.xcassets/RecoverWalletIllustration.imageset/Contents.json b/litewallet/Assets.xcassets/RecoverWalletIllustration.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/RecoverWalletIllustration.imageset/Contents.json rename to litewallet/Assets.xcassets/RecoverWalletIllustration.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/RecoverWalletIllustration.imageset/RecoverWalletIllustration.pdf b/litewallet/Assets.xcassets/RecoverWalletIllustration.imageset/RecoverWalletIllustration.pdf similarity index 100% rename from loafwallet/Assets.xcassets/RecoverWalletIllustration.imageset/RecoverWalletIllustration.pdf rename to litewallet/Assets.xcassets/RecoverWalletIllustration.imageset/RecoverWalletIllustration.pdf diff --git a/loafwallet/Assets.xcassets/RestoreIllustration.imageset/Contents.json b/litewallet/Assets.xcassets/RestoreIllustration.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/RestoreIllustration.imageset/Contents.json rename to litewallet/Assets.xcassets/RestoreIllustration.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/RestoreIllustration.imageset/RestoreIllustration.pdf b/litewallet/Assets.xcassets/RestoreIllustration.imageset/RestoreIllustration.pdf similarity index 100% rename from loafwallet/Assets.xcassets/RestoreIllustration.imageset/RestoreIllustration.pdf rename to litewallet/Assets.xcassets/RestoreIllustration.imageset/RestoreIllustration.pdf diff --git a/loafwallet/Assets.xcassets/RightArrow.imageset/Contents.json b/litewallet/Assets.xcassets/RightArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/RightArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/RightArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/RightArrow.imageset/RightArrow.pdf b/litewallet/Assets.xcassets/RightArrow.imageset/RightArrow.pdf similarity index 100% rename from loafwallet/Assets.xcassets/RightArrow.imageset/RightArrow.pdf rename to litewallet/Assets.xcassets/RightArrow.imageset/RightArrow.pdf diff --git a/loafwallet/Assets.xcassets/SearchIcon.imageset/Contents.json b/litewallet/Assets.xcassets/SearchIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/SearchIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/SearchIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/SearchIcon.imageset/SearchIcon.pdf b/litewallet/Assets.xcassets/SearchIcon.imageset/SearchIcon.pdf similarity index 100% rename from loafwallet/Assets.xcassets/SearchIcon.imageset/SearchIcon.pdf rename to litewallet/Assets.xcassets/SearchIcon.imageset/SearchIcon.pdf diff --git a/loafwallet/Assets.xcassets/Share.imageset/Contents.json b/litewallet/Assets.xcassets/Share.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Share.imageset/Contents.json rename to litewallet/Assets.xcassets/Share.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Share.imageset/Share.pdf b/litewallet/Assets.xcassets/Share.imageset/Share.pdf similarity index 100% rename from loafwallet/Assets.xcassets/Share.imageset/Share.pdf rename to litewallet/Assets.xcassets/Share.imageset/Share.pdf diff --git a/loafwallet/Assets.xcassets/TabBar/Contents.json b/litewallet/Assets.xcassets/TabBar/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/TabBar/Contents.json rename to litewallet/Assets.xcassets/TabBar/Contents.json diff --git a/loafwallet/Assets.xcassets/TabBar/receiveIcon.imageset/Contents.json b/litewallet/Assets.xcassets/TabBar/receiveIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/TabBar/receiveIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/TabBar/receiveIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/TabBar/receiveIcon.imageset/LW_RecieveV2.png b/litewallet/Assets.xcassets/TabBar/receiveIcon.imageset/LW_RecieveV2.png similarity index 100% rename from loafwallet/Assets.xcassets/TabBar/receiveIcon.imageset/LW_RecieveV2.png rename to litewallet/Assets.xcassets/TabBar/receiveIcon.imageset/LW_RecieveV2.png diff --git a/loafwallet/Assets.xcassets/TouchId-Large.imageset/Contents.json b/litewallet/Assets.xcassets/TouchId-Large.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/TouchId-Large.imageset/Contents.json rename to litewallet/Assets.xcassets/TouchId-Large.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/TouchId-Large.imageset/TouchId-Large.pdf b/litewallet/Assets.xcassets/TouchId-Large.imageset/TouchId-Large.pdf similarity index 100% rename from loafwallet/Assets.xcassets/TouchId-Large.imageset/TouchId-Large.pdf rename to litewallet/Assets.xcassets/TouchId-Large.imageset/TouchId-Large.pdf diff --git a/loafwallet/Assets.xcassets/TouchId.imageset/Contents.json b/litewallet/Assets.xcassets/TouchId.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/TouchId.imageset/Contents.json rename to litewallet/Assets.xcassets/TouchId.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/TouchId.imageset/TouchId.pdf b/litewallet/Assets.xcassets/TouchId.imageset/TouchId.pdf similarity index 100% rename from loafwallet/Assets.xcassets/TouchId.imageset/TouchId.pdf rename to litewallet/Assets.xcassets/TouchId.imageset/TouchId.pdf diff --git a/loafwallet/Assets.xcassets/Transaction/Contents.json b/litewallet/Assets.xcassets/Transaction/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Transaction/Contents.json rename to litewallet/Assets.xcassets/Transaction/Contents.json diff --git a/loafwallet/Assets.xcassets/Transaction/movedTransaction.imageset/Contents.json b/litewallet/Assets.xcassets/Transaction/movedTransaction.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/Transaction/movedTransaction.imageset/Contents.json rename to litewallet/Assets.xcassets/Transaction/movedTransaction.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/Transaction/movedTransaction.imageset/fullscreen.png b/litewallet/Assets.xcassets/Transaction/movedTransaction.imageset/fullscreen.png similarity index 100% rename from loafwallet/Assets.xcassets/Transaction/movedTransaction.imageset/fullscreen.png rename to litewallet/Assets.xcassets/Transaction/movedTransaction.imageset/fullscreen.png diff --git a/loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow.png b/litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow.png rename to litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow.png diff --git a/loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@2x.png b/litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@2x.png similarity index 100% rename from loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@2x.png rename to litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@2x.png diff --git a/loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@3x.png b/litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@3x.png rename to litewallet/Assets.xcassets/black-circle-arrow-right.imageset/CircleArrow@3x.png diff --git a/loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/Contents.json b/litewallet/Assets.xcassets/black-circle-arrow-right.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/black-circle-arrow-right.imageset/Contents.json rename to litewallet/Assets.xcassets/black-circle-arrow-right.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/blackRightArrow.imageset/Contents.json b/litewallet/Assets.xcassets/blackRightArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/blackRightArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/blackRightArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/blackRightArrow.imageset/blackRightArrow.png b/litewallet/Assets.xcassets/blackRightArrow.imageset/blackRightArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/blackRightArrow.imageset/blackRightArrow.png rename to litewallet/Assets.xcassets/blackRightArrow.imageset/blackRightArrow.png diff --git a/loafwallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pdf b/litewallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pdf similarity index 100% rename from loafwallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pdf rename to litewallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pdf diff --git a/loafwallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pxm b/litewallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pxm similarity index 100% rename from loafwallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pxm rename to litewallet/Assets.xcassets/buy_icon.imageset/BuyIcon.pxm diff --git a/loafwallet/Assets.xcassets/buy_icon.imageset/Contents.json b/litewallet/Assets.xcassets/buy_icon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/buy_icon.imageset/Contents.json rename to litewallet/Assets.xcassets/buy_icon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/camera-btn-pressed.imageset/Contents.json b/litewallet/Assets.xcassets/camera-btn-pressed.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn-pressed.imageset/Contents.json rename to litewallet/Assets.xcassets/camera-btn-pressed.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed.png b/litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed.png rename to litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed.png diff --git a/loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@2x.png b/litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@2x.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@2x.png rename to litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@2x.png diff --git a/loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@3x.png b/litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@3x.png rename to litewallet/Assets.xcassets/camera-btn-pressed.imageset/camera-btn-pressed@3x.png diff --git a/loafwallet/Assets.xcassets/camera-btn.imageset/Contents.json b/litewallet/Assets.xcassets/camera-btn.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn.imageset/Contents.json rename to litewallet/Assets.xcassets/camera-btn.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn.png b/litewallet/Assets.xcassets/camera-btn.imageset/camera-btn.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn.png rename to litewallet/Assets.xcassets/camera-btn.imageset/camera-btn.png diff --git a/loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn@2x.png b/litewallet/Assets.xcassets/camera-btn.imageset/camera-btn@2x.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn@2x.png rename to litewallet/Assets.xcassets/camera-btn.imageset/camera-btn@2x.png diff --git a/loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn@3x.png b/litewallet/Assets.xcassets/camera-btn.imageset/camera-btn@3x.png similarity index 100% rename from loafwallet/Assets.xcassets/camera-btn.imageset/camera-btn@3x.png rename to litewallet/Assets.xcassets/camera-btn.imageset/camera-btn@3x.png diff --git a/loafwallet/Assets.xcassets/card_icon.imageset/Contents.json b/litewallet/Assets.xcassets/card_icon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/card_icon.imageset/Contents.json rename to litewallet/Assets.xcassets/card_icon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/card_icon.imageset/card_icon.png b/litewallet/Assets.xcassets/card_icon.imageset/card_icon.png similarity index 100% rename from loafwallet/Assets.xcassets/card_icon.imageset/card_icon.png rename to litewallet/Assets.xcassets/card_icon.imageset/card_icon.png diff --git a/loafwallet/Assets.xcassets/colorImageBlue.imageset/Contents.json b/litewallet/Assets.xcassets/colorImageBlue.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/colorImageBlue.imageset/Contents.json rename to litewallet/Assets.xcassets/colorImageBlue.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/colorImageBlue.imageset/colorBlue.png b/litewallet/Assets.xcassets/colorImageBlue.imageset/colorBlue.png similarity index 100% rename from loafwallet/Assets.xcassets/colorImageBlue.imageset/colorBlue.png rename to litewallet/Assets.xcassets/colorImageBlue.imageset/colorBlue.png diff --git a/loafwallet/Assets.xcassets/colorLitewalletBlue.colorset/Contents.json b/litewallet/Assets.xcassets/colorLitewalletBlue.colorset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/colorLitewalletBlue.colorset/Contents.json rename to litewallet/Assets.xcassets/colorLitewalletBlue.colorset/Contents.json diff --git a/loafwallet/Assets.xcassets/colorModesText.colorset/Contents.json b/litewallet/Assets.xcassets/colorModesText.colorset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/colorModesText.colorset/Contents.json rename to litewallet/Assets.xcassets/colorModesText.colorset/Contents.json diff --git a/loafwallet/Assets.xcassets/copyIcon.imageset/Contents.json b/litewallet/Assets.xcassets/copyIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/copyIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/copyIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/copyIcon.imageset/copyicon40.pdf b/litewallet/Assets.xcassets/copyIcon.imageset/copyicon40.pdf similarity index 100% rename from loafwallet/Assets.xcassets/copyIcon.imageset/copyicon40.pdf rename to litewallet/Assets.xcassets/copyIcon.imageset/copyicon40.pdf diff --git a/loafwallet/Assets.xcassets/deletecircle.imageset/Contents.json b/litewallet/Assets.xcassets/deletecircle.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/deletecircle.imageset/Contents.json rename to litewallet/Assets.xcassets/deletecircle.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/deletecircle.imageset/deletecircle.pdf b/litewallet/Assets.xcassets/deletecircle.imageset/deletecircle.pdf similarity index 100% rename from loafwallet/Assets.xcassets/deletecircle.imageset/deletecircle.pdf rename to litewallet/Assets.xcassets/deletecircle.imageset/deletecircle.pdf diff --git a/loafwallet/Assets.xcassets/dropArrow.imageset/Contents.json b/litewallet/Assets.xcassets/dropArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/dropArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/dropArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/dropArrow.imageset/dropArrow4.png b/litewallet/Assets.xcassets/dropArrow.imageset/dropArrow4.png similarity index 100% rename from loafwallet/Assets.xcassets/dropArrow.imageset/dropArrow4.png rename to litewallet/Assets.xcassets/dropArrow.imageset/dropArrow4.png diff --git a/loafwallet/Assets.xcassets/flashIcon.imageset/Contents.json b/litewallet/Assets.xcassets/flashIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/flashIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/flashIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/flashIcon.imageset/Flash.pdf b/litewallet/Assets.xcassets/flashIcon.imageset/Flash.pdf similarity index 100% rename from loafwallet/Assets.xcassets/flashIcon.imageset/Flash.pdf rename to litewallet/Assets.xcassets/flashIcon.imageset/Flash.pdf diff --git a/loafwallet/Assets.xcassets/genericqricon.imageset/Contents.json b/litewallet/Assets.xcassets/genericqricon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/genericqricon.imageset/Contents.json rename to litewallet/Assets.xcassets/genericqricon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/genericqricon.imageset/invert-qr-code.png b/litewallet/Assets.xcassets/genericqricon.imageset/invert-qr-code.png similarity index 100% rename from loafwallet/Assets.xcassets/genericqricon.imageset/invert-qr-code.png rename to litewallet/Assets.xcassets/genericqricon.imageset/invert-qr-code.png diff --git a/loafwallet/Assets.xcassets/genericqricon.imageset/qr-code.png b/litewallet/Assets.xcassets/genericqricon.imageset/qr-code.png similarity index 100% rename from loafwallet/Assets.xcassets/genericqricon.imageset/qr-code.png rename to litewallet/Assets.xcassets/genericqricon.imageset/qr-code.png diff --git a/loafwallet/Assets.xcassets/history_icon.imageset/Contents.json b/litewallet/Assets.xcassets/history_icon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/history_icon.imageset/Contents.json rename to litewallet/Assets.xcassets/history_icon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/history_icon.imageset/history1x.png b/litewallet/Assets.xcassets/history_icon.imageset/history1x.png similarity index 100% rename from loafwallet/Assets.xcassets/history_icon.imageset/history1x.png rename to litewallet/Assets.xcassets/history_icon.imageset/history1x.png diff --git a/loafwallet/Assets.xcassets/modeDropArrow.imageset/Contents.json b/litewallet/Assets.xcassets/modeDropArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/modeDropArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/modeDropArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/modeDropArrow.imageset/grayDropArrow.png b/litewallet/Assets.xcassets/modeDropArrow.imageset/grayDropArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/modeDropArrow.imageset/grayDropArrow.png rename to litewallet/Assets.xcassets/modeDropArrow.imageset/grayDropArrow.png diff --git a/loafwallet/Assets.xcassets/modeDropArrow.imageset/whiteDropArrow.png b/litewallet/Assets.xcassets/modeDropArrow.imageset/whiteDropArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/modeDropArrow.imageset/whiteDropArrow.png rename to litewallet/Assets.xcassets/modeDropArrow.imageset/whiteDropArrow.png diff --git a/loafwallet/Assets.xcassets/receive_icon.imageset/Contents.json b/litewallet/Assets.xcassets/receive_icon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/receive_icon.imageset/Contents.json rename to litewallet/Assets.xcassets/receive_icon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/receive_icon.imageset/ReceiveTabIcon.pdf b/litewallet/Assets.xcassets/receive_icon.imageset/ReceiveTabIcon.pdf similarity index 100% rename from loafwallet/Assets.xcassets/receive_icon.imageset/ReceiveTabIcon.pdf rename to litewallet/Assets.xcassets/receive_icon.imageset/ReceiveTabIcon.pdf diff --git a/loafwallet/Assets.xcassets/send.imageset/Contents.json b/litewallet/Assets.xcassets/send.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/send.imageset/Contents.json rename to litewallet/Assets.xcassets/send.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/send.imageset/history1x.png b/litewallet/Assets.xcassets/send.imageset/history1x.png similarity index 100% rename from loafwallet/Assets.xcassets/send.imageset/history1x.png rename to litewallet/Assets.xcassets/send.imageset/history1x.png diff --git a/loafwallet/Assets.xcassets/send_icon.imageset/Contents.json b/litewallet/Assets.xcassets/send_icon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/send_icon.imageset/Contents.json rename to litewallet/Assets.xcassets/send_icon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/send_icon.imageset/SendTabIcon.pdf b/litewallet/Assets.xcassets/send_icon.imageset/SendTabIcon.pdf similarity index 100% rename from loafwallet/Assets.xcassets/send_icon.imageset/SendTabIcon.pdf rename to litewallet/Assets.xcassets/send_icon.imageset/SendTabIcon.pdf diff --git a/loafwallet/Assets.xcassets/settingsWhite.imageset/Contents.json b/litewallet/Assets.xcassets/settingsWhite.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/settingsWhite.imageset/Contents.json rename to litewallet/Assets.xcassets/settingsWhite.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/settingsWhite.imageset/whiteSettings.png b/litewallet/Assets.xcassets/settingsWhite.imageset/whiteSettings.png similarity index 100% rename from loafwallet/Assets.xcassets/settingsWhite.imageset/whiteSettings.png rename to litewallet/Assets.xcassets/settingsWhite.imageset/whiteSettings.png diff --git a/loafwallet/Assets.xcassets/shield.imageset/Contents.json b/litewallet/Assets.xcassets/shield.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/shield.imageset/Contents.json rename to litewallet/Assets.xcassets/shield.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/shield.imageset/shield.pdf b/litewallet/Assets.xcassets/shield.imageset/shield.pdf similarity index 100% rename from loafwallet/Assets.xcassets/shield.imageset/shield.pdf rename to litewallet/Assets.xcassets/shield.imageset/shield.pdf diff --git a/loafwallet/Assets.xcassets/simplexRightArrow.imageset/Contents.json b/litewallet/Assets.xcassets/simplexRightArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/simplexRightArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/simplexRightArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/simplexRightArrow.imageset/simplexRightArrow.png b/litewallet/Assets.xcassets/simplexRightArrow.imageset/simplexRightArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/simplexRightArrow.imageset/simplexRightArrow.png rename to litewallet/Assets.xcassets/simplexRightArrow.imageset/simplexRightArrow.png diff --git a/loafwallet/Assets.xcassets/unlock.imageset/Contents.json b/litewallet/Assets.xcassets/unlock.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/unlock.imageset/Contents.json rename to litewallet/Assets.xcassets/unlock.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/unlock.imageset/unlock.pdf b/litewallet/Assets.xcassets/unlock.imageset/unlock.pdf similarity index 100% rename from loafwallet/Assets.xcassets/unlock.imageset/unlock.pdf rename to litewallet/Assets.xcassets/unlock.imageset/unlock.pdf diff --git a/loafwallet/Assets.xcassets/whiteCross.imageset/Contents.json b/litewallet/Assets.xcassets/whiteCross.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteCross.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteCross.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteCross.imageset/whiteCross.png b/litewallet/Assets.xcassets/whiteCross.imageset/whiteCross.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteCross.imageset/whiteCross.png rename to litewallet/Assets.xcassets/whiteCross.imageset/whiteCross.png diff --git a/loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/Contents.json b/litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow1.png b/litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow1.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow1.png rename to litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow1.png diff --git a/loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow2.png b/litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow2.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow2.png rename to litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow2.png diff --git a/loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow3.png b/litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow3.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow3.png rename to litewallet/Assets.xcassets/whiteDownArrowCutout.imageset/downarrow3.png diff --git a/loafwallet/Assets.xcassets/whiteDropArrow.imageset/Contents.json b/litewallet/Assets.xcassets/whiteDropArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteDropArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteDropArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteDropArrow.imageset/whiteDropArrow.png b/litewallet/Assets.xcassets/whiteDropArrow.imageset/whiteDropArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteDropArrow.imageset/whiteDropArrow.png rename to litewallet/Assets.xcassets/whiteDropArrow.imageset/whiteDropArrow.png diff --git a/loafwallet/Assets.xcassets/whiteRightArrow.imageset/Contents.json b/litewallet/Assets.xcassets/whiteRightArrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteRightArrow.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteRightArrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteRightArrow.imageset/whiteRightArrow small.png b/litewallet/Assets.xcassets/whiteRightArrow.imageset/whiteRightArrow small.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteRightArrow.imageset/whiteRightArrow small.png rename to litewallet/Assets.xcassets/whiteRightArrow.imageset/whiteRightArrow small.png diff --git a/loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/Contents.json b/litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow1.png b/litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow1.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow1.png rename to litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow1.png diff --git a/loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow2.png b/litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow2.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow2.png rename to litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow2.png diff --git a/loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow3.png b/litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow3.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow3.png rename to litewallet/Assets.xcassets/whiteUpArrowCutout.imageset/uparrow3.png diff --git a/loafwallet/Assets.xcassets/whiteinterditsendIcon.imageset/Contents.json b/litewallet/Assets.xcassets/whiteinterditsendIcon.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteinterditsendIcon.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteinterditsendIcon.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteinterditsendIcon.imageset/sendTabIconwhiteinterdit.pdf b/litewallet/Assets.xcassets/whiteinterditsendIcon.imageset/sendTabIconwhiteinterdit.pdf similarity index 100% rename from loafwallet/Assets.xcassets/whiteinterditsendIcon.imageset/sendTabIconwhiteinterdit.pdf rename to litewallet/Assets.xcassets/whiteinterditsendIcon.imageset/sendTabIconwhiteinterdit.pdf diff --git a/loafwallet/Assets.xcassets/whiteleftarrow.imageset/Contents.json b/litewallet/Assets.xcassets/whiteleftarrow.imageset/Contents.json similarity index 100% rename from loafwallet/Assets.xcassets/whiteleftarrow.imageset/Contents.json rename to litewallet/Assets.xcassets/whiteleftarrow.imageset/Contents.json diff --git a/loafwallet/Assets.xcassets/whiteleftarrow.imageset/whiteBackArrow.png b/litewallet/Assets.xcassets/whiteleftarrow.imageset/whiteBackArrow.png similarity index 100% rename from loafwallet/Assets.xcassets/whiteleftarrow.imageset/whiteBackArrow.png rename to litewallet/Assets.xcassets/whiteleftarrow.imageset/whiteBackArrow.png diff --git a/loafwallet/AssociatedObject.swift b/litewallet/AssociatedObject.swift similarity index 100% rename from loafwallet/AssociatedObject.swift rename to litewallet/AssociatedObject.swift diff --git a/loafwallet/BRAPIClient+Events.swift b/litewallet/BRAPIClient+Events.swift similarity index 91% rename from loafwallet/BRAPIClient+Events.swift rename to litewallet/BRAPIClient+Events.swift index 38dcfe217..e9ffe12a7 100644 --- a/loafwallet/BRAPIClient+Events.swift +++ b/litewallet/BRAPIClient+Events.swift @@ -1,4 +1,5 @@ import Foundation +import UIKit /// Implement Trackabble in your class to have access to these functions public protocol Trackable { @@ -49,11 +50,10 @@ class EventManager { private let sessionId = NSUUID().uuidString private let queue = OperationQueue() - private let sampleChance: UInt32 = 10 private var isSubscribed = false private let eventToNotifications: [String: NSNotification.Name] = [ - "foreground": .UIApplicationDidBecomeActive, - "background": .UIApplicationDidEnterBackground, + "foreground": UIScene.willEnterForegroundNotification, + "background": UIScene.didEnterBackgroundNotification, ] private var buffer = [Event]() private let adaptor: BRAPIAdaptor @@ -91,13 +91,16 @@ class EventManager { // slurp up app lifecycle events and save them as events eventToNotifications.forEach { key, value in - NotificationCenter.default.addObserver(forName: value, object: nil, queue: self.queue, using: { [weak self] note in - self?.saveEvent(key) - if note.name == .UIApplicationDidEnterBackground { - self?.persistToDisk() - self?.sendToServer() - } - }) + NotificationCenter.default.addObserver(forName: value, + object: nil, + queue: self.queue, + using: { [weak self] note in + self?.saveEvent(key) + if note.name == UIScene.didEnterBackgroundNotification { + self?.persistToDisk() + self?.sendToServer() + } + }) } // slurp up events sent as notifications diff --git a/loafwallet/BRAPIClient+Features.swift b/litewallet/BRAPIClient+Features.swift similarity index 100% rename from loafwallet/BRAPIClient+Features.swift rename to litewallet/BRAPIClient+Features.swift diff --git a/loafwallet/BRAPIClient+KV.swift b/litewallet/BRAPIClient+KV.swift similarity index 100% rename from loafwallet/BRAPIClient+KV.swift rename to litewallet/BRAPIClient+KV.swift diff --git a/loafwallet/BRAPIClient+Wallet.swift b/litewallet/BRAPIClient+Wallet.swift similarity index 100% rename from loafwallet/BRAPIClient+Wallet.swift rename to litewallet/BRAPIClient+Wallet.swift diff --git a/loafwallet/BRAddressExtension.swift b/litewallet/BRAddressExtension.swift similarity index 100% rename from loafwallet/BRAddressExtension.swift rename to litewallet/BRAddressExtension.swift diff --git a/loafwallet/BRCalculationExtension.swift b/litewallet/BRCalculationExtension.swift similarity index 100% rename from loafwallet/BRCalculationExtension.swift rename to litewallet/BRCalculationExtension.swift diff --git a/loafwallet/BRKeyExtension.swift b/litewallet/BRKeyExtension.swift similarity index 100% rename from loafwallet/BRKeyExtension.swift rename to litewallet/BRKeyExtension.swift diff --git a/loafwallet/BRMasterKeyExtension.swift b/litewallet/BRMasterKeyExtension.swift similarity index 100% rename from loafwallet/BRMasterKeyExtension.swift rename to litewallet/BRMasterKeyExtension.swift diff --git a/loafwallet/BRPeerManager.swift b/litewallet/BRPeerManager.swift similarity index 100% rename from loafwallet/BRPeerManager.swift rename to litewallet/BRPeerManager.swift diff --git a/loafwallet/BRTxInputExtension.swift b/litewallet/BRTxInputExtension.swift similarity index 100% rename from loafwallet/BRTxInputExtension.swift rename to litewallet/BRTxInputExtension.swift diff --git a/loafwallet/BRTxOutputExtension.swift b/litewallet/BRTxOutputExtension.swift similarity index 100% rename from loafwallet/BRTxOutputExtension.swift rename to litewallet/BRTxOutputExtension.swift diff --git a/loafwallet/BRWallet.swift b/litewallet/BRWallet.swift similarity index 94% rename from loafwallet/BRWallet.swift rename to litewallet/BRWallet.swift index 8ee70d197..02add202a 100644 --- a/loafwallet/BRWallet.swift +++ b/litewallet/BRWallet.swift @@ -37,7 +37,7 @@ class BRWallet { // the first unused external address var receiveAddress: String { - return BRWalletReceiveAddress(cPtr).description + return charInt8ToString(charArray: BRWalletReceiveAddress(cPtr).s) } // all previously genereated internal and external addresses @@ -88,9 +88,9 @@ class BRWallet { return BRWalletCreateTransaction(cPtr, forAmount, toAddress) } - // returns an unsigned transaction that satisifes the given transaction outputs - func createTxForOutputs(_ outputs: [BRTxOutput]) -> BRTxRef { - return BRWalletCreateTxForOutputs(cPtr, outputs, outputs.count) + // returns an unsigned transaction that sends the specified amount from the wallet to the given address + func createOpsTransaction(forAmount: UInt64, toAddress: String, opsFee: UInt64, opsAddress: String) -> BRTxRef? { + return BRWalletCreateOpsTransaction(cPtr, forAmount, toAddress, opsFee, opsAddress) } // signs any inputs in tx that can be signed using private keys from the wallet diff --git a/loafwallet/BartyCrouch.swift b/litewallet/BartyCrouch.swift similarity index 100% rename from loafwallet/BartyCrouch.swift rename to litewallet/BartyCrouch.swift diff --git a/loafwallet/Base.lproj/LaunchScreen.storyboard b/litewallet/Base.lproj/LaunchScreen.storyboard similarity index 71% rename from loafwallet/Base.lproj/LaunchScreen.storyboard rename to litewallet/Base.lproj/LaunchScreen.storyboard index 49766933d..a78a36743 100644 --- a/loafwallet/Base.lproj/LaunchScreen.storyboard +++ b/litewallet/Base.lproj/LaunchScreen.storyboard @@ -1,9 +1,9 @@ - + - + @@ -19,19 +19,18 @@ - - + + - - + - - + + - - + + diff --git a/loafwallet/src/Strings/Base.lproj/Localizable.strings b/litewallet/Base.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/Base.lproj/Localizable.strings rename to litewallet/Base.lproj/Localizable.strings index 52e518659..1b65724ac 100644 --- a/loafwallet/src/Strings/Base.lproj/Localizable.strings +++ b/litewallet/Base.lproj/Localizable.strings @@ -139,9 +139,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Amount to Donate:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Network Fee:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Processing time: These transactions will take %1$@ minutes to process."; @@ -643,9 +640,6 @@ /* Empty pasteboard error message */ "Send.emptyPasteboard" = "Pasteboard is empty"; -/* Network Fee: $0.01 */ -"Send.fee" = "Network Fee: %1$@"; - /* Payee identity not certified alert title. */ "Send.identityNotCertified" = "Payee identity isn't certified."; @@ -781,8 +775,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "You last wrote down your paper key on %1$@"; -/* Start view message */ -"StartViewController.message" = "The most secure and safest way to use Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "The most secure and safest way to use Litecoin."; /* Syncing view connectiong state header text */ "SyncingView.connecting" = "Connecting"; @@ -1467,3 +1461,13 @@ /* Change language alert message */ "Settings.ChangeLanguage.alertMessage" = "Are you sure you want to change the language to %l?"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Fee: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Fees: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Fees:"; + diff --git a/loafwallet/BundleExtension.swift b/litewallet/BundleExtension.swift similarity index 100% rename from loafwallet/BundleExtension.swift rename to litewallet/BundleExtension.swift diff --git a/loafwallet/BuyCenterWebViewController.swift b/litewallet/BuyCenterWebViewController.swift similarity index 100% rename from loafwallet/BuyCenterWebViewController.swift rename to litewallet/BuyCenterWebViewController.swift diff --git a/loafwallet/BuyTableViewController.swift b/litewallet/BuyTableViewController.swift similarity index 96% rename from loafwallet/BuyTableViewController.swift rename to litewallet/BuyTableViewController.swift index 47dca2520..41e936009 100644 --- a/loafwallet/BuyTableViewController.swift +++ b/litewallet/BuyTableViewController.swift @@ -48,6 +48,8 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg @IBOutlet var simplexCurrencySegmentedControl: UISegmentedControl! private var currencyCode: String = "USD" + private let uuidString: String = UIDevice.current.identifierForVendor?.uuidString ?? "" + 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 @@ -57,16 +59,16 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg vcWKVC.uuidString = uuidString vcWKVC.timestamp = Int(Date().timeIntervalSince1970) - addChildViewController(vcWKVC) + addChild(vcWKVC) view.addSubview(vcWKVC.view) - vcWKVC.didMove(toParentViewController: self) + vcWKVC.didMove(toParent: self) vcWKVC.didDismissChildView = { - for vc in self.childViewControllers { + for vc in self.children { DispatchQueue.main.async { - vc.willMove(toParentViewController: nil) + vc.willMove(toParent: nil) vc.view.removeFromSuperview() - vc.removeFromParentViewController() + vc.removeFromParent() } } } @@ -133,10 +135,6 @@ class BuyTableViewController: UITableViewController, SFSafariViewControllerDeleg simplexCellContainerView.clipsToBounds = true } - private let uuidString: String = UIDevice.current.identifierForVendor?.uuidString ?? "" - - private let currentWalletAddress: String = WalletManager.sharedInstance.wallet?.receiveAddress ?? "" - @objc private func didChangeCurrencyMoonpay() { if let code = PartnerFiatOptions(rawValue: moonpaySegmentedControl.selectedSegmentIndex)?.description { diff --git a/loafwallet/BuyWKWebViewController.swift b/litewallet/BuyWKWebViewController.swift similarity index 100% rename from loafwallet/BuyWKWebViewController.swift rename to litewallet/BuyWKWebViewController.swift diff --git a/loafwallet/CHANGELOG.md b/litewallet/CHANGELOG.md similarity index 100% rename from loafwallet/CHANGELOG.md rename to litewallet/CHANGELOG.md diff --git a/loafwallet/CardV1ToastView.swift b/litewallet/CardV1ToastView.swift similarity index 100% rename from loafwallet/CardV1ToastView.swift rename to litewallet/CardV1ToastView.swift diff --git a/litewallet/CheckboxesStepView.swift b/litewallet/CheckboxesStepView.swift new file mode 100644 index 000000000..fc49a074b --- /dev/null +++ b/litewallet/CheckboxesStepView.swift @@ -0,0 +1,35 @@ +import SafariServices +import SwiftUI + +struct CheckboxesStepView: View { + @EnvironmentObject + var viewModel: StartViewModel + + let paragraphFont: Font = .barlowSemiBold(size: 22.0) + let calloutFont: Font = .barlowLight(size: 12.0) + + let genericPad = 5.0 + + @State private var scroll = false + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + let height = geometry.size.height + + ZStack { + CreateStepConfig + .checkboxes + .backgroundColor + .edgesIgnoringSafeArea(.all) + VStack {} + .frame(width: width * 0.9) + } + } + } +} + +#Preview { + CheckboxesStepView() +} diff --git a/loafwallet/ChildViewTransitioningDelegate.swift b/litewallet/ChildViewTransitioningDelegate.swift similarity index 100% rename from loafwallet/ChildViewTransitioningDelegate.swift rename to litewallet/ChildViewTransitioningDelegate.swift diff --git a/loafwallet/Color+Extension.swift b/litewallet/Color+Extension.swift similarity index 80% rename from loafwallet/Color+Extension.swift rename to litewallet/Color+Extension.swift index 79862fab6..5b8bb0573 100644 --- a/loafwallet/Color+Extension.swift +++ b/litewallet/Color+Extension.swift @@ -6,10 +6,14 @@ extension Color { return Color(UIColor.liteWalletBlue) } - static var liteWalletDarkBlue: Color { // 163e7f + static var liteWalletDarkBlue: Color { // 0C3475 return Color(UIColor.liteWalletDarkBlue) } + static var litewalletLime: Color { // D9E76C + return Color(UIColor.litewalletLime) + } + static var litewalletLightGray: Color { // F8F8F8 return Color(UIColor.litewalletLightGray) } diff --git a/litewallet/Constant+Events.swift b/litewallet/Constant+Events.swift new file mode 100644 index 000000000..5670811fb --- /dev/null +++ b/litewallet/Constant+Events.swift @@ -0,0 +1,113 @@ +import Foundation +import UIKit + +/// Custom Event Enum: Events related to different user based actions +enum CustomEvent: String { + /// App Launched + case _20191105_AL = "app_launched" + + /// Visit Receive Controller + case _20202116_VRC = "visited_received_controller" + + /// Visit Send Controller + case _20191105_VSC = "visited_send_controller" + + /// Did Tap Buy Tab Controller + case _20191105_DTBT = "did_tap_buy_tab" + + /// Did Send LTC + case _20191105_DSL = "did_send_ltc" + + /// Did Tap Support + case _20201118_DTS = "did_tap_support" + + /// Entered dispatch group + case _20200111_DEDG = "did_enter_dispatch_group" + + /// Left dispatch group + case _20200111_DLDG = "did_leave_dispatch_group" + + /// Rate not initialized + case _20200111_RNI = "rate_not_initialized" + + /// Fee per kb not initialized + case _20200111_FNI = "feeperkb_not_initialized" + + /// Transaction not initialized + case _20200111_TNI = "transaction_not_initialized" + + /// Wallet not initialized + case _20200111_WNI = "wallet_not_initialized" + + /// Phrase not initialized + case _20200111_PNI = "phrase_not_initialized" + + /// Unable to sign transaction + case _20200111_UTST = "unable_to_sign_transaction" + + /// Generalized Error + case _20200112_ERR = "error" + + /// Keychain Lookup + case _20210804_ERR_KLF = "error_key_lookup_failure" + + /// Started resync + case _20200112_DSR = "did_start_resync" + + /// Showed review request + case _20200125_DSRR = "did_show_review_request" + + /// Unlocked in with PIN + case _20200217_DUWP = "did_unlock_with_pin" + + /// App Launched + case _20200217_DUWB = "did_unlock_with_biometrics" + + /// Did use default fee per kb + case _20200301_DUDFPK = "did_use_default_fee_per_kb" + + /// User tapped support LF + case _20201118_DTGS = "did_tap_get_support" + + /// Started IFPS Lookup + case _20201121_SIL = "started_IFPS_lookup" + + /// Resolved IPFS Address + case _20201121_DRIA = "did_resolve_IPFS_address" + + /// Failed to resolve IPFS Address + case _20201121_FRIA = "failed_resolve_IPFS_address" + + /// User tapped balance + case _20200207_DTHB = "did_tap_header_balance" + + /// Ternio API Wallet details failure + case _20210405_TAWDF = "ternio_api_wallet_details_failure" + + /// Ternio API Authenticate Enable 2FA change + case _20210804_TAA2FAC = "ternio_API_auth_2FA_change" + + /// Ternio API Wallet details success + case _20210804_TAWDS = "ternio_API_wallet_details_success" + + /// Ternio API Login + case _20210804_TAULI = "ternio_API_user_log_in" + + /// Ternio API Logout + case _20210804_TAULO = "ternio_API_user_log_out" + + /// Heartbeat check If event even happens + case _20210427_HCIEEH = "heartbeat_check_if_event_even_happens" + + /// User Tapped on UD Image + case _20220822_UTOU = "user_tapped_on_ud" + + /// User registered Pusher interest + case _20231202_RIGI = "registered_ios_general_interest" + + /// User accepted pushes + case _20231225_UAP = "user_accepted_push" + + /// User signup + case _20240101_US = "user_signup" +} diff --git a/loafwallet/ContainerViewController.swift b/litewallet/ContainerViewController.swift similarity index 100% rename from loafwallet/ContainerViewController.swift rename to litewallet/ContainerViewController.swift diff --git a/loafwallet/CopyButtonView.swift b/litewallet/CopyButtonView.swift similarity index 100% rename from loafwallet/CopyButtonView.swift rename to litewallet/CopyButtonView.swift diff --git a/litewallet/CreateStepConfiguration.swift b/litewallet/CreateStepConfiguration.swift new file mode 100644 index 000000000..5ea79edda --- /dev/null +++ b/litewallet/CreateStepConfiguration.swift @@ -0,0 +1,101 @@ +import Foundation +import SwiftUI +import UIKit + +enum CreateStepConfig { + case intro + case checkboxes + case seedPhrase + case finished + + var backgroundColor: Color { + switch self { + case .intro: + return .white + case .checkboxes: + return .white + case .seedPhrase: + return .white + case .finished: + return .white + } + } + + var mainTitle: String { + switch self { + case .intro: + return "Introduction to Litewallet" + case .checkboxes: + return "Join the Community" + case .seedPhrase: + return "Don't lose this!" + case .finished: + return "Check out your Litewallet" + } + } + + var detaiedlMessage: String { + switch self { + case .intro: + return "You will need 5 mins, a private area and way to take this information down." + case .checkboxes: + return "You will need 5 mins, a private area and way to take this information down." + case .seedPhrase: + return "You will need 5 mins, a private area and way to take this information down." + case .finished: + return "You will need 5 mins, a private area and way to take this information down." + } + } + + var extendedMessage: String { + switch self { + case .intro: + return "You will need 5 mins, a private area and way to take this information down." + case .checkboxes: + return "You will need 5 mins, a private area and way to take this information down." + case .seedPhrase: + return "You will need 5 mins, a private area and way to take this information down." + case .finished: + return "You will need 5 mins, a private area and way to take this information down." + } + } + + var bullet1: String { + switch self { + case .intro: + return "You will need 5 mins, a private area and way to take this information down." + case .checkboxes: + return "You will need 5 mins, a private area and way to take this information down." + case .seedPhrase: + return "You will need 5 mins, a private area and way to take this information down." + case .finished: + return "You will need 5 mins, a private area and way to take this information down." + } + } + + var bullet2: String { + switch self { + case .intro: + return "You will need 5 mins, a private area and way to take this information down." + case .checkboxes: + return "You will need 5 mins, a private area and way to take this information down." + case .seedPhrase: + return "You will need 5 mins, a private area and way to take this information down." + case .finished: + return "You will need 5 mins, a private area and way to take this information down." + } + } + + var bullet3: String { + switch self { + case .intro: + return "You will need 5 mins, a private area and way to take this information down." + case .checkboxes: + return "You will need 5 mins, a private area and way to take this information down." + case .seedPhrase: + return "You will need 5 mins, a private area and way to take this information down." + case .finished: + return "You will need 5 mins, a private area and way to take this information down." + } + } +} diff --git a/litewallet/CreateStepTabView.swift b/litewallet/CreateStepTabView.swift new file mode 100644 index 000000000..d37ad54cb --- /dev/null +++ b/litewallet/CreateStepTabView.swift @@ -0,0 +1,76 @@ +import SwiftUI + +struct CreateStepTabView: View { + @EnvironmentObject + var viewModel: StartViewModel + + let stepViews: [CreateStepView] + + @Environment(\.presentationMode) + var presentationMode: Binding + + init(stepViews: [CreateStepView]) { + self.stepViews = stepViews + } + + var body: some View { + GeometryReader { geometry in + let width = geometry.size.width + let height = geometry.size.height + + VStack { + ZStack { + HStack { + Image(systemName: "chevron.left") + .resizable() + .foregroundColor(.white) + .aspectRatio(contentMode: .fit) + .frame(width: 25.0, + height: 25.0) + .onTapGesture { + presentationMode + .wrappedValue + .dismiss() + viewModel.tappedIndex = 0 + } + .padding(.leading, 10.0) + Spacer() + } + + HStack { + Text(viewModel.headerTitle) + .font(.barlowBold(size: 30.0)) + .foregroundColor(.litecoinGray) + .padding([.bottom, .top], 10.00) + } + .frame(height: 25.0) + } + + TabView(selection: $viewModel.tappedIndex) { + ForEach(0 ..< stepViews.count, id: \.self) { index in + ZStack { + let currentStepView = stepViews[index] + currentStepView + .onAppear(perform: {}) + .environmentObject(viewModel) + } + .clipShape(RoundedRectangle(cornerRadius: 20.0, + style: .continuous)) + .padding(.bottom, 40.0) + } + .padding(.all, 10) + } + .frame(width: UIScreen.main.bounds.width) + .tabViewStyle(PageTabViewStyle()) + } + } + } +} + +// #Preview { +// let store = Store() +// let wallet = WalletManager(store: Store()) +// +// CreateStepTabView(stepViews: [CreateStepView(createConfig: .intro), +// CreateStepView(createConfig: .checkboxes)]) +// } diff --git a/litewallet/CreateStepView.swift b/litewallet/CreateStepView.swift new file mode 100644 index 000000000..b68fd06ab --- /dev/null +++ b/litewallet/CreateStepView.swift @@ -0,0 +1,46 @@ +import SwiftUI + +struct CreateStepView: View { + @EnvironmentObject + var viewModel: StartViewModel + + var backgroundColor: Color = .litewalletDarkBlue + var createStepConfig: CreateStepConfig = .intro + + let hugeFont = Font.barlowBold(size: 30.0) + + init(createConfig: CreateStepConfig) { + createStepConfig = createConfig + } + + var body: some View { + GeometryReader { geometry in + ZStack { + let height = geometry.size.height + let width = geometry.size.width + + createStepConfig.backgroundColor + .edgesIgnoringSafeArea(.all) + + VStack { + if createStepConfig == .intro { + IntroStepView() + .environmentObject(viewModel) + } else if createStepConfig == .checkboxes { + CheckboxesStepView() + .environmentObject(viewModel) + } else if createStepConfig == .seedPhrase { + SeedPhraseStepView() + .environmentObject(viewModel) + } else { + FinishedStepView() + } + } + } + } + } +} + +#Preview { + CreateStepView(createConfig: .intro) +} diff --git a/litewallet/CreateWalletView.swift b/litewallet/CreateWalletView.swift new file mode 100644 index 000000000..ca300ffb6 --- /dev/null +++ b/litewallet/CreateWalletView.swift @@ -0,0 +1,32 @@ +import SwiftUI +import UIKit + +struct CreateWalletView: View { + @EnvironmentObject + var viewModel: StartViewModel + + private let createStepsArray = [CreateStepView(createConfig: .intro), + CreateStepView(createConfig: .checkboxes), + CreateStepView(createConfig: .seedPhrase), + CreateStepView(createConfig: .finished)] + init() {} + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + + ZStack { + Color.litewalletBlue.edgesIgnoringSafeArea(.all) + HStack { + CreateStepTabView(stepViews: createStepsArray) + .environmentObject(viewModel) + } + } + } + } +} + +#Preview { + CreateWalletView() +} diff --git a/loafwallet/Currency.swift b/litewallet/Currency.swift similarity index 100% rename from loafwallet/Currency.swift rename to litewallet/Currency.swift diff --git a/loafwallet/src/ScanViewController.swift b/litewallet/DataValidation.swift similarity index 100% rename from loafwallet/src/ScanViewController.swift rename to litewallet/DataValidation.swift diff --git a/loafwallet/Debug-GoogleService-Info.plist b/litewallet/Debug-GoogleService-Info.plist similarity index 100% rename from loafwallet/Debug-GoogleService-Info.plist rename to litewallet/Debug-GoogleService-Info.plist diff --git a/loafwallet/DomainResolutionFailure.swift b/litewallet/DomainResolutionFailure.swift similarity index 100% rename from loafwallet/DomainResolutionFailure.swift rename to litewallet/DomainResolutionFailure.swift diff --git a/loafwallet/EmailValidation.swift b/litewallet/EmailValidation.swift similarity index 100% rename from loafwallet/EmailValidation.swift rename to litewallet/EmailValidation.swift diff --git a/loafwallet/EmptyTableViewCell.swift b/litewallet/EmptyTableViewCell.swift similarity index 100% rename from loafwallet/EmptyTableViewCell.swift rename to litewallet/EmptyTableViewCell.swift diff --git a/litewallet/EnterPhraseHostingController.swift b/litewallet/EnterPhraseHostingController.swift new file mode 100644 index 000000000..51e97e7f3 --- /dev/null +++ b/litewallet/EnterPhraseHostingController.swift @@ -0,0 +1,43 @@ +import Foundation +import SwiftUI + +class EnterPhraseHostingController: UIHostingController { + // WIP + + // EnterPhraseViewController(store: myself.store, walletManager: myself.walletManager, reason: .setSeed(myself.pushPinCreationViewForRecoveredWallet)) + + // 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) + // private let subheader = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) + // private let faq: UIButton + // private let scrollView = UIScrollView() + // private let container = UIView() + // private let moreInfoButton = UIButton(type: .system) + // let customTitle: String + + var contentView: EnterPhraseView + var store: Store + var walletManager: WalletManager + var reason: PhraseEntryReason + + // store: myself.store, walletManager: walletManager, reason: .validateForWipingWallet + + init(store: Store, walletManager: WalletManager, reason: PhraseEntryReason) { + // WIP + self.store = store + self.walletManager = walletManager + self.reason = reason + contentView = EnterPhraseView(viewModel: EnterPhraseViewModel(store: self.store, + walletManager: self.walletManager, + reason: self.reason)) + + super.init(rootView: contentView) + } + + @available(*, unavailable) + @MainActor dynamic required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/litewallet/EnterPhraseView.swift b/litewallet/EnterPhraseView.swift new file mode 100644 index 000000000..e4c7ad17c --- /dev/null +++ b/litewallet/EnterPhraseView.swift @@ -0,0 +1,10 @@ +import SwiftUI + +struct EnterPhraseView: View { + @ObservedObject + var viewModel: EnterPhraseViewModel + + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} diff --git a/litewallet/EnterPhraseViewModel.swift b/litewallet/EnterPhraseViewModel.swift new file mode 100644 index 000000000..e972f6b3d --- /dev/null +++ b/litewallet/EnterPhraseViewModel.swift @@ -0,0 +1,19 @@ +import Foundation +class EnterPhraseViewModel: ObservableObject { + // MARK: - Combine Variables + + // MARK: - Public Variables + + var store: Store + var walletManager: WalletManager + var reason: PhraseEntryReason + + init(store: Store, + walletManager: WalletManager, + reason: PhraseEntryReason) + { + self.store = store + self.walletManager = walletManager + self.reason = reason + } +} diff --git a/loafwallet/FailedAlertView.swift b/litewallet/FailedAlertView.swift similarity index 100% rename from loafwallet/FailedAlertView.swift rename to litewallet/FailedAlertView.swift diff --git a/loafwallet/FeeSelectorView.swift b/litewallet/FeeSelectorView.swift similarity index 99% rename from loafwallet/FeeSelectorView.swift rename to litewallet/FeeSelectorView.swift index 1d0a2a1ee..e6286d504 100644 --- a/loafwallet/FeeSelectorView.swift +++ b/litewallet/FeeSelectorView.swift @@ -20,6 +20,7 @@ class FeeSelector: UIView { NSLayoutConstraint.activate([bottomConstraint]) } + //: :: private let store: Store private let header = UILabel(font: .barlowMedium(size: 16.0), color: .darkText) private let subheader = UILabel(font: .barlowRegular(size: 14.0), color: .grayTextTint) diff --git a/litewallet/FinishedStepView.swift b/litewallet/FinishedStepView.swift new file mode 100644 index 000000000..c7efbcb7d --- /dev/null +++ b/litewallet/FinishedStepView.swift @@ -0,0 +1,11 @@ +import SwiftUI + +struct FinishedStepView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + FinishedStepView() +} diff --git a/loafwallet/Fonts/BarlowSemiCondensed-Bold.ttf b/litewallet/Fonts/BarlowSemiCondensed-Bold.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-Bold.ttf rename to litewallet/Fonts/BarlowSemiCondensed-Bold.ttf diff --git a/loafwallet/Fonts/BarlowSemiCondensed-Italic.ttf b/litewallet/Fonts/BarlowSemiCondensed-Italic.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-Italic.ttf rename to litewallet/Fonts/BarlowSemiCondensed-Italic.ttf diff --git a/loafwallet/Fonts/BarlowSemiCondensed-Light.ttf b/litewallet/Fonts/BarlowSemiCondensed-Light.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-Light.ttf rename to litewallet/Fonts/BarlowSemiCondensed-Light.ttf diff --git a/loafwallet/Fonts/BarlowSemiCondensed-Medium.ttf b/litewallet/Fonts/BarlowSemiCondensed-Medium.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-Medium.ttf rename to litewallet/Fonts/BarlowSemiCondensed-Medium.ttf diff --git a/loafwallet/Fonts/BarlowSemiCondensed-Regular.ttf b/litewallet/Fonts/BarlowSemiCondensed-Regular.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-Regular.ttf rename to litewallet/Fonts/BarlowSemiCondensed-Regular.ttf diff --git a/loafwallet/Fonts/BarlowSemiCondensed-SemiBold.ttf b/litewallet/Fonts/BarlowSemiCondensed-SemiBold.ttf similarity index 100% rename from loafwallet/Fonts/BarlowSemiCondensed-SemiBold.ttf rename to litewallet/Fonts/BarlowSemiCondensed-SemiBold.ttf diff --git a/loafwallet/ForgotAlertViewModel.swift b/litewallet/ForgotAlertViewModel.swift similarity index 100% rename from loafwallet/ForgotAlertViewModel.swift rename to litewallet/ForgotAlertViewModel.swift diff --git a/loafwallet/ForgotView.swift b/litewallet/ForgotView.swift similarity index 91% rename from loafwallet/ForgotView.swift rename to litewallet/ForgotView.swift index 61508faa8..49f4ddc21 100644 --- a/loafwallet/ForgotView.swift +++ b/litewallet/ForgotView.swift @@ -113,15 +113,3 @@ struct ForgotAlertView: View where Presenting: View { } } } - -struct ForgotAlertView_Previews: PreviewProvider { - static var previews: some View { - VStack { - Spacer() - Text("") - .padding(.all, 10) - .forgotPasswordView(isShowingForgot: .constant(true), emailString: .constant("efef@sec.com"), message: "Forgot message") - Spacer() - } - } -} diff --git a/loafwallet/HostingTransactionCell.swift b/litewallet/HostingTransactionCell.swift similarity index 95% rename from loafwallet/HostingTransactionCell.swift rename to litewallet/HostingTransactionCell.swift index b22351f4f..49c140057 100644 --- a/loafwallet/HostingTransactionCell.swift +++ b/litewallet/HostingTransactionCell.swift @@ -20,7 +20,7 @@ final class HostingTransactionCell: UITableViewCell { let requiresControllerMove = hostingController.parent != parentController if requiresControllerMove { - parentController.addChildViewController(hostingController) + parentController.addChild(hostingController) } if !contentView.subviews.contains(hostingController.view) { diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/Contents.json b/litewallet/Icon.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/Contents.json rename to litewallet/Icon.xcassets/AppIcon.appiconset/Contents.json diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-1.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-2.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-2.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-2.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x-2.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@3x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@3x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@3x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_20pt@3x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt-1.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt-1.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt-1.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt-1.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x-1.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@3x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@3x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@3x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_29pt@3x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x-1.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x-1.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x-1.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x-1.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x-1.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_40pt@3x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@1x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@1x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@1x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@1x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_50pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@1x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@1x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@1x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@1x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_57pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_60pt@3x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_60pt@3x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_60pt@3x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_60pt@3x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@1x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@1x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@1x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@1x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_72pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_76pt.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_76pt.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_76pt.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_76pt.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_76pt@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_76pt@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_76pt@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_76pt@2x.png diff --git a/loafwallet/Icon.xcassets/AppIcon.appiconset/icon_83.5@2x.png b/litewallet/Icon.xcassets/AppIcon.appiconset/icon_83.5@2x.png similarity index 100% rename from loafwallet/Icon.xcassets/AppIcon.appiconset/icon_83.5@2x.png rename to litewallet/Icon.xcassets/AppIcon.appiconset/icon_83.5@2x.png diff --git a/litewallet/Icon.xcassets/Contents.json b/litewallet/Icon.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/litewallet/Icon.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/loafwallet/Info.plist b/litewallet/Info.plist similarity index 100% rename from loafwallet/Info.plist rename to litewallet/Info.plist diff --git a/litewallet/IntroStepView.swift b/litewallet/IntroStepView.swift new file mode 100644 index 000000000..c73438e1e --- /dev/null +++ b/litewallet/IntroStepView.swift @@ -0,0 +1,107 @@ +import SwiftUI + +struct IntroStepView: View { + @EnvironmentObject + var viewModel: StartViewModel + + let paragraphFont: Font = .barlowBold(size: 35.0) + + let genericPad = 5.0 + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + + ZStack { + CreateStepConfig + .intro + .backgroundColor + .edgesIgnoringSafeArea(.all) + VStack { + Text(S.CreateStep.DetailedMessage.intro.localize()) + .font(paragraphFont) + .foregroundColor(.liteWalletBlue) + .frame(width: width * 0.9, alignment: .leading) + .padding([.leading, .trailing], genericPad) + .padding([.bottom], genericPad) + + Image("lofigirl") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: width * 0.9, alignment: .center) + .mask { + RoundedRectangle(cornerRadius: 12.0) + }.padding() + + Text(S.CreateStep.ExtendedMessage.intro.localize()) + .font(paragraphFont) + .foregroundColor(.liteWalletBlue) + .frame(width: width * 0.9, alignment: .leading) + .padding([.leading, .trailing], genericPad) + .padding([.bottom], genericPad) + } + .frame(width: width * 0.9) + } + } + } +} + +#Preview { + IntroStepView() +} + +// let pushOptions: UNAuthorizationOptions = [.alert, .sound, .badge] +// UNUserNotificationCenter.current().requestAuthorization(options: pushOptions) { granted, error in +// if granted { +// DispatchQueue.main.async { +// UIApplication.shared.registerForRemoteNotifications() +// } +// } +// if let error = error { +// print("[PushNotifications] - \(error.localizedDescription)") +// } +// } + +// +// func registerPushNotification(_ application: UIApplication){ +// +// UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in +// +// if granted { +// print("Notification: Granted") +// +// } else { +// print("Notification: not granted") +// +// } +// } +// +// application.registerForRemoteNotifications() +// } +// +// } + +// Button(action: { +// // +// viewModel.didTapIndex = 1 +// }) { +// ZStack { +// RoundedRectangle(cornerRadius: bigButtonCornerRadius) +// .frame(width: width * 0.6, height: 60, alignment: .center) +// .foregroundColor(.litewalletLightGray) +// .shadow(radius: 3, x: 3.0, y: 3.0) +// +// Text(S.Button.ok.localize()) +// .frame(width: width * 0.6, height: 60, alignment: .center) +// .font(paragraphFont) +// .foregroundColor(.litewalletBlue) +// .overlay( +// RoundedRectangle(cornerRadius: bigButtonCornerRadius) +// .stroke(.white, lineWidth: 2.0) +// ) +// } +// } +// .padding(.all, 8.0) + +// viewModel.updatePushPreference(didAcceptPush: didAcceptPush) diff --git a/loafwallet/Icon.xcassets/Contents.json b/litewallet/LFColorPalette.xcassets/Contents.json similarity index 100% rename from loafwallet/Icon.xcassets/Contents.json rename to litewallet/LFColorPalette.xcassets/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/buttonSelectionColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/buttonSelectionColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/buttonSelectionColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/buttonSelectionColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/headerTextColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/headerTextColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/headerTextColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/headerTextColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/inverseBackgroundViewColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/inverseBackgroundViewColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/inverseBackgroundViewColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/inverseBackgroundViewColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/inverseTextColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/inverseTextColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/inverseTextColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/inverseTextColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json similarity index 66% rename from loafwallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json index bd8829ffb..d81fe7ae9 100644 --- a/loafwallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json +++ b/litewallet/LFColorPalette.xcassets/labelTextColor.colorset/Contents.json @@ -1,23 +1,18 @@ { - "info" : { - "version" : 1, - "author" : "xcode" - }, "colors" : [ { - "idiom" : "universal", "color" : { "color-space" : "srgb", "components" : { - "red" : "0.302", "alpha" : "1.000", - "blue" : "0.310", - "green" : "0.302" + "blue" : "0x4F", + "green" : "0x4D", + "red" : "0x4D" } - } + }, + "idiom" : "universal" }, { - "idiom" : "universal", "appearances" : [ { "appearance" : "luminosity", @@ -27,15 +22,15 @@ "color" : { "color-space" : "srgb", "components" : { - "red" : "0.303", "alpha" : "1.000", "blue" : "0.308", - "green" : "0.303" + "green" : "0.303", + "red" : "0.303" } - } + }, + "idiom" : "universal" }, { - "idiom" : "universal", "appearances" : [ { "appearance" : "luminosity", @@ -45,12 +40,17 @@ "color" : { "color-space" : "srgb", "components" : { - "red" : "1.000", "alpha" : "1.000", "blue" : "1.000", - "green" : "1.000" + "green" : "1.000", + "red" : "1.000" } - } + }, + "idiom" : "universal" } - ] -} \ No newline at end of file + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/loafwallet/LFColorPalette.xcassets/lfBackgroundColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/lfBackgroundColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/lfBackgroundColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/lfBackgroundColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/mainColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/mainColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/mainColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/mainColor.colorset/Contents.json diff --git a/loafwallet/LFColorPalette.xcassets/staticWhiteColor.colorset/Contents.json b/litewallet/LFColorPalette.xcassets/staticWhiteColor.colorset/Contents.json similarity index 100% rename from loafwallet/LFColorPalette.xcassets/staticWhiteColor.colorset/Contents.json rename to litewallet/LFColorPalette.xcassets/staticWhiteColor.colorset/Contents.json diff --git a/loafwallet/LFModalReceiveQRViewController.swift b/litewallet/LFModalReceiveQRViewController.swift similarity index 95% rename from loafwallet/LFModalReceiveQRViewController.swift rename to litewallet/LFModalReceiveQRViewController.swift index 1b4ac1f36..8502a72eb 100644 --- a/loafwallet/LFModalReceiveQRViewController.swift +++ b/litewallet/LFModalReceiveQRViewController.swift @@ -24,7 +24,7 @@ class LFModalReceiveQRViewController: UIViewController { blurEffectView.frame = view.bounds blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(blurEffectView) - view.sendSubview(toBack: blurEffectView) + view.sendSubviewToBack(blurEffectView) modalView.layer.cornerRadius = 15 modalView.clipsToBounds = true diff --git a/loafwallet/LWActivityIndicator.swift b/litewallet/LWActivityIndicator.swift similarity index 87% rename from loafwallet/LWActivityIndicator.swift rename to litewallet/LWActivityIndicator.swift index e647a25cc..c2605d15d 100644 --- a/loafwallet/LWActivityIndicator.swift +++ b/litewallet/LWActivityIndicator.swift @@ -10,7 +10,7 @@ struct ActivityIndicator: UIViewRepresentable { func makeUIView(context _: UIViewRepresentableContext) -> UIActivityIndicatorView { - return UIActivityIndicatorView(activityIndicatorStyle: style) + return UIActivityIndicatorView(style: style) } func updateUIView(_ uiView: UIActivityIndicatorView, context _: UIViewRepresentableContext) diff --git a/loafwallet/LWAnalytics.swift b/litewallet/LWAnalytics.swift similarity index 100% rename from loafwallet/LWAnalytics.swift rename to litewallet/LWAnalytics.swift diff --git a/loafwallet/LanguageSelectionViewController.swift b/litewallet/LanguageSelectionViewController.swift similarity index 97% rename from loafwallet/LanguageSelectionViewController.swift rename to litewallet/LanguageSelectionViewController.swift index 5515cf539..010f8b321 100644 --- a/loafwallet/LanguageSelectionViewController.swift +++ b/litewallet/LanguageSelectionViewController.swift @@ -12,7 +12,7 @@ class LanguageSelectionViewController: UITableViewController { func setupUI() { tableView.register(SeparatorCell.self) - tableView.sectionHeaderHeight = UITableViewAutomaticDimension + tableView.sectionHeaderHeight = UITableView.automaticDimension tableView.backgroundColor = .whiteTint tableView.separatorStyle = .none diff --git a/loafwallet/LanguageSelectionViewModel.swift b/litewallet/LanguageSelectionViewModel.swift similarity index 100% rename from loafwallet/LanguageSelectionViewModel.swift rename to litewallet/LanguageSelectionViewModel.swift diff --git a/litewallet/LaunchCardHostingController.swift b/litewallet/LaunchCardHostingController.swift new file mode 100644 index 000000000..2b49710ae --- /dev/null +++ b/litewallet/LaunchCardHostingController.swift @@ -0,0 +1,16 @@ +import Foundation +import SwiftUI + +/// As litewalletBlue view that has no real elements +class LaunchCardHostingController: UIHostingController { + var contentView = LaunchView() + + init() { + super.init(rootView: contentView) + } + + @available(*, unavailable) + @MainActor dynamic required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/litewallet/LaunchView.swift b/litewallet/LaunchView.swift new file mode 100644 index 000000000..6beaa7d3b --- /dev/null +++ b/litewallet/LaunchView.swift @@ -0,0 +1,15 @@ +import SwiftUI + +struct LaunchView: View { + var body: some View { + GeometryReader { _ in + ZStack { + Color.litewalletDarkBlue.edgesIgnoringSafeArea(.all) + } + } + } +} + +#Preview { + LaunchView() +} diff --git a/loafwallet/LitewalletIconView.swift b/litewallet/LitewalletIconView.swift similarity index 100% rename from loafwallet/LitewalletIconView.swift rename to litewallet/LitewalletIconView.swift diff --git a/loafwallet/LocalWebView.swift b/litewallet/LocalWebView.swift similarity index 100% rename from loafwallet/LocalWebView.swift rename to litewallet/LocalWebView.swift diff --git a/loafwallet/LocalWebViewModel.swift b/litewallet/LocalWebViewModel.swift similarity index 100% rename from loafwallet/LocalWebViewModel.swift rename to litewallet/LocalWebViewModel.swift diff --git a/litewallet/LocaleChangeView.swift b/litewallet/LocaleChangeView.swift new file mode 100644 index 000000000..e8d4fbe5f --- /dev/null +++ b/litewallet/LocaleChangeView.swift @@ -0,0 +1,29 @@ +import SwiftUI + +struct LocaleChangeView: View { + // MARK: - Combine Variables + + @ObservedObject + var viewModel: LocaleChangeViewModel + + init(viewModel: LocaleChangeViewModel) { + self.viewModel = viewModel + } + + var body: some View { + VStack { + Text("\(S.Settings.currentLocale.localize()) \(viewModel.displayName)") + .font(Font(UIFont.barlowSemiBold(size: 18.0))) + .foregroundColor(.black) + .padding(.leading, 20) + .padding(.top, 10) + + Spacer() + } + } +} + +#Preview { + LocaleChangeView(viewModel: LocaleChangeViewModel()) + .environment(\.locale, .init(identifier: "fr")) +} diff --git a/loafwallet/LocaleChangeViewModel.swift b/litewallet/LocaleChangeViewModel.swift similarity index 100% rename from loafwallet/LocaleChangeViewModel.swift rename to litewallet/LocaleChangeViewModel.swift diff --git a/loafwallet/Localization.swift b/litewallet/Localization.swift similarity index 100% rename from loafwallet/Localization.swift rename to litewallet/Localization.swift diff --git a/litewallet/LockScreenHeaderView.swift b/litewallet/LockScreenHeaderView.swift new file mode 100644 index 000000000..d40781860 --- /dev/null +++ b/litewallet/LockScreenHeaderView.swift @@ -0,0 +1,31 @@ +import SwiftUI + +struct LockScreenHeaderView: View { + // MARK: - Combine Variables + + @ObservedObject + var viewModel: LockScreenViewModel + + init(viewModel: LockScreenViewModel) { + self.viewModel = viewModel + } + + var body: some View { + Color + .litewalletDarkBlue + .edgesIgnoringSafeArea(.all) + .overlay( + VStack { + Spacer() + Text(" 1 LTC = \(viewModel.currentValueInFiat)") + .font(Font(UIFont.barlowSemiBold(size: 16.0))) + .foregroundColor(.white) + + Text("\(S.History.currentLitecoinValue.localize()) \(viewModel.currencyCode)") + .font(Font(UIFont.barlowRegular(size: 14.0))) + .foregroundColor(.white) + .padding(.bottom, 10) + Divider().background(.white) + }) + } +} diff --git a/loafwallet/LockScreenHeaderViewModel.swift b/litewallet/LockScreenViewModel.swift similarity index 88% rename from loafwallet/LockScreenHeaderViewModel.swift rename to litewallet/LockScreenViewModel.swift index 9f5c34561..ee19d72da 100644 --- a/loafwallet/LockScreenHeaderViewModel.swift +++ b/litewallet/LockScreenViewModel.swift @@ -1,6 +1,9 @@ +import AVFoundation import Foundation +import SwiftUI +import UIKit -class LockScreenHeaderViewModel: ObservableObject, Subscriber { +class LockScreenViewModel: ObservableObject, Subscriber { // MARK: - Combine Variables @Published @@ -15,7 +18,6 @@ class LockScreenHeaderViewModel: ObservableObject, Subscriber { init(store: Store) { self.store = store - addSubscriptions() fetchCurrentPrice() } @@ -23,7 +25,7 @@ class LockScreenHeaderViewModel: ObservableObject, Subscriber { private func fetchCurrentPrice() { guard let currentRate = store?.state.currentRate else { - print("Error: Rate not fetched") + print("Error: Rate not fetched ") return } diff --git a/loafwallet/MainViewController.swift b/litewallet/MainViewController.swift similarity index 77% rename from loafwallet/MainViewController.swift rename to litewallet/MainViewController.swift index cdda0c371..a04291f98 100644 --- a/loafwallet/MainViewController.swift +++ b/litewallet/MainViewController.swift @@ -1,5 +1,6 @@ import BRCore import MachO +import PushNotifications import SwiftUI import UIKit @@ -12,10 +13,8 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg private let loginView: LoginViewController private let tempLoginView: LoginViewController private let loginTransitionDelegate = LoginTransitionDelegate() - private let welcomeTransitingDelegate = TransitioningDelegate() - private var loadingTimer: Timer? - private var didEndLoading = false + let appDelegate = UIApplication.shared.delegate as! AppDelegate var walletManager: WalletManager? { didSet { @@ -28,7 +27,6 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg loginView.shouldSelfDismiss = true present(loginView, animated: false, completion: { self.tempLoginView.remove() - self.attemptShowWelcomeView() }) } } @@ -66,17 +64,19 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg } } - NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillEnterForeground, object: nil, queue: nil) - { _ in - self.showJailbreakWarnings(isJailbroken: isJailbroken) - } + NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, + object: nil, + queue: nil) { _ in + self.showJailbreakWarnings(isJailbroken: isJailbroken) + } } - NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, object: nil, queue: nil) - { _ in - if UserDefaults.writePaperPhraseDate != nil - {} - } + NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, + object: nil, + queue: nil) { _ in + if UserDefaults.writePaperPhraseDate != nil + {} + } addSubscriptions() addAppLifecycleNotificationEvents() @@ -84,6 +84,8 @@ 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 @@ -106,6 +108,10 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg }) { _ in NSLog("US MainView Controller presented") } + + delay(4.0) { + self.appDelegate.pushNotifications.registerForRemoteNotifications() + } } private func addTemporaryStartupViews() { @@ -115,13 +121,14 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg self.tempLoginView.view.constrain(toSuperviewEdges: nil) }) } else { - let startView = StartViewController(store: self.store, didTapCreate: {}, didTapRecover: {}) - self.addChildViewController(startView, layout: { - startView.view.constrain(toSuperviewEdges: nil) - startView.view.isUserInteractionEnabled = false + // Adds a litewalletBlue card view the hides work while thread finishes + let launchView = LaunchCardHostingController() + self.addChildViewController(launchView, layout: { + launchView.view.constrain(toSuperviewEdges: nil) + launchView.view.isUserInteractionEnabled = false }) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { - startView.remove() + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + launchView.remove() } } } @@ -134,7 +141,7 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg } private func addAppLifecycleNotificationEvents() { - NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationDidBecomeActive, object: nil, queue: nil) + NotificationCenter.default.addObserver(forName: UIScene.didActivateNotification, object: nil, queue: nil) { _ in UIView.animate(withDuration: 0.1, animations: { self.blurView.alpha = 0.0 @@ -143,7 +150,7 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg }) } - NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillResignActive, object: nil, queue: nil) + NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, object: nil, queue: nil) { _ in if !self.isLoginRequired, !self.store.state.isPromptingBiometrics { self.blurView.alpha = 1.0 @@ -169,18 +176,6 @@ class MainViewController: UIViewController, Subscriber, LoginViewControllerDeleg present(alert, animated: true, completion: nil) } - private func attemptShowWelcomeView() { - if !UserDefaults.hasShownWelcome { - let welcome = WelcomeViewController() - welcome.transitioningDelegate = welcomeTransitingDelegate - welcome.modalPresentationStyle = .overFullScreen - welcome.modalPresentationCapturesStatusBarAppearance = true - welcomeTransitingDelegate.shouldShowMaskView = false - loginView.present(welcome, animated: true, completion: nil) - UserDefaults.hasShownWelcome = true - } - } - override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .fade } diff --git a/loafwallet/MockSeeds.swift b/litewallet/MockSeeds.swift similarity index 100% rename from loafwallet/MockSeeds.swift rename to litewallet/MockSeeds.swift diff --git a/loafwallet/NSNotificationNameExtension.swift b/litewallet/NSNotificationNameExtension.swift similarity index 100% rename from loafwallet/NSNotificationNameExtension.swift rename to litewallet/NSNotificationNameExtension.swift diff --git a/loafwallet/PartnerData.swift b/litewallet/PartnerData.swift similarity index 52% rename from loafwallet/PartnerData.swift rename to litewallet/PartnerData.swift index 52a95cb93..aee402e5e 100644 --- a/loafwallet/PartnerData.swift +++ b/litewallet/PartnerData.swift @@ -2,8 +2,11 @@ import Foundation import UIKit enum PartnerName { - case unstop case infura + case litewalletOps + case litewalletStart + case pusher + case pusherStaging } struct Partner { @@ -27,27 +30,14 @@ struct Partner { static func partnerKeyPath(name: PartnerName) -> String { /// Switch the config file based on the environment var filePath: String - #if Release - // Loads the release Partner Keys config file. - guard let releasePath = Bundle.main.path(forResource: "partner-keys", - ofType: "plist") - else { - return "ERROR: FILE-NOT-FOUND" - } - filePath = releasePath - #else - - // Loads the debug Partner Keys config file. - guard let debugPath = Bundle.main.path(forResource: "debug-partner-keys", - ofType: "plist") - else { - return "ERROR: FILE-NOT-FOUND" - } - - filePath = debugPath - - #endif + // Loads the release Partner Keys config file. + guard let releasePath = Bundle.main.path(forResource: "partner-keys", + ofType: "plist") + else { + return "ERROR: FILE-NOT-FOUND" + } + filePath = releasePath switch name { case .infura: @@ -62,14 +52,49 @@ struct Partner { return errorDescription } - case .unstop: + case .litewalletOps: + + if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], + let key = dictionary["litewallet-ops"] as? String + { + return key + } else { + let errorDescription = "ERROR-LITEWALLET-OPS_KEY" + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) + return errorDescription + } + case .litewalletStart: + + if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], + let key = dictionary["litewallet-start"] as? String + { + return key + } else { + let errorDescription = "ERROR-LITEWALLET-START_KEY" + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) + return errorDescription + } + + case .pusher: + + if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], + let key = dictionary["pusher-instance-id"] as? String + { + return key + } else { + let errorDescription = "ERROR-PUSHER-ID_KEY" + LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) + return errorDescription + } + + case .pusherStaging: if let dictionary = NSDictionary(contentsOfFile: filePath) as? [String: AnyObject], - let key = dictionary["change-now-api"] as? String + let key = dictionary["pusher-staging-instance-id"] as? String { return key } else { - let errorDescription = "ERROR-CHANGENOW_KEY" + let errorDescription = "ERROR-PUSHER-ID_KEY" LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["error": errorDescription]) return errorDescription } diff --git a/loafwallet/PartnersView.swift b/litewallet/PartnersView.swift similarity index 100% rename from loafwallet/PartnersView.swift rename to litewallet/PartnersView.swift diff --git a/loafwallet/PartnersViewModel.swift b/litewallet/PartnersViewModel.swift similarity index 100% rename from loafwallet/PartnersViewModel.swift rename to litewallet/PartnersViewModel.swift diff --git a/loafwallet/PromptModalViewController.swift b/litewallet/PromptModalViewController.swift similarity index 100% rename from loafwallet/PromptModalViewController.swift rename to litewallet/PromptModalViewController.swift diff --git a/loafwallet/PromptTableViewCell.swift b/litewallet/PromptTableViewCell.swift similarity index 100% rename from loafwallet/PromptTableViewCell.swift rename to litewallet/PromptTableViewCell.swift diff --git a/loafwallet/RELEASE_NOTES.md b/litewallet/RELEASE_NOTES.md similarity index 100% rename from loafwallet/RELEASE_NOTES.md rename to litewallet/RELEASE_NOTES.md diff --git a/loafwallet/ReceiveLTCViewController.swift b/litewallet/ReceiveLTCViewController.swift similarity index 100% rename from loafwallet/ReceiveLTCViewController.swift rename to litewallet/ReceiveLTCViewController.swift diff --git a/litewallet/RecoverWalletView.swift b/litewallet/RecoverWalletView.swift new file mode 100644 index 000000000..947727d33 --- /dev/null +++ b/litewallet/RecoverWalletView.swift @@ -0,0 +1,23 @@ +import SwiftUI + +struct RecoverWalletView: View { + @EnvironmentObject + var viewModel: StartViewModel + + init() {} + + var body: some View { + GeometryReader { _ in + ZStack { + Color.litewalletBlue.edgesIgnoringSafeArea(.all) + VStack { + Text("Recover") + } + } + } + } +} + +#Preview { + RecoverWalletView() +} diff --git a/loafwallet/src/ViewControllers/RequestAmountViewController.swift b/litewallet/RequestAmountViewController.swift similarity index 99% rename from loafwallet/src/ViewControllers/RequestAmountViewController.swift rename to litewallet/RequestAmountViewController.swift index 61b1b8c9e..cb865c340 100644 --- a/loafwallet/src/ViewControllers/RequestAmountViewController.swift +++ b/litewallet/RequestAmountViewController.swift @@ -1,3 +1,4 @@ +import Foundation import UIKit private let qrSize: CGSize = .init(width: 186.0, height: 186.0) @@ -12,7 +13,8 @@ class RequestAmountViewController: UIViewController { init(wallet: BRWallet, store: Store) { self.wallet = wallet - amountView = AmountViewController(store: store, isPinPadExpandedAtLaunch: true, isRequesting: true) + amountView = AmountViewController(store: store, isPinPadExpandedAtLaunch: true, hasAcceptedFees: true) + super.init(nibName: nil, bundle: nil) } @@ -238,7 +240,7 @@ class RequestAmountViewController: UIViewController { extension RequestAmountViewController: ModalDisplayable { var faqArticleId: String? { - return ArticleIds.requestAmount + return ArticleIds.nothing } var modalTitle: String { diff --git a/litewallet/SeedPhraseStepView.swift b/litewallet/SeedPhraseStepView.swift new file mode 100644 index 000000000..f964fbbac --- /dev/null +++ b/litewallet/SeedPhraseStepView.swift @@ -0,0 +1,115 @@ +import SwiftUI +import UIKit + +let seedViewWidth: CGFloat = 65.0 +let fieldViewHeight: CGFloat = 35.0 + +struct SeedPhraseStepView: View { + @EnvironmentObject + var viewModel: StartViewModel + + @State + var pinDigits: String = "" + + let paragraphFont: Font = .barlowSemiBold(size: 22.0) + + let genericPad = 5.0 + + private + let pinPad = 110.0 + + var columns: [GridItem] = [ + GridItem(.flexible(minimum: seedViewWidth)), + GridItem(.flexible(minimum: seedViewWidth)), + GridItem(.flexible(minimum: seedViewWidth)), + GridItem(.flexible(minimum: seedViewWidth)), + ] + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + let height = geometry.size.height + + ZStack { + CreateStepConfig + .seedPhrase + .backgroundColor + .edgesIgnoringSafeArea(.all) + VStack { + HStack { + Text(S.CreateStep.DetailedMessage.seedPhrase.localize()) + .font(paragraphFont) + .foregroundColor(.white) + .frame(width: width * 0.6, alignment: .leading) + .padding([.leading, .trailing], 20.0) + + Spacer() + } + .frame(width: width * 0.9) + HStack { + Spacer() + ScrollView { + LazyVGrid(columns: columns) { + ForEach(viewModel.seedWords) { word in + SeedWordView(seedWord: word) + .frame(height: fieldViewHeight) + .padding(.all, 4.0) + } + } + } + .frame(height: height * 0.3) + Spacer() + } + + PINFieldView(pinText: $viewModel.pinDigits, + pinIsFilled: $viewModel.pinIsFilled, + viewRect: $viewModel.pinViewRect) + .onReceive(viewModel.$pinDigits) { newValue in + pinDigits = newValue + } + .frame(width: width * 0.4) + .opacity(0.7) + + Spacer() + Button(action: { + hideKeyboard() + delay(0.5) { + viewModel.tappedIndex = 3 + } + }) { + HStack { + Spacer() + Image(systemName: "checkmark") + .resizable() + .frame(width: 30, + height: 30, + alignment: .center) + .padding() + } + } + } + } + .frame(width: width * 0.9) + + }.onTapGesture { + hideKeyboard() + } + } +} + +func hideKeyboard() { + UIApplication + .shared + .sendAction(#selector(UIResponder.resignFirstResponder), + to: nil, + from: nil, + for: nil) +} + +// #Preview { +// SeedPhraseStepView() +// .environmentObject(StartViewModel(store: Store(), +// walletManager: +// WalletManager(store: Store()))) +// } diff --git a/litewallet/SeedWordView.swift b/litewallet/SeedWordView.swift new file mode 100644 index 000000000..be3c17e0a --- /dev/null +++ b/litewallet/SeedWordView.swift @@ -0,0 +1,36 @@ +import Foundation +import SwiftUI + +struct SeedWord: Identifiable { + let id = UUID() + let word: String +} + +struct SeedWordView: View { + let seedWord: SeedWord + + var body: some View { + GeometryReader { _ in + + ZStack { + VStack { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(height: 45, alignment: .center) + .foregroundColor(.red) + .shadow(radius: 3, x: 3.0, y: 3.0) + + Text(seedWord.word) + .frame(height: 45, alignment: .center) + .font(.barlowSemiBold(size: 16.0)) + .foregroundColor(.black) + } + } + } + } + } +} + +#Preview { + SeedWordView(seedWord: SeedWord(word: "banana")) +} diff --git a/loafwallet/SendAddressCellView.swift b/litewallet/SendAddressCellView.swift similarity index 62% rename from loafwallet/SendAddressCellView.swift rename to litewallet/SendAddressCellView.swift index 6c1971114..acd0c550f 100644 --- a/loafwallet/SendAddressCellView.swift +++ b/litewallet/SendAddressCellView.swift @@ -6,47 +6,44 @@ struct SendAddressCellView: View { @ObservedObject var viewModel = SendAddressCellViewModel() - @State - private var didReceiveLTCfromUD: Bool = false - - @State - private var shouldDisableLookupButton: Bool = true - @State private var didStartEditing: Bool = false let actionButtonWidth: CGFloat = 45.0 - - let actionButtonA: CGFloat = 5.0 - let actionButtonB: CGFloat = 18.0 + let textFieldHeight: CGFloat = 45.0 var body: some View { GeometryReader { _ in ZStack { VStack { Spacer() + + /// Send Address Field HStack { VStack { - AddressFieldView(S.Send.enterLTCAddressLabel.localize(), text: $viewModel.addressString) + AddressFieldView(placeholder: S.Send.enterLTCAddressLabel.localize(), + text: $viewModel.addressString) .onTapGesture { didStartEditing = true } - .frame(height: 45.0, alignment: .leading) + .frame(height: textFieldHeight, alignment: .leading) } .padding(.leading, swiftUICellPadding) Spacer() - // Paste Address + /// Paste Address button Button(action: { viewModel.shouldPasteAddress?() }) { HStack { ZStack { RoundedRectangle(cornerRadius: 4) - .frame(width: actionButtonWidth, height: 30, alignment: .center) + .frame(width: actionButtonWidth, height: 30, + alignment: .center) .foregroundColor(Color(UIColor.secondaryButton)) - .shadow(color: Color(UIColor.grayTextTint), radius: 3, x: 0, y: 4).padding(.trailing, 3.0) + .shadow(color: Color(UIColor.grayTextTint), radius: 3, x: 0, y: 4) + .padding(.trailing, 3.0) Text(S.Send.pasteLabel.localize()) .frame(width: actionButtonWidth, height: 30, alignment: .center) @@ -61,7 +58,7 @@ struct SendAddressCellView: View { } } - // Scan Address + /// Scan Address Button(action: { viewModel.shouldScanAddress?() }) { @@ -70,7 +67,10 @@ struct SendAddressCellView: View { RoundedRectangle(cornerRadius: 4) .frame(width: actionButtonWidth, height: 30, alignment: .center) .foregroundColor(Color(UIColor.secondaryButton)) - .shadow(color: Color(UIColor.grayTextTint), radius: 3, x: 0, y: 4).padding(.trailing, 8.0) + .shadow(color: Color(UIColor.grayTextTint), + radius: 3, + x: 0, y: 4) + .padding(.trailing, 8.0) Text(S.Send.scanLabel.localize()) .frame(width: actionButtonWidth, height: 30, alignment: .center) @@ -89,6 +89,7 @@ struct SendAddressCellView: View { Color.white.clipShape(RoundedRectangle(cornerRadius: 8.0)) ) .padding([.leading, .trailing], swiftUICellPadding) + Spacer() } } @@ -97,22 +98,6 @@ struct SendAddressCellView: View { } } -struct SendAddressCellView_Previews: PreviewProvider { - static let viewModel = SendAddressCellViewModel() - - static var previews: some View { - Group { - SendAddressCellView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhoneSE2)) - .previewDisplayName(DeviceType.Name.iPhoneSE2) - - SendAddressCellView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone8)) - .previewDisplayName(DeviceType.Name.iPhone8) - - SendAddressCellView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone12ProMax)) - .previewDisplayName(DeviceType.Name.iPhone12ProMax) - } - } +#Preview { + SendAddressCellView(viewModel: SendAddressCellViewModel()) } diff --git a/loafwallet/SendAddressCellViewModel.swift b/litewallet/SendAddressCellViewModel.swift similarity index 85% rename from loafwallet/SendAddressCellViewModel.swift rename to litewallet/SendAddressCellViewModel.swift index 8f4fad9ea..81df08bf0 100644 --- a/loafwallet/SendAddressCellViewModel.swift +++ b/litewallet/SendAddressCellViewModel.swift @@ -6,9 +6,6 @@ class SendAddressCellViewModel: ObservableObject { @Published var addressString: String = "" - @Published - var didUpdatePaste: Bool = false - // MARK: - Public Variables var shouldPasteAddress: (() -> Void)? diff --git a/loafwallet/SendAddressHostingController.swift b/litewallet/SendAddressHostingController.swift similarity index 82% rename from loafwallet/SendAddressHostingController.swift rename to litewallet/SendAddressHostingController.swift index 81d00534c..4939d3334 100644 --- a/loafwallet/SendAddressHostingController.swift +++ b/litewallet/SendAddressHostingController.swift @@ -8,6 +8,7 @@ class SendAddressHostingController: UIHostingController { init() { addressString = contentView.viewModel.addressString + super.init(rootView: contentView) } @@ -15,8 +16,4 @@ class SendAddressHostingController: UIHostingController { @MainActor dynamic required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } - - func didUpdateAddressString() { - addressString = contentView.viewModel.addressString - } } diff --git a/loafwallet/SendButtonHostingController.swift b/litewallet/SendButtonHostingController.swift similarity index 100% rename from loafwallet/SendButtonHostingController.swift rename to litewallet/SendButtonHostingController.swift diff --git a/loafwallet/SendButtonView.swift b/litewallet/SendButtonView.swift similarity index 100% rename from loafwallet/SendButtonView.swift rename to litewallet/SendButtonView.swift diff --git a/loafwallet/SendLTCViewController.swift b/litewallet/SendLTCViewController.swift similarity index 81% rename from loafwallet/SendLTCViewController.swift rename to litewallet/SendLTCViewController.swift index 61ecdd39f..7f3405418 100644 --- a/loafwallet/SendLTCViewController.swift +++ b/litewallet/SendLTCViewController.swift @@ -4,8 +4,8 @@ import UIKit class SendLTCViewController: UIViewController { var store: Store? - override func viewDidLoad() - {} + @IBOutlet var containerView: UIView! + override func viewDidLoad() {} override func viewWillAppear(_: Bool) { guard let store = store diff --git a/litewallet/Sounds/BahasaIndonesia.mp3 b/litewallet/Sounds/BahasaIndonesia.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b6ea96ee2678d42a4bb314d6b4a04ecbc1bd7dfe GIT binary patch literal 8928 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 R{x9SE-)8yW|KtC+{~v%HY3%?2 literal 0 HcmV?d00001 diff --git a/litewallet/Sounds/Deutsch.mp3 b/litewallet/Sounds/Deutsch.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..868409d093b4b4a67adbed42bca46d1c292c97fb GIT binary patch literal 3936 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 z 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 JSKYtb{~P66Pfh>; literal 0 HcmV?d00001 diff --git "a/litewallet/Sounds/Fran\303\247ais.mp3" "b/litewallet/Sounds/Fran\303\247ais.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..4b1caa5eca59985c21dccf1328e6fee5f5b34ed6 GIT binary patch literal 3648 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 C1S38G literal 0 HcmV?d00001 diff --git a/litewallet/Sounds/Italiano.mp3 b/litewallet/Sounds/Italiano.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..be7d15b18750962fd00695bb9cae24262ab1a636 GIT binary patch literal 4416 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 literal 0 HcmV?d00001 diff --git "a/litewallet/Sounds/Portugu\303\252s.mp3" "b/litewallet/Sounds/Portugu\303\252s.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..f7d54262bd996b2956365b7e60914d3d83cb7fda GIT binary patch literal 5280 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 literal 0 HcmV?d00001 diff --git "a/litewallet/Sounds/\321\203\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260.mp3" "b/litewallet/Sounds/\321\203\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..9fc43e4d9f0b68469e15826be93063c9cb3bb403 GIT binary patch literal 5184 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 F{{ilF$iM&q literal 0 HcmV?d00001 diff --git "a/litewallet/Sounds/\344\270\255\345\234\213\344\272\272.mp3" "b/litewallet/Sounds/\344\270\255\345\234\213\344\272\272.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..b9f00f6cbbfa304d949fd2a280ff21de1a1789d5 GIT binary patch literal 5088 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 BkHP=| literal 0 HcmV?d00001 diff --git "a/litewallet/Sounds/\355\225\234\352\265\255\354\235\270.mp3" "b/litewallet/Sounds/\355\225\234\352\265\255\354\235\270.mp3" new file mode 100644 index 0000000000000000000000000000000000000000..f17488e15429e9f3e4bd9a27b3b9ec0b577cb9e3 GIT binary patch literal 4416 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 D^BFm+ literal 0 HcmV?d00001 diff --git a/loafwallet/StandardDividerView.swift b/litewallet/StandardDividerView.swift similarity index 100% rename from loafwallet/StandardDividerView.swift rename to litewallet/StandardDividerView.swift diff --git a/litewallet/StartHostingController.swift b/litewallet/StartHostingController.swift new file mode 100644 index 000000000..514241300 --- /dev/null +++ b/litewallet/StartHostingController.swift @@ -0,0 +1,21 @@ +import Foundation +import SwiftUI + +class StartHostingController: UIHostingController { + // MARK: - Private + + var viewModel: StartViewModel + + init(store: Store, walletManager: WalletManager) { + viewModel = StartViewModel(store: store, walletManager: walletManager) + + super.init(rootView: StartView(viewModel: viewModel)) + } + + // MARK: - Private + + @available(*, unavailable) + @MainActor dynamic required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/litewallet/StartViewModel.swift b/litewallet/StartViewModel.swift new file mode 100644 index 000000000..849ea475d --- /dev/null +++ b/litewallet/StartViewModel.swift @@ -0,0 +1,205 @@ +import AVFoundation +import Foundation +import SwiftUI +import UIKit + +class StartViewModel: ObservableObject { + // MARK: - Combine Variables + + @Published + var currentLanguage: LanguageSelection = .English + + @Published + var tappedIndex: Int = 0 + + @Published + var walletCreationDidFail: Bool = false + + @Published + var seedWords: [SeedWord] = [SeedWord(word: "indicate"), SeedWord(word: "material"), SeedWord(word: "property"), + SeedWord(word: "banana"), SeedWord(word: "tuition"), SeedWord(word: "lemon"), + SeedWord(word: "banana"), SeedWord(word: "tuition"), SeedWord(word: "lemon"), + SeedWord(word: "banana"), SeedWord(word: "tuition"), SeedWord(word: "surround")] + + @Published + var pinDigits = "" + + @Published + var pinIsFilled = false + + @Published + var pinViewRect = CGRect() + + @Published + var headerTitle = S.CreateStep.MainTitle.intro.localize() + + // MARK: - Public Variables + + var staticTagline = "" + var didTapCreate: (() -> Void)? + var didTapRecover: (() -> Void)? + var store: Store + var walletManager: WalletManager + + let languages: [LanguageSelection] = LanguageSelection.allCases + + init(store: Store, walletManager: WalletManager) { + self.store = store + self.walletManager = walletManager + staticTagline = taglines[0] + + // checkForWalletAndSync() + } + + /// Completion Handler process + /// 1. Create a closure var + /// 2. Create an func with an escaping closure and the signature should match the one in step 1 + /// 3. In the func make the var equal it to func signature + /// 4. The parent calls the func of this class + /// 5. The third class that is observing the class with the function triggers the var + + func userWantsToCreate(completion: @escaping () -> Void) { + didTapCreate = completion + } + + func userWantsToRecover(completion: @escaping () -> Void) { + 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() + } + } + + func speakLanguage() { + if let url = Bundle.main.url(forResource: currentLanguage.voiceFilename, withExtension: "mp3") { + var id: SystemSoundID = 0 + AudioServicesCreateSystemSoundID(url as CFURL, &id) + AudioServicesAddSystemSoundCompletion(id, nil, nil, { soundId, _ in + AudioServicesDisposeSystemSoundID(soundId) + }, nil) + AudioServicesPlaySystemSound(id) + } + } + + func setLanguage(code: String) { + UserDefaults.selectedLanguage = code + UserDefaults.standard.synchronize() + Bundle.setLanguage(code) + + DispatchQueue.main.async { + NotificationCenter.default.post(name: .languageChangedNotification, + object: nil, + userInfo: nil) + } + } + + func generateNewSeedPhrase() -> [String] { + return [""] + } + + // MARK: - Lengthy elements + + /// Set these to the bottom to make the others more readable + + let taglines: [String] = [ + "The most secure and easiest way to use Litecoin.", + "使用莱特币最安全、最简单的方式。", + "使用莱特币最安全、最简单的方式", + "La manière la plus sûre et la plus simple d'utiliser Litecoin.", + "Die sicherste Option zur Nutzung von Litecoin.", + "Cara paling aman dan termudah untuk menggunakan Litecoin.", + "Il modo più sicuro e semplice per utilizzare Litecoin.", + "最も安全にリテコインを使う手段。", + "라이트코인을 사용하는 가장 안전하고 쉬운 방법입니다.", + "A maneira mais segura e fácil de usar Litecoin.", + "Самый безопасный и простой способ использовать Litecoin", + "La forma más segura y sencilla de utilizar Litecoin", + "Litecoin kullanmanın en güvenli ve en kolay yolu.", + "Найбезпечніший і найпростіший спосіб використання Litecoin", + ] + + let alertMessage: [String] = [ + "Are you sure you want to change the language to English?", + "您确定要更改语言吗?", + "您確定要更改語言嗎?", + "Voulez-vous vraiment changer la langue?", + "Sind Sie sicher, dass Sie die Sprache auf Deutsch ändern möchten?", + "Yakin ingin mengubah bahasanya ke bahasa Indonesia?", + "Sei sicuro di voler cambiare la lingua in italiano?", + "言語を日本語に変更してもよろしいですか?", + "언어를 한국어로 변경하시겠습니까?", + "Tem certeza de que deseja alterar o idioma para português?", + "Вы уверены, что хотите сменить язык на русский?", + "¿Estás seguro de que quieres cambiar el idioma a español?", + "Dili Türkçe olarak değiştirmek istediğinizden emin misiniz?", + "Ви впевнені, що хочете змінити мову на українську?", + ] + 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/StoreReview+Extension.swift b/litewallet/StoreReview+Extension.swift new file mode 100644 index 000000000..ff156f6aa --- /dev/null +++ b/litewallet/StoreReview+Extension.swift @@ -0,0 +1,15 @@ +import StoreKit + +// Inspired by https://stackoverflow.com/questions/63953891/requestreview-was-deprecated-in-ios-14-0 +public extension SKStoreReviewController { + static func requestReviewInCurrentScene() { + if let scene = UIApplication.shared + .connectedScenes + .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene + { + DispatchQueue.main.async { + requestReview(in: scene) + } + } + } +} diff --git a/loafwallet/Storyboards/Alerts.storyboard b/litewallet/Storyboards/Alerts.storyboard similarity index 100% rename from loafwallet/Storyboards/Alerts.storyboard rename to litewallet/Storyboards/Alerts.storyboard diff --git a/loafwallet/Storyboards/Animate.storyboard b/litewallet/Storyboards/Animate.storyboard similarity index 100% rename from loafwallet/Storyboards/Animate.storyboard rename to litewallet/Storyboards/Animate.storyboard diff --git a/loafwallet/Storyboards/Buy.storyboard b/litewallet/Storyboards/Buy.storyboard similarity index 100% rename from loafwallet/Storyboards/Buy.storyboard rename to litewallet/Storyboards/Buy.storyboard diff --git a/loafwallet/Storyboards/Main.storyboard b/litewallet/Storyboards/Main.storyboard similarity index 100% rename from loafwallet/Storyboards/Main.storyboard rename to litewallet/Storyboards/Main.storyboard diff --git a/loafwallet/Storyboards/Phrase.storyboard b/litewallet/Storyboards/Phrase.storyboard similarity index 100% rename from loafwallet/Storyboards/Phrase.storyboard rename to litewallet/Storyboards/Phrase.storyboard diff --git a/loafwallet/Storyboards/Receive.storyboard b/litewallet/Storyboards/Receive.storyboard similarity index 100% rename from loafwallet/Storyboards/Receive.storyboard rename to litewallet/Storyboards/Receive.storyboard diff --git a/loafwallet/Storyboards/Send.storyboard b/litewallet/Storyboards/Send.storyboard similarity index 84% rename from loafwallet/Storyboards/Send.storyboard rename to litewallet/Storyboards/Send.storyboard index f1da24d41..6ab6c78f7 100644 --- a/loafwallet/Storyboards/Send.storyboard +++ b/litewallet/Storyboards/Send.storyboard @@ -1,9 +1,9 @@ - + - + @@ -11,13 +11,16 @@ - + - + + + + diff --git a/loafwallet/Storyboards/Settings.storyboard b/litewallet/Storyboards/Settings.storyboard similarity index 100% rename from loafwallet/Storyboards/Settings.storyboard rename to litewallet/Storyboards/Settings.storyboard diff --git a/loafwallet/Storyboards/Transactions.storyboard b/litewallet/Storyboards/Transactions.storyboard similarity index 100% rename from loafwallet/Storyboards/Transactions.storyboard rename to litewallet/Storyboards/Transactions.storyboard diff --git a/loafwallet/Storyboards/WarningConfirmation.storyboard b/litewallet/Storyboards/WarningConfirmation.storyboard similarity index 100% rename from loafwallet/Storyboards/WarningConfirmation.storyboard rename to litewallet/Storyboards/WarningConfirmation.storyboard diff --git a/loafwallet/Storyboards/XIBs/SyncProgressHeaderView.xib b/litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib similarity index 100% rename from loafwallet/Storyboards/XIBs/SyncProgressHeaderView.xib rename to litewallet/Storyboards/XIBs/SyncProgressHeaderView.xib diff --git a/loafwallet/SupportLFViewModel.swift b/litewallet/SupportLFViewModel.swift similarity index 100% rename from loafwallet/SupportLFViewModel.swift rename to litewallet/SupportLFViewModel.swift diff --git a/loafwallet/SupportLitecoinFoundationView.swift b/litewallet/SupportLitecoinFoundationView.swift similarity index 100% rename from loafwallet/SupportLitecoinFoundationView.swift rename to litewallet/SupportLitecoinFoundationView.swift diff --git a/loafwallet/SupportLitecoinFoundationViewModel.swift b/litewallet/SupportLitecoinFoundationViewModel.swift similarity index 100% rename from loafwallet/SupportLitecoinFoundationViewModel.swift rename to litewallet/SupportLitecoinFoundationViewModel.swift diff --git a/loafwallet/SupportSafariViewModel.swift b/litewallet/SupportSafariViewModel.swift similarity index 100% rename from loafwallet/SupportSafariViewModel.swift rename to litewallet/SupportSafariViewModel.swift diff --git a/loafwallet/SyncProgressHeaderView.swift b/litewallet/SyncProgressHeaderView.swift similarity index 100% rename from loafwallet/SyncProgressHeaderView.swift rename to litewallet/SyncProgressHeaderView.swift diff --git a/loafwallet/TabBarViewController.swift b/litewallet/TabBarViewController.swift similarity index 93% rename from loafwallet/TabBarViewController.swift rename to litewallet/TabBarViewController.swift index 7f3593a28..de7846f3f 100644 --- a/loafwallet/TabBarViewController.swift +++ b/litewallet/TabBarViewController.swift @@ -14,7 +14,6 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel private let largeFontSize: CGFloat = 24.0 private let smallFontSize: CGFloat = 12.0 private var hasInitialized = false - private var didLoginLitecoinCardAccount = false private let dateFormatter = DateFormatter() private let equalsLabel = UILabel(font: .barlowMedium(size: 12), color: .whiteTint) private var regularConstraints: [NSLayoutConstraint] = [] @@ -114,19 +113,10 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel private func setupViews() { walletBalanceLabel.text = S.ManageWallet.balance.localize() + ":" - if #available(iOS 11.0, *), - let backgroundColor = UIColor(named: "mainColor") - { - headerView.backgroundColor = backgroundColor - tabBar.barTintColor = backgroundColor - containerView.backgroundColor = backgroundColor - self.view.backgroundColor = backgroundColor - } else { - headerView.backgroundColor = .liteWalletBlue - tabBar.barTintColor = .liteWalletBlue - containerView.backgroundColor = .liteWalletBlue - view.backgroundColor = .liteWalletBlue - } + headerView.backgroundColor = .liteWalletBlue + tabBar.barTintColor = .liteWalletBlue + containerView.backgroundColor = .liteWalletBlue + view.backgroundColor = .liteWalletBlue } private func configurePriceLabels() { @@ -343,7 +333,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel // MARK: - Tab View Controllers Configuration switch NSStringFromClass(contentController.classForCoder) { - case "loafwallet.TransactionsViewController": + case "litewallet.TransactionsViewController": guard let transactionVC = contentController as? TransactionsViewController else { @@ -354,7 +344,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel transactionVC.walletManager = walletManager transactionVC.isLtcSwapped = store?.state.isLtcSwapped - case "loafwallet.BuyTableViewController": + case "litewallet.BuyTableViewController": guard let buyVC = contentController as? BuyTableViewController else { return @@ -362,7 +352,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel buyVC.store = store buyVC.walletManager = walletManager - case "loafwallet.SendLTCViewController": + case "litewallet.SendLTCViewController": guard let sendVC = contentController as? SendLTCViewController else { return @@ -370,7 +360,7 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel sendVC.store = store - case "loafwallet.ReceiveLTCViewController": + case "litewallet.ReceiveLTCViewController": guard let receiveVC = contentController as? ReceiveLTCViewController else { return @@ -382,17 +372,17 @@ class TabBarViewController: UIViewController, Subscriber, Trackable, UITabBarDel } exchangeRate = TransactionManager.sharedInstance.rate - addChildViewController(contentController) + addChild(contentController) contentController.view.frame = containerView.frame view.addSubview(contentController.view) - contentController.didMove(toParentViewController: self) + contentController.didMove(toParent: self) activeController = contentController } func hideContentController(contentController: UIViewController) { - contentController.willMove(toParentViewController: nil) + contentController.willMove(toParent: nil) contentController.view.removeFromSuperview() - contentController.removeFromParentViewController() + contentController.removeFromParent() } func tabBar(_: UITabBar, didSelect item: UITabBarItem) { diff --git a/loafwallet/TestnetData.swift b/litewallet/TestnetData.swift similarity index 100% rename from loafwallet/TestnetData.swift rename to litewallet/TestnetData.swift diff --git a/loafwallet/TextView+Extension.swift b/litewallet/TextView+Extension.swift similarity index 100% rename from loafwallet/TextView+Extension.swift rename to litewallet/TextView+Extension.swift diff --git a/loafwallet/TransactionCellView.swift b/litewallet/TransactionCellView.swift similarity index 100% rename from loafwallet/TransactionCellView.swift rename to litewallet/TransactionCellView.swift diff --git a/loafwallet/TransactionCellViewModel.swift b/litewallet/TransactionCellViewModel.swift similarity index 94% rename from loafwallet/TransactionCellViewModel.swift rename to litewallet/TransactionCellViewModel.swift index 4c901089a..db359b933 100644 --- a/loafwallet/TransactionCellViewModel.swift +++ b/litewallet/TransactionCellViewModel.swift @@ -76,11 +76,10 @@ class TransactionCellViewModel: ObservableObject { feeText = transaction.amountDetails(isLtcSwapped: isLtcSwapped, rate: rate, rates: [rate], maxDigits: maxDigits) addressText = String(format: transaction.direction.addressTextFormat, transaction.toAddress ?? "DEBUG-UPDATED-ADDRESS") - print("::: toAddress: \(transaction.toAddress) raw : \(transaction.rawTransaction)") if transaction.direction == .sent { directionImageText = "arrowtriangle.up.circle.fill" - directionArrowColor = Color(UIColor.litecoinOrange) + directionArrowColor = Color(UIColor.litewalletOrange) } else if transaction.direction == .received { directionImageText = "arrowtriangle.down.circle.fill" directionArrowColor = Color(UIColor.litecoinGreen) diff --git a/loafwallet/TransactionManager.swift b/litewallet/TransactionManager.swift similarity index 100% rename from loafwallet/TransactionManager.swift rename to litewallet/TransactionManager.swift diff --git a/loafwallet/TransactionModalView.swift b/litewallet/TransactionModalView.swift similarity index 100% rename from loafwallet/TransactionModalView.swift rename to litewallet/TransactionModalView.swift diff --git a/loafwallet/TransactionsViewController.swift b/litewallet/TransactionsViewController.swift similarity index 100% rename from loafwallet/TransactionsViewController.swift rename to litewallet/TransactionsViewController.swift diff --git a/loafwallet/TransactionsViewModel.swift b/litewallet/TransactionsViewModel.swift similarity index 100% rename from loafwallet/TransactionsViewModel.swift rename to litewallet/TransactionsViewModel.swift diff --git a/litewallet/TransferAmountViewModel.swift b/litewallet/TransferAmountViewModel.swift new file mode 100644 index 000000000..3519d6456 --- /dev/null +++ b/litewallet/TransferAmountViewModel.swift @@ -0,0 +1,73 @@ +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/loafwallet/UIApplication+Extension.swift b/litewallet/UIApplication+Extension.swift similarity index 100% rename from loafwallet/UIApplication+Extension.swift rename to litewallet/UIApplication+Extension.swift diff --git a/loafwallet/UITableViewExtension.swift b/litewallet/UITableViewExtension.swift similarity index 100% rename from loafwallet/UITableViewExtension.swift rename to litewallet/UITableViewExtension.swift diff --git a/loafwallet/UnsafeMutablePointerExtension.swift b/litewallet/UnsafeMutablePointerExtension.swift similarity index 100% rename from loafwallet/UnsafeMutablePointerExtension.swift rename to litewallet/UnsafeMutablePointerExtension.swift diff --git a/loafwallet/UnstoppableDomainView.swift b/litewallet/UnstoppableDomainView.swift similarity index 84% rename from loafwallet/UnstoppableDomainView.swift rename to litewallet/UnstoppableDomainView.swift index 6f1b2693c..cf5491f9f 100644 --- a/loafwallet/UnstoppableDomainView.swift +++ b/litewallet/UnstoppableDomainView.swift @@ -31,17 +31,12 @@ struct UnstoppableDomainView: View { Spacer() HStack { if viewModel.isDomainResolving { - if #available(iOS 14.0, *) { - ProgressView() - .padding(.all, swiftUICellPadding) - } else { - ActivityIndicator(isAnimating: .constant(true), style: .large) - .padding(.all, swiftUICellPadding) - } + ProgressView() + .padding(.all, swiftUICellPadding) } else { VStack { ZStack { - AddressFieldView(viewModel.placeholderString, + AddressFieldView(placeholder: viewModel.placeholderString, text: $viewModel.searchString) .onTapGesture { didStartEditing = true @@ -90,11 +85,7 @@ struct UnstoppableDomainView: View { return } - if #available(iOS 10.0, *) { - UIApplication.shared.open(url, options: [:], completionHandler: nil) - } else { - UIApplication.shared.openURL(url) - } + UIApplication.shared.open(url, options: [:], completionHandler: nil) LWAnalytics.logEventWithParameters(itemName: ._20220822_UTOU) } diff --git a/loafwallet/UnstoppableDomainViewModel.swift b/litewallet/UnstoppableDomainViewModel.swift similarity index 100% rename from loafwallet/UnstoppableDomainViewModel.swift rename to litewallet/UnstoppableDomainViewModel.swift diff --git a/loafwallet/View+Extension.swift b/litewallet/View+Extension.swift similarity index 69% rename from loafwallet/View+Extension.swift rename to litewallet/View+Extension.swift index 25c9fd9d9..11ac2db31 100644 --- a/loafwallet/View+Extension.swift +++ b/litewallet/View+Extension.swift @@ -2,21 +2,6 @@ import Foundation import SwiftUI extension View { - /// Forgot Password View Modal - /// - Parameters: - /// - isShowingForgot: Boolean to show/hide the modal - /// - emailString: Users email - /// - message: Message detail - /// - Returns: ForgotPasswordView - - func forgotPasswordView(isShowingForgot: Binding, - emailString _: Binding, - message: String) -> some View - { - loafwallet.ForgotAlertView(isShowingForgot: isShowingForgot, presenting: self, - mainMessage: message) - } - /// From Stack Overflow /// https://stackoverflow.com/questions/56760335/round-specific-corners-swiftui @@ -85,3 +70,29 @@ struct ClearButton: ViewModifier { } } } + +/// Inspired by: https://stackoverflow.com/questions/27459746/adding-space-padding-to-a-uilabel +@IBDesignable class PaddingLabel: UILabel { + @IBInspectable var topInset: CGFloat = 5.0 + @IBInspectable var bottomInset: CGFloat = 5.0 + @IBInspectable var leftInset: CGFloat = 5.0 + @IBInspectable var rightInset: CGFloat = 5.0 + + override func drawText(in rect: CGRect) { + let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset) + super.drawText(in: rect.inset(by: insets)) + } + + override var intrinsicContentSize: CGSize { + let size = super.intrinsicContentSize + return CGSize(width: size.width + leftInset + rightInset, + height: size.height + topInset + bottomInset) + } + + override var bounds: CGRect { + didSet { + // ensures this works within stack views if multi-line + preferredMaxLayoutWidth = bounds.width - (leftInset + rightInset) + } + } +} diff --git a/loafwallet/WarningConfirmationViewController.swift b/litewallet/WarningConfirmationViewController.swift similarity index 100% rename from loafwallet/WarningConfirmationViewController.swift rename to litewallet/WarningConfirmationViewController.swift diff --git a/loafwallet/WipeEmptyWalletViewController.swift b/litewallet/WipeEmptyWalletViewController.swift similarity index 100% rename from loafwallet/WipeEmptyWalletViewController.swift rename to litewallet/WipeEmptyWalletViewController.swift diff --git a/loafwallet/bitrefill_index.html b/litewallet/bitrefill_index.html similarity index 100% rename from loafwallet/bitrefill_index.html rename to litewallet/bitrefill_index.html diff --git a/loafwallet/da.lproj/BIP39Words.plist b/litewallet/de.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/da.lproj/BIP39Words.plist rename to litewallet/de.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/de.lproj/Localizable.strings b/litewallet/de.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/de.lproj/Localizable.strings rename to litewallet/de.lproj/Localizable.strings index 8015ec448..c4f47abdc 100755 --- a/loafwallet/src/Strings/de.lproj/Localizable.strings +++ b/litewallet/de.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Zu spendender Betrag:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Netzwerkgebühr:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Verarbeitungszeit: Die Bearbeitung dieser Transaktionen dauert %1$@ Minuten."; @@ -1083,9 +1080,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "Du hast dir deinen Offlineschlüssel zuletzt am %1$@ notiert"; - -/* Start view message */ -"StartViewController.message" = "Die sicherste Option zur Nutzung von Litecoin."; + +/* Start view tagline */ +"StartViewController.tagline" = "Die sicherste Option zur Nutzung von Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Unterstützung der Litecoin Foundation"; @@ -1449,3 +1446,15 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d von %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Gebühr: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Gebühren: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Gebühren:"; + + + diff --git a/loafwallet/de.lproj/BIP39Words.plist b/litewallet/en.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/de.lproj/BIP39Words.plist rename to litewallet/en.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/en.lproj/Localizable.strings b/litewallet/en.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/en.lproj/Localizable.strings rename to litewallet/en.lproj/Localizable.strings index 2413de253..592980777 100644 --- a/loafwallet/src/Strings/en.lproj/Localizable.strings +++ b/litewallet/en.lproj/Localizable.strings @@ -1084,8 +1084,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "You last wrote down your paper key on %1$@"; -/* Start view message */ -"StartViewController.message" = "The most secure and safest way to use Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "The most secure and easiest way to use Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Support the Litecoin Foundation"; @@ -1449,3 +1449,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d of %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Fee: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Fees: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Fees:"; diff --git a/loafwallet/es.lproj/BIP39Words.plist b/litewallet/es.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/es.lproj/BIP39Words.plist rename to litewallet/es.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/es.lproj/Localizable.strings b/litewallet/es.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/es.lproj/Localizable.strings rename to litewallet/es.lproj/Localizable.strings index 125935337..465f926b0 100755 --- a/loafwallet/src/Strings/es.lproj/Localizable.strings +++ b/litewallet/es.lproj/Localizable.strings @@ -167,9 +167,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Cantidad a donar:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Tarifa de la red:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Tiempo de procesamiento: estas transacciones tardarán %1$@ minutos en procesarse."; @@ -1086,8 +1083,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "La última vez que anotaste tu clave en papel fue el %1$@"; -/* Start view message */ -"StartViewController.message" = "La forma más segura de usar Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "La forma más segura y sencilla de utilizar Litecoin"; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Apoyar la Fundación Litecoin"; @@ -1451,3 +1448,13 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d de %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Tarifa: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Honorarios: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Honorarios:"; + diff --git a/loafwallet/fr.lproj/BIP39Words.plist b/litewallet/fr.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/fr.lproj/BIP39Words.plist rename to litewallet/fr.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/fr.lproj/Localizable.strings b/litewallet/fr.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/fr.lproj/Localizable.strings rename to litewallet/fr.lproj/Localizable.strings index 3c4efbf20..9a95a062a 100755 --- a/loafwallet/src/Strings/fr.lproj/Localizable.strings +++ b/litewallet/fr.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Montant à donner:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Frais de réseau :"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Temps de traitement: le traitement de ces transactions prendra %1$@ minutes."; @@ -1084,8 +1081,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "Vous avez finalement écrit votre clé de papier sur %1$@"; -/* Start view message */ -"StartViewController.message" = "La façon la plus sécurisée et sûre d'utiliser Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "La manière la plus sûre et la plus simple d'utiliser Litecoin."; + /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Soutenez la Fondation Litecoin"; @@ -1449,3 +1447,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d de %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Frais: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Frais: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Frais:"; diff --git a/loafwallet/general.css b/litewallet/general.css similarity index 100% rename from loafwallet/general.css rename to litewallet/general.css diff --git a/loafwallet/el.lproj/BIP39Words.plist b/litewallet/id.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/el.lproj/BIP39Words.plist rename to litewallet/id.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/id.lproj/Localizable.strings b/litewallet/id.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/id.lproj/Localizable.strings rename to litewallet/id.lproj/Localizable.strings index 2076b000c..95d1a995c 100644 --- a/loafwallet/src/Strings/id.lproj/Localizable.strings +++ b/litewallet/id.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Jumlah yang disumbangkan:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Biaya Jaringan:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Waktu pemrosesan: Transaksi-transaksi ini akan memakan waktu %1$@ menit untuk diproses."; @@ -1084,8 +1081,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "Terakhir Anda menuliskan kunci kertas Anda di %1$@"; -/* Start view message */ -"StartViewController.message" = "Cara paling aman dan teraman untuk menggunakan Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "Cara paling aman dan termudah untuk menggunakan Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Dukung Yayasan Litecoin"; @@ -1449,3 +1446,13 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d dari %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Biaya: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Biaya: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Biaya:"; + diff --git a/loafwallet/it.lproj/BIP39Words.plist b/litewallet/it.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/it.lproj/BIP39Words.plist rename to litewallet/it.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/it.lproj/Localizable.strings b/litewallet/it.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/it.lproj/Localizable.strings rename to litewallet/it.lproj/Localizable.strings index fc791b440..919275a56 100755 --- a/loafwallet/src/Strings/it.lproj/Localizable.strings +++ b/litewallet/it.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Importo da donare:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Costo per la rete:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Tempo di elaborazione: l'elaborazione di queste transazioni richiederà %1$@ minuti."; @@ -1084,8 +1081,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "Hai annotato la tua chiave cartacea l'ultima volta il %1$@"; -/* Start view message */ -"StartViewController.message" = "Il modo più sicuro per usare i Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "Il modo più sicuro e semplice per utilizzare Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Sostenere la Fondazione Litecoin"; @@ -1449,3 +1446,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d di %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Tassa: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Commissioni: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Commissioni:"; diff --git a/loafwallet/ja.lproj/BIP39Words.plist b/litewallet/ja.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/ja.lproj/BIP39Words.plist rename to litewallet/ja.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/ja.lproj/Localizable.strings b/litewallet/ja.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/ja.lproj/Localizable.strings rename to litewallet/ja.lproj/Localizable.strings index 28df4995e..141663d73 100755 --- a/loafwallet/src/Strings/ja.lproj/Localizable.strings +++ b/litewallet/ja.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "寄付金額:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "ネットワーク手数料:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "処理時間:これらのトランザクションの処理には %1$@ 分かかります。"; @@ -1083,9 +1080,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "あなたが最後に紙の鍵を書き留めたのは %1$@です"; - -/* Start view message */ -"StartViewController.message" = "最も安全にリテコインを使う手段。"; + +/* Start view tagline */ +"StartViewController.tagline" = "最も安全にリテコインを使う手段。"; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Litecoin基金を支援する"; @@ -1449,3 +1446,13 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%2$dの%1$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "手数料: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "料金: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "料金:"; + diff --git a/loafwallet/ko.lproj/BIP39Words.plist b/litewallet/ko.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/ko.lproj/BIP39Words.plist rename to litewallet/ko.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/ko.lproj/Localizable.strings b/litewallet/ko.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/ko.lproj/Localizable.strings rename to litewallet/ko.lproj/Localizable.strings index 381c47856..760a9b90a 100755 --- a/loafwallet/src/Strings/ko.lproj/Localizable.strings +++ b/litewallet/ko.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "기부 금액"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "네트워크 수수료:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "처리 시간 :이 거래는 % 1 $ @ 분이 소요됩니다."; @@ -1084,8 +1081,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "%1$@에 마지막으로 페이퍼 키를 작성하셨습니다."; -/* Start view message */ -"StartViewController.message" = "Litecoin을 사용하는 가장 안정되고 안전한 방법."; +/* Start view tagline */ +"StartViewController.tagline" = "라이트코인을 사용하는 가장 안전하고 쉬운 방법입니다."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "라이트 코인 재단 지원"; @@ -1449,3 +1446,14 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%2$d의 %1$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "요금: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "수수료: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "수수료:"; + + diff --git a/loafwallet/loafwallet.entitlements b/litewallet/litewallet.entitlements similarity index 74% rename from loafwallet/loafwallet.entitlements rename to litewallet/litewallet.entitlements index fc29681d7..6a9ab47f7 100644 --- a/loafwallet/loafwallet.entitlements +++ b/litewallet/litewallet.entitlements @@ -6,9 +6,5 @@ development com.apple.developer.default-data-protection NSFileProtectionComplete - com.apple.security.application-groups - - group.com.litecoin.loafwallet - diff --git a/loafwallet/en.lproj/BIP39Words.plist b/litewallet/pt.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/en.lproj/BIP39Words.plist rename to litewallet/pt.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/pt.lproj/Localizable.strings b/litewallet/pt.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/pt.lproj/Localizable.strings rename to litewallet/pt.lproj/Localizable.strings index e3bda693c..fd14d60e3 100755 --- a/loafwallet/src/Strings/pt.lproj/Localizable.strings +++ b/litewallet/pt.lproj/Localizable.strings @@ -167,9 +167,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Valor para Doar:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Comissão da rede:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Tempo de processamento: essas transações levarão %1$@ minutos para serem processadas."; @@ -1084,9 +1081,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "A última vez que escreveu a sua chave de papel foi em %1$@"; - -/* Start view message */ -"StartViewController.message" = "A forma mais protegida e segura de utilizar a Litecoin."; + +/* Start view tagline */ +"StartViewController.tagline" = "A maneira mais segura e fácil de usar Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Apoiar a Fundação Litecoin"; @@ -1450,3 +1447,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d de %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Taxa: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Tarifas: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Tarifas:"; diff --git a/loafwallet/hu.lproj/BIP39Words.plist b/litewallet/ru.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/hu.lproj/BIP39Words.plist rename to litewallet/ru.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/ru.lproj/Localizable.strings b/litewallet/ru.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/ru.lproj/Localizable.strings rename to litewallet/ru.lproj/Localizable.strings index 734f93af7..f47482cee 100755 --- a/loafwallet/src/Strings/ru.lproj/Localizable.strings +++ b/litewallet/ru.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "Сумма пожертвования:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Комиссия сети:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "Время обработки: обработка этих транзакций займет% 1 $ @ минут."; @@ -1083,9 +1080,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "Вы выписывали свой бумажный ключ в последний раз %1$@"; - -/* Start view message */ -"StartViewController.message" = "Самый надежный и безопасный способ использования биткойна."; + +/* Start view tagline */ +"StartViewController.tagline" = "Самый безопасный и простой способ использовать Litecoin"; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Поддержите фонд Litecoin"; @@ -1449,3 +1446,15 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d из %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Платеж: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Сборы: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Сборы:"; + + + diff --git a/litewallet/src/AnnounceUpdatesView.swift b/litewallet/src/AnnounceUpdatesView.swift new file mode 100644 index 000000000..3787f123c --- /dev/null +++ b/litewallet/src/AnnounceUpdatesView.swift @@ -0,0 +1,129 @@ +import PushNotifications +import SafariServices +import SwiftUI + +enum NavigateStart { + case create + case recover +} + +struct AnnounceUpdatesView: View { + @EnvironmentObject + var viewModel: StartViewModel + + @State + private var didComplete = false + + @State + private var languagePref: LanguageSelection = .English + + @FocusState private var isEmailFieldFocused: Bool + + @Binding + var didTapContinue: Bool + + let navigateStart: NavigateStart + + let paragraphFont: Font = .barlowSemiBold(size: 22.0) + let calloutFont: Font = .barlowLight(size: 12.0) + + let genericPad = 20.0 + let smallLabelPad = 15.0 + let buttonHeight = 44.0 + let pageHeight = 145.0 + let hugeFont = Font.barlowBold(size: 30.0) + let buttonLightFont: Font = .barlowLight(size: 20.0) + let buttonFont: Font = .barlowSemiBold(size: 20.0) + let appDelegate = UIApplication.shared.delegate as! AppDelegate + + init(navigateStart: NavigateStart, language: LanguageSelection, didTapContinue: Binding) { + self.navigateStart = navigateStart + languagePref = language + _didTapContinue = didTapContinue + } + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + let height = geometry.size.height + + ZStack { + Color.liteWalletDarkBlue.edgesIgnoringSafeArea(.all) + VStack { + Text(S.Notifications.emailTitle.localize()) + .font(hugeFont) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + .frame(idealHeight: buttonHeight) + .foregroundColor(.white) + .padding(.all, genericPad) + .padding(.top, height * 0.08) + + Text(S.Notifications.pitchMessage.localize()) + .font(buttonLightFont) + .kerning(0.3) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + .foregroundColor(.white) + .padding(.all, genericPad) + .onTapGesture { + isEmailFieldFocused.toggle() + } + + SignupWebView(userAction: $didComplete, + urlString: C.signupURL) + .frame(width: width) + .frame(height: pageHeight) + .edgesIgnoringSafeArea(.all) + .padding(.bottom, smallLabelPad) + .onChange(of: didComplete) { updateValue in + if updateValue { + switch navigateStart { + case .create: + viewModel.didTapCreate!() + case .recover: + viewModel.didTapRecover!() + } + } + } + + Spacer() + Button { + /// Reuse this struct for Create or Recover + switch navigateStart { + case .create: + viewModel.didTapCreate!() + case .recover: + viewModel.didTapRecover!() + } + + } label: { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(width: width * 0.9, height: 45, alignment: .center) + .foregroundColor(.litewalletDarkBlue) + + Text(S.Notifications.signupCancel.localize()) + .frame(width: width * 0.9, height: 45, alignment: .center) + .font(buttonLightFont) + .foregroundColor(.white) + .overlay( + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .stroke(.white, lineWidth: 0.5) + ) + } + } + .padding(.bottom, genericPad) + } + } + } + .edgesIgnoringSafeArea(.top) + } +} + +/// Crashes when env Obj is added +// #Preview { +// AnnounceUpdatesView(navigateStart: .create, +// didTapContinue: .constant(false)) +// } diff --git a/loafwallet/AppDelegate.swift b/litewallet/src/AppDelegate.swift similarity index 57% rename from loafwallet/AppDelegate.swift rename to litewallet/src/AppDelegate.swift index 33cf4a7d4..8ae9e44bb 100644 --- a/loafwallet/AppDelegate.swift +++ b/litewallet/src/AppDelegate.swift @@ -1,5 +1,6 @@ import Firebase import LocalAuthentication +import PushNotifications import SwiftUI import UIKit @@ -7,19 +8,9 @@ import UIKit class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? let applicationController = ApplicationController() - - func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplicationLaunchOptionsKey: Any]?) -> Bool + let pushNotifications = PushNotifications.shared + func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - UINavigationBar.appearance().tintColor = .darkText - - if #available(iOS 15, *) { - let appearance = UINavigationBarAppearance() - appearance.configureWithOpaqueBackground() - appearance.titleTextAttributes = [.foregroundColor: UIColor.darkText] - UINavigationBar.appearance().standardAppearance = appearance - UINavigationBar.appearance().scrollEdgeAppearance = appearance - } - setFirebaseConfiguration() updateCurrentUserLocale(localeId: Locale.current.identifier) @@ -36,6 +27,24 @@ class AppDelegate: UIResponder, UIApplicationDelegate { Bundle.setLanguage(UserDefaults.selectedLanguage) + // Pusher + pushNotifications.start(instanceId: Partner.partnerKeyPath(name: .pusherStaging)) + // pushNotifications.registerForRemoteNotifications() + let generaliOSInterest = "general-ios" + let debugGeneraliOSInterest = "debug-general-ios" + + try? pushNotifications + .addDeviceInterest(interest: generaliOSInterest) + try? pushNotifications + .addDeviceInterest(interest: debugGeneraliOSInterest) + + let interests = pushNotifications.getDeviceInterests()?.joined(separator: "|") ?? "" + let device = UIDevice.current.identifierForVendor?.uuidString ?? "ID" + let interestesDict: [String: String] = ["device_id": device, + "pusher_interests": interests] + + LWAnalytics.logEventWithParameters(itemName: ._20231202_RIGI, properties: interestesDict) + return true } @@ -55,17 +64,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { applicationController.willResignActive() } - func application(_: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) - { - applicationController.performFetch(completionHandler) - } - - func application(_: UIApplication, shouldAllowExtensionPointIdentifier _: UIApplicationExtensionPointIdentifier) -> 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 _: [UIApplicationOpenURLOptionsKey: Any] = [:]) -> Bool + func application(_: UIApplication, open url: URL, options _: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { return applicationController.open(url: url) } @@ -78,6 +82,21 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return true } + /// Pusher Related funcs + func application(_: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + pushNotifications.registerDeviceToken(deviceToken) + + let acceptanceDict: [String: String] = ["did_accept": "true", + "date_accepted": Date().ISO8601Format()] + LWAnalytics.logEventWithParameters(itemName: ._20231225_UAP, properties: acceptanceDict) + } + + func application(_: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], + fetchCompletionHandler _: @escaping (UIBackgroundFetchResult) -> Void) + { + pushNotifications.handleNotification(userInfo: userInfo) + } + /// Sets the correct Google Services plist file private func setFirebaseConfiguration() { // Load a Firebase debug config file. diff --git a/loafwallet/src/ApplicationController.swift b/litewallet/src/ApplicationController.swift similarity index 89% rename from loafwallet/src/ApplicationController.swift rename to litewallet/src/ApplicationController.swift index 612848e4e..2aa0e518e 100644 --- a/loafwallet/src/ApplicationController.swift +++ b/litewallet/src/ApplicationController.swift @@ -1,18 +1,20 @@ import StoreKit import UIKit -private let timeSinceLastExitKey = "TimeSinceLastExit" -private let shouldRequireLoginTimeoutKey = "ShouldRequireLoginTimeoutKey" -private let numberOfLitewalletLaunches = "NumberOfLitewalletLaunches" +let timeSinceLastExitKey = "TimeSinceLastExit" +let shouldRequireLoginTimeoutKey = "ShouldRequireLoginTimeoutKey" +let numberOfLitewalletLaunches = "NumberOfLitewalletLaunches" +let hasSeenAnnounceView = "HasSeedAnnounceView" +let LITEWALLET_APP_STORE_ID = 1_119_332_592 class ApplicationController: Subscriber, Trackable { // Ideally the window would be private, but is unfortunately required // by the UIApplicationDelegate Protocol + var window: UIWindow? fileprivate let store = Store() private var startFlowController: StartFlowPresenter? private var modalPresenter: ModalPresenter? - fileprivate var walletManager: WalletManager? private var walletCoordinator: WalletCoordinator? private var exchangeUpdater: ExchangeUpdater? @@ -53,7 +55,7 @@ class ApplicationController: Subscriber, Trackable { func launch(application: UIApplication, window: UIWindow?) { self.application = application self.window = window - application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) + application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum) setup() reachability.didChange = { isReachable in if !isReachable { @@ -164,11 +166,12 @@ class ApplicationController: Subscriber, Trackable { private func didInitWalletManager() { guard let walletManager = walletManager else { assertionFailure("WalletManager should exist!"); return } guard let rootViewController = window?.rootViewController else { return } + guard let window = window else { return } hasPerformedWalletDependentInitialization = true store.perform(action: PinLength.set(walletManager.pinLength)) walletCoordinator = WalletCoordinator(walletManager: walletManager, store: store) - modalPresenter = ModalPresenter(store: store, walletManager: walletManager, window: window!, apiClient: noAuthApiClient) + modalPresenter = ModalPresenter(store: store, walletManager: walletManager, window: window, apiClient: noAuthApiClient) exchangeUpdater = ExchangeUpdater(store: store, walletManager: walletManager) feeUpdater = FeeUpdater(walletManager: walletManager, store: store) startFlowController = StartFlowPresenter(store: store, walletManager: walletManager, rootViewController: rootViewController) @@ -182,7 +185,6 @@ class ApplicationController: Subscriber, Trackable { if UIApplication.shared.applicationState != .background { if walletManager.noWallet { - UserDefaults.hasShownWelcome = true addWalletCreationListener() store.perform(action: ShowStartFlow()) } else { @@ -201,8 +203,9 @@ class ApplicationController: Subscriber, Trackable { self?.performBackgroundFetch() } } + exchangeUpdater?.refresh(completion: { - // Update values + NSLog("Rates were updated") }) } } @@ -214,25 +217,6 @@ class ApplicationController: Subscriber, Trackable { return now - then > timeout } - private func setupDefaults() { - if UserDefaults.standard.object(forKey: shouldRequireLoginTimeoutKey) == nil { - UserDefaults.standard.set(60.0 * 3.0, forKey: shouldRequireLoginTimeoutKey) // Default 3 min timeout - } - } - - private 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 { - SKStoreReviewController.requestReview() - LWAnalytics.logEventWithParameters(itemName: ._20200125_DSRR) - } - } else { - UserDefaults.standard.set(NSNumber(value: 1), forKey: numberOfLitewalletLaunches) - } - } - private func setupRootViewController() { mainViewController = MainViewController(store: store) window?.rootViewController = mainViewController @@ -244,8 +228,9 @@ class ApplicationController: Subscriber, Trackable { feeUpdater?.refresh() defaultsUpdater?.refresh() walletManager?.apiClient?.events?.up() + exchangeUpdater?.refresh(completion: { - // Update values + NSLog("::: Refreshed fiat rates") }) } @@ -332,10 +317,4 @@ class ApplicationController: Subscriber, Trackable { self.fetchCompletionHandler = nil } } - - func willResignActive() - {} } - -extension ApplicationController -{} diff --git a/loafwallet/src/BRCore.swift b/litewallet/src/BRCore.swift similarity index 94% rename from loafwallet/src/BRCore.swift rename to litewallet/src/BRCore.swift index 7f557c852..b3e105978 100644 --- a/loafwallet/src/BRCore.swift +++ b/litewallet/src/BRCore.swift @@ -83,6 +83,30 @@ public func charInt8ToString(charArray: (CChar, CChar, CChar, CChar, CChar, CCha return String(NSString(characters: addressCharArray, length: length)) } +/// Converts String to CChar +/// - Parameter String +/// - Returns: characterArray: [CChar] +public func stringToCharArray(addressString: String) -> [CChar] { + let arrayLength = 75 + + var charArray = [CChar]() + + let stringArray = Array(addressString) + + for index in 0 ... arrayLength - 1 { + if index < stringArray.count { + let value = Int8(stringArray[index] + .unicodeScalars + .map { $0.value }.reduce(0, +)) + charArray.append(CChar(value)) + } else { + charArray.append(0) + } + } + + return charArray +} + // since iOS does not page memory to disk, all we need to do is cleanse allocated memory prior to deallocation public let secureAllocator: CFAllocator = { var context = CFAllocatorContext() diff --git a/litewallet/src/Constants/ArticleIds.swift b/litewallet/src/Constants/ArticleIds.swift new file mode 100644 index 000000000..94cfbeec1 --- /dev/null +++ b/litewallet/src/Constants/ArticleIds.swift @@ -0,0 +1,5 @@ +import Foundation + +enum ArticleIds { + static let nothing = "nothing" +} diff --git a/loafwallet/src/Constants/Constants.swift b/litewallet/src/Constants/Constants.swift similarity index 50% rename from loafwallet/src/Constants/Constants.swift rename to litewallet/src/Constants/Constants.swift index cf3b835c2..def14cb0b 100644 --- a/loafwallet/src/Constants/Constants.swift +++ b/litewallet/src/Constants/Constants.swift @@ -2,149 +2,11 @@ import UIKit let π: CGFloat = .pi let customUserAgent: String = "litewallet-ios" -let litecoinCardURL: String = "https://litecoin.dashboard.getblockcard.com/" - -/// Sets tthe wallet type, the image and the label -enum WalletType: String { - case litecoinCard - case litewallet - - var description: String { - switch self { - case .litecoinCard: - return "litecoin-front-card-border" - case .litewallet: - return "coinBlueWhite" - } - } - - var balanceLabel: String { - switch self { - case .litecoinCard: - return S.LitecoinCard.cardBalance.localize() - case .litewallet: - return S.LitecoinCard.Transfer.litewalletBalance.localize() - } - } - - var nameLabel: String { - switch self { - case .litecoinCard: - return S.LitecoinCard.name.localize() - case .litewallet: - return S.Litewallet.name.localize() - } - } -} - -/// Custom Event Enum: Events related to different user based actions -enum CustomEvent: String { - /// App Launched - case _20191105_AL = "app_launched" - - /// Visit Receive Controller - case _20202116_VRC = "visited_received_controller" - - /// Visit Send Controller - case _20191105_VSC = "visited_send_controller" - - /// Did Tap Buy Tab Controller - case _20191105_DTBT = "did_tap_buy_tab" - - /// Did Send LTC - case _20191105_DSL = "did_send_ltc" - - /// Did Tap Support - case _20201118_DTS = "did_tap_support" - - /// Entered dispatch group - case _20200111_DEDG = "did_enter_dispatch_group" - - /// Left dispatch group - case _20200111_DLDG = "did_leave_dispatch_group" - - /// Rate not initialized - case _20200111_RNI = "rate_not_initialized" - - /// Fee per kb not initialized - case _20200111_FNI = "feeperkb_not_initialized" - - /// Transaction not initialized - case _20200111_TNI = "transaction_not_initialized" - - /// Wallet not initialized - case _20200111_WNI = "wallet_not_initialized" - - /// Phrase not initialized - case _20200111_PNI = "phrase_not_initialized" - - /// Unable to sign transaction - case _20200111_UTST = "unable_to_sign_transaction" - - /// Generalized Error - case _20200112_ERR = "error" - - /// Keychain Lookup - case _20210804_ERR_KLF = "error_key_lookup_failure" - - /// Started resync - case _20200112_DSR = "did_start_resync" - - /// Showed review request - case _20200125_DSRR = "did_show_review_request" - - /// Unlocked in with PIN - case _20200217_DUWP = "did_unlock_with_pin" - - /// App Launched - case _20200217_DUWB = "did_unlock_with_biometrics" - - /// Did use default fee per kb - case _20200301_DUDFPK = "did_use_default_fee_per_kb" - - /// User tapped support LF - case _20201118_DTGS = "did_tap_get_support" - - /// Started IFPS Lookup - case _20201121_SIL = "started_IFPS_lookup" - - /// Resolved IPFS Address - case _20201121_DRIA = "did_resolve_IPFS_address" - - /// Failed to resolve IPFS Address - case _20201121_FRIA = "failed_resolve_IPFS_address" - - /// User tapped balance - case _20200207_DTHB = "did_tap_header_balance" - - /// Ternio API Wallet details failure - case _20210405_TAWDF = "ternio_api_wallet_details_failure" - - /// Ternio API Authenticate Enable 2FA change - case _20210804_TAA2FAC = "ternio_API_auth_2FA_change" - - /// Ternio API Wallet details success - case _20210804_TAWDS = "ternio_API_wallet_details_success" - - /// Ternio API Login - case _20210804_TAULI = "ternio_API_user_log_in" - - /// Ternio API Logout - case _20210804_TAULO = "ternio_API_user_log_out" - - /// Heartbeat check If event even happens - case _20210427_HCIEEH = "heartbeat_check_if_event_even_happens" - - /// User Tapped on UD Image - case _20220822_UTOU = "user_tapped_on_ud" -} +let swiftUICellPadding = 12.0 +let bigButtonCornerRadius = 15.0 struct FoundationSupport { - static let dashboard = "https://litecoinfoundation.zendesk.com/" - - /// Litecoin Foundation main donation address: MVZj7gBRwcVpa9AAWdJm8A3HqTst112eJe - /// As of Nov 14th, 2020 - static let donationLTCAddress = "MVZj7gBRwcVpa9AAWdJm8A3HqTst112eJe" + static let dashboard = "https://support.litewallet.io/" } struct APIServer { @@ -161,29 +23,13 @@ struct Padding { } } -struct DeviceType { - enum Name { - static var iPhoneSE = "iPhone SE" - static var iPhoneSE2 = "iPhone SE2" - static var iPhone7 = "iPhone 7" - static var iPhone8 = "iPhone 8" - static var iPhone8Plus = "iPhone 8+" - static var iPhoneXSMax = "iPhone Xs Max" - static var iPhone11ProMax = "iPhone 11 Pro Max" - static var iPhone12Pro = "iPhone 12 Pro" - static var iPhone12ProMax = "iPhone 12 Pro Max" - static var iPadPro = "iPad Pro (12.9-inch) (3rd generation)" - } -} - struct C { static let padding = Padding() struct Sizes { static let buttonHeight: CGFloat = 48.0 - static let sendButtonHeight: CGFloat = 65.0 + static let sendButtonHeight: CGFloat = 165.0 static let headerHeight: CGFloat = 48.0 static let largeHeaderHeight: CGFloat = 220.0 - static let logoAspectRatio: CGFloat = 125.0 / 417.0 } static var defaultTintColor: UIColor = UIView().tintColor @@ -200,6 +46,9 @@ struct C { static let supportEmail = "support@litecoinfoundation.zendesk.com" static let reviewLink = "https://itunes.apple.com/app/loafwallet-litecoin-wallet/id1119332592?action=write-review" + static let signupURL = "https://litewallet.io/mobile-signup/signup.html" + static let stagingSignupURL = "https://staging-litewallet-io.webflow.io/mobile-signup/signup" + static var standardPort: Int { return E.isTestnet ? 19335 : 9333 } diff --git a/litewallet/src/Constants/Functions.swift b/litewallet/src/Constants/Functions.swift new file mode 100644 index 000000000..7805bf290 --- /dev/null +++ b/litewallet/src/Constants/Functions.swift @@ -0,0 +1,62 @@ +import UIKit + +func guardProtected(queue: DispatchQueue, callback: @escaping () -> Void) { + DispatchQueue.main.async { + if UIApplication.shared.isProtectedDataAvailable { + callback() + } else { + var observer: Any? + observer = NotificationCenter + .default + .addObserver(forName: UIApplication.protectedDataDidBecomeAvailableNotification, + object: nil, + queue: nil, + using: { _ in + queue.async { + callback() + } + if let observer = observer { + NotificationCenter.default.removeObserver(observer) + } + }) + } + } +} + +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 +{ + return { [weak context] arguments in + guard let strongContext = context else { return } + closure(strongContext, arguments) + } +} + +/// Description: 1701029422 +func tieredOpsFee(amount: UInt64) -> UInt64 { + switch amount { + case 0 ..< 1_398_000: + return 69900 + case 1_398_000 ..< 6_991_000: + return 111_910 + case 6_991_000 ..< 27_965_000: + return 279_700 + case 27_965_000 ..< 139_820_000: + return 699_540 + case 139_820_000 ..< 279_653_600: + return 1_049_300 + case 279_653_600 ..< 699_220_000: + return 1_398_800 + case 699_220_000 ..< 1_398_440_000: + return 2_797_600 + default: + return 2_797_600 + } +} diff --git a/litewallet/src/Constants/Strings.swift b/litewallet/src/Constants/Strings.swift new file mode 100644 index 000000000..36ce677a1 --- /dev/null +++ b/litewallet/src/Constants/Strings.swift @@ -0,0 +1,724 @@ +import Foundation + +enum S { + enum CreateStep { + enum MainTitle { + static let intro = Localization(key: "MainTitle.intro", value: "Quick Start", comment: "Litewallet Quick Start") + static let checkboxes = Localization(key: "MainTitle.checkboxes", value: "Stay Connected", comment: "Stay Connected") + static let seedPhrase = Localization(key: "MainTitle.seedPhrase", value: "Protect your Litecoin!", comment: "Protect your Litecoin!") + static let finished = Localization(key: "MainTitle.finished", value: "Confirm and Go", comment: "Confirm and Go") + } + + enum DetailedMessage { + static let intro = Localization(key: "DetailedMessage.intro", value: "Take the next 5 minutes to secure your Litecoin.", comment: "Detailed message for intro") + static let checkboxes = Localization(key: "DetailedMessage.checkboxes", value: "Sign up for the push notifications to learn Litecoin news. Unsubscribe any time in Settings", comment: "Settings button label") + static let seedPhrase = Localization(key: "DetailedMessage.seedPhrase", value: "Please write this down", comment: "Warning seed phrase") + static let finished = Localization(key: "DetailedMessage.finished", value: "Settings", comment: "Settings button label") + } + + enum ExtendedMessage { + static let intro = Localization(key: "ExtendedMessage.intro", value: "Please find a private place to write down your PIN and seed phrase.", comment: "extended message") + static let checkboxes = Localization(key: "ExtendedMessage.checkboxes", value: "Enter your email to get updates about Litewallet", comment: "Email sign up website") + static let seedPhrase = Localization(key: "ExtendedMessage.seedPhrase", value: "Settings", comment: "Settings button label") + static let finished = Localization(key: "ExtendedMessage.finished", value: "Settings", comment: "Settings button label") + } + + enum Bullet1 { + static let intro = Localization(key: "Bullet1.intro", value: "Litewallet is from the Litecoin Foundation and Charlie Lee, creator of Litecoin.", comment: "") + static let checkboxes = Localization(key: "Bullet1.checkboxes", value: "Settings", comment: "Settings button label") + static let seedPhrase = Localization(key: "Bullet1.seedPhrase", value: "Settings", comment: "Settings button label") + static let finished = Localization(key: "Bullet1.finished", value: "Settings", comment: "Settings button label") + } + + enum Bullet2 { + static let intro = Localization(key: "Bullet2.intro", value: "Settings", comment: "Settings button label") + static let checkboxes = Localization(key: "Bullet2.checkboxes", value: "Settings", comment: "Settings button label") + static let seedPhrase = Localization(key: "Bullet2.seedPhrase", value: "Settings", comment: "Settings button label") + static let finished = Localization(key: "Bullet2.finished", value: "Settings", comment: "Settings button label") + } + + enum Bullet3 { + static let intro = Localization(key: "Bullet3.intro", value: "Settings", comment: "Settings button label") + static let checkboxes = Localization(key: "Bullet3.checkboxes", value: "Settings", comment: "Settings button label") + static let seedPhrase = Localization(key: "Bullet3.seedPhrase", value: "Settings", comment: "Settings button label") + static let finished = Localization(key: "Bullet3.finished", value: "Settings", comment: "Settings button label") + } + } + + enum Symbols { + static let photons = "mł" + static let lites = "ł" + static let ltc = "Ł" + static let narrowSpace = "\u{2009}" + static let lock = "\u{1F512}" + static let redX = "\u{274C}" + static func currencyButtonTitle(maxDigits: Int) -> String { + switch maxDigits { + case 2: + return "photons\(S.Symbols.narrowSpace)(m\(S.Symbols.lites))" + case 5: + return "lites\(S.Symbols.narrowSpace)(\(S.Symbols.lites))" + case 8: + return "LTC\(S.Symbols.narrowSpace)(\(S.Symbols.ltc))" + default: + return "lites\(S.Symbols.narrowSpace)(\(S.Symbols.lites))" + } + } + } + + enum Conjuction { + static let asOf = Localization(key: "Conjunction.asOf", value: "as of", comment: "as of a time or date") + } + + // MARK: - Generic Button labels + + enum Button { + static let ok = Localization(key: "Button.ok", value: "OK", comment: "OK button label") + static let cancel = Localization(key: "Button.cancel", value: "Cancel", comment: "Cancel button label") + static let settings = Localization(key: "Button.settings", value: "Settings", comment: "Settings button label") + static let submit = Localization(key: "Button.submit", value: "Submit", comment: "Settings button label") + static let ignore = Localization(key: "Button.ignore", value: "Ignore", comment: "Ignore button label") + static let yes = Localization(key: "Button.yes", value: "Yes", comment: "Yes button") + static let no = Localization(key: "Button.no", value: "No", comment: "No button") + static let send = Localization(key: "Button.send", value: "send", comment: "send button") + static let receive = Localization(key: "Button.receive", value: "receive", comment: "receive button") + static let menu = Localization(key: "Button.menu", value: "menu", comment: "menu button") + static let buy = Localization(key: "Button.buy", value: "buy", comment: "buy button") + static let resetFields = Localization(key: "Button.resetFields", value: "reset", comment: "resetFields") + } + + enum LitewalletAlert { + static let warning = Localization(key: "Alert.warning", value: "Warning", comment: "Warning alert title") + static let error = Localization(key: "Alert.error", value: "Error", comment: "Error alert title") + static let noInternet = Localization(key: "Alert.noInternet", value: "No internet connection found. Check your connection and try again.", comment: "No internet alert message") + static let corruptionError = Localization(key: "Alert.corruptionError", value: "Database Corruption Error", comment: "Corruption Error alert title") + static let corruptionMessage = Localization(key: "Alert.corruptionMessage", value: "Your local database is corrupted. Go to Settings > Blockchain: Settings > Delete Database to refresh", comment: "Corruption Error alert title") + } + + enum Scanner { + static let flashButtonLabel = Localization(key: "Scanner.flashButtonLabel", value: "Camera Flash", comment: "Scan Litecoin address camera flash toggle") + } + + enum Send { + static let title = Localization(key: "Send.title", value: "Send", comment: "Send modal title") + static let toLabel = Localization(key: "Send.toLabel", value: "To", comment: "Send money to label") + static let enterLTCAddressLabel = Localization(key: "Send.enterLTCAddress", value: "Enter LTC Address", comment: "Enter LTC Address") + static let amountLabel = Localization(key: "Send.amountLabel", value: "Amount", comment: "Send money amount label") + static let descriptionLabel = Localization(key: "Send.descriptionLabel", value: "Memo", comment: "Description for sending money label") + static let sendLabel = Localization(key: "Send.sendLabel", value: "Send", comment: "Send button label") + static let pasteLabel = Localization(key: "Send.pasteLabel", value: "Paste", comment: "Paste button label") + static let scanLabel = Localization(key: "Send.scanLabel", value: "Scan", comment: "Scan button label") + static let invalidAddressTitle = Localization(key: "Send.invalidAddressTitle", value: "Invalid Address", comment: "Invalid address alert title") + static let invalidAddressMessage = Localization(key: "Send.invalidAddressMessage", value: "The destination address is not a valid Litecoin address.", comment: "Invalid address alert message") + static let invalidAddressOnPasteboard = Localization(key: "Send.invalidAddressOnPasteboard", value: "Pasteboard does not contain a valid Litecoin address.", comment: "Invalid address on pasteboard message") + static let emptyPasteboard = Localization(key: "Send.emptyPasteboard", value: "Pasteboard is empty", comment: "Empty pasteboard error message") + static let cameraUnavailableTitle = Localization(key: "Send.cameraUnavailableTitle", value: "Litewallet is not allowed to access the camera", comment: "Camera not allowed alert title") + static let cameraUnavailableMessage = Localization(key: "Send.cameraunavailableMessage", value: "Go to Settings to allow camera access.", comment: "Camera not allowed message") + static let balance = Localization(key: "Send.balance", value: "Balance: %1$@", comment: "Balance: $4.00") + static let fee = Localization(key: "Send.fees", value: "Fees: %1$@", comment: "Fees: $0.10") + static let feeBlank = Localization(key: "Send.feeBlank", value: "Fees:", comment: "Fees: ") + static let bareFee = Localization(key: "Send.fee", value: "Fee: %1$@", comment: "Fee: $0.01") + static let containsAddress = Localization(key: "Send.containsAddress", value: "The destination is your own address. You cannot send to yourself.", comment: "Warning when sending to self.") + enum UsedAddress { + static let title = Localization(key: "Send.UsedAddress.title", value: "Address Already Used", comment: "Adress already used alert title") + static let firstLine = Localization(key: "Send.UsedAddress.firstLine", value: "Litecoin addresses are intended for single use only.", comment: "Adress already used alert message - first part") + static let secondLine = Localization(key: "Send.UsedAddress.secondLIne", value: "Re-use reduces privacy for both you and the recipient and can result in loss if the recipient doesn't directly control the address.", comment: "Adress already used alert message - second part") + } + + static let identityNotCertified = Localization(key: "Send.identityNotCertified", value: "Payee identity isn't certified.", comment: "Payee identity not certified alert title.") + static let createTransactionError = Localization(key: "Send.creatTransactionError", value: "Could not create transaction.", comment: "Could not create transaction alert title") + static let publicTransactionError = Localization(key: "Send.publishTransactionError", value: "Could not publish transaction.", comment: "Could not publish transaction alert title") + static let noAddress = Localization(key: "Send.noAddress", value: "Please enter the recipient's address.", comment: "Empty address alert message") + static let noAmount = Localization(key: "Send.noAmount", value: "Please enter an amount to send.", comment: "Emtpy amount alert message") + static let isRescanning = Localization(key: "Send.isRescanning", value: "Sending is disabled during a full rescan.", comment: "Is rescanning error message") + static let remoteRequestError = Localization(key: "Send.remoteRequestError", value: "Could not load payment request", comment: "Could not load remote request error message") + 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 { + static let title = Localization(key: "Receive.title", value: "Receive", comment: "Receive modal title") + static let emailButton = Localization(key: "Receive.emailButton", value: "Email", comment: "Share via email button label") + static let textButton = Localization(key: "Receive.textButton", value: "Text Message", comment: "Share via text message (SMS)") + static let copied = Localization(key: "Receive.copied", value: "Copied to clipboard.", comment: "Address copied message.") + static let share = Localization(key: "Receive.share", value: "Share", comment: "Share button label") + static let request = Localization(key: "Receive.request", value: "Request an Amount", comment: "Request button label") + static let barItemTitle = Localization(key: "Receive.barItemTitle", value: "Receive", comment: "Receive Bar Item Title") + } + + // MARK: - Litewallet + + enum Litewallet { + static let name = Localization(key: "Litewallet.name", value: "Litewallet", comment: "Litewallet name") + } + + enum Account { + static let loadingMessage = Localization(key: "Account.loadingMessage", value: "Loading Wallet", comment: "Loading Wallet Message") + } + + enum History { + static let barItemTitle = Localization(key: "History.barItemTitle", value: "History", comment: "History Bar Item Title") + static let currentLitecoinValue = Localization(key: "History.currentLitecoinValue", value: "History CurrentLitecoinValue", comment: "History Current Litecoin Value") + } + + enum JailbreakWarnings { + static let title = Localization(key: "JailbreakWarnings.title", value: "WARNING", comment: "Jailbreak warning title") + static let messageWithBalance = Localization(key: "JailbreakWarnings.messageWithBalance", value: "DEVICE SECURITY COMPROMISED\n Any 'jailbreak' app can access Litewallet's keychain data and steal your Litecoin! Wipe this wallet immediately and restore on a secure device.", comment: "Jailbreak warning message") + static let messageWithoutBalance = Localization(key: "JailbreakWarnings.messageWithoutBalance", value: "DEVICE SECURITY COMPROMISED\n Any 'jailbreak' app can access Litewallet's keychain data and steal your Litecoin. Please only use Litewallet on a non-jailbroken device.", comment: "Jailbreak warning message") + static let ignore = Localization(key: "JailbreakWarnings.ignore", value: "Ignore", comment: "Ignore jailbreak warning button") + static let wipe = Localization(key: "JailbreakWarnings.wipe", value: "Wipe", comment: "Wipe wallet button") + static let close = Localization(key: "JailbreakWarnings.close", value: "Close", comment: "Close app button") + } + + enum ErrorMessages { + static let emailUnavailableTitle = Localization(key: "ErrorMessages.emailUnavailableTitle", value: "Email Unavailable", comment: "Email unavailable alert title") + static let emailUnavailableMessage = Localization(key: "ErrorMessages.emailUnavailableMessage", value: "This device isn't configured to send email with the iOS mail app.", comment: "Email unavailable alert title") + static let messagingUnavailableTitle = Localization(key: "ErrorMessages.messagingUnavailableTitle", value: "Messaging Unavailable", comment: "Messaging unavailable alert title") + static let messagingUnavailableMessage = Localization(key: "ErrorMessages.messagingUnavailableMessage", value: "This device isn't configured to send messages.", comment: "Messaging unavailable alert title") + } + + enum UnlockScreen { + static let myAddress = Localization(key: "UnlockScreen.myAddress", value: "My Address", comment: "My Address button title") + static let scan = Localization(key: "UnlockScreen.scan", value: "Scan", comment: "Scan button title") + static let touchIdText = Localization(key: "UnlockScreen.touchIdText", value: "Unlock with TouchID", comment: "Unlock with TouchID accessibility label") + static let touchIdPrompt = Localization(key: "UnlockScreen.touchIdPrompt", value: "Unlock your Litewallet.", comment: "TouchID/FaceID prompt text") + static let enterPIN = Localization(key: "UnlockScreen.enterPin", value: "Enter PIN", comment: "Unlock Screen sub-header") + static let unlocked = Localization(key: "UnlockScreen.unlocked", value: "Wallet Unlocked", comment: "Wallet unlocked message") + static let disabled = Localization(key: "UnlockScreen.disabled", value: "Disabled until: %1$@", comment: "Disabled until date") + static let resetPin = Localization(key: "UnlockScreen.resetPin", value: "Reset PIN", comment: "Reset PIN with Paper Key button label.") + static let faceIdText = Localization(key: "UnlockScreen.faceIdText", value: "Unlock with FaceID", comment: "Unlock with FaceID accessibility label") + } + + enum Transaction { + static let justNow = Localization(key: "Transaction.justNow", value: "just now", comment: "Timestamp label for event that just happened") + static let invalid = Localization(key: "Transaction.invalid", value: "INVALID", comment: "Invalid transaction") + static let complete = Localization(key: "Transaction.complete", value: "Complete", comment: "Transaction complete label") + static let waiting = Localization(key: "Transaction.waiting", value: "Waiting to be confirmed. Some merchants require confirmation to complete a transaction. Estimated time: 1-2 hours.", comment: "Waiting to be confirmed string") + static let starting = Localization(key: "Transaction.starting", value: "Starting balance: %1$@", comment: "eg. Starting balance: $50.00") + static let fee = Localization(key: "Transaction.fee", value: "(%1$@ fee)", comment: "(b600 fee)") + static let ending = Localization(key: "Transaction.ending", value: "Ending balance: %1$@", comment: "eg. Ending balance: $50.00") + static let exchangeOnDaySent = Localization(key: "Transaction.exchangeOnDaySent", value: "Exchange rate when sent:", comment: "Exchange rate on date header") + static let exchangeOnDayReceived = Localization(key: "Transaction.exchangeOnDayReceived", value: "Exchange rate when received:", comment: "Exchange rate on date header") + static let receivedStatus = Localization(key: "Transaction.receivedStatus", value: "In progress: %1$@", comment: "Receive status text: 'In progress: 20%'") + static let sendingStatus = Localization(key: "Transaction.sendingStatus", value: "In progress: %1$@", comment: "Send status text: 'In progress: 20%'") + static let available = Localization(key: "Transaction.available", value: "Available to Spend", comment: "Availability status text") + static let txIDLabel = Localization(key: "Transaction.txIDLabel", value: "Transaction txID", comment: "Static TX iD Label") + static let amountDetailLabel = Localization(key: "Transaction.amountDetailLabel", value: "Transaction amount detail", comment: "Static amount Label") + static let startingAmountDetailLabel = Localization(key: "Transaction.startingAmountDetailLabel", value: "Transaction starting amount detail", comment: "Static starting amount Label") + static let endAmountDetailLabel = Localization(key: "Transaction.endAmountDetailLabel", value: "Transaction end amount detail", comment: "Static end amount Label") + static let blockHeightLabel = Localization(key: "Transaction.blockHeightLabel", value: "Transaction blockHeightLabel", comment: "Static blockHeight Label") + static let commentLabel = Localization(key: "Transaction.commentLabel", value: "Transaction comment label", comment: "Static comment Label") + } + + enum TransactionDetails { + static let title = Localization(key: "TransactionDetails.title", value: "Transaction Details", comment: "Transaction Details Title") + static let receiveModaltitle = Localization(key: "TransactionDetails.receivedModalTitle", value: "RECEIVE LTC", comment: "RECEIVE LTCTitle") + static let statusHeader = Localization(key: "TransactionDetails.statusHeader", value: "Status", comment: "Status section header") + static let commentsHeader = Localization(key: "TransactionDetails.commentsHeader", value: "Memo", comment: "Memo section header") + static let amountHeader = Localization(key: "TransactionDetails.amountHeader", value: "Amount", comment: "Amount section header") + static let emptyMessage = Localization(key: "TransactionDetails.emptyMessage", value: "Your transactions will appear here.", comment: "Empty transaction list message.") + static let txHashHeader = Localization(key: "TransactionDetails.txHashHeader", value: "Litecoin Transaction ID", comment: "Transaction ID header") + static let sentAmountDescription = Localization(key: "TransactionDetails.sentAmountDescription", value: "Sent %1@", comment: "Sent $5.00") + static let receivedAmountDescription = Localization(key: "TransactionDetails.receivedAmountDescription", value: "Received %1@", comment: "Received $5.00") + static let movedAmountDescription = Localization(key: "TransactionDetails.movedAmountDescription", value: "Moved %1@", comment: "Moved $5.00") + static let account = Localization(key: "TransactionDetails.account", value: "account", comment: "e.g. I received money from an account.") + static let sent = Localization(key: "TransactionDetails.sent", value: "Sent %1$@", comment: "Sent $5.00 (sent title 1/2)") + static let received = Localization(key: "TransactionDetails.received", value: "Received %1$@", comment: "Received $5.00 (received title 1/2)") + static let moved = Localization(key: "TransactionDetails.moved", value: "Moved %1$@", comment: "Moved $5.00") + static let to = Localization(key: "TransactionDetails.to", value: "to %1$@", comment: "[sent] to

(sent title 2/2)") + static let from = Localization(key: "TransactionDetails.from", value: "at %1$@", comment: "[received] at
(received title 2/2)") + static let blockHeightLabel = Localization(key: "TransactionDetails.blockHeightLabel", value: "Confirmed in Block", comment: "Block height label") + static let notConfirmedBlockHeightLabel = Localization(key: "TransactionDetails.notConfirmedBlockHeightLabel", value: "Not Confirmed", comment: "eg. Confirmed in Block: Not Confirmed") + static let staticTXIDLabel = Localization(key: "TransactionDetails.staticTXLabel", value: "TXID:", comment: "Label for TXID") + static let priceTimeStampLabel = Localization(key: "TransactionDetails.priceTimeStampPrefix", value: "as of", comment: "Prefix for price") + static let copyAllDetails = Localization(key: "TransactionDetails.copyAllDetails", value: "Copy all details", comment: "Copy all details") + static let copiedAll = Localization(key: "TransactionDetails.copiedAll", value: "Copied", comment: "Copied") + } + + // MARK: - Buy Center + + 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") + 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") + static let simplexTitle = Localization(key: "BuyCenter.simplexTitle", value: "Simplex", comment: "Simplex Title") + static let simplexFinancialDetails = Localization(key: "BuyCenter.simplexFinancialDetails", value: "• Get Litecoin in 5 mins!\n• Buy Litecoin via credit card\n• Passport or State ID", comment: "Simplex buy financial details") + static let changellyTitle = Localization(key: "BuyCenter.changellyTitle", value: "Changelly", comment: "Changelly Title") + static let changellyFinancialDetails = Localization(key: "BuyCenter.changellyFinancialDetails", value: "• Change Litecoin for other cryptos\n• No ID Required\n• Buy via credit card\n• Global coverage", comment: "Changelly buy financial details") + static let bitrefillTitle = Localization(key: "BuyCenter.BitrefillTitle", value: "Bitrefill", comment: "Bitrefill Title") + static let bitrefillFinancialDetails = Localization(key: "BuyCenter.bitrefillFinancialDetails", value: "• Buy gift cards\n• Refill prepaid phones\n• Steam, Amazon, Hotels.com\n• Works in 170 countries", comment: "Bitrefill buy financial details") + } + + static let barItemTitle = Localization(key: "BuyCenter.barItemTitle", value: "Buy", comment: "Buy Bar Item Title") + } + + // MARK: - Security Center + + enum SecurityCenter { + static let title = Localization(key: "SecurityCenter.title", value: "Security Center", comment: "Security Center Title") + static let info = Localization(key: "SecurityCenter.info", value: "Enable all security features for maximum protection.", comment: "Security Center Info") + enum Cells { + static let pinTitle = Localization(key: "SecurityCenter.pinTitle", value: "6-Digit PIN", comment: "PIN button title") + static let pinDescription = Localization(key: "SecurityCenter.pinDescription", value: "Protects your Litewallet from unauthorized users.", comment: "PIN button description") + static let touchIdTitle = Localization(key: "SecurityCenter.touchIdTitle", value: "Touch ID", comment: "Touch ID button title") + static let touchIdDescription = Localization(key: "SecurityCenter.touchIdDescription", value: "Conveniently unlock your Litewallet and send money up to a set limit.", comment: "Touch ID/FaceID button description") + static let paperKeyTitle = Localization(key: "SecurityCenter.paperKeyTitle", value: "Paper Key", comment: "Paper Key button title") + static let paperKeyDescription = Localization(key: "SecurityCenter.paperKeyDescription", value: "The only way to access your Litecoin if you lose or upgrade your phone.", comment: "Paper Key button description") + static let faceIdTitle = Localization(key: "SecurityCenter.faceIdTitle", value: "Face ID", comment: "Face ID button title") + } + } + + enum UpdatePin { + static let updateTitle = Localization(key: "UpdatePin.updateTitle", value: "Update PIN", comment: "Update PIN title") + static let createTitle = Localization(key: "UpdatePin.createTitle", value: "Set PIN", comment: "Update PIN title") + static let createTitleConfirm = Localization(key: "UpdatePin.createTitleConfirm", value: "Re-Enter PIN", comment: "Update PIN title") + static let createInstruction = Localization(key: "UpdatePin.createInstruction", value: "Your PIN will be used to unlock your Litewallet and send money.", comment: "PIN creation info.") + static let enterCurrent = Localization(key: "UpdatePin.enterCurrent", value: "Enter your current PIN.", comment: "Enter current PIN instruction") + static let enterNew = Localization(key: "UpdatePin.enterNew", value: "Enter your new PIN.", comment: "Enter new PIN instruction") + static let reEnterNew = Localization(key: "UpdatePin.reEnterNew", value: "Re-Enter your new PIN.", comment: "Re-Enter new PIN instruction") + static let caption = Localization(key: "UpdatePin.caption", value: "Remember this PIN. If you forget it, you won't be able to access your Litecoin.", comment: "Update PIN caption text") + static let setPinErrorTitle = Localization(key: "UpdatePin.setPinErrorTitle", value: "Update PIN Error", comment: "Update PIN failure alert view title") + static let setPinError = Localization(key: "UpdatePin.setPinError", value: "Sorry, could not update PIN.", comment: "Update PIN failure error message.") + } + + enum RecoverWallet { + static let next = Localization(key: "RecoverWallet.next", value: "Next", comment: "Next button label") + static let intro = Localization(key: "RecoverWallet.intro", value: "Recover your Litewallet with your paper key.", comment: "Recover wallet intro") + static let leftArrow = Localization(key: "RecoverWallet.leftArrow", value: "Left Arrow", comment: "Previous button accessibility label") + static let rightArrow = Localization(key: "RecoverWallet.rightArrow", value: "Right Arrow", comment: "Next button accessibility label") + static let done = Localization(key: "RecoverWallet.done", value: "Done", comment: "Done button text") + static let instruction = Localization(key: "RecoverWallet.instruction", value: "Enter Paper Key", comment: "Enter paper key instruction") + static let header = Localization(key: "RecoverWallet.header", value: "Recover Wallet", comment: "Recover wallet header") + static let subheader = Localization(key: "RecoverWallet.subheader", value: "Enter the paper key for the wallet you want to recover.", comment: "Recover wallet sub-header") + + static let headerResetPin = Localization(key: "RecoverWallet.header_reset_pin", value: "Reset PIN", comment: "Reset PIN with paper key: header") + static let subheaderResetPin = Localization(key: "RecoverWallet.subheader_reset_pin", value: "To reset your PIN, enter the words from your paper key into the boxes below.", comment: "Reset PIN with paper key: sub-header") + static let resetPinInfo = Localization(key: "RecoverWallet.reset_pin_more_info", value: "Tap here for more information.", comment: "Reset PIN with paper key: more information button.") + static let invalid = Localization(key: "RecoverWallet.invalid", value: "The paper key you entered is invalid. Please double-check each word and try again.", comment: "Invalid paper key message") + } + + enum ManageWallet { + static let title = Localization(key: "ManageWallet.title", value: "Manage Wallet", comment: "Manage wallet modal title") + static let textFieldLabel = Localization(key: "ManageWallet.textFeildLabel", value: "Wallet Name", comment: "Change Wallet name textfield label") + static let description = Localization(key: "ManageWallet.description", value: "Your wallet name only appears in your account transaction history and cannot be seen by anyone else.", comment: "Manage wallet description text") + static let creationDatePrefix = Localization(key: "ManageWallet.creationDatePrefix", value: "You created your wallet on %1$@", comment: "Wallet creation date prefix") + static let balance = Localization(key: "ManageWallet.balance", value: "Balance", comment: "Balance") + } + + enum AccountHeader { + static let defaultWalletName = Localization(key: "AccountHeader.defaultWalletName", value: "My Litewallet", comment: "Default wallet name") + static let manageButtonName = Localization(key: "AccountHeader.manageButtonName", value: "MANAGE", comment: "Manage wallet button title") + } + + enum VerifyPin { + static let title = Localization(key: "VerifyPin.title", value: "PIN Required", comment: "Verify PIN view title") + static let continueBody = Localization(key: "VerifyPin.continueBody", value: "Please enter your PIN to continue.", comment: "Verify PIN view body") + static let authorize = Localization(key: "VerifyPin.authorize", value: "Please enter your PIN to authorize this transaction.", comment: "Verify PIN for transaction view body") + static let touchIdMessage = Localization(key: "VerifyPin.touchIdMessage", value: "Authorize this transaction", comment: "Authorize transaction with touch id message") + } + + enum TouchIdSettings { + static let title = Localization(key: "TouchIdSettings.title", value: "Touch ID", comment: "Touch ID settings view title") + static let label = Localization(key: "TouchIdSettings.label", value: "Use your fingerprint to unlock your Litewallet and send money up to a set limit.", comment: "Touch Id screen label") + static let switchLabel = Localization(key: "TouchIdSettings.switchLabel", value: "Enable Touch ID for Litewallet", comment: "Touch id switch label.") + static let unavailableAlertTitle = Localization(key: "TouchIdSettings.unavailableAlertTitle", value: "Touch ID Not Set Up", comment: "Touch ID unavailable alert title") + static let unavailableAlertMessage = Localization(key: "TouchIdSettings.unavailableAlertMessage", value: "You have not set up Touch ID on this device. Go to Settings->Touch ID & Passcode to set it up now.", comment: "Touch ID unavailable alert message") + static let spendingLimit = Localization(key: "TouchIdSettings.spendingLimit", value: "Spending limit: %1$@ (%2$@)", comment: "Spending Limit: b100,000 ($100)") + static let limitValue = Localization(key: "TouchIdSettings.limitValue", value: "%1$@ (%2$@)", comment: " ł100,000 ($100)") + static let customizeText = Localization(key: "TouchIdSettings.customizeText", value: "You can customize your Touch ID spending limit from the %1$@.", comment: "You can customize your Touch ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button]") + static let linkText = Localization(key: "TouchIdSettings.linkText", value: "Touch ID Spending Limit Screen", comment: "Link Text (see TouchIdSettings.customizeText)") + } + + enum FaceIDSettings { + static let title = Localization(key: "FaceIDSettings.title", value: "Face ID", comment: "Face ID settings view title") + static let label = Localization(key: "FaceIDSettings.label", value: "Use your face to unlock your Litewallet and send money up to a set limit.", comment: "Face ID screen label") + static let switchLabel = Localization(key: "FaceIDSettings.switchLabel", value: "Enable Face ID for Litewallet", comment: "Face id switch label.") + static let unavailableAlertTitle = Localization(key: "FaceIDSettings.unavailableAlertTitle", value: "Face ID Not Set Up", comment: "Face ID unavailable alert title") + static let unavailableAlertMessage = Localization(key: "FaceIDSettings.unavailableAlertMessage", value: "You have not set up Face ID on this device. Go to Settings->Face ID & Passcode to set it up now.", comment: "Face ID unavailable alert message") + static let customizeText = Localization(key: "FaceIDSettings.customizeText", value: "You can customize your Face ID spending limit from the %1$@.", comment: "You can customize your Face ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button]") + static let linkText = Localization(key: "FaceIDSettings.linkText", value: "Face ID Spending Limit Screen", comment: "Link Text (see TouchIdSettings.customizeText)") + } + + enum SpendingLimit { + static let titleLabel = Localization(key: "SpendingLimit.title", value: "Current Spending Limit: ", comment: "Current spending limit:") + } + + enum TouchIdSpendingLimit { + static let title = Localization(key: "TouchIdSpendingLimit.title", value: "Touch ID Spending Limit", comment: "Touch Id spending limit screen title") + static let body = Localization(key: "TouchIdSpendingLimit.body", value: "You will be asked to enter your 6-digit PIN to send any transaction over your spending limit, and every 48 hours since the last time you entered your 6-digit PIN.", comment: "Touch ID spending limit screen body") + static let requirePasscode = Localization(key: "TouchIdSpendingLimit", value: "Always require passcode", comment: "Always require passcode option") + } + + enum FaceIdSpendingLimit { + static let title = Localization(key: "FaceIDSpendingLimit.title", value: "Face ID Spending Limit", comment: "Face Id spending limit screen title") + } + + // MARK: - Settings + + enum Settings { + static let title = Localization(key: "Settings.title", value: "Settings", comment: "Settings title") + static let wallet = Localization(key: "Settings.wallet", value: "Wallet", comment: "Wallet Settings section header") + static let manage = Localization(key: "Settings.manage", value: "Manage", comment: "Manage settings section header") + static let support = Localization(key: "Settings.support", value: "Support", comment: "Support settings section header") + static let blockchain = Localization(key: "Settings.blockchain", value: "Blockchain", comment: "Blockchain settings section header") + static let importTile = Localization(key: "Settings.importTitle", value: "Import Wallet", comment: "Import wallet label") + static let notifications = Localization(key: "Settings.notifications", value: "Notifications", comment: "Notifications label") + static let touchIdLimit = Localization(key: "Settings.touchIdLimit", value: "Touch ID Spending Limit", comment: "Touch ID spending limit label") + static let currency = Localization(key: "Settings.currency", value: "Display Currency", comment: "Default currency label") + static let sync = Localization(key: "Settings.sync", value: "Sync Blockchain", comment: "Sync blockchain label") + static let shareData = Localization(key: "Settings.shareData", value: "Share Anonymous Data", comment: "Share anonymous data label") + static let earlyAccess = Localization(key: "Settings.earlyAccess", value: "Join Early Access", comment: "Join Early access label") + static let about = Localization(key: "Settings.about", value: "About", comment: "About label") + static let review = Localization(key: "Settings.review", value: "Leave us a Review", comment: "Leave review button label") + static let enjoying = Localization(key: "Settings.enjoying", value: "Are you enjoying Litewallet?", comment: "Are you enjoying Litewallet alert message body") + static let wipe = Localization(key: "Settings.wipe", value: "Start/Recover Another Wallet", comment: "Start or recover another wallet menu label.") + static let advancedTitle = Localization(key: "Settings.advancedTitle", value: "Advanced Settings", comment: "Advanced Settings title") + static let faceIdLimit = Localization(key: "Settings.faceIdLimit", value: "Face ID Spending Limit", comment: "Face ID spending limit label") + static let languages = Localization(key: "Settings.languages", value: "Languages", comment: "Languages label") + static let litewalletVersion = Localization(key: "Settings.litewallet.version", value: "Litewallet Version:", comment: "Litewallet version") + static let litewalletEnvironment = Localization(key: "Settings.litewallet.environment", value: "Litewallet Environment:", comment: "Litewallet environment") + static let socialLinks = Localization(key: "Settings.socialLinks", value: "Social Links:", comment: "Litewallet Social links") + static let litewalletPartners = Localization(key: "Settings.litewallet.partners", value: "Litewallet Partners:", comment: "Litewallet Partners") + static let currentLocale = Localization(key: "Settings.currentLocale", value: "Current Locale:", comment: "Current Locale") + static let changeLanguageMessage = Localization(key: "Settings.ChangeLanguage.alertMessage", value: nil, comment: nil) + } + + enum About { + static let title = Localization(key: "About.title", value: "About", comment: "About screen title") + static let blog = Localization(key: "About.blog", value: "Website", comment: "About screen website label") + static let twitter = Localization(key: "About.twitter", value: "Twitter", comment: "About screen twitter label") + static let reddit = Localization(key: "About.reddit", value: "Reddit", comment: "About screen reddit label") + static let privacy = Localization(key: "About.privacy", value: "Privacy Policy", comment: "Privay Policy button label") + static let footer = Localization(key: "About.footer", value: "Made by the LiteWallet Team\nof the\nLitecoin Foundation\n%1$@", comment: "About screen footer") + } + + enum Notifications { + static let emailTitle = Localization(key: "Notifications.emailTitle", value: "Don't a miss a thing!", comment: "Email title") + static let pitchMessage = Localization(key: "Notifications.pitchMessage", value: "Sign up to hear about updates & contests from the Litewallet team!\nAccept notifications to get live news, price & market information!", comment: "Pitch to get user to sign up") + static let emailLabel = Localization(key: "Notifications.emailLabel", value: "Email address", comment: "Email address label") + static let emailPlaceholder = Localization(key: "Notifications.emailPlaceholder", value: "Enter here", comment: "Email address placeholder") + static let languagePreference = Localization(key: "Notifications.languagePreference", value: "Preferred language:", comment: "Language preference label") + static let signupCancel = Localization(key: "Notifications.signupCancel", value: "No, thanks", comment: "Signup cancel") + } + + enum DefaultCurrency { + static let rateLabel = Localization(key: "DefaultCurrency.rateLabel", value: "Exchange Rate", comment: "Exchange rate label") + static let bitcoinLabel = Localization(key: "DefaultCurrency.bitcoinLabel", value: "Litecoin Display Unit", comment: "Litecoin denomination picker label") + static let chooseFiatLabel = Localization(key: "DefaultCurrency.chooseFiatLabel", value: "Choose Fiat:", comment: "Label to pick fiat") + } + + enum SyncingView { + static let syncing = Localization(key: "SyncingView.syncing", value: "Syncing", comment: "Syncing view syncing state header text") + static let connecting = Localization(key: "SyncingView.connecting", value: "Connecting", comment: "Syncing view connectiong state header text") + } + + enum SyncingHeader { + static let syncing = Localization(key: "SyncingHeader.syncing", value: "Syncing...", comment: "Syncing view syncing state header text") + static let connecting = Localization(key: "SyncingHeader.connecting", value: "Connecting...", comment: "Syncing view connection state header text") + static let success = Localization(key: "SyncingHeader.success", value: "Success!", comment: "Syncing header success state header text") + static let rescanning = Localization(key: "SyncingHeader.rescan", value: "Rescanning...*", comment: "Rescanning header success state header text") + } + + enum ReScan { + static let header = Localization(key: "ReScan.header", value: "Sync Blockchain", comment: "Sync Blockchain view header") + static let subheader1 = Localization(key: "ReScan.subheader1", value: "Estimated time", comment: "Subheader label") + static let subheader2 = Localization(key: "ReScan.subheader2", value: "When to Sync?", comment: "Subheader label") + static let body1 = Localization(key: "ReScan.body1", value: "20-45 minutes", comment: "extimated time") + static let body2 = Localization(key: "ReScan.body2", value: "If a transaction shows as completed on the Litecoin network but not in your Litewallet.", comment: "Syncing explanation") + static let body3 = Localization(key: "ReScan.body3", value: "You repeatedly get an error saying your transaction was rejected.", comment: "Syncing explanation") + static let buttonTitle = Localization(key: "ReScan.buttonTitle", value: "Start Sync", comment: "Start Sync button label") + static let footer = Localization(key: "ReScan.footer", value: "You will not be able to send money while syncing with the blockchain.", comment: "Sync blockchain view footer") + static let alertTitle = Localization(key: "ReScan.alertTitle", value: "Sync with Blockchain?", comment: "Alert message title") + static let alertMessage = Localization(key: "ReScan.alertMessage", value: "You will not be able to send money while syncing.", comment: "Alert message body") + static let alertAction = Localization(key: "ReScan.alertAction", value: "Sync", comment: "Alert action button label") + } + + enum ShareData { + static let header = Localization(key: "ShareData.header", value: "Share Data?", comment: "Share data header") + static let body = Localization(key: "ShareData.body", value: "Help improve Litewallet by sharing your anonymous data with us. This does not include any financial information. We respect your financial privacy.", comment: "Share data view body") + static let toggleLabel = Localization(key: "ShareData.toggleLabel", value: "Share Anonymous Data?", comment: "Share data switch label.") + } + + enum ConfirmPaperPhrase { + static let word = Localization(key: "ConfirmPaperPhrase.word", value: "Word #%1$@", comment: "Word label eg. Word #1, Word #2") + static let label = Localization(key: "ConfirmPaperPhrase.label", value: "To make sure everything was written down correctly, please enter the following words from your paper key.", comment: "Confirm paper phrase view label.") + static let error = Localization(key: "ConfirmPaperPhrase.error", value: "The words entered do not match your paper key. Please try again.", comment: "Confirm paper phrase error message") + } + + enum StartPaperPhrase { + static let body = Localization(key: "StartPaperPhrase.body", value: "Your paper key is the only way to restore your Litewallet if your mobile is unavailable.\n No one in the Litecoin Foundation team can give this paper key to you!\n\nWe will show you a list of words to write down on a piece of paper and keep safe.\n\nPLEASE MAKE BACKUPS AND DON'T LOSE IT!", comment: "Paper key explanation text.") + static let buttonTitle = Localization(key: "StartPaperPhrase.buttonTitle", value: "Write Down Paper Key", comment: "button label") + static let againButtonTitle = Localization(key: "StartPaperPhrase.againButtonTitle", value: "Write Down Paper Key Again", comment: "button label") + static let date = Localization(key: "StartPaperPhrase.date", value: "You last wrote down your paper key on %1$@", comment: "Argument is date") + } + + enum WritePaperPhrase { + static let instruction = Localization(key: "WritePaperPhrase.instruction", value: "Write down each word in order and store it in a safe place.", comment: "Paper key instructions.") + static let step = Localization(key: "WritePaperPhrase.step", value: "%1$d of %2$d", comment: "1 of 3") + static let next = Localization(key: "WritePaperPhrase.next", value: "Next", comment: "button label") + static let previous = Localization(key: "WritePaperPhrase.previous", value: "Previous", comment: "button label") + } + + enum TransactionDirection { + static let to = Localization(key: "TransactionDirection.to", value: "Sent to this Address", comment: "(this transaction was) Sent to this address:") + static let received = Localization(key: "TransactionDirection.address", value: "Received at this Address", comment: "(this transaction was) Received at this address:") + } + + enum RequestAnAmount { + static let title = Localization(key: "RequestAnAmount.title", value: "Request an Amount", comment: "Request a specific amount of Litecoin") + static let noAmount = Localization(key: "RequestAnAmount.noAmount", value: "Please enter an amount first.", comment: "No amount entered error message.") + } + + // MARK: - Security Alerts + + enum SecurityAlerts { + static let pinSet = Localization(key: "Alerts.pinSet", value: "PIN Set", comment: "Alert Header label (the PIN was set)") + static let paperKeySet = Localization(key: "Alerts.paperKeySet", value: "Paper Key Set", comment: "Alert Header Label (the paper key was set)") + static let sendSuccess = Localization(key: "Alerts.sendSuccess", value: "Send Confirmation", comment: "Send success alert header label (confirmation that the send happened)") + static let resolvedSuccess = Localization(key: "Alerts.resolvedSuccess", value: "Resolved Success", comment: "Resolved Success") + static let resolvedSuccessSubheader = Localization(key: "Alerts.resolvedSuccessSubheader", value: "Resolved", comment: "Resolved Success subheader") + static let sendFailure = Localization(key: "Alerts.sendFailure", value: "Send failed", comment: "Send failure alert header label (the send failed to happen)") + static let paperKeySetSubheader = Localization(key: "Alerts.paperKeySetSubheader", value: "Awesome!", comment: "Alert Subheader label (playfully positive)") + static let sendSuccessSubheader = Localization(key: "Alerts.sendSuccessSubheader", value: "Money Sent!", comment: "Send success alert subheader label (e.g. the money was sent)") + static let copiedAddressesHeader = Localization(key: "Alerts.copiedAddressesHeader", value: "Addresses Copied", comment: "'the addresses were copied'' Alert title") + static let copiedAddressesSubheader = Localization(key: "Alerts.copiedAddressesSubheader", value: "All wallet addresses successfully copied.", comment: "Addresses Copied Alert sub header") + } + + enum MenuButton { + static let security = Localization(key: "MenuButton.security", value: "Security Center", comment: "Menu button title") + static let support = Localization(key: "MenuButton.customer.support", value: "Customer support", comment: "Menu button title") + static let settings = Localization(key: "MenuButton.settings", value: "Settings", comment: "Menu button title") + static let lock = Localization(key: "MenuButton.lock", value: "Lock Wallet", comment: "Menu button title") + static let buy = Localization(key: "MenuButton.buy", value: "Buy Litecoin", comment: "Buy Litecoin title") + } + + enum MenuViewController { + static let modalTitle = Localization(key: "MenuViewController.modalTitle", value: "Menu", comment: "Menu modal title") + } + + enum StartViewController { + static let createButton = Localization(key: "MenuViewController.createButton", value: "Create New Wallet", comment: "button label") + static let recoverButton = Localization(key: "MenuViewController.recoverButton", value: "Recover Wallet", comment: "button label") + static let tagline = Localization(key: "StartViewController.tagline", value: "The most secure and safest way to use Litecoin.", comment: "Start view message") + static let continueButton = Localization(key: "StartViewController.continueButton", value: "Continue", comment: "Continue button label") + } + + enum AccessibilityLabels { + static let close = Localization(key: "AccessibilityLabels.close", value: "Close", comment: "Close modal button accessibility label") + static let faq = Localization(key: "AccessibilityLabels.faq", value: "Support Center", comment: "Support center accessibiliy label") + } + + enum Search { + static let sent = Localization(key: "Search.sent", value: "sent", comment: "Sent filter label") + static let received = Localization(key: "Search.received", value: "received", comment: "Received filter label") + static let pending = Localization(key: "Search.pending", value: "pending", comment: "Pending filter label") + static let complete = Localization(key: "Search.complete", value: "complete", comment: "Complete filter label") + } + + enum Prompts { + static let affirm = Localization(key: "Prompts.PaperKey.affirm", value: "Continue", comment: "Affirm button title.") + static let cancel = Localization(key: "Prompts.PaperKey.cancel", value: "Cancel", comment: "Cancel button.") + static let enable = Localization(key: "Prompts.PaperKey.enable", value: "Enable", comment: "Enable button.") + static let dismiss = Localization(key: "Prompts.dismiss", value: "**Dismiss", comment: "Dismiss button.") + enum TouchId { + static let title = Localization(key: "Prompts.TouchId.title", value: "Enable Touch ID", comment: "Enable touch ID prompt title") + static let body = Localization(key: "Prompts.TouchId.body", value: "Tap here to enable Touch ID", comment: "Enable touch ID prompt body") + } + + enum PaperKey { + static let title = Localization(key: "Prompts.PaperKey.title", value: "Action Required", comment: "An action is required (You must do this action).") + static let body = Localization(key: "Prompts.PaperKey.body", value: "Your Paper Key must be kept in a safe place. It is the only way modify or restore your Litewallet or transfer your Litecoin. Please write it down.", comment: "Warning about paper key.") + } + + enum SetPin { + static let title = Localization(key: "Prompts.SetPin.title", value: "Set PIN", comment: "Set PIN prompt title.") + static let body = Localization(key: "Prompts.SetPin.body", value: "Litewallet requires a 6-digit PIN. Please set and store your PIN in a safe place.", comment: "Upgrade PIN prompt body.") + } + + enum RecommendRescan { + static let title = Localization(key: "Prompts.RecommendRescan.title", value: "Transaction Rejected", comment: "Transaction rejected prompt title") + static let body = Localization(key: "Prompts.RecommendRescan.body", value: "Your wallet may be out of sync. This can often be fixed by rescanning the blockchain.", comment: "Transaction rejected prompt body") + } + + enum NoPasscode { + static let title = Localization(key: "Prompts.NoPasscode.title", value: "Turn device passcode on", comment: "No Passcode set warning title") + static let body = Localization(key: "Prompts.NoPasscode.body", value: "A device passcode is needed to safeguard your wallet.", comment: "No passcode set warning body") + } + + enum ShareData { + static let title = Localization(key: "Prompts.ShareData.title", value: "Share Anonymous Data", comment: "Share data prompt title") + static let body = Localization(key: "Prompts.ShareData.body", value: "Help improve Litewallet by sharing your anonymous data with us", comment: "Share data prompt body") + } + + enum FaceId { + static let title = Localization(key: "Prompts.FaceId.title", value: "Enable Face ID", comment: "Enable face ID prompt title") + static let body = Localization(key: "Prompts.FaceId.body", value: "Tap here to enable Face ID", comment: "Enable face ID prompt body") + } + } + + // MARK: - Payment Protocol + + enum PaymentProtocol { + enum Errors { + static let untrustedCertificate = Localization(key: "PaymentProtocol.Errors.untrustedCertificate", value: "untrusted certificate", comment: "Untrusted certificate payment protocol error message") + static let missingCertificate = Localization(key: "PaymentProtocol.Errors.missingCertificate", value: "missing certificate", comment: "Missing certificate payment protocol error message") + static let unsupportedSignatureType = Localization(key: "PaymentProtocol.Errors.unsupportedSignatureType", value: "unsupported signature type", comment: "Unsupported signature type payment protocol error message") + static let requestExpired = Localization(key: "PaymentProtocol.Errors.requestExpired", value: "request expired", comment: "Request expired payment protocol error message") + static let badPaymentRequest = Localization(key: "PaymentProtocol.Errors.badPaymentRequest", value: "Bad Payment Request", comment: "Bad Payment request alert title") + static let smallOutputErrorTitle = Localization(key: "PaymentProtocol.Errors.smallOutputError", value: "Couldn't make payment", comment: "Payment too small alert title") + static let smallPayment = Localization(key: "PaymentProtocol.Errors.smallPayment", value: "Litecoin payments can't be less than %1$@.", comment: "Amount too small error message") + static let smallTransaction = Localization(key: "PaymentProtocol.Errors.smallTransaction", value: "Litecoin transaction outputs can't be less than $@.", comment: "Output too small error message.") + static let corruptedDocument = Localization(key: "PaymentProtocol.Errors.corruptedDocument", value: "Unsupported or corrupted document", comment: "Error opening payment protocol file message") + } + } + + enum URLHandling { + static let addressListAlertTitle = Localization(key: "URLHandling.addressListAlertTitle", value: "Copy Wallet Addresses", comment: "Authorize to copy wallet address alert title") + static let addressListAlertMessage = Localization(key: "URLHandling.addressaddressListAlertMessage", value: "Copy wallet addresses to clipboard?", comment: "Authorize to copy wallet addresses alert message") + static let addressListVerifyPrompt = Localization(key: "URLHandling.addressList", value: "Authorize to copy wallet address to clipboard", comment: "Authorize to copy wallet address PIN view prompt.") + static let copy = Localization(key: "URLHandling.copy", value: "Copy", comment: "Copy wallet addresses alert button label") + } + + enum ApiClient { + static let notReady = Localization(key: "ApiClient.notReady", value: "Wallet not ready", comment: "Wallet not ready error message") + static let jsonError = Localization(key: "ApiClient.jsonError", value: "JSON Serialization Error", comment: "JSON Serialization error message") + static let tokenError = Localization(key: "ApiClient.tokenError", value: "Unable to retrieve API token", comment: "API Token error message") + } + + enum CameraPlugin { + static let centerInstruction = Localization(key: "CameraPlugin.centerInstruction", value: "Center your ID in the box", comment: "Camera plugin instruction") + } + + enum LocationPlugin { + static let disabled = Localization(key: "LocationPlugin.disabled", value: "Location services are disabled.", comment: "Location services disabled error") + static let notAuthorized = Localization(key: "LocationPlugin.notAuthorized", value: "Litewallet does not have permission to access location services.", comment: "No permissions for location services") + } + + enum Webview { + static let updating = Localization(key: "Webview.updating", value: "Updating...", comment: "Updating webview message") + static let errorMessage = Localization(key: "Webview.errorMessage", value: "There was an error loading the content. Please try again.", comment: "Webview loading error message") + static let dismiss = Localization(key: "Webview.dismiss", value: "Dismiss", comment: "Dismiss button label") + } + + enum TimeSince { + static let seconds = Localization(key: "TimeSince.seconds", value: "%1$@ s", comment: "6 s (6 seconds)") + static let minutes = Localization(key: "TimeSince.minutes", value: "%1$@ m", comment: "6 m (6 minutes)") + static let hours = Localization(key: "TimeSince.hours", value: "%1$@ h", comment: "6 h (6 hours)") + static let days = Localization(key: "TimeSince.days", value: "%1$@ d", comment: "6 d (6 days)") + } + + enum Import { + static let leftCaption = Localization(key: "Import.leftCaption", value: "Wallet to be imported", comment: "Caption for graphics") + static let rightCaption = Localization(key: "Import.rightCaption", value: "Your Litewallet Wallet", comment: "Caption for graphics") + static let importMessage = Localization(key: "Import.message", value: "Importing a wallet transfers all the money from your other wallet into your Litewallet wallet using a single transaction.", comment: "Import wallet intro screen message") + static let importWarning = Localization(key: "Import.warning", value: "Importing a wallet does not include transaction history or other details.", comment: "Import wallet intro warning message") + static let scan = Localization(key: "Import.scan", value: "Scan Private Key", comment: "Scan Private key button label") + static let title = Localization(key: "Import.title", value: "Import Wallet", comment: "Import Wallet screen title") + static let importing = Localization(key: "Import.importing", value: "Importing Wallet", comment: "Importing wallet progress view label") + static let confirm = Localization(key: "Import.confirm", value: "Send %1$@ from this private key into your wallet? The Litecoin network will receive a fee of %2$@.", comment: "Sweep private key confirmation message") + static let checking = Localization(key: "Import.checking", value: "Checking private key balance...", comment: "Checking private key balance progress view text") + static let password = Localization(key: "Import.password", value: "This private key is password protected.", comment: "Enter password alert view title") + static let passwordPlaceholder = Localization(key: "Import.passwordPlaceholder", value: "password", comment: "password textfield placeholder") + static let unlockingActivity = Localization(key: "Import.unlockingActivity", value: "Unlocking Key", comment: "Unlocking Private key activity view message.") + static let importButton = Localization(key: "Import.importButton", value: "Import", comment: "Import button label") + static let success = Localization(key: "Import.success", value: "Success", comment: "Import wallet success alert title") + static let successBody = Localization(key: "Import.SuccessBody", value: "Successfully imported wallet.", comment: "Successfully imported wallet message body") + static let wrongPassword = Localization(key: "Import.wrongPassword", value: "Wrong password, please try again.", comment: "Wrong password alert message") + enum Error { + static let notValid = Localization(key: "Import.Error.notValid", value: "Not a valid private key", comment: "Not a valid private key error message") + static let duplicate = Localization(key: "Import.Error.duplicate", value: "This private key is already in your wallet.", comment: "Duplicate key error message") + static let empty = Localization(key: "Import.Error.empty", value: "This private key is empty.", comment: "empty private key error message") + static let highFees = Localization(key: "Import.Error.highFees", value: "Transaction fees would cost more than the funds available on this private key.", comment: "High fees error message") + static let signing = Localization(key: "Import.Error.signing", value: "Error signing transaction", comment: "Import signing error message") + } + } + + enum WipeWallet { + static let title = Localization(key: "WipeWallet.title", value: "Start or Recover Another Wallet", comment: "Wipe wallet navigation item title.") + static let alertTitle = Localization(key: "WipeWallet.alertTitle", value: "Wipe Wallet?", comment: "Wipe wallet alert title") + static let alertMessage = Localization(key: "WipeWallet.alertMessage", value: "Are you sure you want to delete this wallet?", comment: "Wipe wallet alert message") + static let wipe = Localization(key: "WipeWallet.wipe", value: "Wipe", comment: "Wipe wallet button title") + static let wiping = Localization(key: "WipeWallet.wiping", value: "Wiping...", comment: "Wiping activity message") + static let failedTitle = Localization(key: "WipeWallet.failedTitle", value: "Failed", comment: "Failed wipe wallet alert title") + static let failedMessage = Localization(key: "WipeWallet.failedMessage", value: "Failed to wipe wallet.", comment: "Failed wipe wallet alert message") + static let instruction = Localization(key: "WipeWallet.instruction", value: "To start a new wallet or restore an existing wallet, you must first erase the wallet that is currently installed. To continue, enter the current wallet's Paper Key.", comment: "Enter key to wipe wallet instruction.") + static let startMessage = Localization(key: "WipeWallet.startMessage", value: "Starting or recovering another wallet allows you to access and manage a different Litewallet wallet on this device.", comment: "Start wipe wallet view message") + static let startWarning = Localization(key: "WipeWallet.startWarning", value: "Your current wallet will be removed from this device. If you wish to restore it in the future, you will need to enter your Paper Key.", comment: "Start wipe wallet view warning") + static let emptyWallet = Localization(key: "WipeWallet.emptyWallet", value: "Forget seed or PIN?", comment: "Warning if user lost phrase") + static let resetTitle = Localization(key: "resetTitle", value: " Delete my Litewallet ", comment: "Warning Empty Wipe title") + static let resetButton = Localization(key: "resetButton", value: "Yes, reset wallet", comment: "Reset walet button title") + static let warningTitle = Localization(key: "WipeWallet.warningTitle", value: "PLEASE READ!", comment: "Warning title") + static let warningDescription = Localization(key: "WipeWallet.warningDescription", value: "Your LiteWallet is empty. Resetting will delete the old private key and wipe the app data.\n\nAfter the reset, be prepared to record the new 12 words and keep them in a very secure place.\n\nNo LiteWallet developers can retrieve this seed for you.", comment: "Warning description") + static let warningAlert = Localization(key: "WipeWallet.warningAlert", value: "DO NOT LOSE IT!", comment: "Warning Alert") + static let deleteDatabase = Localization(key: "WipeWallet.deleteDatabase", value: "Delete database", comment: "Delete db") + static let alertDeleteTitle = Localization(key: "WipeWallet.alertDeleteTitle", value: "Delet Database", comment: "Delete database title") + static let deleteMessageTitle = Localization(key: "WipeWallet.deleteMessageTitle", value: "This deletes the database but retains the PIN and phrase. You will be asked to confirm your existing PIN, seed and will re-sync the new db", comment: "Delete database message") + static let deleteSync = Localization(key: "WipeWallet.deleteSync", value: "Delete & Sync", comment: "Delete and sync") + } + + enum FeeSelector { + static let title = Localization(key: "FeeSelector.title", value: "Processing Speed", comment: "Fee Selector title") + static let regularLabel = Localization(key: "FeeSelector.regularLabel", value: "Estimated Delivery: 2.5 - 5+ minutes", comment: "Fee Selector regular fee description") + static let economyLabel = Localization(key: "FeeSelector.economyLabel", value: "Estimated Delivery: ~10 minutes", comment: "Fee Selector economy fee description") + static let luxuryLabel = Localization(key: "FeeSelector.luxuryLabel", value: "Delivery: 2.5 - 5+ minutes", comment: "Fee Selector luxury fee description") + static let economyWarning = Localization(key: "FeeSelector.economyWarning", value: "This option is not recommended for time-sensitive transactions.", comment: "Warning message for economy fee") + static let luxuryMessage = Localization(key: "FeeSelector.luxuryMessage", value: "This option virtually guarantees acceptance of your transaction while you pay a premium.", comment: "Message for luxury fee") + + static let regular = Localization(key: "FeeSelector.regular", value: "Regular", comment: "Regular fee") + static let economy = Localization(key: "FeeSelector.economy", value: "Economy", comment: "Economy fee") + static let luxury = Localization(key: "FeeSelector.luxury", value: "Luxury", comment: "Luxury fee") + } + + enum Confirmation { + static let title = Localization(key: "Confirmation.title", value: "Confirmation", comment: "Confirmation Screen title") + static let send = Localization(key: "Confirmation.send", value: "Send", comment: "Send: (amount)") + static let to = Localization(key: "Confirmation.to", value: "To", comment: "To: (address)") + static let staticAddressLabel = Localization(key: "Confirmation.staticAddressLabel", value: "ADDRESS:", comment: "Address label") + + 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%") + } + + enum NodeSelector { + static let manualButton = Localization(key: "NodeSelector.manualButton", value: "Switch to Manual Mode", comment: "Switch to manual mode button label") + static let automaticButton = Localization(key: "NodeSelector.automaticButton", value: "Switch to Automatic Mode", comment: "Switch to automatic mode button label") + static let title = Localization(key: "NodeSelector.title", value: "Litecoin Nodes", comment: "Node Selector view title") + static let nodeLabel = Localization(key: "NodeSelector.nodeLabel", value: "Current Primary Node", comment: "Node address label") + static let statusLabel = Localization(key: "NodeSelector.statusLabel", value: "Node Connection Status", comment: "Node status label") + static let connected = Localization(key: "NodeSelector.connected", value: "Connected", comment: "Node is connected label") + static let notConnected = Localization(key: "NodeSelector.notConnected", value: "Not Connected", comment: "Node is not connected label") + static let enterTitle = Localization(key: "NodeSelector.enterTitle", value: "Enter Node", comment: "Enter Node ip address view title") + static let enterBody = Localization(key: "NodeSelector.enterBody", value: "Enter Node IP address and port (optional)", comment: "Enter node ip address view body") + } + + enum Welcome { + static let title = Localization(key: "Welcome.title", value: "Welcome to Litewallet", comment: "Welcome view title") + static let body = Localization(key: "Welcome.body", value: "Litewallet now has a brand new look and some new features.\n\nAll coins are displayed in lites (ł). 1 Litecoin (Ł) = 1000 lites (ł).", comment: "Welcome view body text") + } + + enum Fragments { + static let or = Localization(key: "Fragment.or", value: "or", comment: "Or") + static let confirm = Localization(key: "Fragment.confirm", value: "confirm", comment: "Confirm") + static let to = Localization(key: "Fragment.to", value: "to", comment: "to") + static let sorry = Localization(key: "Fragment.sorry", value: "sorry", comment: "sorry") + } +} diff --git a/loafwallet/src/Controls/MenuButton.swift b/litewallet/src/Controls/MenuButton.swift similarity index 100% rename from loafwallet/src/Controls/MenuButton.swift rename to litewallet/src/Controls/MenuButton.swift diff --git a/loafwallet/src/Controls/MenuButtonType.swift b/litewallet/src/Controls/MenuButtonType.swift similarity index 100% rename from loafwallet/src/Controls/MenuButtonType.swift rename to litewallet/src/Controls/MenuButtonType.swift diff --git a/loafwallet/src/Controls/SegmentedButton.swift b/litewallet/src/Controls/SegmentedButton.swift similarity index 100% rename from loafwallet/src/Controls/SegmentedButton.swift rename to litewallet/src/Controls/SegmentedButton.swift diff --git a/litewallet/src/Environment.swift b/litewallet/src/Environment.swift new file mode 100644 index 000000000..8541978fa --- /dev/null +++ b/litewallet/src/Environment.swift @@ -0,0 +1,159 @@ +import UIKit + +/// 14 Languages +enum LanguageSelection: Int, CaseIterable, Equatable, Identifiable { + case English = 0 + case ChineseTraditional + case ChineseSimplified + case French + case German + case Indonesian + case Italian + case Japan + case Korean + case Portuguese + case Russian + case Spanish + case Turkish + case Ukrainian + var id: LanguageSelection { self } + + var code: String { + switch self { + case .English: return "en" + case .ChineseTraditional: return "zh" + case .ChineseSimplified: return "zh" + case .French: return "fr" + case .German: return "de" + case .Indonesian: return "id" + case .Italian: return "it" + case .Japan: return "ja" + case .Korean: return "ko" + case .Portuguese: return "pt" + case .Russian: return "ru" + case .Spanish: return "es" + case .Turkish: return "tr" + case .Ukrainian: return "uk" + } + } + + var nativeName: String { + switch self { + case .English: return "English" + case .ChineseTraditional: return "中國人" + case .ChineseSimplified: return "中国人" + case .French: return "Français" + case .German: return "Deutsch" + case .Indonesian: return "Bahasa Indonesia" + case .Italian: return "Italiano" + case .Japan: return "日本語" + case .Korean: return "한국인" + case .Portuguese: return "Português" + case .Russian: return "Русский" + case .Spanish: return "Español" + case .Turkish: return "Türkçe" + case .Ukrainian: return "українська" + } + } + + var voiceFilename: String { + switch self { + case .English: return "English" + case .ChineseTraditional: return "中國人" + case .ChineseSimplified: return "中國人" + case .French: return "Français" + case .German: return "Deutsch" + case .Indonesian: return "BahasaIndonesia" + case .Italian: return "Italiano" + case .Japan: return "日本語" + case .Korean: return "한국인" + case .Portuguese: return "Português" + case .Russian: return "Русский" + case .Spanish: return "Español" + case .Turkish: return "Türkçe" + case .Ukrainian: return "українська" + } + } +} + +struct E { + static let isTestnet: Bool = { + #if Testnet + return true + #else + return false + #endif + }() + + static let isTestFlight: Bool = { + #if Testflight + return true + #else + return false + #endif + }() + + static let isSimulator: Bool = { + #if arch(i386) || arch(x86_64) + return true + #else + return false + #endif + }() + + static let isDebug: Bool = { + #if Debug + return true + #else + return false + #endif + }() + + static let isRelease: Bool = { + #if Release + return true + #else + return false + #endif + }() + + static let isScreenshots: Bool = { + #if Screenshots + return true + #else + return false + #endif + }() + + static var isIPhone4: Bool { + return (UIScreen.main.bounds.size.height == 480.0) + } + + static var isIPhone5: Bool { + return (UIScreen.main.bounds.size.height == 568.0) && (E.is32Bit) + } + + static var isIPhoneX: Bool { + return (UIScreen.main.bounds.size.height == 812.0) + } + + static var isIPhone8Plus: Bool { + return (UIScreen.main.bounds.size.height == 736.0) + } + + static var isIPhoneXsMax: Bool { + return (UIScreen.main.bounds.size.height == 812.0) + } + + static var isIPad: Bool { + return (UIDevice.current.userInterfaceIdiom == .pad) + } + + static let is32Bit: Bool = { + MemoryLayout.size == MemoryLayout.size + }() + + static var screenHeight: CGFloat { + return UIScreen.main.bounds.size.height + } +} diff --git a/litewallet/src/Extensions/ApplicationController+Extension.swift b/litewallet/src/Extensions/ApplicationController+Extension.swift new file mode 100644 index 000000000..5426f1577 --- /dev/null +++ b/litewallet/src/Extensions/ApplicationController+Extension.swift @@ -0,0 +1,35 @@ +import Foundation +import StoreKit + +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 { + SKStoreReviewController.requestReview() + + SKStoreReviewController.requestReviewInCurrentScene() + + // iOSAppStoreURLFormat = @"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%d"; + // [NSURL URLWithString:[NSString stringWithFormat:([[UIDevice currentDevice].systemVersion floatValue] >= 7.0f)? iOS7AppStoreURLFormat: iOSAppStoreURLFormat, YOUR_APP_STORE_ID]]; // Would contain the right link + + LWAnalytics.logEventWithParameters(itemName: ._20200125_DSRR) + } + } else { + UserDefaults.standard.set(NSNumber(value: 1), forKey: numberOfLitewalletLaunches) + } + } + + func willResignActive() + {} +} diff --git a/loafwallet/src/Extensions/Async.swift b/litewallet/src/Extensions/Async.swift similarity index 100% rename from loafwallet/src/Extensions/Async.swift rename to litewallet/src/Extensions/Async.swift diff --git a/loafwallet/src/Extensions/CGContext+Additions.swift b/litewallet/src/Extensions/CGContext+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/CGContext+Additions.swift rename to litewallet/src/Extensions/CGContext+Additions.swift diff --git a/loafwallet/src/Extensions/CGRect+Additions.swift b/litewallet/src/Extensions/CGRect+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/CGRect+Additions.swift rename to litewallet/src/Extensions/CGRect+Additions.swift diff --git a/loafwallet/src/Extensions/CustomTitleView.swift b/litewallet/src/Extensions/CustomTitleView.swift similarity index 100% rename from loafwallet/src/Extensions/CustomTitleView.swift rename to litewallet/src/Extensions/CustomTitleView.swift diff --git a/loafwallet/src/Extensions/Date+Additions.swift b/litewallet/src/Extensions/Date+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/Date+Additions.swift rename to litewallet/src/Extensions/Date+Additions.swift diff --git a/loafwallet/src/Extensions/DispatchQueue+Additions.swift b/litewallet/src/Extensions/DispatchQueue+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/DispatchQueue+Additions.swift rename to litewallet/src/Extensions/DispatchQueue+Additions.swift diff --git a/loafwallet/src/Extensions/LAContext+Extensions.swift b/litewallet/src/Extensions/LAContext+Extensions.swift similarity index 100% rename from loafwallet/src/Extensions/LAContext+Extensions.swift rename to litewallet/src/Extensions/LAContext+Extensions.swift diff --git a/loafwallet/src/Extensions/NumberFormatter+Additions.swift b/litewallet/src/Extensions/NumberFormatter+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/NumberFormatter+Additions.swift rename to litewallet/src/Extensions/NumberFormatter+Additions.swift diff --git a/litewallet/src/Extensions/SafariServices+Extension.swift b/litewallet/src/Extensions/SafariServices+Extension.swift new file mode 100644 index 000000000..06edd45e3 --- /dev/null +++ b/litewallet/src/Extensions/SafariServices+Extension.swift @@ -0,0 +1,98 @@ +import Foundation +import SafariServices +import SwiftUI +import UIKit +import WebKit + +// inspired https://www.swiftyplace.com/blog/loading-a-web-view-in-swiftui-with-wkwebview + +struct WebView: UIViewRepresentable { + let url: URL + @Binding + var scrollToSignup: Bool + + @State + private + var didStartEditing: Bool = false + + func makeUIView(context _: Context) -> WKWebView { + let webview = SignupWebView(frame: CGRectZero, didStartEditing: $didStartEditing) + let request = URLRequest(url: url) + webview.load(request) + return webview + } + + func updateUIView(_ webview: WKWebView, context _: Context) { + print("::: webview \(webview.frame.size)") + + webview.endEditing(true) + + if scrollToSignup { + let point = CGPoint(x: 0, y: webview.scrollView.contentSize.height - webview.frame.size.height / 2) + print("::: point \(point)") + + webview.scrollView.setContentOffset(point, animated: true) + DispatchQueue.main.async { + self.scrollToSignup = false + } + } + } +} + +// https://stackoverflow.com/questions/44684714/show-keyboard-on-button-click-by-calling-wkwebview-input-field +class SignupWebView: WKWebView, WKNavigationDelegate { + @Binding + var didStartEditing: Bool + + init(frame: CGRect, didStartEditing: Binding) { + _didStartEditing = didStartEditing + + let configuration = WKWebViewConfiguration() + super.init(frame: frame, configuration: configuration) + navigationDelegate = self + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var intrinsicContentSize: CGSize { + return scrollView.contentSize + } + + func webView(_ webView: WKWebView, didFinish _: WKNavigation!) { + var scriptContent = "var meta = document.createElement('meta');" + scriptContent += "meta.name='viewport';" + scriptContent += "meta.content='width=device-width';" + scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);" + scriptContent += "document.body.scrollHeight;" + + webView.evaluateJavaScript(scriptContent, completionHandler: { height, error in + + print(height) + print(error) + }) + + webView.evaluateJavaScript("document.body.innerHTML", completionHandler: { (value: Any!, error: Error!) in + if error != nil { + // 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) + }) + } +} diff --git a/loafwallet/src/Extensions/String+Additions.swift b/litewallet/src/Extensions/String+Additions.swift similarity index 85% rename from loafwallet/src/Extensions/String+Additions.swift rename to litewallet/src/Extensions/String+Additions.swift index 3fae6f53a..3808b4e38 100644 --- a/loafwallet/src/Extensions/String+Additions.swift +++ b/litewallet/src/Extensions/String+Additions.swift @@ -90,6 +90,17 @@ extension String { } return Data(bytes: bytes) } + + static func localizedString(for key: String, + locale: Locale = .current) -> String + { + let language = locale.languageCode + let path = Bundle.main.path(forResource: language, ofType: "lproj")! + let bundle = Bundle(path: path)! + let localizedString = NSLocalizedString(key, bundle: bundle, comment: "") + + return localizedString + } } extension UnicodeScalar { @@ -114,7 +125,7 @@ extension String { self = capitalizingFirstLetter() } - func replacingZeroFeeWithOneCent() -> String { + func replacingZeroFeeWithTenCents() -> String { guard count > 3 else { LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["ERROR": "STRING_ISSUE"]) @@ -122,10 +133,10 @@ extension String { } let range = index(endIndex, offsetBy: -3) ..< endIndex - return replacingOccurrences(of: ".00", with: ".01", options: .literal, range: range) + return replacingOccurrences(of: ".00", with: ".10", options: .literal, range: range) } - func combinedFeeReplacingZeroFeeWithOneCent() -> String { + func combinedFeeReplacingZeroFeeWithTenCents() -> String { guard count > 4 else { LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: ["ERROR": "STRING_ISSUE"]) @@ -133,6 +144,6 @@ extension String { } let range = index(endIndex, offsetBy: -4) ..< endIndex - return replacingOccurrences(of: ".00)", with: ".01)", options: .literal, range: range) + return replacingOccurrences(of: ".00)", with: ".10)", options: .literal, range: range) } } diff --git a/loafwallet/src/Extensions/UIBarButtonItem+Additions.swift b/litewallet/src/Extensions/UIBarButtonItem+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/UIBarButtonItem+Additions.swift rename to litewallet/src/Extensions/UIBarButtonItem+Additions.swift diff --git a/loafwallet/src/Extensions/UIButton+BRWAdditions.swift b/litewallet/src/Extensions/UIButton+BRWAdditions.swift similarity index 80% rename from loafwallet/src/Extensions/UIButton+BRWAdditions.swift rename to litewallet/src/Extensions/UIButton+BRWAdditions.swift index 51dd28af3..ff67559f0 100644 --- a/loafwallet/src/Extensions/UIButton+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIButton+BRWAdditions.swift @@ -10,11 +10,11 @@ extension UIButton { let font = button.titleLabel?.font { let spacing: CGFloat = C.padding[1] / 2.0 - let titleSize = NSString(string: title).size(withAttributes: [NSAttributedStringKey.font: font]) + let titleSize = NSString(string: title).size(withAttributes: [NSAttributedString.Key.font: font]) // These edge insets place the image vertically above the title label - button.titleEdgeInsets = UIEdgeInsetsMake(0.0, -imageSize.width, -(imageSize.height + spacing), 0.0) - button.imageEdgeInsets = UIEdgeInsetsMake(-(titleSize.height + spacing), 0.0, 0.0, -titleSize.width) + button.titleEdgeInsets = UIEdgeInsets(top: 0.0, left: -imageSize.width, bottom: -(imageSize.height + spacing), right: 0.0) + button.imageEdgeInsets = UIEdgeInsets(top: -(titleSize.height + spacing), left: 0.0, bottom: 0.0, right: -titleSize.width) } return button } @@ -38,9 +38,9 @@ extension UIButton { button.setImage(image, for: .normal) if image == #imageLiteral(resourceName: "Close") { - button.imageEdgeInsets = UIEdgeInsetsMake(14.0, 14.0, 14.0, 14.0) + button.imageEdgeInsets = UIEdgeInsets(top: 14.0, left: 14.0, bottom: 14.0, right: 14.0) } else { - button.imageEdgeInsets = UIEdgeInsetsMake(12.0, 12.0, 12.0, 12.0) + button.imageEdgeInsets = UIEdgeInsets(top: 12.0, left: 12.0, bottom: 12.0, right: 12.0) } button.tintColor = .darkText diff --git a/loafwallet/src/Extensions/UIColor+Extension.swift b/litewallet/src/Extensions/UIColor+Extension.swift similarity index 85% rename from loafwallet/src/Extensions/UIColor+Extension.swift rename to litewallet/src/Extensions/UIColor+Extension.swift index 7fad9d8ca..0668402cd 100644 --- a/loafwallet/src/Extensions/UIColor+Extension.swift +++ b/litewallet/src/Extensions/UIColor+Extension.swift @@ -1,3 +1,4 @@ +import SwiftUI import UIKit extension UIColor { @@ -35,7 +36,7 @@ extension UIColor { return #colorLiteral(red: 0.04705882353, green: 0.2039215686, blue: 0.4588235294, alpha: 1) } - static var litecoinOrange: UIColor { // FE5F55 + static var litewalletOrange: UIColor { // FE5F55 return #colorLiteral(red: 0.9960784314, green: 0.3725490196, blue: 0.3333333333, alpha: 1) } @@ -43,6 +44,10 @@ extension UIColor { return #colorLiteral(red: 0.09019607843, green: 0.6196078431, blue: 0.1529411765, alpha: 1) } + static var litewalletLime: UIColor { // D9E76C + return #colorLiteral(red: 0.8509803922, green: 0.9058823529, blue: 0.4235294118, alpha: 1) + } + // MARK: Buttons static var primaryButton: UIColor { @@ -105,10 +110,6 @@ extension UIColor { return UIColor(red: 72.0 / 255.0, green: 240.0 / 255.0, blue: 184.0 / 255.0, alpha: 1.0) } - static var cameraGuideNegative: UIColor { - return UIColor(red: 240.0 / 255.0, green: 74.0 / 255.0, blue: 93.0 / 255.0, alpha: 1.0) - } - static var purple: UIColor { return UIColor(red: 209.0 / 255.0, green: 125.0 / 255.0, blue: 245.0 / 255.0, alpha: 1.0) } @@ -154,8 +155,22 @@ extension UIColor { static var blueGradientEnd: UIColor { return UIColor(red: 56.0 / 255.0, green: 141.0 / 255.0, blue: 252.0 / 255.0, alpha: 1.0) } +} + +extension Color { + static var litewalletBlue: Color { // 345D9D + return Color(#colorLiteral(red: 0.2039215686, green: 0.3647058824, blue: 0.6156862745, alpha: 1)) + } + + static var litewalletDarkBlue: Color { // 0C3475 + return Color(#colorLiteral(red: 0.04705882353, green: 0.2039215686, blue: 0.4588235294, alpha: 1)) + } + + static var litewalletOrange: Color { // FE5F55 + return Color(#colorLiteral(red: 0.9960784314, green: 0.3725490196, blue: 0.3333333333, alpha: 1)) + } - static var txListGreen: UIColor { - return UIColor(red: 0.0, green: 169.0 / 255.0, blue: 157.0 / 255.0, alpha: 1.0) + static var litewalletGreen: Color { // 179E27 + return Color(#colorLiteral(red: 0.09019607843, green: 0.6196078431, blue: 0.1529411765, alpha: 1)) } } diff --git a/loafwallet/src/Extensions/UIControl+Callback.swift b/litewallet/src/Extensions/UIControl+Callback.swift similarity index 100% rename from loafwallet/src/Extensions/UIControl+Callback.swift rename to litewallet/src/Extensions/UIControl+Callback.swift diff --git a/loafwallet/src/Extensions/UIFont+BRWAdditions.swift b/litewallet/src/Extensions/UIFont+BRWAdditions.swift similarity index 72% rename from loafwallet/src/Extensions/UIFont+BRWAdditions.swift rename to litewallet/src/Extensions/UIFont+BRWAdditions.swift index 53292723c..255c16e55 100644 --- a/loafwallet/src/Extensions/UIFont+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIFont+BRWAdditions.swift @@ -1,3 +1,4 @@ +import SwiftUI import UIKit extension UIFont { @@ -55,3 +56,29 @@ extension UIFont { ] } } + +extension Font { + static func barlowSemiBold(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-SemiBold", size: size) + } + + static func barlowBold(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-Bold", size: size) + } + + static func barlowItalic(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-Italic", size: size) + } + + static func barlowMedium(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-Medium", size: size) + } + + static func barlowRegular(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-Regular", size: size) + } + + static func barlowLight(size: CGFloat) -> Font { + return Font.custom("BarlowSemiCondensed-Light", size: size) + } +} diff --git a/loafwallet/src/Extensions/UIImage+Utils.swift b/litewallet/src/Extensions/UIImage+Utils.swift similarity index 97% rename from loafwallet/src/Extensions/UIImage+Utils.swift rename to litewallet/src/Extensions/UIImage+Utils.swift index 6e44b4329..2474a7550 100644 --- a/loafwallet/src/Extensions/UIImage+Utils.swift +++ b/litewallet/src/Extensions/UIImage+Utils.swift @@ -26,7 +26,7 @@ extension UIImage { } // force software rendering for security (GPU rendering causes image artifacts on iOS 7 and is generally crashy) - let context = CIContext(options: [kCIContextUseSoftwareRenderer: true]) + let context = CIContext(options: [.useSoftwareRenderer: true]) objc_sync_enter(context) defer { objc_sync_exit(context) } guard let outputImage = filter?.outputImage else { assertionFailure("No qr output image"); return nil } diff --git a/loafwallet/src/Extensions/UILabel+BRWAdditions.swift b/litewallet/src/Extensions/UILabel+BRWAdditions.swift similarity index 81% rename from loafwallet/src/Extensions/UILabel+BRWAdditions.swift rename to litewallet/src/Extensions/UILabel+BRWAdditions.swift index 8e939a4b4..1dfd36f18 100644 --- a/loafwallet/src/Extensions/UILabel+BRWAdditions.swift +++ b/litewallet/src/Extensions/UILabel+BRWAdditions.swift @@ -32,11 +32,11 @@ extension UILabel { func pushNewText(_ newText: String) { let animation = CATransition() animation.timingFunction = CAMediaTimingFunction(name: - kCAMediaTimingFunctionEaseInEaseOut) - animation.type = kCATransitionPush - animation.subtype = kCATransitionFromTop + CAMediaTimingFunctionName.easeInEaseOut) + animation.type = CATransitionType.push + animation.subtype = CATransitionSubtype.fromTop animation.duration = C.animationDuration - layer.add(animation, forKey: kCATransitionPush) + layer.add(animation, forKey: "kCATransitionPush") text = newText } } diff --git a/loafwallet/src/Extensions/UINavigationController+Extension.swift b/litewallet/src/Extensions/UINavigationController+Extension.swift similarity index 67% rename from loafwallet/src/Extensions/UINavigationController+Extension.swift rename to litewallet/src/Extensions/UINavigationController+Extension.swift index 4713d50e9..1c9c05d6d 100644 --- a/loafwallet/src/Extensions/UINavigationController+Extension.swift +++ b/litewallet/src/Extensions/UINavigationController+Extension.swift @@ -14,8 +14,8 @@ extension UINavigationController { func setWhiteStyle() { navigationBar.tintColor = .white navigationBar.titleTextAttributes = [ - NSAttributedStringKey.foregroundColor: UIColor.white, - NSAttributedStringKey.font: UIFont.customBold(size: 17.0), + NSAttributedString.Key.foregroundColor: UIColor.white, + NSAttributedString.Key.font: UIFont.customBold(size: 17.0), ] setTintableBackArrow() } @@ -43,3 +43,15 @@ extension UINavigationController { navigationBar.backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "Back") } } + +extension UINavigationBarAppearance { + func setColor(title: UIColor? = nil, background: UIColor? = nil) { + configureWithTransparentBackground() + if let titleColor = title { + titleTextAttributes = [.foregroundColor: titleColor] + } + backgroundColor = background + UINavigationBar.appearance().scrollEdgeAppearance = self + UINavigationBar.appearance().standardAppearance = self + } +} diff --git a/loafwallet/src/Extensions/UIScreen+Additions.swift b/litewallet/src/Extensions/UIScreen+Additions.swift similarity index 100% rename from loafwallet/src/Extensions/UIScreen+Additions.swift rename to litewallet/src/Extensions/UIScreen+Additions.swift diff --git a/loafwallet/src/Extensions/UISlider+Gradient.swift b/litewallet/src/Extensions/UISlider+Gradient.swift similarity index 100% rename from loafwallet/src/Extensions/UISlider+Gradient.swift rename to litewallet/src/Extensions/UISlider+Gradient.swift diff --git a/loafwallet/src/Extensions/UITableView+Additions.swift b/litewallet/src/Extensions/UITableView+Additions.swift similarity index 59% rename from loafwallet/src/Extensions/UITableView+Additions.swift rename to litewallet/src/Extensions/UITableView+Additions.swift index 8bf2676ef..9567cba4f 100644 --- a/loafwallet/src/Extensions/UITableView+Additions.swift +++ b/litewallet/src/Extensions/UITableView+Additions.swift @@ -3,7 +3,7 @@ import UIKit extension UIScrollView { func verticallyOffsetContent(_ deltaY: CGFloat) { contentOffset = CGPoint(x: contentOffset.x, y: contentOffset.y - deltaY) - contentInset = UIEdgeInsetsMake(contentInset.top + deltaY, contentInset.left, contentInset.bottom, contentInset.right) + contentInset = UIEdgeInsets(top: contentInset.top + deltaY, left: contentInset.left, bottom: contentInset.bottom, right: contentInset.right) scrollIndicatorInsets = contentInset } } diff --git a/loafwallet/src/Extensions/UIView+AnimationAdditions.swift b/litewallet/src/Extensions/UIView+AnimationAdditions.swift similarity index 100% rename from loafwallet/src/Extensions/UIView+AnimationAdditions.swift rename to litewallet/src/Extensions/UIView+AnimationAdditions.swift diff --git a/loafwallet/src/Extensions/UIView+BRWAdditions.swift b/litewallet/src/Extensions/UIView+BRWAdditions.swift similarity index 96% rename from loafwallet/src/Extensions/UIView+BRWAdditions.swift rename to litewallet/src/Extensions/UIView+BRWAdditions.swift index 32ae92538..d67869d60 100644 --- a/loafwallet/src/Extensions/UIView+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIView+BRWAdditions.swift @@ -4,7 +4,7 @@ enum Dimension { case width case height - var layoutAttribute: NSLayoutAttribute { + var layoutAttribute: NSLayoutConstraint.Attribute { switch self { case .width: return .width @@ -42,14 +42,14 @@ extension UIView { NSLayoutConstraint.activate(constraints.compactMap { $0 }) } - func constraint(_ attribute: NSLayoutAttribute, 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) } - func constraint(_ attribute: NSLayoutAttribute, toView: UIView) -> NSLayoutConstraint? { + func constraint(_ attribute: NSLayoutConstraint.Attribute, toView: UIView) -> 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: 0.0) diff --git a/loafwallet/src/Extensions/UIView+FrameChangeBlocking.swift b/litewallet/src/Extensions/UIView+FrameChangeBlocking.swift similarity index 100% rename from loafwallet/src/Extensions/UIView+FrameChangeBlocking.swift rename to litewallet/src/Extensions/UIView+FrameChangeBlocking.swift diff --git a/loafwallet/src/Extensions/UIView+InitAdditions.swift b/litewallet/src/Extensions/UIView+InitAdditions.swift similarity index 100% rename from loafwallet/src/Extensions/UIView+InitAdditions.swift rename to litewallet/src/Extensions/UIView+InitAdditions.swift diff --git a/loafwallet/src/Extensions/UIViewController+Alerts.swift b/litewallet/src/Extensions/UIViewController+Alerts.swift similarity index 100% rename from loafwallet/src/Extensions/UIViewController+Alerts.swift rename to litewallet/src/Extensions/UIViewController+Alerts.swift diff --git a/loafwallet/src/Extensions/UIViewController+BRWAdditions.swift b/litewallet/src/Extensions/UIViewController+BRWAdditions.swift similarity index 66% rename from loafwallet/src/Extensions/UIViewController+BRWAdditions.swift rename to litewallet/src/Extensions/UIViewController+BRWAdditions.swift index f0d8383cb..75b913ef0 100644 --- a/loafwallet/src/Extensions/UIViewController+BRWAdditions.swift +++ b/litewallet/src/Extensions/UIViewController+BRWAdditions.swift @@ -2,16 +2,16 @@ import UIKit extension UIViewController { func addChildViewController(_ viewController: UIViewController, layout: () -> Void) { - addChildViewController(viewController) + addChild(viewController) view.addSubview(viewController.view) layout() - viewController.didMove(toParentViewController: self) + viewController.didMove(toParent: self) } func remove() { - willMove(toParentViewController: nil) + willMove(toParent: nil) view.removeFromSuperview() - removeFromParentViewController() + removeFromParent() } func addCloseNavigationItem(tintColor: UIColor? = nil) { @@ -20,13 +20,7 @@ extension UIViewController { self?.dismiss(animated: true, completion: nil) } if let color = tintColor { - if #available(iOS 11.0, *), - let labelTextColor = UIColor(named: "labelTextColor") - { - close.tintColor = labelTextColor - } else { - close.tintColor = color - } + close.tintColor = UIColor.black } navigationItem.leftBarButtonItems = [UIBarButtonItem.negativePadding, UIBarButtonItem(customView: close)] } diff --git a/loafwallet/src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift b/litewallet/src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift similarity index 100% rename from loafwallet/src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift rename to litewallet/src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift diff --git a/loafwallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift b/litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift similarity index 100% rename from loafwallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift rename to litewallet/src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift diff --git a/loafwallet/src/Extensions/UserDefaults+Additions.swift b/litewallet/src/Extensions/UserDefaults+Additions.swift similarity index 96% rename from loafwallet/src/Extensions/UserDefaults+Additions.swift rename to litewallet/src/Extensions/UserDefaults+Additions.swift index e450a478e..bb595aa6e 100644 --- a/loafwallet/src/Extensions/UserDefaults+Additions.swift +++ b/litewallet/src/Extensions/UserDefaults+Additions.swift @@ -14,7 +14,6 @@ private let currentRateKey = "currentRateKey" private let customNodeIPKey = "customNodeIPKey" private let customNodePortKey = "customNodePortKey" private let hasPromptedShareDataKey = "hasPromptedShareDataKey" -private let hasShownWelcomeKey = "hasShownWelcomeKey" private let didSeeTransactionCorruption = "DidSeeTransactionCorruption" private let userIsInUSAKey = "userIsInUSAKey" private let selectedLanguageKey = "selectedLanguage" @@ -148,11 +147,6 @@ extension UserDefaults { get { return defaults.bool(forKey: hasPromptedBiometricsKey) } set { defaults.set(newValue, forKey: hasPromptedBiometricsKey) } } - - static var hasShownWelcome: Bool { - get { return defaults.bool(forKey: hasShownWelcomeKey) } - set { defaults.set(newValue, forKey: hasShownWelcomeKey) } - } } // MARK: - Wallet Requires Backup diff --git a/loafwallet/src/FeeManager.swift b/litewallet/src/FeeManager.swift similarity index 85% rename from loafwallet/src/FeeManager.swift rename to litewallet/src/FeeManager.swift index 8e3705ba0..1ddb579a2 100644 --- a/loafwallet/src/FeeManager.swift +++ b/litewallet/src/FeeManager.swift @@ -2,7 +2,7 @@ import FirebaseAnalytics import Foundation // this is the default that matches the mobile-api if the server is unavailable -private let defaultEconomyFeePerKB: UInt64 = 2500 // From legacy minimum. default min is 1000 as Litecoin Core version v0.17.1 +private let defaultEconomyFeePerKB: UInt64 = 8000 // Updated Dec 2, 2024 private let defaultRegularFeePerKB: UInt64 = 25000 private let defaultLuxuryFeePerKB: UInt64 = 66746 private let defaultTimestamp: UInt64 = 1_583_015_199_122 @@ -49,7 +49,8 @@ class FeeUpdater: Trackable { walletManager.apiClient?.feePerKb { newFees, error in guard error == nil else { - let properties: [String: String] = ["ERROR_MESSAGE": String(describing: error), "ERROR_TYPE": "FEE_PER_KB"] + let properties: [String: String] = ["ERROR_MESSAGE": String(describing: error), + "ERROR_TYPE": "FEE_PER_KB"] LWAnalytics.logEventWithParameters(itemName: ._20200112_ERR, properties: properties) completion() return @@ -65,7 +66,10 @@ class FeeUpdater: Trackable { } if timer == nil { - timer = Timer.scheduledTimer(timeInterval: feeUpdateInterval, target: self, selector: #selector(intervalRefresh), userInfo: nil, repeats: true) + timer = Timer.scheduledTimer(timeInterval: feeUpdateInterval, + target: self, + selector: #selector(intervalRefresh), + userInfo: nil, repeats: true) } } diff --git a/loafwallet/src/FlowControllers/MessageUIPresenter.swift b/litewallet/src/FlowControllers/MessageUIPresenter.swift similarity index 97% rename from loafwallet/src/FlowControllers/MessageUIPresenter.swift rename to litewallet/src/FlowControllers/MessageUIPresenter.swift index f0a481c7a..89cf3adbf 100644 --- a/loafwallet/src/FlowControllers/MessageUIPresenter.swift +++ b/litewallet/src/FlowControllers/MessageUIPresenter.swift @@ -18,7 +18,7 @@ class MessageUIPresenter: NSObject, Trackable { UINavigationBar.appearance().titleTextAttributes = nil let emailView = MFMailComposeViewController() emailView.setMessageBody(string, isHTML: false) - if let data = UIImagePNGRepresentation(image) { + if let data = image.pngData() { emailView.addAttachmentData(data, mimeType: "image/png", fileName: "litecoinqr.png") } emailView.mailComposeDelegate = self @@ -72,7 +72,7 @@ class MessageUIPresenter: NSObject, Trackable { UINavigationBar.appearance().titleTextAttributes = nil let textView = MFMessageComposeViewController() textView.body = string - if let data = UIImagePNGRepresentation(image) { + if let data = image.pngData() { textView.addAttachmentData(data, typeIdentifier: "public.image", filename: "litecoinqr.png") } textView.messageComposeDelegate = self @@ -80,7 +80,7 @@ class MessageUIPresenter: NSObject, Trackable { present(textView) } - fileprivate var originalTitleTextAttributes: [NSAttributedStringKey: Any]? + fileprivate var originalTitleTextAttributes: [NSAttributedString.Key: Any]? private func present(_ viewController: UIViewController) { presenter?.view.isFrameChangeBlocked = true diff --git a/loafwallet/src/FlowControllers/StartFlowPresenter.swift b/litewallet/src/FlowControllers/StartFlowPresenter.swift similarity index 73% rename from loafwallet/src/FlowControllers/StartFlowPresenter.swift rename to litewallet/src/FlowControllers/StartFlowPresenter.swift index 1fa78e92a..a51199265 100644 --- a/loafwallet/src/FlowControllers/StartFlowPresenter.swift +++ b/litewallet/src/FlowControllers/StartFlowPresenter.swift @@ -3,14 +3,6 @@ import UIKit class StartFlowPresenter: Subscriber { // MARK: - Public - init(store: Store, walletManager: WalletManager, rootViewController: UIViewController) { - self.store = store - self.walletManager = walletManager - self.rootViewController = rootViewController - navigationControllerDelegate = StartNavigationDelegate(store: store) - addSubscriptions() - } - // MARK: - Private private let store: Store @@ -21,13 +13,12 @@ class StartFlowPresenter: Subscriber { private var loginViewController: UIViewController? private let loginTransitionDelegate = LoginTransitionDelegate() - private var closeButton: UIButton { - let button = UIButton.close - button.tintColor = .white - button.tap = { [weak self] in - self?.store.perform(action: HideStartFlow()) - } - return button + init(store: Store, walletManager: WalletManager, rootViewController: UIViewController) { + self.store = store + self.walletManager = walletManager + self.rootViewController = rootViewController + navigationControllerDelegate = StartNavigationDelegate(store: store) + addSubscriptions() } private func addSubscriptions() { @@ -36,7 +27,7 @@ class StartFlowPresenter: Subscriber { callback: { self.handleStartFlowChange(state: $0) }) store.lazySubscribe(self, selector: { $0.isLoginRequired != $1.isLoginRequired }, - callback: { self.handleLoginRequiredChange(state: $0) }) // TODO: - this should probably be in modal presenter + callback: { self.handleLoginRequiredChange(state: $0) }) store.subscribe(self, name: .lock, callback: { _ in self.presentLoginFlow(isPresentedForLock: true) }) } @@ -59,23 +50,47 @@ class StartFlowPresenter: Subscriber { } } + // MARK: - SwiftUI Start Flow + private func presentStartFlow() { - let startViewController = StartViewController(store: store, - didTapCreate: { [weak self] in - self?.pushPinCreationViewControllerForNewWallet() - }, - didTapRecover: { [weak self] in - guard let myself = self else { return } - let recoverIntro = RecoverWalletIntroViewController(didTapNext: myself.pushRecoverWalletView) - myself.navigationController?.setClearNavbar() - myself.navigationController?.modalPresentationStyle = .fullScreen - myself.navigationController?.setNavigationBarHidden(false, animated: false) - myself.navigationController?.pushViewController(recoverIntro, animated: true) - }) - - navigationController = ModalNavigationController(rootViewController: startViewController) - navigationController?.delegate = navigationControllerDelegate - navigationController?.modalPresentationStyle = .fullScreen + /// DOC: This is a legacy path for iPad users since SwiftUI doesnt gracefully handle presentations like iPhone + if UIDevice.current.userInterfaceIdiom == .pad { + let startViewController = StartViewController(store: store, + didTapCreate: { [weak self] in + self?.pushPinCreationViewControllerForNewWallet() + }, + didTapRecover: { [weak self] in + guard let myself = self else { return } + let recoverIntro = RecoverWalletIntroViewController(didTapNext: myself.pushRecoverWalletView) + myself.navigationController?.setClearNavbar() + myself.navigationController?.modalPresentationStyle = .fullScreen + myself.navigationController?.setNavigationBarHidden(false, animated: false) + myself.navigationController?.pushViewController(recoverIntro, animated: true) + }) + + navigationController = ModalNavigationController(rootViewController: startViewController) + navigationController?.delegate = navigationControllerDelegate + navigationController?.modalPresentationStyle = .fullScreen + } else { + let startHostingController = StartHostingController(store: store, + walletManager: walletManager) + + startHostingController.viewModel.userWantsToCreate { + self.pushPinCreationViewControllerForNewWallet() + } + + startHostingController.viewModel.userWantsToRecover { + let recoverIntro = RecoverWalletIntroViewController(didTapNext: self.pushRecoverWalletView) + self.navigationController?.setClearNavbar() + self.navigationController?.modalPresentationStyle = .fullScreen + self.navigationController?.setNavigationBarHidden(false, animated: false) + self.navigationController?.pushViewController(recoverIntro, animated: true) + } + + navigationController = ModalNavigationController(rootViewController: startHostingController) + navigationController?.delegate = navigationControllerDelegate + navigationController?.modalPresentationStyle = .fullScreen + } if let startFlow = navigationController { startFlow.setNavigationBarHidden(true, animated: false) @@ -138,8 +153,8 @@ class StartFlowPresenter: Subscriber { paperPhraseViewController.hideCloseNavigationItem() // Forces user to confirm paper-key navigationController?.navigationBar.titleTextAttributes = [ - NSAttributedStringKey.foregroundColor: UIColor.white, - NSAttributedStringKey.font: UIFont.customBold(size: 17.0), + NSAttributedString.Key.foregroundColor: UIColor.white, + NSAttributedString.Key.font: UIFont.customBold(size: 17.0), ] navigationController?.pushViewController(paperPhraseViewController, animated: true) } diff --git a/loafwallet/src/FlowControllers/StartNavigationDelegate.swift b/litewallet/src/FlowControllers/StartNavigationDelegate.swift similarity index 79% rename from loafwallet/src/FlowControllers/StartNavigationDelegate.swift rename to litewallet/src/FlowControllers/StartNavigationDelegate.swift index 1a3bf1a40..c6d54b5d4 100644 --- a/loafwallet/src/FlowControllers/StartNavigationDelegate.swift +++ b/litewallet/src/FlowControllers/StartNavigationDelegate.swift @@ -12,8 +12,8 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { if viewController is RecoverWalletIntroViewController { navigationController.navigationBar.tintColor = .white navigationController.navigationBar.titleTextAttributes = [ - NSAttributedStringKey.foregroundColor: UIColor.white, - NSAttributedStringKey.font: UIFont.customBold(size: 17.0), + NSAttributedString.Key.foregroundColor: UIColor.white, + NSAttributedString.Key.font: UIFont.customBold(size: 17.0), ] navigationController.setClearNavbar() navigationController.navigationBar.barTintColor = .clear @@ -22,8 +22,8 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { if viewController is EnterPhraseViewController { navigationController.navigationBar.tintColor = .darkText navigationController.navigationBar.titleTextAttributes = [ - NSAttributedStringKey.foregroundColor: UIColor.darkText, - NSAttributedStringKey.font: UIFont.customBold(size: 17.0), + NSAttributedString.Key.foregroundColor: UIColor.darkText, + NSAttributedString.Key.font: UIFont.customBold(size: 17.0), ] navigationController.setClearNavbar() navigationController.navigationBar.isTranslucent = false @@ -33,8 +33,8 @@ class StartNavigationDelegate: NSObject, UINavigationControllerDelegate { if viewController is UpdatePinViewController { navigationController.navigationBar.tintColor = .darkText navigationController.navigationBar.titleTextAttributes = [ - NSAttributedStringKey.foregroundColor: UIColor.darkText, - NSAttributedStringKey.font: UIFont.customBold(size: 17.0), + NSAttributedString.Key.foregroundColor: UIColor.darkText, + NSAttributedString.Key.font: UIFont.customBold(size: 17.0), ] navigationController.setClearNavbar() } diff --git a/loafwallet/src/FlowControllers/URLController.swift b/litewallet/src/FlowControllers/URLController.swift similarity index 100% rename from loafwallet/src/FlowControllers/URLController.swift rename to litewallet/src/FlowControllers/URLController.swift diff --git a/loafwallet/src/KVStoreCoordinator.swift b/litewallet/src/KVStoreCoordinator.swift similarity index 100% rename from loafwallet/src/KVStoreCoordinator.swift rename to litewallet/src/KVStoreCoordinator.swift diff --git a/litewallet/src/LoginView.swift b/litewallet/src/LoginView.swift new file mode 100644 index 000000000..817b88505 --- /dev/null +++ b/litewallet/src/LoginView.swift @@ -0,0 +1,30 @@ +// +// LoginView.swift +// litewallet +// +// Created by Kerry Washington on 12/25/23. +// Copyright © 2023 Litecoin Foundation. All rights reserved. +// +import SwiftUI + +struct LoginView: View { + @ObservedObject + var viewModel: LockScreenViewModel + + init(viewModel: LockScreenViewModel) { + self.viewModel = viewModel + + /// lockScreenHeaderView + } + + var body: some View { + GeometryReader { _ in + ZStack { + Color.litewalletBlue.edgesIgnoringSafeArea(.all) + VStack { + Spacer() + } + } + } + } +} diff --git a/litewallet/src/LoginViewHostingController.swift b/litewallet/src/LoginViewHostingController.swift new file mode 100644 index 000000000..4bd35cdc7 --- /dev/null +++ b/litewallet/src/LoginViewHostingController.swift @@ -0,0 +1,26 @@ +// +// LoginViewHostingController.swift +// litewallet +// +// Created by Kerry Washington on 12/25/23. +// Copyright © 2023 Litecoin Foundation. All rights reserved. +// +import Foundation +import SwiftUI + +class LoginViewHostingController: UIHostingController { + // MARK: - Private + + var viewModel: LockScreenViewModel + + init(store: Store, isPresentedForLock _: Bool, walletManager _: WalletManager? = nil) { + viewModel = LockScreenViewModel(store: store) + + super.init(rootView: LoginView(viewModel: viewModel)) + } + + @available(*, unavailable) + @MainActor dynamic required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/litewallet/src/LoginViewModel.swift b/litewallet/src/LoginViewModel.swift new file mode 100644 index 000000000..de2f4e8d8 --- /dev/null +++ b/litewallet/src/LoginViewModel.swift @@ -0,0 +1,18 @@ +import AVFoundation +import Foundation +import SwiftUI +import UIKit + +class LoginViewModel: ObservableObject { + // MARK: - Combine Variables + + var store: Store + var walletManager: WalletManager? + var isPresentedForLock: Bool + + init(store: Store, isPresentedForLock: Bool, walletManager: WalletManager?) { + self.store = store + self.walletManager = walletManager + self.isPresentedForLock = isPresentedForLock + } +} diff --git a/loafwallet/src/ModalPresenter.swift b/litewallet/src/ModalPresenter.swift similarity index 96% rename from loafwallet/src/ModalPresenter.swift rename to litewallet/src/ModalPresenter.swift index db522e267..b54f6d4f1 100644 --- a/loafwallet/src/ModalPresenter.swift +++ b/litewallet/src/ModalPresenter.swift @@ -310,12 +310,14 @@ class ModalPresenter: Subscriber, Trackable { sendVC.presentScan = presentScan(parent: root) sendVC.presentVerifyPin = { [weak self, weak root] bodyText, callback in guard let myself = self else { return } + guard let myroot = root else { return } + let vc = VerifyPinViewController(bodyText: bodyText, pinLength: myself.store.state.pinLength, callback: callback) - vc.transitioningDelegate = self?.verifyPinTransitionDelegate + vc.transitioningDelegate = myself.verifyPinTransitionDelegate vc.modalPresentationStyle = .overFullScreen vc.modalPresentationCapturesStatusBarAppearance = true - root?.view.isFrameChangeBlocked = true - root?.present(vc, animated: true, completion: nil) + myroot.view.isFrameChangeBlocked = true + myroot.present(vc, animated: true, completion: nil) } sendVC.onPublishSuccess = { [weak self] in self?.presentAlert(.sendSuccess, completion: {}) @@ -535,11 +537,6 @@ class ModalPresenter: Subscriber, Trackable { let settings = SettingsViewController(sections: sections, rows: rows) settings.addCloseNavigationItem() settingsNav.viewControllers = [settings] - let view = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) - view.backgroundColor = .whiteTint - settingsNav.navigationBar.setBackgroundImage(view.imageRepresentation, for: .default) - settingsNav.navigationBar.shadowImage = UIImage() - settingsNav.navigationBar.isTranslucent = false top.present(settingsNav, animated: true, completion: nil) } @@ -660,18 +657,8 @@ class ModalPresenter: Subscriber, Trackable { }) start.navigationItem.title = S.SecurityCenter.Cells.paperKeyTitle.localize() - var staticColor = UIColor() - - if #available(iOS 11.0, *), - let tempStaticColor = UIColor(named: "staticWhiteColor") - { - staticColor = tempStaticColor - } else { - staticColor = .whiteTint - } - if UserDefaults.writePaperPhraseDate != nil { - start.addCloseNavigationItem(tintColor: staticColor) + start.addCloseNavigationItem(tintColor: .lightGray) } else { start.hideCloseNavigationItem() } @@ -697,7 +684,7 @@ class ModalPresenter: Subscriber, Trackable { group.enter() DispatchQueue.walletQueue.asyncAfter(deadline: .now() + 2.0) { - print("Pausing to show 'Wiping' Dialog") + print("::: Pausing to show 'Wiping' Dialog") group.leave() } @@ -706,7 +693,9 @@ class ModalPresenter: Subscriber, Trackable { canForceWipeWallet { self.store.trigger(name: .reinitWalletManager { - activity.dismiss(animated: true, completion: {}) + activity.dismiss(animated: true, completion: { + print("::: Reiniting the WalletManager") + }) }) } else { let failure = UIAlertController(title: S.WipeWallet.failedTitle.localize(), message: S.WipeWallet.failedMessage.localize(), preferredStyle: .alert) @@ -719,23 +708,6 @@ class ModalPresenter: Subscriber, Trackable { topViewController?.present(alert, animated: true, completion: nil) } - private func handlePaymentRequest(request: PaymentRequest) { - currentRequest = request - guard !store.state.isLoginRequired else { presentModal(.send); return } - - if topViewController is MainViewController { - presentModal(.send) - } else { - LWAnalytics.logEventWithParameters(itemName: ._20210427_HCIEEH) - if let presented = UIApplication.shared.windows.filter({ $0.isKeyWindow }).first?.rootViewController?.presentedViewController - { - presented.dismiss(animated: true, completion: { - self.presentModal(.send) - }) - } - } - } - private func handleScanQrURL() { guard !store.state.isLoginRequired else { presentLoginScan(); return } diff --git a/litewallet/src/Models/KeyboardNotificationInfo.swift b/litewallet/src/Models/KeyboardNotificationInfo.swift new file mode 100644 index 000000000..73c007c09 --- /dev/null +++ b/litewallet/src/Models/KeyboardNotificationInfo.swift @@ -0,0 +1,35 @@ +import UIKit + +struct KeyboardNotificationInfo { + let endFrame: CGRect + + let startFrame: CGRect + + var deltaY: CGFloat { + return endFrame.minY - startFrame.minY + } + + var animationOptions: UIView.AnimationOptions { + return UIView.AnimationOptions(rawValue: animationCurve << 16) + } + + let animationDuration: Double + + init?(_ userInfo: [AnyHashable: Any]?) { + guard let userInfo = userInfo else { return nil } + guard let endFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue, + let startFrame = userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue, + let animationDuration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber, + let animationCurve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber + else { + return nil + } + + self.endFrame = endFrame.cgRectValue + self.startFrame = startFrame.cgRectValue + self.animationDuration = animationDuration.doubleValue + self.animationCurve = animationCurve.uintValue + } + + private let animationCurve: UInt +} diff --git a/loafwallet/src/Models/Rate.swift b/litewallet/src/Models/Rate.swift similarity index 100% rename from loafwallet/src/Models/Rate.swift rename to litewallet/src/Models/Rate.swift diff --git a/loafwallet/src/Models/Setting.swift b/litewallet/src/Models/Setting.swift similarity index 100% rename from loafwallet/src/Models/Setting.swift rename to litewallet/src/Models/Setting.swift diff --git a/loafwallet/src/Models/SimpleUTXO.swift b/litewallet/src/Models/SimpleUTXO.swift similarity index 100% rename from loafwallet/src/Models/SimpleUTXO.swift rename to litewallet/src/Models/SimpleUTXO.swift diff --git a/loafwallet/src/Models/Types.swift b/litewallet/src/Models/Types.swift similarity index 98% rename from loafwallet/src/Models/Types.swift rename to litewallet/src/Models/Types.swift index f42aa0d5a..c774c4a77 100644 --- a/loafwallet/src/Models/Types.swift +++ b/litewallet/src/Models/Types.swift @@ -1,6 +1,7 @@ import Foundation +import UIKit -// MARK: - Satishis +// MARK: - Satoshis struct Satoshis { let rawValue: UInt64 diff --git a/litewallet/src/PINFieldView.swift b/litewallet/src/PINFieldView.swift new file mode 100644 index 000000000..769ff65ad --- /dev/null +++ b/litewallet/src/PINFieldView.swift @@ -0,0 +1,105 @@ +import Foundation +import SwiftUI +import UIKit + +struct PINFieldView: UIViewRepresentable { + // MARK: - Combine Variables + + @Binding + var pinText: String + + @Binding + var pinIsFilled: Bool + + @Binding + var viewRect: CGRect + + // MARK: - Public Variables + + public + var isFirstResponder: Bool = false + + public + var placeholder: String = "------" + + // MARK: - Private Variables + + private + let viewKerning: CGFloat = 10.0 + + private + let maxPinDigits: Int = 6 + + init(pinText: Binding, + pinIsFilled: Binding, + viewRect: Binding) + { + _pinText = pinText + _pinIsFilled = pinIsFilled + _viewRect = viewRect + } + + func makeUIView(context: UIViewRepresentableContext) -> UITextField { + let textField = UITextField() + textField.delegate = context.coordinator + textField.font = .barlowSemiBold(size: 24.0) + textField.textAlignment = .center + textField.backgroundColor = .clear + textField.textColor = UIColor(Color.liteWalletDarkBlue) + textField.defaultTextAttributes.updateValue(viewKerning, forKey: NSAttributedString.Key.kern) + textField.keyboardType = .decimalPad + textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [ + NSAttributedString.Key.kern: 15.0, + NSAttributedString.Key.foregroundColor: UIColor(Color.green), + NSAttributedString.Key.font: UIFont.barlowBold(size: 17.0), + ]) + viewRect = textField.bounds + return textField + } + + func updateUIView(_: UITextField, context _: UIViewRepresentableContext) {} + + func makeCoordinator() -> PINFieldView.Coordinator { + Coordinator(parent: self) + } + + class Coordinator: NSObject, UITextFieldDelegate { + var parent: PINFieldView + + init(parent: PINFieldView) { + self.parent = parent + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + let maxLength = parent.maxPinDigits + let currentString: NSString = (textField.text ?? "") as NSString + let newString: NSString = + currentString.replacingCharacters(in: range, with: string) as NSString + + if newString.length == parent.maxPinDigits { + parent.pinText = String(newString) + parent.pinIsFilled = true + } else { + parent.pinIsFilled = false + } + + return newString.length <= maxLength + } + + func textFieldDidEndEditing(_ textField: UITextField) { + textField.resignFirstResponder() + } + } +} + +struct PINFieldView_Previews: PreviewProvider { + static var previews: some View { + Group { + HStack { + PINFieldView(pinText: .constant(""), + pinIsFilled: .constant(true), + viewRect: .constant(CGRect())) + } + } + } +} diff --git a/loafwallet/src/PaymentProtocol.swift b/litewallet/src/PaymentProtocol.swift similarity index 100% rename from loafwallet/src/PaymentProtocol.swift rename to litewallet/src/PaymentProtocol.swift diff --git a/loafwallet/src/PaymentRequest.swift b/litewallet/src/PaymentRequest.swift similarity index 100% rename from loafwallet/src/PaymentRequest.swift rename to litewallet/src/PaymentRequest.swift diff --git a/litewallet/src/PinDigitView.swift b/litewallet/src/PinDigitView.swift new file mode 100644 index 000000000..5b68de505 --- /dev/null +++ b/litewallet/src/PinDigitView.swift @@ -0,0 +1,97 @@ +import Foundation +import SwiftUI + +struct PinDigit: Identifiable, Hashable { + let id = UUID() + let digit: String +} + +struct PinDigitView: View { + let pinDigit: PinDigit + + var body: some View { + GeometryReader { _ in + + ZStack { + VStack { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(height: 45, alignment: .center) + .foregroundColor(.red) + .shadow(radius: 3, x: 3.0, y: 3.0) + + Text(pinDigit.digit) + .frame(height: 45, alignment: .center) + .font(.barlowSemiBold(size: 18.0)) + .foregroundColor(.black) + } + } + } + } + } +} + +#Preview { + PinDigitView(pinDigit: PinDigit(digit: "0")) +} + +/// 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 + @Environment(\.dismiss) var dismiss + + private let maxDigits: Int = 6 + private let userPasscode = "000000" + + @State var enteredPasscode: String = "" + @FocusState var keyboardFocused: Bool + + public var body: some View { + ZStack { + HStack { + ForEach(0 ..< maxDigits, id: \.self) { + let entered = ($0 + 1) > enteredPasscode.count + + ZStack { + Image(systemName: "circle") + } + } + } + HStack { + TextField("", text: $enteredPasscode) + .opacity(1.0) + .keyboardType(.decimalPad) + .focused($keyboardFocused) + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + keyboardFocused = true + } + } + } + } + .padding() + .onChange(of: enteredPasscode) { newValue in + if newValue.count == viewModel.walletManager.pinLength { + keyboardFocused = false + } + } + // .onChange(of: enteredPasscode) { _ in + // guard enteredPasscode.count == maxDigits else { return } +// + // passcodeValidation() + // } + } + + // func passcodeValidation() { + // if enteredPasscode == userPasscode { + // viewModel.isUnlocked = true + // dismiss() + // } else { + // enteredPasscode = "" + // showAlert = true + // } + // } +} diff --git a/loafwallet/src/Platform/BRAPIClient.swift b/litewallet/src/Platform/BRAPIClient.swift similarity index 100% rename from loafwallet/src/Platform/BRAPIClient.swift rename to litewallet/src/Platform/BRAPIClient.swift diff --git a/loafwallet/src/Platform/BRActivityView.swift b/litewallet/src/Platform/BRActivityView.swift similarity index 96% rename from loafwallet/src/Platform/BRActivityView.swift rename to litewallet/src/Platform/BRActivityView.swift index 835ca7d00..c9daaacdc 100644 --- a/loafwallet/src/Platform/BRActivityView.swift +++ b/litewallet/src/Platform/BRActivityView.swift @@ -22,7 +22,7 @@ class BRActivityViewController: UIViewController { } @objc open class BRActivityView: UIView { - let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .large) + let activityIndicatorView = UIActivityIndicatorView(style: .large) let boundingBoxView = UIView(frame: CGRect.zero) let messageLabel = UILabel(frame: CGRect.zero) diff --git a/loafwallet/src/Platform/BRCoding.swift b/litewallet/src/Platform/BRCoding.swift similarity index 96% rename from loafwallet/src/Platform/BRCoding.swift rename to litewallet/src/Platform/BRCoding.swift index 2a5495844..2d44f0b6f 100644 --- a/loafwallet/src/Platform/BRCoding.swift +++ b/litewallet/src/Platform/BRCoding.swift @@ -3,6 +3,7 @@ import Foundation // BRCoder/BRCoding works a lot like NSCoder/NSCoding but simpler // instead of using optionals everywhere we just use zero values, and take advantage // of the swift type system somewhat to make the whole api a little cleaner + protocol BREncodable { // return anything that is JSON-able func encode() -> AnyObject @@ -46,7 +47,7 @@ open class BRKeyedArchiver { obj.encode(coder) do { let j = try JSONSerialization.data(withJSONObject: coder.data, options: []) - guard let bz = (compressed ? j.bzCompressedData : j) + guard let bz = (compressed ? nil : j) else { print("compression error") return Data() @@ -63,7 +64,7 @@ open class BRKeyedArchiver { open class BRKeyedUnarchiver { static func unarchiveObjectWithData(_ data: Data, compressed: Bool = true) -> T? { do { - guard let bz = (compressed ? Data(bzCompressedData: data) : data), + guard let bz = (compressed ? nil : data), let j = try JSONSerialization.jsonObject(with: bz, options: []) as? [String: AnyObject] else { print("BRKeyedUnarchiver invalid json object, or invalid bz data") diff --git a/loafwallet/src/Platform/BRReplicatedKVStore.swift b/litewallet/src/Platform/BRReplicatedKVStore.swift similarity index 99% rename from loafwallet/src/Platform/BRReplicatedKVStore.swift rename to litewallet/src/Platform/BRReplicatedKVStore.swift index cb31d1083..bad0eca03 100644 --- a/loafwallet/src/Platform/BRReplicatedKVStore.swift +++ b/litewallet/src/Platform/BRReplicatedKVStore.swift @@ -1,6 +1,6 @@ import BRCore import Foundation -import sqlite3 +import SQLite3 public enum BRReplicatedKVStoreError: Error { case sqLiteError diff --git a/loafwallet/src/Platform/BRSocketHelpers.c b/litewallet/src/Platform/BRSocketHelpers.c similarity index 100% rename from loafwallet/src/Platform/BRSocketHelpers.c rename to litewallet/src/Platform/BRSocketHelpers.c diff --git a/loafwallet/src/Platform/BRSocketHelpers.h b/litewallet/src/Platform/BRSocketHelpers.h similarity index 100% rename from loafwallet/src/Platform/BRSocketHelpers.h rename to litewallet/src/Platform/BRSocketHelpers.h diff --git a/loafwallet/src/Platform/BRTar.swift b/litewallet/src/Platform/BRTar.swift similarity index 100% rename from loafwallet/src/Platform/BRTar.swift rename to litewallet/src/Platform/BRTar.swift diff --git a/loafwallet/src/Platform/BRWebViewController.swift b/litewallet/src/Platform/BRWebViewController.swift similarity index 100% rename from loafwallet/src/Platform/BRWebViewController.swift rename to litewallet/src/Platform/BRWebViewController.swift diff --git a/loafwallet/src/Platform/Extensions.swift b/litewallet/src/Platform/Extensions.swift similarity index 84% rename from loafwallet/src/Platform/Extensions.swift rename to litewallet/src/Platform/Extensions.swift index b8d1d1653..b79051f57 100644 --- a/loafwallet/src/Platform/Extensions.swift +++ b/litewallet/src/Platform/Extensions.swift @@ -1,6 +1,6 @@ import BRCore import Foundation -import libbz2 +// import libbz2 import UIKit public extension String { @@ -153,94 +153,94 @@ public extension Data { return objc_getAssociatedObject(self, &AssociatedKeys.hexString) as? String } - var bzCompressedData: Data? { - guard !isEmpty - else { - return self - } - - var compressed = Data() - var stream = bz_stream() - var mself = self - var success = true - mself.withUnsafeMutableBytes { (selfBuff: UnsafeMutablePointer) in - let outBuff = UnsafeMutablePointer.allocate(capacity: Int(BZCompressionBufferSize)) - defer { outBuff.deallocate() } - - stream.next_in = selfBuff - stream.avail_in = UInt32(self.count) - stream.next_out = outBuff - stream.avail_out = BZCompressionBufferSize - - var bzret = BZ2_bzCompressInit(&stream, BZDefaultBlockSize, 0, BZDefaultWorkFactor) - guard bzret == BZ_OK - else { - print("failed compression init") - success = false - return - } - repeat { - bzret = BZ2_bzCompress(&stream, stream.avail_in > 0 ? BZ_RUN : BZ_FINISH) - guard bzret >= BZ_OK - else { - print("failed compress") - success = false - return - } - let bpp = UnsafeBufferPointer(start: outBuff, count: Int(BZCompressionBufferSize) - Int(stream.avail_out)) - compressed.append(bpp) - stream.next_out = outBuff - stream.avail_out = BZCompressionBufferSize - } while bzret != BZ_STREAM_END - } - BZ2_bzCompressEnd(&stream) - guard success else { return nil } - return compressed - } - - init?(bzCompressedData data: Data) { - guard !data.isEmpty - else { - return nil - } - var stream = bz_stream() - var decompressed = Data() - var myDat = data - var success = true - myDat.withUnsafeMutableBytes { (datBuff: UnsafeMutablePointer) in - let outBuff = UnsafeMutablePointer.allocate(capacity: Int(BZCompressionBufferSize)) - defer { outBuff.deallocate() } - - stream.next_in = datBuff - stream.avail_in = UInt32(data.count) - stream.next_out = outBuff - stream.avail_out = BZCompressionBufferSize - - var bzret = BZ2_bzDecompressInit(&stream, 0, 0) - guard bzret == BZ_OK - else { - print("failed decompress init") - success = false - return - } - repeat { - bzret = BZ2_bzDecompress(&stream) - guard bzret >= BZ_OK - else { - print("failed decompress") - success = false - return - } - let bpp = UnsafeBufferPointer(start: outBuff, count: Int(BZCompressionBufferSize) - Int(stream.avail_out)) - decompressed.append(bpp) - stream.next_out = outBuff - stream.avail_out = BZCompressionBufferSize - } while bzret != BZ_STREAM_END - } - BZ2_bzDecompressEnd(&stream) - guard success else { return nil } - self.init(decompressed) - } +// var bzCompressedData: Data? { +// guard !isEmpty +// else { +// return self +// } +// +// var compressed = Data() +// var stream = bz_stream() +// var mself = self +// var success = true +// mself.withUnsafeMutableBytes { (selfBuff: UnsafeMutablePointer) in +// let outBuff = UnsafeMutablePointer.allocate(capacity: Int(BZCompressionBufferSize)) +// defer { outBuff.deallocate() } +// +// stream.next_in = selfBuff +// stream.avail_in = UInt32(self.count) +// stream.next_out = outBuff +// stream.avail_out = BZCompressionBufferSize +// +// var bzret = BZ2_bzCompressInit(&stream, BZDefaultBlockSize, 0, BZDefaultWorkFactor) +// guard bzret == BZ_OK +// else { +// print("failed compression init") +// success = false +// return +// } +// repeat { +// bzret = BZ2_bzCompress(&stream, stream.avail_in > 0 ? BZ_RUN : BZ_FINISH) +// guard bzret >= BZ_OK +// else { +// print("failed compress") +// success = false +// return +// } +// let bpp = UnsafeBufferPointer(start: outBuff, count: Int(BZCompressionBufferSize) - Int(stream.avail_out)) +// compressed.append(bpp) +// stream.next_out = outBuff +// stream.avail_out = BZCompressionBufferSize +// } while bzret != BZ_STREAM_END +// } +// BZ2_bzCompressEnd(&stream) +// guard success else { return nil } +// return compressed +// } +// +// init?(bzCompressedData data: Data) { +// guard !data.isEmpty +// else { +// return nil +// } +// var stream = bz_stream() +// var decompressed = Data() +// var myDat = data +// var success = true +// myDat.withUnsafeMutableBytes { (datBuff: UnsafeMutablePointer) in +// let outBuff = UnsafeMutablePointer.allocate(capacity: Int(BZCompressionBufferSize)) +// defer { outBuff.deallocate() } +// +// stream.next_in = datBuff +// stream.avail_in = UInt32(data.count) +// stream.next_out = outBuff +// stream.avail_out = BZCompressionBufferSize +// +// var bzret = BZ2_bzDecompressInit(&stream, 0, 0) +// guard bzret == BZ_OK +// else { +// print("failed decompress init") +// success = false +// return +// } +// repeat { +// bzret = BZ2_bzDecompress(&stream) +// guard bzret >= BZ_OK +// else { +// print("failed decompress") +// success = false +// return +// } +// let bpp = UnsafeBufferPointer(start: outBuff, count: Int(BZCompressionBufferSize) - Int(stream.avail_out)) +// decompressed.append(bpp) +// stream.next_out = outBuff +// stream.avail_out = BZCompressionBufferSize +// } while bzret != BZ_STREAM_END +// } +// BZ2_bzDecompressEnd(&stream) +// guard success else { return nil } +// self.init(decompressed) +// } var base58: String { return withUnsafeBytes { (selfBytes: UnsafePointer) -> String in @@ -322,7 +322,7 @@ public extension Data { } } - fileprivate func genNonce() -> [UInt8] { + private func genNonce() -> [UInt8] { var tv = timeval() gettimeofday(&tv, nil) var t = UInt64(tv.tv_usec) * 1_000_000 + UInt64(tv.tv_usec) diff --git a/loafwallet/src/Platform/TxMetaData.swift b/litewallet/src/Platform/TxMetaData.swift similarity index 100% rename from loafwallet/src/Platform/TxMetaData.swift rename to litewallet/src/Platform/TxMetaData.swift diff --git a/loafwallet/src/Platform/WalletInfo.swift b/litewallet/src/Platform/WalletInfo.swift similarity index 100% rename from loafwallet/src/Platform/WalletInfo.swift rename to litewallet/src/Platform/WalletInfo.swift diff --git a/loafwallet/src/Platform/module.modulemap b/litewallet/src/Platform/module.modulemap similarity index 100% rename from loafwallet/src/Platform/module.modulemap rename to litewallet/src/Platform/module.modulemap diff --git a/loafwallet/src/ReachabilityMonitor.swift b/litewallet/src/ReachabilityMonitor.swift similarity index 100% rename from loafwallet/src/ReachabilityMonitor.swift rename to litewallet/src/ReachabilityMonitor.swift diff --git a/loafwallet/src/RetryTimer.swift b/litewallet/src/RetryTimer.swift similarity index 100% rename from loafwallet/src/RetryTimer.swift rename to litewallet/src/RetryTimer.swift diff --git a/litewallet/src/ScanViewController.swift b/litewallet/src/ScanViewController.swift new file mode 100644 index 000000000..fecc4ab44 --- /dev/null +++ b/litewallet/src/ScanViewController.swift @@ -0,0 +1 @@ +import Foundation diff --git a/loafwallet/src/Sender.swift b/litewallet/src/Sender.swift similarity index 90% rename from loafwallet/src/Sender.swift rename to litewallet/src/Sender.swift index 45b7cc84a..62b0d11ca 100644 --- a/loafwallet/src/Sender.swift +++ b/litewallet/src/Sender.swift @@ -48,6 +48,17 @@ class Sender { return transaction != nil } + func createTransactionWithOpsOutputs(amount: UInt64, + to: String) -> Bool + { + transaction = walletManager.wallet?.createOpsTransaction(forAmount: amount, + toAddress: to, + opsFee: tieredOpsFee(amount: amount), + opsAddress: Partner.partnerKeyPath(name: .litewalletOps)) + + return transaction != nil + } + func feeForTx(amount: UInt64) -> UInt64 { return walletManager.wallet?.feeForTx(amount: amount) ?? 0 } @@ -104,36 +115,6 @@ class Sender { } } - func sendToCard(amount: UInt64, toAddress: String, completion: @escaping (Bool) -> Void) { - if createTransaction(amount: amount, to: toAddress) { - if let tx = transaction { - DispatchQueue.walletQueue.async { [weak self] in - guard let myself = self else { return } - myself.walletManager.signCardTransaction(tx) { result in - switch result { - case .success: - - self?.publish(completion: { result in - print("XXX \(result)") - }) - - completion(true) - - case .failure: - print("XXX Failure") - - case .fallback: - print("XXX Fallback") - - case .cancel: - print("XXX Cancel") - } - } - } - } - } - } - /// Verify Pin /// - Parameters: /// - tx: TX package diff --git a/litewallet/src/SignupWebView.swift b/litewallet/src/SignupWebView.swift new file mode 100644 index 000000000..1f5163d31 --- /dev/null +++ b/litewallet/src/SignupWebView.swift @@ -0,0 +1,83 @@ +import Combine +import Foundation +import SafariServices +import SwiftUI +import UIKit +import WebKit + +struct SignupWebView: UIViewRepresentable { + @Binding + var userAction: Bool + + let urlString: String + + private var webView: WKWebView? + + init(userAction: Binding, urlString: String) { + webView = WKWebView() + self.urlString = urlString + _userAction = userAction + } + + func makeUIView(context: Context) -> WKWebView { + let source = "var meta = document.createElement('meta');" + + "meta.name = 'viewport';" + + "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" + + "var head = document.getElementsByTagName('head')[0];" + + "head.appendChild(meta);" + + let script = WKUserScript(source: source, + injectionTime: .atDocumentEnd, + forMainFrameOnly: true) + + let userContentController = WKUserContentController() + userContentController.addUserScript(script) + + let configuration = WKWebViewConfiguration() + configuration.userContentController = userContentController + + let _wkwebview = WKWebView(frame: .zero, configuration: configuration) + _wkwebview.navigationDelegate = context.coordinator + _wkwebview.uiDelegate = context.coordinator + _wkwebview.allowsBackForwardNavigationGestures = false + _wkwebview.scrollView.isScrollEnabled = false + _wkwebview.backgroundColor = UIColor.liteWalletDarkBlue + _wkwebview.load(URLRequest(url: URL(string: urlString)!)) + + return _wkwebview + } + + func updateUIView(_ webView: WKWebView, context _: Context) { + webView.evaluateJavaScript("document.getElementById('submit-email').value") { response, _ in + + if let resultString = response as? String, + resultString.contains("Please") + { + userAction = true + + let signupDict: [String: String] = ["date_accepted": Date().ISO8601Format()] + LWAnalytics.logEventWithParameters(itemName: ._20240101_US, properties: signupDict) + } + } + } + + func makeCoordinator() -> Coordinator { + return Coordinator(self) + } + + class Coordinator: NSObject, + WKNavigationDelegate, + WKUIDelegate, + WKScriptMessageHandler + { + func userContentController(_: WKUserContentController, didReceive message: WKScriptMessage) { + print("::: message \(message)") + } + + let parent: SignupWebView + + init(_ parent: SignupWebView) { + self.parent = parent + } + } +} diff --git a/litewallet/src/SignupWebViewModel.swift b/litewallet/src/SignupWebViewModel.swift new file mode 100644 index 000000000..d4de24f21 --- /dev/null +++ b/litewallet/src/SignupWebViewModel.swift @@ -0,0 +1,14 @@ +// +// SignupWebViewModel.swift +// litewallet +// +// Created by Kerry Washington on 1/9/24. +// Copyright © 2024 Litecoin Foundation. All rights reserved. +// +import Combine +import Foundation + +class SignupWebViewModel: ObservableObject { + var showLoader = PassthroughSubject() + var valuePublisher = PassthroughSubject() +} diff --git a/loafwallet/src/SimpleRedux.swift b/litewallet/src/SimpleRedux.swift similarity index 99% rename from loafwallet/src/SimpleRedux.swift rename to litewallet/src/SimpleRedux.swift index 45a4a8a1a..1482ceda4 100644 --- a/loafwallet/src/SimpleRedux.swift +++ b/litewallet/src/SimpleRedux.swift @@ -8,7 +8,7 @@ protocol Action { } // We need reference semantics for Subscribers, so they are restricted to classes -protocol Subscriber: class {} +protocol Subscriber: AnyObject {} extension Subscriber { var hashValue: Int { diff --git a/loafwallet/src/SimpleRedux/Actions.swift b/litewallet/src/SimpleRedux/Actions.swift similarity index 99% rename from loafwallet/src/SimpleRedux/Actions.swift rename to litewallet/src/SimpleRedux/Actions.swift index 015b4b0df..82315a16f 100644 --- a/loafwallet/src/SimpleRedux/Actions.swift +++ b/litewallet/src/SimpleRedux/Actions.swift @@ -209,15 +209,6 @@ enum MaxDigits { } } -enum PushNotifications { - struct setIsEnabled: Action { - let reduce: Reducer - init(_ isEnabled: Bool) { - reduce = { $0.clone(isPushNotificationsEnabled: isEnabled) } - } - } -} - enum biometricsActions { struct setIsPrompting: Action { let reduce: Reducer diff --git a/loafwallet/src/SimpleRedux/ReduxState.swift b/litewallet/src/SimpleRedux/ReduxState.swift similarity index 100% rename from loafwallet/src/SimpleRedux/ReduxState.swift rename to litewallet/src/SimpleRedux/ReduxState.swift diff --git a/litewallet/src/StartView.swift b/litewallet/src/StartView.swift new file mode 100644 index 000000000..60cacbd9e --- /dev/null +++ b/litewallet/src/StartView.swift @@ -0,0 +1,212 @@ +import SwiftUI +import UIKit + +struct StartView: View { + let buttonFont: Font = .barlowSemiBold(size: 20.0) + let buttonLightFont: Font = .barlowLight(size: 20.0) + let tinyFont: Font = .barlowRegular(size: 12.0) + + let squareButtonSize: CGFloat = 55.0 + let squareImageSize: CGFloat = 25.0 + + @ObservedObject + var startViewModel: StartViewModel + + @State + private var selectedLang: Bool = false + + @State + private var delayedSelect: Bool = false + + @State + private var currentTagline = "" + + @State + private var animationAmount = 0.0 + + @State + private var pickedLanguage: LanguageSelection = .English + + @State + private var didContinue: Bool = false + + init(viewModel: StartViewModel) { + startViewModel = viewModel + } + + var body: some View { + GeometryReader { geometry in + + let width = geometry.size.width + let height = geometry.size.height + + NavigationView { + ZStack { + Color.litewalletDarkBlue.edgesIgnoringSafeArea(.all) + VStack { + Spacer() + Image("new-logotype-white") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: width * 0.6) + .padding(.top, height * 0.05) + .padding(.bottom, height * 0.05) + + Text(currentTagline) + .font(buttonLightFont) + .multilineTextAlignment(.center) + .fixedSize(horizontal: false, + vertical: true) + .foregroundColor(.white) + .frame(width: width * 0.7, + height: height * 0.05, + alignment: .center) + .padding(.top, height * 0.02) + .padding(.bottom, height * 0.08) + .onAppear { + currentTagline = startViewModel.staticTagline + } + HStack { + ZStack { + Picker("", selection: $pickedLanguage) { + ForEach(startViewModel.languages, id: \.self) { + Text($0.nativeName) + .font(selectedLang ? buttonFont : buttonLightFont) + .foregroundColor(.white) + } + } + .pickerStyle(.wheel) + .frame(width: width * 0.5) + .onChange(of: $pickedLanguage.wrappedValue) { _ in + startViewModel.currentLanguage = pickedLanguage + selectedLang = true + currentTagline = startViewModel.taglines[startViewModel.currentLanguage.rawValue] + startViewModel.speakLanguage() + delay(1.5) { + delayedSelect = true + } + } + + Image(systemName: "checkmark.message.fill") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: squareImageSize, + height: squareImageSize, + alignment: .center) + .foregroundColor(selectedLang ? + .litewalletGreen : .litecoinGray.opacity(0.4)) + .shadow(radius: 6, x: 3.0, y: 3.0) + .padding(.all, 4.0) + .frame(width: width * 0.3, + height: squareButtonSize, + alignment: .center) + .offset(CGSize(width: width * 0.18, + height: -height * 0.03)) + .scaleEffect(CGSize(width: animationAmount, height: animationAmount)) + .animation( + .easeInOut(duration: 1.8) + .repeatCount(5), + value: animationAmount + ) + .onAppear { + animationAmount = 1.0 + } + } + } + .frame(width: width * 0.9, + height: height * 0.1, + 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 + } + } + } + Spacer() + NavigationLink(destination: + + AnnounceUpdatesView(navigateStart: .create, + language: startViewModel.currentLanguage, + didTapContinue: $didContinue) + .environmentObject(startViewModel) + .navigationBarBackButtonHidden(true) + ) { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(width: width * 0.9, height: 45, alignment: .center) + .foregroundColor(.white) + .shadow(radius: 3, x: 3.0, y: 3.0) + + Text(S.StartViewController.createButton.localize()) + .frame(width: width * 0.9, height: 45, alignment: .center) + .font(buttonFont) + .foregroundColor(.litewalletBlue) + .overlay( + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .stroke(.white, lineWidth: 2.0) + ) + } + } + .padding([.top, .bottom], 10.0) + + NavigationLink(destination: + + AnnounceUpdatesView(navigateStart: .recover, + language: startViewModel.currentLanguage, + didTapContinue: $didContinue) + .environmentObject(startViewModel) + .navigationBarBackButtonHidden(true) + ) { + ZStack { + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .frame(width: width * 0.9, height: 45, alignment: .center) + .foregroundColor(Color(UIColor.liteWalletBlue) + ).shadow(radius: 5, x: 3.0, y: 3.0) + + Text(S.StartViewController.recoverButton.localize()) + .frame(width: width * 0.9, height: 45, alignment: .center) + .font(buttonLightFont) + .foregroundColor(Color(UIColor.litecoinWhite)) + .overlay( + RoundedRectangle(cornerRadius: bigButtonCornerRadius) + .stroke(.white) + ) + } + } + .padding([.top, .bottom], 10.0) + + Text(AppVersion.string) + .frame(width: 100, alignment: .center) + .font(tinyFont) + .foregroundColor(.white) + .padding(.all, 5.0) + } + .padding(.all, swiftUICellPadding) + } + } + } + .alert(S.LitewalletAlert.error.localize(), + isPresented: $startViewModel.walletCreationDidFail, + actions: { + HStack { + Button(S.Button.ok.localize(), role: .cancel) { + startViewModel.walletCreationDidFail = false + } + } + }) + } +} + +// #Preview { +// StartView(viewModel: StartViewModel(store: Store(), +// walletManager: WalletManager(store: Store()))) +// .environment(\.locale, .init(identifier: "en")) +// } diff --git a/loafwallet/src/UserDefaultsUpdater.swift b/litewallet/src/UserDefaultsUpdater.swift similarity index 100% rename from loafwallet/src/UserDefaultsUpdater.swift rename to litewallet/src/UserDefaultsUpdater.swift diff --git a/loafwallet/src/ViewControllers/AboutViewController.swift b/litewallet/src/ViewControllers/AboutViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/AboutViewController.swift rename to litewallet/src/ViewControllers/AboutViewController.swift diff --git a/loafwallet/src/ViewControllers/AmountViewController.swift b/litewallet/src/ViewControllers/AmountViewController.swift similarity index 94% rename from loafwallet/src/ViewControllers/AmountViewController.swift rename to litewallet/src/ViewControllers/AmountViewController.swift index 00c7042d1..ef3048d71 100644 --- a/loafwallet/src/ViewControllers/AmountViewController.swift +++ b/litewallet/src/ViewControllers/AmountViewController.swift @@ -1,21 +1,36 @@ import UIKit -private let currencyHeight: CGFloat = 80.0 -private let feeHeight: CGFloat = 130.0 - +private let currencyToggleConstant: CGFloat = 20.0 +private let amountFont: UIFont = UIFont.barlowMedium(size: 14.0) class AmountViewController: UIViewController, Trackable { - init(store: Store, isPinPadExpandedAtLaunch: Bool, isRequesting: Bool = false) { - self.store = store - self.isPinPadExpandedAtLaunch = isPinPadExpandedAtLaunch - self.isRequesting = isRequesting - if let rate = store.state.currentRate, store.state.isLtcSwapped { - currencyToggle = ShadowButton(title: "\(rate.code)(\(rate.currencySymbol))", type: .tertiary) - } else { - currencyToggle = ShadowButton(title: S.Symbols.currencyButtonTitle(maxDigits: store.state.maxDigits), type: .tertiary) + private let store: Store + private let isPinPadExpandedAtLaunch: Bool + private let isRequesting: Bool + var minimumFractionDigits = 2 + private var hasTrailingDecimal = false + private var pinPadHeight: NSLayoutConstraint? + private var feeSelectorHeight: NSLayoutConstraint? + private var feeSelectorTop: NSLayoutConstraint? + private var placeholder = PaddingLabel(font: amountFont, color: .grayTextTint) + private var amountLabel = UILabel(font: amountFont, color: .darkText) + private let pinPad: PinPadViewController + private let currencyToggle: ShadowButton + private let border = UIView(color: .secondaryShadow) + private let bottomBorder = UIView(color: .secondaryShadow) + private let cursor = BlinkingView(blinkColor: C.defaultTintColor) + private let balanceLabel = UILabel() + private let feeLabel = UILabel() + private let feeContainer = InViewAlert(type: .secondary) + private let tapView = UIView() + private let editFee = UIButton(type: .system) + private let feeSelector: FeeSelector + + private var amount: Satoshis? { + didSet { + updateAmountLabel() + updateBalanceLabel() + didUpdateAmount?(amount) } - feeSelector = FeeSelector(store: store) - pinPad = PinPadViewController(style: .white, keyboardType: .decimalPad, maxDigits: store.state.maxDigits) - super.init(nibName: nil, bundle: nil) } var balanceTextForAmount: ((Satoshis?, Rate?) -> (NSAttributedString?, NSAttributedString?)?)? @@ -39,6 +54,24 @@ class AmountViewController: UIViewController, Trackable { } } + init(store: Store, + isPinPadExpandedAtLaunch: Bool, + hasAcceptedFees _: Bool, + isRequesting: Bool = false) + { + self.store = store + self.isPinPadExpandedAtLaunch = isPinPadExpandedAtLaunch + self.isRequesting = isRequesting + if let rate = store.state.currentRate, store.state.isLtcSwapped { + currencyToggle = ShadowButton(title: "\(rate.code)(\(rate.currencySymbol))", type: .tertiary) + } else { + currencyToggle = ShadowButton(title: S.Symbols.currencyButtonTitle(maxDigits: store.state.maxDigits), type: .tertiary) + } + feeSelector = FeeSelector(store: store) + pinPad = PinPadViewController(style: .white, keyboardType: .decimalPad, maxDigits: store.state.maxDigits) + super.init(nibName: nil, bundle: nil) + } + func forceUpdateAmount(amount: Satoshis) { self.amount = amount fullRefresh() @@ -50,36 +83,6 @@ class AmountViewController: UIViewController, Trackable { } } - private let store: Store - private let isPinPadExpandedAtLaunch: Bool - private let isRequesting: Bool - var minimumFractionDigits = 2 - private var hasTrailingDecimal = false - private var pinPadHeight: NSLayoutConstraint? - private var feeSelectorHeight: NSLayoutConstraint? - private var feeSelectorTop: NSLayoutConstraint? - private var placeholder = UILabel(font: .customBody(size: 16.0), color: .grayTextTint) - private var amountLabel = UILabel(font: .customBody(size: 26.0), color: .darkText) - private let pinPad: PinPadViewController - private let currencyToggle: ShadowButton - private let border = UIView(color: .secondaryShadow) - private let bottomBorder = UIView(color: .secondaryShadow) - private let cursor = BlinkingView(blinkColor: C.defaultTintColor) - private let balanceLabel = UILabel() - private let feeLabel = UILabel() - private let feeContainer = InViewAlert(type: .secondary) - private let tapView = UIView() - private let editFee = UIButton(type: .system) - private let feeSelector: FeeSelector - - private var amount: Satoshis? { - didSet { - updateAmountLabel() - updateBalanceLabel() - didUpdateAmount?(amount) - } - } - override func viewDidLoad() { if #available(iOS 11.0, *) { guard let headerTextColor = UIColor(named: "headerTextColor"), @@ -116,12 +119,15 @@ class AmountViewController: UIViewController, Trackable { private func addConstraints() { amountLabel.constrain([ - amountLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: C.padding[3]), + amountLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: swiftUICellPadding), amountLabel.centerYAnchor.constraint(equalTo: currencyToggle.centerYAnchor), + amountLabel.heightAnchor.constraint(equalToConstant: 44.0), ]) + placeholder.constrain([ - placeholder.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: C.padding[3]), + placeholder.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: swiftUICellPadding), placeholder.centerYAnchor.constraint(equalTo: amountLabel.centerYAnchor), + placeholder.heightAnchor.constraint(equalToConstant: 44.0), ]) cursor.constrain([ cursor.leadingAnchor.constraint(equalTo: amountLabel.trailingAnchor, constant: 2.0), @@ -130,7 +136,7 @@ class AmountViewController: UIViewController, Trackable { cursor.widthAnchor.constraint(equalToConstant: 2.0), ]) currencyToggle.constrain([ - currencyToggle.topAnchor.constraint(equalTo: view.topAnchor, constant: C.padding[2]), + currencyToggle.topAnchor.constraint(equalTo: view.topAnchor, constant: currencyToggleConstant), currencyToggle.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -C.padding[2]), ]) feeSelectorHeight = feeContainer.heightAnchor.constraint(equalToConstant: 0.0) @@ -153,7 +159,7 @@ class AmountViewController: UIViewController, Trackable { ]) balanceLabel.constrain([ balanceLabel.leadingAnchor.constraint(equalTo: amountLabel.leadingAnchor), - balanceLabel.topAnchor.constraint(equalTo: cursor.bottomAnchor), + balanceLabel.topAnchor.constraint(equalTo: cursor.bottomAnchor, constant: 10.0), ]) feeLabel.constrain([ feeLabel.leadingAnchor.constraint(equalTo: balanceLabel.leadingAnchor), @@ -232,7 +238,7 @@ class AmountViewController: UIViewController, Trackable { self?.toggleFeeSelector() } editFee.setImage(#imageLiteral(resourceName: "Edit"), for: .normal) - editFee.imageEdgeInsets = UIEdgeInsetsMake(15.0, 15.0, 15.0, 15.0) + editFee.imageEdgeInsets = UIEdgeInsets(top: 15.0, left: 15.0, bottom: 15.0, right: 15.0) editFee.tintColor = .grayTextTint editFee.isHidden = true } @@ -247,7 +253,7 @@ class AmountViewController: UIViewController, Trackable { amountLabel.constrain([ amountLabel.trailingAnchor.constraint(lessThanOrEqualTo: currencyToggle.leadingAnchor, constant: -C.padding[2]), ]) - amountLabel.minimumScaleFactor = 0.5 + amountLabel.minimumScaleFactor = 0.95 amountLabel.adjustsFontSizeToFitWidth = true amountLabel.setContentCompressionResistancePriority(UILayoutPriority.defaultLow, for: .horizontal) } diff --git a/loafwallet/src/ViewControllers/BiometricsSettingsViewController.swift b/litewallet/src/ViewControllers/BiometricsSettingsViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/BiometricsSettingsViewController.swift rename to litewallet/src/ViewControllers/BiometricsSettingsViewController.swift diff --git a/loafwallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift b/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift similarity index 97% rename from loafwallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift rename to litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift index 81f9c878e..0bc2e72c0 100644 --- a/loafwallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift +++ b/litewallet/src/ViewControllers/BiometricsSpendingLimitViewController.swift @@ -22,7 +22,7 @@ class BiometricsSpendingLimitViewController: UITableViewController, Subscriber { selectedLimit = walletManager.spendingLimit } tableView.register(SeparatorCell.self, forCellReuseIdentifier: cellIdentifier) - tableView.sectionHeaderHeight = UITableViewAutomaticDimension + tableView.sectionHeaderHeight = UITableView.automaticDimension tableView.estimatedSectionHeaderHeight = 50.0 tableView.backgroundColor = .whiteTint tableView.separatorStyle = .none @@ -33,7 +33,7 @@ class BiometricsSpendingLimitViewController: UITableViewController, Subscriber { titleLabel.sizeToFit() navigationItem.titleView = titleLabel - let faqButton = UIButton.buildFaqButton(store: store, articleId: ArticleIds.touchIdSpendingLimit) + let faqButton = UIButton.buildFaqButton(store: store, articleId: ArticleIds.nothing) faqButton.tintColor = .darkText navigationItem.rightBarButtonItems = [UIBarButtonItem.negativePadding, UIBarButtonItem(customView: faqButton)] diff --git a/loafwallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift b/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift similarity index 96% rename from loafwallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift rename to litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift index 10b6381b4..45f74fc47 100644 --- a/loafwallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift +++ b/litewallet/src/ViewControllers/ConfirmPaperPhraseViewController.swift @@ -68,10 +68,13 @@ class ConfirmPaperPhraseViewController: UITableViewController { navigationController?.navigationBar.isHidden = true setupSubViews() firstWordCell.confirmPhraseView?.textField.becomeFirstResponder() - NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) - { [weak self] _ in - self?.dismiss(animated: true, completion: nil) - } + + NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, + object: nil, + queue: nil) { [weak self] _ in + self?.dismiss(animated: true, + completion: nil) + } } override var preferredStatusBarStyle: UIStatusBarStyle { diff --git a/loafwallet/src/ViewControllers/ConfirmationViewController.swift b/litewallet/src/ViewControllers/ConfirmationViewController.swift similarity index 91% rename from loafwallet/src/ViewControllers/ConfirmationViewController.swift rename to litewallet/src/ViewControllers/ConfirmationViewController.swift index 36b3ccfe7..22e3a6f94 100644 --- a/loafwallet/src/ViewControllers/ConfirmationViewController.swift +++ b/litewallet/src/ViewControllers/ConfirmationViewController.swift @@ -2,10 +2,18 @@ import LocalAuthentication import UIKit class ConfirmationViewController: UIViewController, ContentBoxPresenter { - init(amount: Satoshis, fee: Satoshis, feeType: FeeType, state: ReduxState, selectedRate: Rate?, minimumFractionDigits: Int?, address: String, isUsingBiometrics: Bool, isDonation _: Bool = false) + init(amount: Satoshis, + txFee: Satoshis, + opsFee: Satoshis, + feeType: FeeType, + state: ReduxState, + selectedRate: Rate?, + minimumFractionDigits: Int?, + address: String, isUsingBiometrics: Bool, isDonation _: Bool = false) { self.amount = amount - feeAmount = fee + self.txFee = txFee + self.opsFee = opsFee self.feeType = feeType self.state = state self.selectedRate = selectedRate @@ -18,7 +26,8 @@ class ConfirmationViewController: UIViewController, ContentBoxPresenter { } private let amount: Satoshis - private let feeAmount: Satoshis + private let txFee: Satoshis + private let opsFee: Satoshis private let feeType: FeeType private let state: ReduxState private let selectedRate: Rate? @@ -177,11 +186,11 @@ class ConfirmationViewController: UIViewController, ContentBoxPresenter { } let displayAmount = DisplayAmount(amount: amount, state: state, selectedRate: selectedRate, minimumFractionDigits: 2) - let displayFee = DisplayAmount(amount: feeAmount, state: state, selectedRate: selectedRate, minimumFractionDigits: 2) - let displayTotal = DisplayAmount(amount: amount + feeAmount, state: state, selectedRate: selectedRate, minimumFractionDigits: 2) + let displayFee = DisplayAmount(amount: txFee + opsFee, state: state, selectedRate: selectedRate, minimumFractionDigits: 2) + let displayTotal = DisplayAmount(amount: amount + txFee + opsFee, state: state, selectedRate: selectedRate, minimumFractionDigits: 2) toLabel.text = S.Confirmation.to.localize() - feeLabel.text = S.Confirmation.feeLabel.localize() + feeLabel.text = S.Send.feeBlank.localize() sendLabel.text = S.Confirmation.amountLabel.localize() totalLabel.text = S.Confirmation.totalLabel.localize() @@ -189,7 +198,7 @@ class ConfirmationViewController: UIViewController, ContentBoxPresenter { address.text = addressText send.text = displayAmount.description - fee.text = displayFee.description.replacingZeroFeeWithOneCent() + fee.text = displayFee.description.replacingZeroFeeWithTenCents() total.text = displayTotal.description cancel.tap = strongify(self) { myself in diff --git a/loafwallet/src/ViewControllers/EnterPhraseCollectionViewController.swift b/litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/EnterPhraseCollectionViewController.swift rename to litewallet/src/ViewControllers/EnterPhraseCollectionViewController.swift diff --git a/loafwallet/src/ViewControllers/EnterPhraseViewController.swift b/litewallet/src/ViewControllers/EnterPhraseViewController.swift similarity index 94% rename from loafwallet/src/ViewControllers/EnterPhraseViewController.swift rename to litewallet/src/ViewControllers/EnterPhraseViewController.swift index 121c1d54b..15a0e1bf8 100644 --- a/loafwallet/src/ViewControllers/EnterPhraseViewController.swift +++ b/litewallet/src/ViewControllers/EnterPhraseViewController.swift @@ -14,7 +14,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT self.store = store self.walletManager = walletManager enterPhrase = EnterPhraseCollectionViewController(walletManager: walletManager) - faq = UIButton.buildFaqButton(store: store, articleId: ArticleIds.recoverWallet) + faq = UIButton.buildFaqButton(store: store, articleId: ArticleIds.nothing) self.reason = reason switch reason { @@ -27,8 +27,6 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT } super.init(nibName: nil, bundle: nil) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: .UIKeyboardWillShow, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: .UIKeyboardWillHide, object: nil) } // MARK: - Private @@ -37,7 +35,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT private let walletManager: WalletManager private let reason: PhraseEntryReason private let enterPhrase: EnterPhraseCollectionViewController - private let errorLabel = UILabel.wrapping(font: .customBody(size: 16.0), color: .cameraGuideNegative) + 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) private let subheader = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) @@ -55,6 +53,8 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT addSubviews() addConstraints() setData() + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) } private func addSubviews() { @@ -67,9 +67,9 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT container.addSubview(faq) container.addSubview(moreInfoButton) - addChildViewController(enterPhrase) + addChild(enterPhrase) container.addSubview(enterPhrase.view) - enterPhrase.didMove(toParentViewController: self) + enterPhrase.didMove(toParent: self) } private func addConstraints() { @@ -145,7 +145,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT instruction.isHidden = true moreInfoButton.setTitle(S.RecoverWallet.resetPinInfo.localize(), for: .normal) moreInfoButton.tap = { [weak self] in - self?.store.trigger(name: .presentFaq(ArticleIds.resetPinWithPaperKey)) + self?.store.trigger(name: .presentFaq(ArticleIds.nothing)) } faq.isHidden = true case .validateForWipingWallet: @@ -186,7 +186,7 @@ class EnterPhraseViewController: UIViewController, UIScrollViewDelegate, CustomT @objc private func keyboardWillShow(notification: Notification) { guard let userInfo = notification.userInfo else { return } - guard let frameValue = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } + guard let frameValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return } var contentInset = scrollView.contentInset if contentInset.bottom == 0.0 { contentInset.bottom = frameValue.cgRectValue.height + 44.0 diff --git a/loafwallet/src/ViewControllers/Import/StartImportViewController.swift b/litewallet/src/ViewControllers/Import/StartImportViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/Import/StartImportViewController.swift rename to litewallet/src/ViewControllers/Import/StartImportViewController.swift diff --git a/loafwallet/src/ViewControllers/LoginViewController.swift b/litewallet/src/ViewControllers/LoginViewController.swift similarity index 95% rename from loafwallet/src/ViewControllers/LoginViewController.swift rename to litewallet/src/ViewControllers/LoginViewController.swift index d29db5443..4f2445f07 100644 --- a/loafwallet/src/ViewControllers/LoginViewController.swift +++ b/litewallet/src/ViewControllers/LoginViewController.swift @@ -1,4 +1,4 @@ -import FirebaseCrashlytics +import Firebase import LocalAuthentication import SwiftUI import UIKit @@ -31,7 +31,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { pinView = PinView(style: .login, length: store.state.pinLength) } - let viewModel = LockScreenHeaderViewModel(store: self.store) + let viewModel = LockScreenViewModel(store: self.store) headerView = UIHostingController(rootView: LockScreenHeaderView(viewModel: viewModel)) super.init(nibName: nil, bundle: nil) @@ -47,19 +47,19 @@ class LoginViewController: UIViewController, Subscriber, Trackable { private let backgroundView: UIView = { let view = UIView() - view.backgroundColor = .liteWalletBlue + view.backgroundColor = .liteWalletDarkBlue return view }() private let headerView: UIHostingController - private let pinPadViewController = PinPadViewController(style: .clear, keyboardType: .pinPad, maxDigits: 0) private let pinViewContainer = UIView() private var pinView: PinView? private let isPresentedForLock: Bool private let disabledView: WalletDisabledView - private let activityView = UIActivityIndicatorView(activityIndicatorStyle: .large) + private let activityView = UIActivityIndicatorView(style: .large) private let wipeBannerButton = UIButton() + var delegate: LoginViewControllerDelegate? private var logo: UIImageView = { @@ -97,7 +97,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { private var hasAttemptedToShowBiometrics = false private let lockedOverlay = UIVisualEffectView() private var isResetting = false - private let versionLabel = UILabel(font: .barlowLight(size: 12), color: .white) + private let versionLabel = UILabel(font: .barlowRegular(size: 12), color: .white) private var isWalletEmpty = false override func viewDidLoad() { @@ -149,8 +149,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) guard UIApplication.shared.applicationState != .background else { return } - if shouldUseBiometrics, !hasAttemptedToShowBiometrics, !isPresentedForLock, UserDefaults.hasShownWelcome - { + if shouldUseBiometrics, !hasAttemptedToShowBiometrics, !isPresentedForLock { hasAttemptedToShowBiometrics = true biometricsTapped() } @@ -172,19 +171,18 @@ class LoginViewController: UIViewController, Subscriber, Trackable { pinViewContainer.addSubview(pinView) logo.constrain([ - logo.topAnchor.constraint(equalTo: view.centerYAnchor, constant: -120), + logo.topAnchor.constraint(equalTo: view.centerYAnchor, constant: -100), logo.centerXAnchor.constraint(equalTo: view.centerXAnchor), logo.constraint(.height, constant: 45), logo.constraint(.width, constant: 201), ]) - enterPINLabel.constrain([ enterPINLabel.topAnchor.constraint(equalTo: pinView.topAnchor, constant: -40), enterPINLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), ]) pinView.constrain([ - pinView.centerYAnchor.constraint(equalTo: pinPadViewController.view.topAnchor, constant: -60), + pinView.centerYAnchor.constraint(equalTo: pinPadViewController.view.topAnchor, constant: -40), pinView.centerXAnchor.constraint(equalTo: pinViewContainer.centerXAnchor), pinView.widthAnchor.constraint(equalToConstant: pinView.width), pinView.heightAnchor.constraint(equalToConstant: pinView.itemSize), @@ -218,7 +216,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { if walletManager != nil { addChildViewController(pinPadViewController, layout: { - pinPadBottom = pinPadViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -60) + pinPadBottom = pinPadViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -120) pinPadViewController.view.constrain([ pinPadViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), pinPadViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), @@ -230,10 +228,10 @@ class LoginViewController: UIViewController, Subscriber, Trackable { pinViewContainer.constrain(toSuperviewEdges: nil) versionLabel.constrain([ - versionLabel.constraint(.top, toView: view, constant: 30), - versionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), - versionLabel.widthAnchor.constraint(equalToConstant: 120.0), - versionLabel.heightAnchor.constraint(equalToConstant: 44.0), + versionLabel.constraint(.bottom, toView: view, constant: -15), + versionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor), + versionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor), + versionLabel.heightAnchor.constraint(equalToConstant: 24.0), ]) if walletManager != nil { @@ -253,7 +251,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { enterPINLabel.text = S.UnlockScreen.enterPIN.localize() versionLabel.text = AppVersion.string - versionLabel.textAlignment = .right + versionLabel.textAlignment = .center } private func deviceTopConstraintConstant() -> CGFloat { @@ -276,7 +274,7 @@ class LoginViewController: UIViewController, Subscriber, Trackable { wipeBannerButton.adjustsImageWhenHighlighted = true wipeBannerButton.constrain([ - wipeBannerButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0), + wipeBannerButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -35), wipeBannerButton.leadingAnchor.constraint(equalTo: view.leadingAnchor), wipeBannerButton.trailingAnchor.constraint(equalTo: view.trailingAnchor), wipeBannerButton.heightAnchor.constraint(equalToConstant: 60), diff --git a/loafwallet/src/ViewControllers/ModalNavigationController.swift b/litewallet/src/ViewControllers/ModalNavigationController.swift similarity index 100% rename from loafwallet/src/ViewControllers/ModalNavigationController.swift rename to litewallet/src/ViewControllers/ModalNavigationController.swift diff --git a/loafwallet/src/ViewControllers/NodeSelectorViewController.swift b/litewallet/src/ViewControllers/NodeSelectorViewController.swift similarity index 94% rename from loafwallet/src/ViewControllers/NodeSelectorViewController.swift rename to litewallet/src/ViewControllers/NodeSelectorViewController.swift index fa17058e6..49fd952dc 100644 --- a/loafwallet/src/ViewControllers/NodeSelectorViewController.swift +++ b/litewallet/src/ViewControllers/NodeSelectorViewController.swift @@ -11,6 +11,7 @@ class NodeSelectorViewController: UIViewController, Trackable { private let walletManager: WalletManager private var okAction: UIAlertAction? private var timer: Timer? + private let leftJustPadding = C.padding[6] init(walletManager: WalletManager) { self.walletManager = walletManager @@ -38,15 +39,15 @@ class NodeSelectorViewController: UIViewController, Trackable { } private func addConstraints() { - titleLabel.pinTopLeft(padding: C.padding[2]) - nodeLabel.pinTopLeft(toView: titleLabel, topPadding: C.padding[2]) + titleLabel.pinTopLeft(padding: leftJustPadding) + nodeLabel.pinTopLeft(toView: titleLabel, topPadding: leftJustPadding) node.pinTopLeft(toView: nodeLabel, topPadding: 0) - statusLabel.pinTopLeft(toView: node, topPadding: C.padding[2]) + statusLabel.pinTopLeft(toView: node, topPadding: leftJustPadding) status.pinTopLeft(toView: statusLabel, topPadding: 0) button.constrain([ - button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: C.padding[2]), - button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -C.padding[2]), - button.topAnchor.constraint(equalTo: status.bottomAnchor, constant: C.padding[2]), + button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: leftJustPadding), + button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -leftJustPadding), + button.topAnchor.constraint(equalTo: status.bottomAnchor, constant: leftJustPadding), button.heightAnchor.constraint(equalToConstant: 44.0), ]) } diff --git a/loafwallet/src/ViewControllers/PinPadViewController.swift b/litewallet/src/ViewControllers/PinPadViewController.swift similarity index 99% rename from loafwallet/src/ViewControllers/PinPadViewController.swift rename to litewallet/src/ViewControllers/PinPadViewController.swift index 855097e8e..786400383 100644 --- a/loafwallet/src/ViewControllers/PinPadViewController.swift +++ b/litewallet/src/ViewControllers/PinPadViewController.swift @@ -284,7 +284,7 @@ class GenericPinPadCell: UICollectionViewCell { override var accessibilityTraits: UIAccessibilityTraits { get { - return UIAccessibilityTraitStaticText + return UIAccessibilityTraits.staticText } set {} } diff --git a/loafwallet/src/ViewControllers/ReScanViewController.swift b/litewallet/src/ViewControllers/ReScanViewController.swift similarity index 90% rename from loafwallet/src/ViewControllers/ReScanViewController.swift rename to litewallet/src/ViewControllers/ReScanViewController.swift index 409e400ac..caef3efd1 100644 --- a/loafwallet/src/ViewControllers/ReScanViewController.swift +++ b/litewallet/src/ViewControllers/ReScanViewController.swift @@ -3,7 +3,7 @@ import UIKit class ReScanViewController: UIViewController, Subscriber { init(store: Store) { self.store = store - faq = .buildFaqButton(store: store, articleId: ArticleIds.reScan) + faq = .buildFaqButton(store: store, articleId: ArticleIds.nothing) super.init(nibName: nil, bundle: nil) } @@ -85,10 +85,10 @@ class ReScanViewController: UIViewController, Subscriber { private var bodyText: NSAttributedString { let body = NSMutableAttributedString() - let headerAttributes = [NSAttributedStringKey.font: UIFont.customBold(size: 16.0), - NSAttributedStringKey.foregroundColor: UIColor.darkText] - let bodyAttributes = [NSAttributedStringKey.font: UIFont.customBody(size: 16.0), - NSAttributedStringKey.foregroundColor: UIColor.darkText] + let headerAttributes = [NSAttributedString.Key.font: UIFont.customBold(size: 16.0), + NSAttributedString.Key.foregroundColor: UIColor.darkText] + 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)) diff --git a/loafwallet/src/ViewControllers/RecoverWalletIntroViewController.swift b/litewallet/src/ViewControllers/RecoverWalletIntroViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/RecoverWalletIntroViewController.swift rename to litewallet/src/ViewControllers/RecoverWalletIntroViewController.swift diff --git a/litewallet/src/ViewControllers/RequestAmountViewController.swift b/litewallet/src/ViewControllers/RequestAmountViewController.swift new file mode 100644 index 000000000..7966efee6 --- /dev/null +++ b/litewallet/src/ViewControllers/RequestAmountViewController.swift @@ -0,0 +1,250 @@ +import UIKit + +private let qrSize: CGSize = .init(width: 186.0, height: 186.0) +private let smallButtonHeight: CGFloat = 32.0 +private let buttonPadding: CGFloat = 20.0 +private let smallSharePadding: CGFloat = 12.0 +private let largeSharePadding: CGFloat = 20.0 + +class RequestAmountViewController: UIViewController { + var presentEmail: PresentShare? + var presentText: PresentShare? + + init(wallet: BRWallet, store: Store) { + self.wallet = wallet + amountView = AmountViewController(store: store, + isPinPadExpandedAtLaunch: true, + hasAcceptedFees: false, + isRequesting: true) + super.init(nibName: nil, bundle: nil) + } + + // MARK: - Private + + private let amountView: AmountViewController + private let qrCode = UIImageView() + private let address = UILabel(font: .customBody(size: 14.0)) + private let addressPopout = InViewAlert(type: .primary) + private let share = ShadowButton(title: S.Receive.share.localize(), type: .tertiary, image: #imageLiteral(resourceName: "Share")) + private let sharePopout = InViewAlert(type: .secondary) + private let border = UIView() + private var topSharePopoutConstraint: NSLayoutConstraint? + private let wallet: BRWallet + + // MARK: - PinPad State + + private var amount: Satoshis? { + didSet { + setQrCode() + } + } + + override func viewDidLoad() { + addSubviews() + addConstraints() + setData() + addActions() + setupCopiedMessage() + setupShareButtons() + } + + private func addSubviews() { + view.addSubview(qrCode) + view.addSubview(address) + view.addSubview(addressPopout) + view.addSubview(share) + view.addSubview(sharePopout) + view.addSubview(border) + } + + private func addConstraints() { + addChildViewController(amountView, layout: { + amountView.view.constrain([ + amountView.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + amountView.view.topAnchor.constraint(equalTo: view.topAnchor), + amountView.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), + ]) + }) + qrCode.constrain([ + qrCode.constraint(.width, constant: qrSize.width), + qrCode.constraint(.height, constant: qrSize.height), + qrCode.topAnchor.constraint(equalTo: amountView.view.bottomAnchor, constant: C.padding[2]), + qrCode.constraint(.centerX, toView: view), + ]) + address.constrain([ + address.constraint(toBottom: qrCode, constant: C.padding[1]), + address.constraint(.centerX, toView: view), + ]) + addressPopout.heightConstraint = addressPopout.constraint(.height, constant: 0.0) + addressPopout.constrain([ + addressPopout.constraint(toBottom: address, constant: 0.0), + addressPopout.constraint(.centerX, toView: view), + addressPopout.constraint(.width, toView: view), + addressPopout.heightConstraint, + ]) + share.constrain([ + share.constraint(toBottom: addressPopout, constant: C.padding[2]), + share.constraint(.centerX, toView: view), + share.constraint(.width, constant: qrSize.width), + share.constraint(.height, constant: smallButtonHeight), + ]) + sharePopout.heightConstraint = sharePopout.constraint(.height, constant: 0.0) + topSharePopoutConstraint = sharePopout.constraint(toBottom: share, constant: largeSharePadding) + sharePopout.constrain([ + topSharePopoutConstraint, + sharePopout.constraint(.centerX, toView: view), + sharePopout.constraint(.width, toView: view), + sharePopout.heightConstraint, + ]) + border.constrain([ + border.constraint(.width, toView: view), + border.constraint(toBottom: sharePopout, constant: 0.0), + border.constraint(.centerX, toView: view), + border.constraint(.height, constant: 1.0), + border.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -C.padding[2]), + ]) + } + + private func setData() { + view.backgroundColor = .white + address.text = wallet.receiveAddress + address.textColor = .grayTextTint + border.backgroundColor = .secondaryBorder + qrCode.image = UIImage.qrCode(data: "\(wallet.receiveAddress)".data(using: .utf8)!, color: CIColor(color: .black))? + .resize(qrSize)! + share.isToggleable = true + sharePopout.clipsToBounds = true + } + + private func addActions() { + let gr = UITapGestureRecognizer(target: self, action: #selector(RequestAmountViewController.addressTapped)) + address.addGestureRecognizer(gr) + address.isUserInteractionEnabled = true + share.addTarget(self, action: #selector(RequestAmountViewController.shareTapped), for: .touchUpInside) + amountView.didUpdateAmount = { [weak self] amount in + self?.amount = amount + } + } + + private func setQrCode() { + guard let amount = amount else { return } + let request = PaymentRequest.requestString(withAddress: wallet.receiveAddress, forAmount: amount.rawValue) + qrCode.image = UIImage.qrCode(data: request.data(using: .utf8)!, color: CIColor(color: .black))? + .resize(qrSize)! + } + + private func setupCopiedMessage() { + let copiedMessage = UILabel(font: .customMedium(size: 14.0)) + copiedMessage.textColor = .white + copiedMessage.text = S.Receive.copied.localize() + copiedMessage.textAlignment = .center + addressPopout.contentView = copiedMessage + } + + private func setupShareButtons() { + let container = UIView() + container.translatesAutoresizingMaskIntoConstraints = false + let email = ShadowButton(title: S.Receive.emailButton.localize(), type: .tertiary) + let text = ShadowButton(title: S.Receive.textButton.localize(), type: .tertiary) + container.addSubview(email) + container.addSubview(text) + email.constrain([ + email.constraint(.leading, toView: container, constant: C.padding[2]), + email.constraint(.top, toView: container, constant: buttonPadding), + email.constraint(.bottom, toView: container, constant: -buttonPadding), + email.trailingAnchor.constraint(equalTo: container.centerXAnchor, constant: -C.padding[1]), + ]) + text.constrain([ + text.constraint(.trailing, toView: container, constant: -C.padding[2]), + text.constraint(.top, toView: container, constant: buttonPadding), + text.constraint(.bottom, toView: container, constant: -buttonPadding), + text.leadingAnchor.constraint(equalTo: container.centerXAnchor, constant: C.padding[1]), + ]) + sharePopout.contentView = container + email.addTarget(self, action: #selector(RequestAmountViewController.emailTapped), for: .touchUpInside) + text.addTarget(self, action: #selector(RequestAmountViewController.textTapped), for: .touchUpInside) + } + + @objc private func shareTapped() { + toggle(alertView: sharePopout, shouldAdjustPadding: true) + if addressPopout.isExpanded { + toggle(alertView: addressPopout, shouldAdjustPadding: false) + } + } + + @objc private func addressTapped() { + guard let text = address.text else { return } + UIPasteboard.general.string = text + toggle(alertView: addressPopout, shouldAdjustPadding: false, shouldShrinkAfter: true) + if sharePopout.isExpanded { + toggle(alertView: sharePopout, shouldAdjustPadding: true) + } + } + + @objc private func emailTapped() { + guard let amount = amount else { return showErrorMessage(S.RequestAnAmount.noAmount.localize()) } + let text = PaymentRequest.requestString(withAddress: wallet.receiveAddress, forAmount: amount.rawValue) + presentEmail?(text, qrCode.image!) + } + + @objc private func textTapped() { + guard let amount = amount else { return showErrorMessage(S.RequestAnAmount.noAmount.localize()) } + let text = PaymentRequest.requestString(withAddress: wallet.receiveAddress, forAmount: amount.rawValue) + presentText?(text, qrCode.image!) + } + + private func toggle(alertView: InViewAlert, shouldAdjustPadding: Bool, shouldShrinkAfter: Bool = false) + { + share.isEnabled = false + address.isUserInteractionEnabled = false + + var deltaY = alertView.isExpanded ? -alertView.height : alertView.height + if shouldAdjustPadding { + if deltaY > 0 { + deltaY -= (largeSharePadding - smallSharePadding) + } else { + deltaY += (largeSharePadding - smallSharePadding) + } + } + + if alertView.isExpanded { + alertView.contentView?.isHidden = true + } + + UIView.spring(C.animationDuration, animations: { + if shouldAdjustPadding { + let newPadding = self.sharePopout.isExpanded ? largeSharePadding : smallSharePadding + self.topSharePopoutConstraint?.constant = newPadding + } + alertView.toggle() + self.parent?.view.layoutIfNeeded() + }, completion: { _ in + alertView.isExpanded = !alertView.isExpanded + self.share.isEnabled = true + self.address.isUserInteractionEnabled = true + alertView.contentView?.isHidden = false + if shouldShrinkAfter { + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { + if alertView.isExpanded { + self.toggle(alertView: alertView, shouldAdjustPadding: shouldAdjustPadding) + } + } + } + }) + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension RequestAmountViewController: ModalDisplayable { + var faqArticleId: String? { + return ArticleIds.nothing + } + + var modalTitle: String { + return S.Receive.request.localize() + } +} diff --git a/loafwallet/src/ViewControllers/RootModals/ManageWalletViewController.swift b/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift similarity index 95% rename from loafwallet/src/ViewControllers/RootModals/ManageWalletViewController.swift rename to litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift index 0b5ac17de..b47dee2b4 100644 --- a/loafwallet/src/ViewControllers/RootModals/ManageWalletViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/ManageWalletViewController.swift @@ -18,8 +18,8 @@ class ManageWalletViewController: UIViewController, ModalPresentable, Subscriber addSubviews() addConstraints() setData() - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: .UIKeyboardWillShow, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: .UIKeyboardWillHide, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil) } override func viewDidDisappear(_ animated: Bool) { @@ -138,7 +138,7 @@ extension ManageWalletViewController: UITextFieldDelegate { extension ManageWalletViewController: ModalDisplayable { var faqArticleId: String? { - return ArticleIds.manageWallet + return ArticleIds.nothing } var modalTitle: String { diff --git a/loafwallet/src/ViewControllers/RootModals/MenuViewController.swift b/litewallet/src/ViewControllers/RootModals/MenuViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/RootModals/MenuViewController.swift rename to litewallet/src/ViewControllers/RootModals/MenuViewController.swift diff --git a/loafwallet/src/ViewControllers/RootModals/ModalDisplayable.swift b/litewallet/src/ViewControllers/RootModals/ModalDisplayable.swift similarity index 100% rename from loafwallet/src/ViewControllers/RootModals/ModalDisplayable.swift rename to litewallet/src/ViewControllers/RootModals/ModalDisplayable.swift diff --git a/loafwallet/src/ViewControllers/RootModals/ModalViewController.swift b/litewallet/src/ViewControllers/RootModals/ModalViewController.swift similarity index 97% rename from loafwallet/src/ViewControllers/RootModals/ModalViewController.swift rename to litewallet/src/ViewControllers/RootModals/ModalViewController.swift index f8b7341f8..01a6dcd13 100644 --- a/loafwallet/src/ViewControllers/RootModals/ModalViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/ModalViewController.swift @@ -38,9 +38,9 @@ class ModalViewController: UIViewController, Subscriber { view.addSubview(scrollView) scrollView.addSubview(scrollViewContent) - addChildViewController(childViewController) + addChild(childViewController) scrollViewContent.addSubview(childViewController.view) - childViewController.didMove(toParentViewController: self) + childViewController.didMove(toParent: self) } private func addConstraints() { @@ -68,7 +68,6 @@ class ModalViewController: UIViewController, Subscriber { // Two stage layout is required here because we need the height constant // of the content at initial layout view.layoutIfNeeded() - let height = scrollViewContent.bounds.size.height + 60.0 let minHeight = scrollView.heightAnchor.constraint(greaterThanOrEqualToConstant: height) let midHeight = scrollView.heightAnchor.constraint(equalTo: scrollViewContent.heightAnchor) @@ -83,7 +82,8 @@ class ModalViewController: UIViewController, Subscriber { private func setInitialData() { view.backgroundColor = .clear - scrollView.backgroundColor = .white + scrollView.backgroundColor = UIColor.litecoinGray + scrollView.delaysContentTouches = false if var modalPresentable = childViewController as? ModalPresentable { modalPresentable.parentView = view diff --git a/loafwallet/src/ViewControllers/RootModals/ReceiveViewController.swift b/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift similarity index 98% rename from loafwallet/src/ViewControllers/RootModals/ReceiveViewController.swift rename to litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift index e167f9791..0a389cc7d 100644 --- a/loafwallet/src/ViewControllers/RootModals/ReceiveViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/ReceiveViewController.swift @@ -128,8 +128,8 @@ class ReceiveViewController: UIViewController, Subscriber, Trackable { } private func setStyle() { - view.backgroundColor = .white - address.textColor = .grayTextTint + view.backgroundColor = UIColor.litecoinGray + address.textColor = .liteWalletBlue border.backgroundColor = .secondaryBorder share.isToggleable = true if !isRequestAmountVisible { @@ -273,7 +273,7 @@ class ReceiveViewController: UIViewController, Subscriber, Trackable { extension ReceiveViewController: ModalDisplayable { var faqArticleId: String? { - return ArticleIds.receiveBitcoin + return ArticleIds.nothing } var modalTitle: String { diff --git a/loafwallet/src/ViewControllers/RootModals/SendViewController.swift b/litewallet/src/ViewControllers/RootModals/SendViewController.swift similarity index 59% rename from loafwallet/src/ViewControllers/RootModals/SendViewController.swift rename to litewallet/src/ViewControllers/RootModals/SendViewController.swift index 536f23f43..218370beb 100644 --- a/loafwallet/src/ViewControllers/RootModals/SendViewController.swift +++ b/litewallet/src/ViewControllers/RootModals/SendViewController.swift @@ -1,16 +1,12 @@ import BRCore import FirebaseAnalytics +import KeychainAccess import LocalAuthentication import SwiftUI import UIKit typealias PresentScan = (@escaping ScanCompletion) -> Void -private let verticalButtonPadding: CGFloat = 15.0 -private let buttonSize = CGSize(width: 52.0, height: 32.0) - -let swiftUICellPadding = 12.0 - class SendViewController: UIViewController, Subscriber, ModalPresentable, Trackable { // MARK: - Public @@ -22,6 +18,29 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka var parentView: UIView? // ModalPresentable var initialAddress: String? var isPresentedFromLock = false + var hasActivatedInlineFees: Bool = true + + // MARK: - Private + + private let store: Store + private let sender: Sender + private let walletManager: WalletManager + private let amountView: AmountViewController + private let sendAddressCell = AddressCell() + private let memoCell = DescriptionSendCell(placeholder: S.Send.descriptionLabel.localize()) + private var sendButtonCell = SendButtonHostingController() + private let currency: ShadowButton + private var balance: UInt64 = 0 + private var amount: Satoshis? + private var combinedFee: Satoshis? + private var didIgnoreUsedAddressWarning = false + private var didIgnoreIdentityNotCertified = false + private let initialRequest: PaymentRequest? + private let confirmTransitioningDelegate = TransitioningDelegate() + private var feeType: FeeType? + private let keychainPreferences = Keychain(service: "litewallet.user-prefs") + 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) { @@ -30,15 +49,23 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka self.walletManager = walletManager self.initialAddress = initialAddress self.initialRequest = initialRequest + currency = ShadowButton(title: S.Symbols.currencyButtonTitle(maxDigits: store.state.maxDigits), type: .tertiary) - amountView = AmountViewController(store: store, isPinPadExpandedAtLaunch: false) + + /// User Preference + if let opsPreference = keychainPreferences["hasAcceptedFees"], + opsPreference == "false" + { + hasActivatedInlineFees = false + } else { + keychainPreferences["has-accepted-fees"] = "true" + } + + amountView = AmountViewController(store: store, isPinPadExpandedAtLaunch: false, hasAcceptedFees: hasActivatedInlineFees) LWAnalytics.logEventWithParameters(itemName: ._20191105_VSC) super.init(nibName: nil, bundle: nil) - - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: .UIKeyboardWillShow, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: .UIKeyboardWillHide, object: nil) } // MARK: - Private @@ -48,26 +75,6 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka NotificationCenter.default.removeObserver(self) } - private let store: Store - private let sender: Sender - private let walletManager: WalletManager - private let amountView: AmountViewController - private let sendAddressCell = SendAddressHostingController() - private let unstoppableCell = UIHostingController(rootView: UnstoppableDomainView(viewModel: UnstoppableDomainViewModel())) - private let descriptionCell = DescriptionSendCell(placeholder: S.Send.descriptionLabel.localize()) - private let orView = UILabel(font: .barlowMedium(size: 14.0), color: .litecoinSilver) - private var sendButtonCell = SendButtonHostingController() - private let currency: ShadowButton - private let currencyBorder = UIView(color: .secondaryShadow) - private var pinPadHeightConstraint: NSLayoutConstraint? - private var balance: UInt64 = 0 - private var amount: Satoshis? - private var didIgnoreUsedAddressWarning = false - private var didIgnoreIdentityNotCertified = false - private let initialRequest: PaymentRequest? - private let confirmTransitioningDelegate = TransitioningDelegate() - private var feeType: FeeType? - override func viewDidLoad() { view.backgroundColor = UIColor.litecoinGray @@ -75,60 +82,41 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka walletManager.wallet?.feePerKb = store.state.fees.regular // polish parameters - descriptionCell.backgroundColor = UIColor.litecoinGray + memoCell.backgroundColor = UIColor.litecoinGray amountView.view.backgroundColor = UIColor.litecoinGray - orView.backgroundColor = UIColor.litecoinGray - orView.text = "-- " + S.Fragments.or.localize() + " --" - orView.textAlignment = .center - - view.addSubview(sendAddressCell.view) - view.addSubview(orView) - view.addSubview(unstoppableCell.view) - view.addSubview(descriptionCell) + view.addSubview(sendAddressCell) + view.addSubview(memoCell) view.addSubview(sendButtonCell.view) - sendAddressCell.view.invalidateIntrinsicContentSize() - sendAddressCell.view.constrainTopCorners(height: SendCell.defaultHeight) + sendAddressCell.invalidateIntrinsicContentSize() + sendAddressCell.constrainTopCorners(height: SendCell.defaultHeight) + memoCell.constrain([ + memoCell.widthAnchor.constraint(equalTo: sendAddressCell.widthAnchor), + memoCell.topAnchor.constraint(equalTo: sendAddressCell.bottomAnchor), + memoCell.leadingAnchor.constraint(equalTo: sendAddressCell.leadingAnchor), + memoCell.heightAnchor.constraint(equalTo: memoCell.textView.heightAnchor, constant: C.padding[3]), + ]) + memoCell.accessoryView.constrain([ + memoCell.accessoryView.constraint(.width, constant: 0.0), + ]) addChildViewController(amountView, layout: { amountView.view.constrain([ amountView.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), - amountView.view.topAnchor.constraint(equalTo: unstoppableCell.view.bottomAnchor), + amountView.view.topAnchor.constraint(equalTo: memoCell.bottomAnchor), amountView.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), ]) }) - orView.constrain([ - orView.topAnchor.constraint(equalTo: sendAddressCell.view.bottomAnchor, constant: -5.0), - orView.widthAnchor.constraint(equalTo: amountView.view.widthAnchor), - orView.leadingAnchor.constraint(equalTo: amountView.view.leadingAnchor), - orView.heightAnchor.constraint(equalToConstant: 16.0), - ]) - unstoppableCell.view.constrain([ - unstoppableCell.view.topAnchor.constraint(equalTo: orView.bottomAnchor), - unstoppableCell.view.widthAnchor.constraint(equalTo: amountView.view.widthAnchor), - unstoppableCell.view.leadingAnchor.constraint(equalTo: amountView.view.leadingAnchor), - unstoppableCell.view.heightAnchor.constraint(equalToConstant: SendCell.defaultHeight + 15.0), - ]) - - descriptionCell.constrain([ - descriptionCell.widthAnchor.constraint(equalTo: amountView.view.widthAnchor), - descriptionCell.topAnchor.constraint(equalTo: amountView.view.bottomAnchor), - descriptionCell.leadingAnchor.constraint(equalTo: amountView.view.leadingAnchor), - descriptionCell.heightAnchor.constraint(equalTo: descriptionCell.textView.heightAnchor, constant: C.padding[3]), - ]) - descriptionCell.accessoryView.constrain([ - descriptionCell.accessoryView.constraint(.width, constant: 0.0), - ]) sendButtonCell.view.constrain([ sendButtonCell.view.constraint(.leading, toView: view), sendButtonCell.view.constraint(.trailing, toView: view), - sendButtonCell.view.constraint(toBottom: descriptionCell, constant: 0.0), + sendButtonCell.view.constraint(toBottom: amountView.view, constant: buttonToBorder), sendButtonCell.view.constraint(.height, constant: C.Sizes.sendButtonHeight), sendButtonCell.view .bottomAnchor - .constraint(equalTo: view.bottomAnchor, constant: C.Sizes.sendButtonHeight - C.Sizes.buttonHeight), + .constraint(equalTo: view.bottomAnchor, constant: -C.padding[8]), ]) addButtonActions() @@ -150,13 +138,17 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka } private func addButtonActions() { - descriptionCell.didReturn = { textView in + // MARK: - MemoCell Callbacks + + memoCell.didReturn = { textView in textView.resignFirstResponder() } - descriptionCell.didBeginEditing = { [weak self] in + memoCell.didBeginEditing = { [weak self] in self?.amountView.closePinPad() } + // MARK: - AmountView Callbacks + amountView.balanceTextForAmount = { [weak self] amount, rate in self?.balanceTextForAmount(amount: amount, rate: rate) } @@ -179,40 +171,39 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka amountView.didChangeFirstResponder = { [weak self] isFirstResponder in if isFirstResponder { - self?.descriptionCell.textView.resignFirstResponder() + self?.memoCell.textView.resignFirstResponder() + self?.sendAddressCell.textField.resignFirstResponder() + /// copyKeyboardChangeAnimation(willShow: true, notification: notification) } } - // MARK: - SendAddressView Model Callbacks + // MARK: - SendAddressView Model Callbacks / Actions - sendAddressCell.rootView.viewModel.shouldPasteAddress = { - self.pasteTapped() - } + sendAddressCell.paste.addTarget(self, action: #selector(SendViewController.pasteTapped), for: .touchUpInside) + sendAddressCell.scan.addTarget(self, action: #selector(SendViewController.scanTapped), for: .touchUpInside) - sendAddressCell.rootView.viewModel.shouldScanAddress = { - self.scanTapped() + sendAddressCell.didBeginEditing = strongify(self) { _ in + // myself.amountView.closePinPad() } - // MARK: - Unstopplable Domain Model Callbacks - - unstoppableCell.rootView.viewModel.didResolveUDAddress = { resolvedUDAddress in - - /// Paste in Unstoppable Domain resolved LTC address to textField - if !resolvedUDAddress.isEmpty { - // Toast the successful resolution - self.onResolvedSuccess?() - self.sendAddressCell.rootView.viewModel.addressString = resolvedUDAddress - } + sendAddressCell.didEndEditing = strongify(self) { myself in + myself.resignFirstResponder() } - unstoppableCell.rootView.viewModel.didFailToResolve = { errorMessage in - // Toast the failure - self.onResolutionFailure?(errorMessage) - self.sendAddressCell.rootView.viewModel.addressString = "" + sendAddressCell.didReceivePaymentRequest = { [weak self] request in + self?.handleRequest(request) } + // MARK: - SendButton Model Callbacks / Actions + sendButtonCell.rootView.doSendTransaction = { - self.sendTapped() + guard let sendAddress = self.sendAddressCell.address else { return } + if sendAddress.isValidAddress { + self.sendTapped() + } else { + self.showAlert(title: S.LitewalletAlert.error.localize(), message: S.Transaction.invalid.localize(), + buttonLabel: S.Button.ok.localize()) + } } } @@ -223,28 +214,36 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka let balanceOutput = String(format: S.Send.balance.localize(), balanceText) var feeOutput = "" - var color: UIColor = .grayTextTint + var balanceColor: UIColor = .grayTextTint + /// Check the amount is greater than zero and if user is opting out of fees if let amount = amount, amount > 0 { - let fee = sender.feeForTx(amount: amount.rawValue) - let feeAmount = DisplayAmount(amount: Satoshis(rawValue: fee), state: store.state, selectedRate: rate, minimumFractionDigits: 2) + let tieredOpsFee = tieredOpsFee(amount: amount.rawValue) + let totalAmountToCalculateFees = hasActivatedInlineFees ? (amount.rawValue + tieredOpsFee) : amount.rawValue + + let fee = sender.feeForTx(amount: totalAmountToCalculateFees) + + let feeAmountLabel = DisplayAmount(amount: Satoshis(rawValue: fee) + tieredOpsFee, + state: store.state, + selectedRate: rate, + minimumFractionDigits: 2) - let feeText = feeAmount.description.replacingZeroFeeWithOneCent() - feeOutput = String(format: S.Send.fee.localize(), feeText) - if balance >= fee, amount.rawValue > (balance - fee) { - color = .cameraGuideNegative + let feeText = feeAmountLabel.description.replacingZeroFeeWithTenCents() + feeOutput = hasActivatedInlineFees ? String(format: S.Send.fee.localize(), feeText) : + String(format: S.Send.feeBlank.localize(), feeText) + + if balance >= (fee + tieredOpsFee), amount.rawValue > (balance - (fee + tieredOpsFee)) { + balanceColor = .litewalletOrange } } - let balanceAttributes: [NSAttributedStringKey: Any] = [ - NSAttributedStringKey.font: UIFont.customBody(size: 14.0), - NSAttributedStringKey.foregroundColor: color, + let balanceStyle = [ + NSAttributedString.Key.font: UIFont.customBody(size: 14.0), + NSAttributedString.Key.foregroundColor: balanceColor, ] - let feeAttributes: [NSAttributedStringKey: Any] = [ - NSAttributedStringKey.font: UIFont.customBody(size: 14.0), - NSAttributedStringKey.foregroundColor: UIColor.grayTextTint, - ] + let balanceAttributes: [NSAttributedString.Key: Any] = balanceStyle + let feeAttributes: [NSAttributedString.Key: Any] = balanceStyle return (NSAttributedString(string: balanceOutput, attributes: balanceAttributes), NSAttributedString(string: feeOutput, attributes: feeAttributes)) } @@ -252,85 +251,134 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka @objc private func pasteTapped() { guard let pasteboard = UIPasteboard.general.string, !pasteboard.utf8.isEmpty else { - return showAlert(title: S.LitewalletAlert.error.localize(), message: S.Send.emptyPasteboard.localize(), buttonLabel: S.Button.ok.localize()) + return showAlert(title: S.Send.invalidAddressTitle.localize(), message: S.Send.noAddress.localize(), buttonLabel: S.Button.ok.localize()) } guard let request = PaymentRequest(string: pasteboard) else { - return showAlert(title: S.Send.invalidAddressTitle.localize(), message: S.Send.invalidAddressOnPasteboard.localize(), buttonLabel: S.Button.ok.localize()) + return showAlert(title: S.Send.invalidAddressTitle.localize(), message: S.Send.noAddress.localize(), buttonLabel: S.Button.ok.localize()) } - sendAddressCell.rootView.viewModel.addressString = pasteboard - handleRequest(request) + sendAddressCell.textField.text = pasteboard + sendAddressCell.textField.layoutIfNeeded() } @objc private func scanTapped() { - descriptionCell.textView.resignFirstResponder() + memoCell.textView.resignFirstResponder() presentScan? { [weak self] paymentRequest in guard let request = paymentRequest else { return } guard let destinationAddress = paymentRequest?.toAddress else { return } - self?.sendAddressCell.rootView.viewModel.addressString = destinationAddress self?.handleRequest(request) + self?.sendAddressCell.textField.text = destinationAddress } } @objc private func sendTapped() { - let sendAddress = sendAddressCell.rootView.viewModel.addressString - + if sendAddressCell.textField.isFirstResponder { + sendAddressCell.textField.resignFirstResponder() + } + let bareAmount: Satoshis? if sender.transaction == nil { - guard let amount = amount + guard let address = sendAddressCell.address else { + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.noAddress.localize(), buttonLabel: S.Button.ok.localize()) + } + + if !address.isValidAddress { + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.noAddress.localize(), + buttonLabel: S.Button.ok.localize()) + } + + guard var amountToSend = amount else { - return showAlert(title: S.LitewalletAlert.error.localize(), message: S.Send.noAmount.localize(), buttonLabel: S.Button.ok.localize()) + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.noAmount.localize(), + buttonLabel: S.Button.ok.localize()) } + + let opsFeeAmount = Satoshis(rawValue: tieredOpsFee(amount: amountToSend.rawValue)) + let fee = walletManager.wallet?.feeForTx(amount: amountToSend.rawValue + opsFeeAmount.rawValue) + let feeInSatoshis = Satoshis(rawValue: fee ?? 0) + bareAmount = amountToSend + + /// Set ops fees + if hasActivatedInlineFees { + amountToSend = amountToSend + opsFeeAmount + } + if let minOutput = walletManager.wallet?.minOutputAmount { - guard amount.rawValue >= minOutput + guard amountToSend.rawValue >= minOutput else { let minOutputAmount = Amount(amount: minOutput, rate: Rate.empty, maxDigits: store.state.maxDigits) - let message = String(format: S.PaymentProtocol.Errors.smallPayment.localize(), minOutputAmount.string(isLtcSwapped: store.state.isLtcSwapped)) - return showAlert(title: S.LitewalletAlert.error.localize(), message: message, buttonLabel: S.Button.ok.localize()) + let message = String(format: S.PaymentProtocol.Errors.smallPayment.localize(), + minOutputAmount.string(isLtcSwapped: store.state.isLtcSwapped)) + return showAlert(title: S.LitewalletAlert.error.localize(), + message: message, + buttonLabel: S.Button.ok.localize()) } } - guard !(walletManager.wallet?.containsAddress(sendAddress) ?? false) - else { - return showAlert(title: S.LitewalletAlert.error.localize(), message: S.Send.containsAddress.localize(), buttonLabel: S.Button.ok.localize()) - } - guard amount.rawValue <= (walletManager.wallet?.maxOutputAmount ?? 0) + guard !(walletManager.wallet?.containsAddress(address) ?? false) else { - return showAlert(title: S.LitewalletAlert.error.localize(), message: S.Send.insufficientFunds.localize(), buttonLabel: S.Button.ok.localize()) + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.containsAddress.localize(), + buttonLabel: S.Button.ok.localize()) } - guard sender.createTransaction(amount: amount.rawValue, to: sendAddress) + guard amountToSend.rawValue <= (walletManager.wallet?.maxOutputAmount ?? 0) else { - return showAlert(title: S.LitewalletAlert.error.localize(), message: S.Send.createTransactionError.localize(), buttonLabel: S.Button.ok.localize()) + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.insufficientFunds.localize(), + buttonLabel: S.Button.ok.localize()) } - } else { - NSLog("Error: transaction is nil") - } - guard let amount = amount - else { - NSLog("Error: Amount is nil") - return - } + /// Set Ops or Single Output + if hasActivatedInlineFees { + guard let bareAmt = bareAmount?.rawValue, + sender.createTransactionWithOpsOutputs(amount: bareAmt, to: address) + else { + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.createTransactionError.localize(), + buttonLabel: S.Button.ok.localize()) + } + } else { + guard let bareAmt = bareAmount?.rawValue, + sender.createTransaction(amount: bareAmt, to: address) + else { + return showAlert(title: S.LitewalletAlert.error.localize(), + message: S.Send.createTransactionError.localize(), + buttonLabel: S.Button.ok.localize()) + } + } - let confirm = ConfirmationViewController(amount: amount, fee: Satoshis(sender.fee), feeType: feeType ?? .regular, state: store.state, selectedRate: amountView.selectedRate, minimumFractionDigits: amountView.minimumFractionDigits, address: sendAddress, isUsingBiometrics: sender.canUseBiometrics) + let confirm = ConfirmationViewController(amount: bareAmount ?? Satoshis(0), + txFee: feeInSatoshis, + opsFee: opsFeeAmount, + feeType: feeType ?? .regular, state: store.state, + selectedRate: amountView.selectedRate, + minimumFractionDigits: amountView.minimumFractionDigits, + address: address, isUsingBiometrics: sender.canUseBiometrics) + + confirm.successCallback = { + confirm.dismiss(animated: true, completion: { + self.send() + }) + } + confirm.cancelCallback = { + confirm.dismiss(animated: true, completion: { + self.sender.transaction = nil + }) + } + confirmTransitioningDelegate.shouldShowMaskView = false + confirm.transitioningDelegate = confirmTransitioningDelegate + confirm.modalPresentationStyle = UIModalPresentationStyle.overFullScreen + confirm.modalPresentationCapturesStatusBarAppearance = true + present(confirm, animated: true, completion: nil) - confirm.successCallback = { - confirm.dismiss(animated: true, completion: { - self.send() - }) - } - confirm.cancelCallback = { - confirm.dismiss(animated: true, completion: { - self.sender.transaction = nil - }) + } else { + NSLog("Error: transaction is nil") } - confirmTransitioningDelegate.shouldShowMaskView = false - confirm.transitioningDelegate = confirmTransitioningDelegate - confirm.modalPresentationStyle = .overFullScreen - confirm.modalPresentationCapturesStatusBarAppearance = true - present(confirm, animated: true, completion: nil) } private func handleRequest(_ request: PaymentRequest) { @@ -341,7 +389,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka amountView.forceUpdateAmount(amount: amount) } if request.label != nil { - descriptionCell.content = request.label + memoCell.content = request.label } case .remote: @@ -367,7 +415,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka sender.send(biometricsMessage: S.VerifyPin.touchIdMessage.localize(), rate: rate, - comment: descriptionCell.textView.text, + comment: memoCell.textView.text, feePerKb: feePerKb, verifyPinFunction: { [weak self] pinValidationCallback in self?.presentVerifyPin?(S.VerifyPin.authorize.localize()) { [weak self] pin, vc in @@ -392,6 +440,8 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka myself.onPublishSuccess?() }) self?.saveEvent("send.success") + self?.sendAddressCell.textField.text = "" + self?.memoCell.textView.text = "" LWAnalytics.logEventWithParameters(itemName: ._20191105_DSL) case let .creationError(message): @@ -455,7 +505,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka if requestAmount > 0 { amountView.forceUpdateAmount(amount: requestAmount) } - descriptionCell.content = protoReq.details.memo + memoCell.content = protoReq.details.memo if requestAmount == 0 { if let amount = amount { @@ -476,25 +526,6 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka present(alertController, animated: true, completion: nil) } - // MARK: - Keyboard Notifications - - @objc private func keyboardWillShow(notification: Notification) { - copyKeyboardChangeAnimation(notification: notification) - } - - @objc private func keyboardWillHide(notification: Notification) { - copyKeyboardChangeAnimation(notification: notification) - } - - // TODO: - maybe put this in ModalPresentable? - private func copyKeyboardChangeAnimation(notification: Notification) { - guard let info = KeyboardNotificationInfo(notification.userInfo) else { return } - UIView.animate(withDuration: info.animationDuration, delay: 0, options: info.animationOptions, animations: { - guard let parentView = self.parentView else { return } - parentView.frame = parentView.frame.offsetBy(dx: 0, dy: info.deltaY) - }, completion: nil) - } - @available(*, unavailable) required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -503,7 +534,7 @@ class SendViewController: UIViewController, Subscriber, ModalPresentable, Tracka extension SendViewController: ModalDisplayable { var faqArticleId: String? { - return ArticleIds.sendBitcoin + return ArticleIds.nothing } var modalTitle: String { diff --git a/loafwallet/src/ViewControllers/ScanViewController.swift b/litewallet/src/ViewControllers/ScanViewController.swift similarity index 98% rename from loafwallet/src/ViewControllers/ScanViewController.swift rename to litewallet/src/ViewControllers/ScanViewController.swift index a59912e4f..4690c5b96 100644 --- a/loafwallet/src/ViewControllers/ScanViewController.swift +++ b/litewallet/src/ViewControllers/ScanViewController.swift @@ -17,7 +17,7 @@ class ScanViewController: UIViewController, Trackable { let alertController = UIAlertController(title: S.Send.cameraUnavailableTitle.localize(), message: S.Send.cameraUnavailableMessage.localize(), preferredStyle: .alert) alertController.addAction(UIAlertAction(title: S.Button.cancel.localize(), style: .cancel, handler: nil)) alertController.addAction(UIAlertAction(title: S.Button.settings.localize(), style: .default, handler: { _ in - if let appSettings = URL(string: UIApplicationOpenSettingsURLString) { + if let appSettings = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(appSettings, options: [:], completionHandler: nil) } })) diff --git a/loafwallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift b/litewallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift similarity index 99% rename from loafwallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift rename to litewallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift index 230299bae..acb4809da 100644 --- a/loafwallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift +++ b/litewallet/src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift @@ -25,7 +25,7 @@ class SecurityCenterViewController: UIViewController, Subscriber { init(store: Store, walletManager: WalletManager) { self.store = store self.walletManager = walletManager - header = ModalHeaderView(title: S.SecurityCenter.title.localize(), style: .light, faqInfo: (store, ArticleIds.securityCenter)) + header = ModalHeaderView(title: S.SecurityCenter.title.localize(), style: .light, faqInfo: (store, ArticleIds.nothing)) if #available(iOS 11.0, *) { shield.tintColor = UIColor(named: "labelTextColor") diff --git a/loafwallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift b/litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift rename to litewallet/src/ViewControllers/SecurityCenter/UpdatePinViewController.swift diff --git a/loafwallet/src/ViewControllers/SettingsViewController.swift b/litewallet/src/ViewControllers/SettingsViewController.swift similarity index 86% rename from loafwallet/src/ViewControllers/SettingsViewController.swift rename to litewallet/src/ViewControllers/SettingsViewController.swift index b156f5aee..7bf3321c9 100644 --- a/loafwallet/src/ViewControllers/SettingsViewController.swift +++ b/litewallet/src/ViewControllers/SettingsViewController.swift @@ -9,7 +9,7 @@ import LocalAuthentication import UIKit class SettingsViewController: UITableViewController, CustomTitleView { - init(sections: [String], rows: [String: [Setting]], optionalTitle: String? = nil) { + init(sections: [String], rows: [String: [Setting]], optionalTitle _: String? = nil) { self.sections = sections if UserDefaults.isBiometricsEnabled { self.rows = rows @@ -20,8 +20,8 @@ class SettingsViewController: UITableViewController, CustomTitleView { self.rows = tempRows } - customTitle = optionalTitle ?? S.Settings.title.localize() - titleLabel.text = optionalTitle ?? S.Settings.title.localize() + customTitle = S.Settings.title.localize() // optionalTitle ?? S.Settings.title.localize() + titleLabel.text = S.Settings.title.localize() // "optionalTitle" // ?? S.Settings.title.localize() super.init(style: .plain) } @@ -35,25 +35,19 @@ class SettingsViewController: UITableViewController, CustomTitleView { override func viewDidLoad() { let headerView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: 48.0)) - if #available(iOS 11.0, *) { - guard let textColor = UIColor(named: "labelTextColor"), - let backGroundColor = UIColor(named: "lfBackgroundColor") - else { - NSLog("ERROR: Custom color not found") - return - } - - headerView.backgroundColor = backGroundColor - tableView.backgroundColor = backGroundColor - titleLabel = UILabel(font: .customBold(size: 26.0), color: textColor) - } else { - headerView.backgroundColor = .liteWalletBlue - tableView.backgroundColor = .clear - titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) + guard let textColor = UIColor(named: "labelTextColor"), + let backGroundColor = UIColor(named: "lfBackgroundColor") + else { + NSLog("ERROR: Custom color not found") + return } + headerView.backgroundColor = backGroundColor + tableView.backgroundColor = backGroundColor + titleLabel = UILabel(font: .customBold(size: 26.0), color: textColor) + headerView.addSubview(titleLabel) - titleLabel.constrain(toSuperviewEdges: UIEdgeInsetsMake(0, C.padding[2], 0, 0)) + titleLabel.constrain(toSuperviewEdges: UIEdgeInsets(top: 0, left: C.padding[2], bottom: 0, right: 0)) tableView.register(SeparatorCell.self, forCellReuseIdentifier: cellIdentifier) tableView.tableHeaderView = headerView tableView.tableFooterView = UIView() diff --git a/loafwallet/src/ViewControllers/ShareDataViewController.swift b/litewallet/src/ViewControllers/ShareDataViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/ShareDataViewController.swift rename to litewallet/src/ViewControllers/ShareDataViewController.swift diff --git a/loafwallet/src/ViewControllers/StartPaperPhraseViewController.swift b/litewallet/src/ViewControllers/StartPaperPhraseViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/StartPaperPhraseViewController.swift rename to litewallet/src/ViewControllers/StartPaperPhraseViewController.swift diff --git a/loafwallet/src/ViewControllers/StartViewController.swift b/litewallet/src/ViewControllers/StartViewController.swift similarity index 98% rename from loafwallet/src/ViewControllers/StartViewController.swift rename to litewallet/src/ViewControllers/StartViewController.swift index d3ef812a6..490602b9b 100644 --- a/loafwallet/src/ViewControllers/StartViewController.swift +++ b/litewallet/src/ViewControllers/StartViewController.swift @@ -43,7 +43,6 @@ class StartViewController: UIViewController { } private func setData() { - message.text = S.StartViewController.message.localize() message.lineBreakMode = .byWordWrapping message.numberOfLines = 0 message.textAlignment = .center diff --git a/loafwallet/src/ViewControllers/StartWipeWalletViewController.swift b/litewallet/src/ViewControllers/StartWipeWalletViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/StartWipeWalletViewController.swift rename to litewallet/src/ViewControllers/StartWipeWalletViewController.swift diff --git a/loafwallet/src/ViewControllers/VerifyPinViewController.swift b/litewallet/src/ViewControllers/VerifyPinViewController.swift similarity index 100% rename from loafwallet/src/ViewControllers/VerifyPinViewController.swift rename to litewallet/src/ViewControllers/VerifyPinViewController.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift similarity index 100% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift similarity index 100% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift similarity index 100% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift similarity index 100% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift similarity index 100% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift diff --git a/loafwallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift b/litewallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift similarity index 89% rename from loafwallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift rename to litewallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift index 65d85e2c3..9d478a2b5 100644 --- a/loafwallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift +++ b/litewallet/src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift @@ -3,6 +3,7 @@ import UIKit class PresentModalAnimator: NSObject { // MARK: - Public + let heightOffset: CGFloat = 40.0 init(shouldCoverBottomGap: Bool, completion: @escaping () -> Void) { self.completion = completion self.shouldCoverBottomGap = shouldCoverBottomGap @@ -36,7 +37,7 @@ extension PresentModalAnimator: UIViewControllerAnimatedTransitioning { let fromFrame = container.frame var maskView: UIView? if shouldCoverBottomGap { - maskView = UIView(frame: CGRect(x: 0, y: fromFrame.height, width: fromFrame.width, height: 40.0)) + maskView = UIView(frame: CGRect(x: 0, y: fromFrame.height, width: fromFrame.width, height: heightOffset)) maskView?.backgroundColor = .white container.addSubview(maskView!) } @@ -46,7 +47,8 @@ extension PresentModalAnimator: UIViewControllerAnimatedTransitioning { container.addSubview(toView) UIView.spring(duration, animations: { - maskView?.frame = CGRect(x: 0, y: fromFrame.height - 30.0, width: fromFrame.width, height: 40.0) + // fromFrame.height - 30.0 + maskView?.frame = CGRect(x: 0, y: fromFrame.height, width: fromFrame.width, height: self.heightOffset) blurView.effect = UIBlurEffect(style: .dark) toView.frame = finalToViewFrame }, completion: { _ in diff --git a/loafwallet/src/ViewControllers/WritePaperPhraseViewController.swift b/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift similarity index 95% rename from loafwallet/src/ViewControllers/WritePaperPhraseViewController.swift rename to litewallet/src/ViewControllers/WritePaperPhraseViewController.swift index fe435d468..383ab57e2 100644 --- a/loafwallet/src/ViewControllers/WritePaperPhraseViewController.swift +++ b/litewallet/src/ViewControllers/WritePaperPhraseViewController.swift @@ -62,10 +62,11 @@ class WritePaperPhraseViewController: UIViewController { addConstraints() addButtonTargets() - NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) - { [weak self] _ in - self?.dismiss(animated: true, completion: nil) - } + NotificationCenter.default.addObserver(forName: UIScene.willDeactivateNotification, + object: nil, + queue: nil) { [weak self] _ in + self?.dismiss(animated: true, completion: nil) + } } override var preferredStatusBarStyle: UIStatusBarStyle { diff --git a/loafwallet/src/ViewModels/Amount.swift b/litewallet/src/ViewModels/Amount.swift similarity index 100% rename from loafwallet/src/ViewModels/Amount.swift rename to litewallet/src/ViewModels/Amount.swift diff --git a/loafwallet/src/ViewModels/Transaction.swift b/litewallet/src/ViewModels/Transaction.swift similarity index 99% rename from loafwallet/src/ViewModels/Transaction.swift rename to litewallet/src/ViewModels/Transaction.swift index 977d2bf26..9e02031ea 100644 --- a/loafwallet/src/ViewModels/Transaction.swift +++ b/litewallet/src/ViewModels/Transaction.swift @@ -151,7 +151,7 @@ class Transaction { private let tx: BRTxRef private let wallet: BRWallet - fileprivate let satoshis: UInt64 + private let satoshis: UInt64 private var kvStore: BRReplicatedKVStore? lazy var toAddress: String? = { diff --git a/loafwallet/src/ViewModels/TransactionDirection.swift b/litewallet/src/ViewModels/TransactionDirection.swift similarity index 100% rename from loafwallet/src/ViewModels/TransactionDirection.swift rename to litewallet/src/ViewModels/TransactionDirection.swift diff --git a/loafwallet/src/Views/AboutCell.swift b/litewallet/src/Views/AboutCell.swift similarity index 100% rename from loafwallet/src/Views/AboutCell.swift rename to litewallet/src/Views/AboutCell.swift diff --git a/loafwallet/src/Views/AlertView.swift b/litewallet/src/Views/AlertView.swift similarity index 100% rename from loafwallet/src/Views/AlertView.swift rename to litewallet/src/Views/AlertView.swift diff --git a/loafwallet/src/Views/AnimatedIcons/AnimatableIcon.swift b/litewallet/src/Views/AnimatedIcons/AnimatableIcon.swift similarity index 100% rename from loafwallet/src/Views/AnimatedIcons/AnimatableIcon.swift rename to litewallet/src/Views/AnimatedIcons/AnimatableIcon.swift diff --git a/loafwallet/src/Views/AnimatedIcons/CheckView.swift b/litewallet/src/Views/AnimatedIcons/CheckView.swift similarity index 94% rename from loafwallet/src/Views/AnimatedIcons/CheckView.swift rename to litewallet/src/Views/AnimatedIcons/CheckView.swift index 80f0b6f9c..c93f7f215 100644 --- a/loafwallet/src/Views/AnimatedIcons/CheckView.swift +++ b/litewallet/src/Views/AnimatedIcons/CheckView.swift @@ -14,15 +14,15 @@ class CheckView: UIView, AnimatableIcon { shape.fillColor = UIColor.clear.cgColor shape.strokeStart = 0.0 shape.strokeEnd = 0.0 - shape.lineCap = "round" - shape.lineJoin = "round" + shape.lineCap = .round + shape.lineJoin = .round layer.addSublayer(shape) let animation = CABasicAnimation(keyPath: "strokeEnd") animation.toValue = 1.0 animation.isRemovedOnCompletion = false - animation.fillMode = kCAFillModeForwards - animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) + animation.fillMode = CAMediaTimingFillMode.forwards + animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.default) animation.duration = 0.3 shape.add(animation, forKey: nil) diff --git a/loafwallet/src/Views/BlinkingView.swift b/litewallet/src/Views/BlinkingView.swift similarity index 100% rename from loafwallet/src/Views/BlinkingView.swift rename to litewallet/src/Views/BlinkingView.swift diff --git a/loafwallet/src/Views/CameraGuideView.swift b/litewallet/src/Views/CameraGuideView.swift similarity index 97% rename from loafwallet/src/Views/CameraGuideView.swift rename to litewallet/src/Views/CameraGuideView.swift index 1ce792755..7692bf1e4 100644 --- a/loafwallet/src/Views/CameraGuideView.swift +++ b/litewallet/src/Views/CameraGuideView.swift @@ -9,7 +9,7 @@ enum CameraGuideState { var color: UIColor { switch self { case .normal: return .darkLine - case .negative: return .cameraGuideNegative + case .negative: return .litewalletOrange case .positive: return .cameraGuidePositive } } diff --git a/loafwallet/src/Views/Circle.swift b/litewallet/src/Views/Circle.swift similarity index 100% rename from loafwallet/src/Views/Circle.swift rename to litewallet/src/Views/Circle.swift diff --git a/loafwallet/src/Views/ConfirmPhrase.swift b/litewallet/src/Views/ConfirmPhrase.swift similarity index 98% rename from loafwallet/src/Views/ConfirmPhrase.swift rename to litewallet/src/Views/ConfirmPhrase.swift index 1d6ac9410..320a39673 100644 --- a/loafwallet/src/Views/ConfirmPhrase.swift +++ b/litewallet/src/Views/ConfirmPhrase.swift @@ -66,7 +66,7 @@ class ConfirmPhrase: UIView { func validate() { if textField.text != word { - textField.textColor = .cameraGuideNegative // .red + textField.textColor = .litewalletOrange } } diff --git a/loafwallet/src/Views/DefaultCurrencyViewController.swift b/litewallet/src/Views/DefaultCurrencyViewController.swift similarity index 98% rename from loafwallet/src/Views/DefaultCurrencyViewController.swift rename to litewallet/src/Views/DefaultCurrencyViewController.swift index 7c1c0ef85..35624ca83 100644 --- a/loafwallet/src/Views/DefaultCurrencyViewController.swift +++ b/litewallet/src/Views/DefaultCurrencyViewController.swift @@ -49,7 +49,7 @@ class DefaultCurrencyViewController: UITableViewController, Subscriber { self.setExchangeRateLabel() }) - tableView.sectionHeaderHeight = UITableViewAutomaticDimension + tableView.sectionHeaderHeight = UITableView.automaticDimension tableView.estimatedSectionHeaderHeight = 140.0 tableView.backgroundColor = .whiteTint tableView.separatorStyle = .none @@ -59,7 +59,7 @@ class DefaultCurrencyViewController: UITableViewController, Subscriber { titleLabel.sizeToFit() navigationItem.titleView = titleLabel - let faqButton = UIButton.buildFaqButton(store: store, articleId: ArticleIds.displayCurrency) + let faqButton = UIButton.buildFaqButton(store: store, articleId: ArticleIds.nothing) faqButton.tintColor = .darkText navigationItem.rightBarButtonItems = [UIBarButtonItem.negativePadding, UIBarButtonItem(customView: faqButton)] } diff --git a/loafwallet/src/Views/DrawableCircle.swift b/litewallet/src/Views/DrawableCircle.swift similarity index 86% rename from loafwallet/src/Views/DrawableCircle.swift rename to litewallet/src/Views/DrawableCircle.swift index 6518a9d92..9500a8d34 100644 --- a/loafwallet/src/Views/DrawableCircle.swift +++ b/litewallet/src/Views/DrawableCircle.swift @@ -32,15 +32,15 @@ class DrawableCircle: UIView { checkLayer.strokeColor = C.defaultTintColor.cgColor checkLayer.fillColor = UIColor.clear.cgColor checkLayer.strokeEnd = 0.0 - checkLayer.lineCap = "round" - checkLayer.lineJoin = "round" + checkLayer.lineCap = .round + checkLayer.lineJoin = .round layer.addSublayer(checkLayer) } func show() { let circleAnimation = CABasicAnimation(keyPath: "opacity") circleAnimation.duration = animationDuration - circleAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) + circleAnimation.timingFunction = CAMediaTimingFunction(name: .easeIn) circleAnimation.fromValue = 0.0 circleAnimation.toValue = 1.0 circleLayer.opacity = 1.0 @@ -49,8 +49,8 @@ class DrawableCircle: UIView { let checkAnimation = CABasicAnimation(keyPath: "strokeEnd") checkAnimation.fromValue = 0.0 checkAnimation.toValue = 1.0 - checkAnimation.fillMode = kCAFillModeForwards - checkAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) + checkAnimation.fillMode = .forwards + checkAnimation.timingFunction = CAMediaTimingFunction(name: .easeIn) checkAnimation.duration = animationDuration checkLayer.strokeEnd = 1.0 checkLayer.add(checkAnimation, forKey: "drawCheck") diff --git a/loafwallet/src/Views/EnterPhraseCell.swift b/litewallet/src/Views/EnterPhraseCell.swift similarity index 98% rename from loafwallet/src/Views/EnterPhraseCell.swift rename to litewallet/src/Views/EnterPhraseCell.swift index fd65d2be2..ab7eae008 100644 --- a/loafwallet/src/Views/EnterPhraseCell.swift +++ b/litewallet/src/Views/EnterPhraseCell.swift @@ -162,8 +162,8 @@ extension EnterPhraseCell: UITextFieldDelegate { textField.textColor = .darkText separator.backgroundColor = .secondaryShadow } else { - textField.textColor = .cameraGuideNegative - separator.backgroundColor = .cameraGuideNegative + textField.textColor = .litewalletOrange + separator.backgroundColor = .litewalletOrange hasDisplayedInvalidState = true } } diff --git a/loafwallet/src/Views/GradientCircle.swift b/litewallet/src/Views/GradientCircle.swift similarity index 100% rename from loafwallet/src/Views/GradientCircle.swift rename to litewallet/src/Views/GradientCircle.swift diff --git a/loafwallet/src/Views/GradientSwitch.swift b/litewallet/src/Views/GradientSwitch.swift similarity index 100% rename from loafwallet/src/Views/GradientSwitch.swift rename to litewallet/src/Views/GradientSwitch.swift diff --git a/loafwallet/src/Views/GradientView.swift b/litewallet/src/Views/GradientView.swift similarity index 95% rename from loafwallet/src/Views/GradientView.swift rename to litewallet/src/Views/GradientView.swift index 3ad08ba25..3b673430c 100644 --- a/loafwallet/src/Views/GradientView.swift +++ b/litewallet/src/Views/GradientView.swift @@ -24,7 +24,7 @@ extension UIView { image.contentMode = .scaleToFill addSubview(image) image.constrain(toSuperviewEdges: nil) - sendSubview(toBack: image) + sendSubviewToBack(image) } } @@ -44,6 +44,6 @@ extension UIView { image.contentMode = .scaleToFill addSubview(image) image.constrain(toSuperviewEdges: nil) - sendSubview(toBack: image) + sendSubviewToBack(image) } } diff --git a/loafwallet/src/Views/InAppAlert.swift b/litewallet/src/Views/InAppAlert.swift similarity index 100% rename from loafwallet/src/Views/InAppAlert.swift rename to litewallet/src/Views/InAppAlert.swift diff --git a/loafwallet/src/Views/InViewAlert.swift b/litewallet/src/Views/InViewAlert.swift similarity index 96% rename from loafwallet/src/Views/InViewAlert.swift rename to litewallet/src/Views/InViewAlert.swift index 2f4624073..bdbb85224 100644 --- a/loafwallet/src/Views/InViewAlert.swift +++ b/litewallet/src/Views/InViewAlert.swift @@ -15,7 +15,7 @@ class InViewAlert: UIView { didSet { guard let view = contentView else { return } addSubview(view) - view.constrain(toSuperviewEdges: UIEdgeInsetsMake(arrowHeight, 0, 0, 0)) + view.constrain(toSuperviewEdges: UIEdgeInsets(top: arrowHeight, left: 0, bottom: 0, right: 0)) } } diff --git a/loafwallet/src/Views/LightWeightAlert.swift b/litewallet/src/Views/LightWeightAlert.swift similarity index 85% rename from loafwallet/src/Views/LightWeightAlert.swift rename to litewallet/src/Views/LightWeightAlert.swift index 8eebe78fb..debaa1218 100644 --- a/loafwallet/src/Views/LightWeightAlert.swift +++ b/litewallet/src/Views/LightWeightAlert.swift @@ -18,7 +18,7 @@ class LightWeightAlert: UIView { background.contentView.addSubview(container) container.contentView.addSubview(label) container.constrain(toSuperviewEdges: nil) - label.constrain(toSuperviewEdges: UIEdgeInsetsMake(C.padding[2], C.padding[2], -C.padding[2], -C.padding[2])) + label.constrain(toSuperviewEdges: UIEdgeInsets(top: C.padding[2], left: C.padding[2], bottom: -C.padding[2], right: -C.padding[2])) layer.cornerRadius = 4.0 layer.masksToBounds = true } diff --git a/loafwallet/src/Views/LoadingProgressView.swift b/litewallet/src/Views/LoadingProgressView.swift similarity index 100% rename from loafwallet/src/Views/LoadingProgressView.swift rename to litewallet/src/Views/LoadingProgressView.swift diff --git a/loafwallet/src/Views/LoginBackgroundTriangle.swift b/litewallet/src/Views/LoginBackgroundTriangle.swift similarity index 100% rename from loafwallet/src/Views/LoginBackgroundTriangle.swift rename to litewallet/src/Views/LoginBackgroundTriangle.swift diff --git a/loafwallet/src/Views/ModalHeaderView.swift b/litewallet/src/Views/ModalHeaderView.swift similarity index 100% rename from loafwallet/src/Views/ModalHeaderView.swift rename to litewallet/src/Views/ModalHeaderView.swift diff --git a/loafwallet/src/Views/NonScrollingCollectionView.swift b/litewallet/src/Views/NonScrollingCollectionView.swift similarity index 100% rename from loafwallet/src/Views/NonScrollingCollectionView.swift rename to litewallet/src/Views/NonScrollingCollectionView.swift diff --git a/loafwallet/src/Views/PhraseView.swift b/litewallet/src/Views/PhraseView.swift similarity index 100% rename from loafwallet/src/Views/PhraseView.swift rename to litewallet/src/Views/PhraseView.swift diff --git a/loafwallet/src/Views/PinPadCells/PinPadCells.swift b/litewallet/src/Views/PinPadCells/PinPadCells.swift similarity index 100% rename from loafwallet/src/Views/PinPadCells/PinPadCells.swift rename to litewallet/src/Views/PinPadCells/PinPadCells.swift diff --git a/loafwallet/src/Views/PinView.swift b/litewallet/src/Views/PinView.swift similarity index 93% rename from loafwallet/src/Views/PinView.swift rename to litewallet/src/Views/PinView.swift index ca6e59c51..39b266ed1 100644 --- a/loafwallet/src/Views/PinView.swift +++ b/litewallet/src/Views/PinView.swift @@ -47,11 +47,11 @@ class PinView: UIView { func shake(completion: (() -> Void)? = nil) { shakeCompletion = completion let translation = CAKeyframeAnimation(keyPath: "transform.translation.x") - translation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + translation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear) translation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0] let rotation = CAKeyframeAnimation(keyPath: "transform.rotation.y") - rotation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + rotation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.linear) rotation.values = [-5, 5, -5, 5, -3, 3, -2, 2, 0].map { self.toRadian(value: $0) diff --git a/loafwallet/src/Views/RadialGradientView.swift b/litewallet/src/Views/RadialGradientView.swift similarity index 100% rename from loafwallet/src/Views/RadialGradientView.swift rename to litewallet/src/Views/RadialGradientView.swift diff --git a/loafwallet/src/Views/SearchHeaderView.swift b/litewallet/src/Views/SearchHeaderView.swift similarity index 98% rename from loafwallet/src/Views/SearchHeaderView.swift rename to litewallet/src/Views/SearchHeaderView.swift index 99dd7039a..f0eecd854 100644 --- a/loafwallet/src/Views/SearchHeaderView.swift +++ b/litewallet/src/Views/SearchHeaderView.swift @@ -123,7 +123,7 @@ class SearchHeaderView: UIView { private func addConstraints() { cancel.setTitle(S.Button.cancel.localize(), for: .normal) - let titleSize = NSString(string: cancel.titleLabel!.text!).size(withAttributes: [NSAttributedStringKey.font: cancel.titleLabel!.font]) + let titleSize = NSString(string: cancel.titleLabel!.text!).size(withAttributes: [NSAttributedString.Key.font: cancel.titleLabel!.font]) cancel.constrain([ cancel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -C.padding[2]), cancel.centerYAnchor.constraint(equalTo: searchBar.centerYAnchor), diff --git a/loafwallet/src/Views/SecurityCenterCell.swift b/litewallet/src/Views/SecurityCenterCell.swift similarity index 100% rename from loafwallet/src/Views/SecurityCenterCell.swift rename to litewallet/src/Views/SecurityCenterCell.swift diff --git a/loafwallet/src/Views/SendAmountCell.swift b/litewallet/src/Views/SendAmountCell.swift similarity index 95% rename from loafwallet/src/Views/SendAmountCell.swift rename to litewallet/src/Views/SendAmountCell.swift index 64c76a0fc..413fd107c 100644 --- a/loafwallet/src/Views/SendAmountCell.swift +++ b/litewallet/src/Views/SendAmountCell.swift @@ -3,9 +3,9 @@ import UIKit class SendAmountCell: SendCell { init(placeholder: String) { super.init() - let attributes: [NSAttributedStringKey: Any] = [ - NSAttributedStringKey.foregroundColor: UIColor.grayTextTint, - NSAttributedStringKey.font: placeholderFont, + let attributes: [NSAttributedString.Key: Any] = [ + NSAttributedString.Key.foregroundColor: UIColor.grayTextTint, + NSAttributedString.Key.font: placeholderFont, ] textField.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: attributes) textField.delegate = self diff --git a/litewallet/src/Views/SendViewCells/AddressCell.swift b/litewallet/src/Views/SendViewCells/AddressCell.swift new file mode 100644 index 000000000..7e0a42942 --- /dev/null +++ b/litewallet/src/Views/SendViewCells/AddressCell.swift @@ -0,0 +1,110 @@ +import UIKit + +class AddressCell: UIView { + init() { + super.init(frame: .zero) + setupViews() + } + + var address: String? { + return textField.text + } + + var didBeginEditing: (() -> Void)? + var didEndEditing: (() -> Void)? + var didReceivePaymentRequest: ((PaymentRequest) -> Void)? + + let textField = UITextField() + let paste = ShadowButton(title: S.Send.pasteLabel.localize(), type: .tertiary) + let scan = ShadowButton(title: S.Send.scanLabel.localize(), type: .tertiary) + private let dividerView = UIView(color: .secondaryShadow) + + private func setupViews() { + if #available(iOS 11.0, *) { + guard let textColor = UIColor(named: "labelTextColor") + else { + NSLog("ERROR: Main color") + return + } + textField.textColor = textColor + } else { + textField.textColor = .darkText + } + addSubviews() + addConstraints() + setInitialData() + } + + private func addSubviews() { + addSubview(textField) + addSubview(dividerView) + addSubview(paste) + addSubview(scan) + } + + private func addConstraints() { + textField.constrain([ + textField.constraint(.leading, toView: self, constant: 11.0), + textField.constraint(.centerY, toView: self), + textField.trailingAnchor.constraint(equalTo: paste.leadingAnchor, constant: -C.padding[1]), + ]) + scan.constrain([ + scan.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -C.padding[2]), + scan.centerYAnchor.constraint(equalTo: centerYAnchor), + ]) + paste.constrain([ + paste.centerYAnchor.constraint(equalTo: centerYAnchor), + paste.trailingAnchor.constraint(equalTo: scan.leadingAnchor, constant: -C.padding[0.625]), + ]) + dividerView.constrain([ + dividerView.leadingAnchor.constraint(equalTo: leadingAnchor), + dividerView.bottomAnchor.constraint(equalTo: bottomAnchor), + dividerView.trailingAnchor.constraint(equalTo: trailingAnchor), + dividerView.heightAnchor.constraint(equalToConstant: 1.0), + ]) + } + + private func setInitialData() { + textField.font = .customBody(size: 15.0) + textField.adjustsFontSizeToFitWidth = true + textField.minimumFontSize = 10.0 + textField.placeholder = S.Send.enterLTCAddressLabel.localize() + textField.returnKeyType = .done + textField.delegate = self + textField.clearButtonMode = .whileEditing + } + + @objc private func didTap() { + textField.becomeFirstResponder() + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension AddressCell: UITextFieldDelegate { + func textFieldDidBeginEditing(_: UITextField) { + didBeginEditing?() + } + + func textFieldDidEndEditing(_: UITextField) { + didEndEditing?() + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } + + func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool + { + if let request = PaymentRequest(string: string) { + didReceivePaymentRequest?(request) + return false + } else { + return true + } + } +} diff --git a/loafwallet/src/Views/SendViewCells/DescriptionSendCell.swift b/litewallet/src/Views/SendViewCells/DescriptionSendCell.swift similarity index 100% rename from loafwallet/src/Views/SendViewCells/DescriptionSendCell.swift rename to litewallet/src/Views/SendViewCells/DescriptionSendCell.swift diff --git a/loafwallet/src/Views/SendViewCells/SendCell.swift b/litewallet/src/Views/SendViewCells/SendCell.swift similarity index 92% rename from loafwallet/src/Views/SendViewCells/SendCell.swift rename to litewallet/src/Views/SendViewCells/SendCell.swift index ab97d6a36..fbd348226 100644 --- a/loafwallet/src/Views/SendViewCells/SendCell.swift +++ b/litewallet/src/Views/SendViewCells/SendCell.swift @@ -1,7 +1,7 @@ import UIKit class SendCell: UIView { - static let defaultHeight: CGFloat = 95.0 + static let defaultHeight: CGFloat = 55.0 // 95.0 init() { super.init(frame: .zero) diff --git a/loafwallet/src/Views/SeparatorCell.swift b/litewallet/src/Views/SeparatorCell.swift similarity index 89% rename from loafwallet/src/Views/SeparatorCell.swift rename to litewallet/src/Views/SeparatorCell.swift index 51e78536c..e33320584 100644 --- a/loafwallet/src/Views/SeparatorCell.swift +++ b/litewallet/src/Views/SeparatorCell.swift @@ -1,7 +1,7 @@ import UIKit class SeparatorCell: UITableViewCell { - override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + override init(style: CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) let separator = UIView() separator.backgroundColor = .secondaryShadow diff --git a/loafwallet/src/Views/ShadowButton.swift b/litewallet/src/Views/ShadowButton.swift similarity index 100% rename from loafwallet/src/Views/ShadowButton.swift rename to litewallet/src/Views/ShadowButton.swift diff --git a/loafwallet/src/Views/SyncingView.swift b/litewallet/src/Views/SyncingView.swift similarity index 100% rename from loafwallet/src/Views/SyncingView.swift rename to litewallet/src/Views/SyncingView.swift diff --git a/loafwallet/src/Views/UnEditableTextView.swift b/litewallet/src/Views/UnEditableTextView.swift similarity index 100% rename from loafwallet/src/Views/UnEditableTextView.swift rename to litewallet/src/Views/UnEditableTextView.swift diff --git a/loafwallet/src/Views/UpdatingLabel.swift b/litewallet/src/Views/UpdatingLabel.swift similarity index 94% rename from loafwallet/src/Views/UpdatingLabel.swift rename to litewallet/src/Views/UpdatingLabel.swift index 0e994eae9..953ec93f3 100644 --- a/loafwallet/src/Views/UpdatingLabel.swift +++ b/litewallet/src/Views/UpdatingLabel.swift @@ -46,8 +46,8 @@ class UpdatingLabel: UILabel { private func startTimer() { timer = CADisplayLink(target: self, selector: #selector(UpdatingLabel.update)) timer?.preferredFramesPerSecond = 2 - timer?.add(to: .main, forMode: .defaultRunLoopMode) - timer?.add(to: .main, forMode: .UITrackingRunLoopMode) + timer?.add(to: .main, forMode: .default) + timer?.add(to: .main, forMode: .tracking) } @objc private func update() { diff --git a/loafwallet/src/Views/WalletDisabledView.swift b/litewallet/src/Views/WalletDisabledView.swift similarity index 99% rename from loafwallet/src/Views/WalletDisabledView.swift rename to litewallet/src/Views/WalletDisabledView.swift index fceffe593..4a2304c42 100644 --- a/loafwallet/src/Views/WalletDisabledView.swift +++ b/litewallet/src/Views/WalletDisabledView.swift @@ -7,7 +7,7 @@ class WalletDisabledView: UIView { init(store: Store) { self.store = store - faq = UIButton.buildFaqButton(store: store, articleId: ArticleIds.walletDisabled) + faq = UIButton.buildFaqButton(store: store, articleId: ArticleIds.nothing) blur = UIVisualEffectView() super.init(frame: .zero) setup() diff --git a/loafwallet/src/Wallet/ExchangeUpdater.swift b/litewallet/src/Wallet/ExchangeUpdater.swift similarity index 99% rename from loafwallet/src/Wallet/ExchangeUpdater.swift rename to litewallet/src/Wallet/ExchangeUpdater.swift index e28547dbc..5b52eb0a0 100644 --- a/loafwallet/src/Wallet/ExchangeUpdater.swift +++ b/litewallet/src/Wallet/ExchangeUpdater.swift @@ -16,6 +16,7 @@ class ExchangeUpdater: Subscriber { func refresh(completion: @escaping () -> Void) { 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() diff --git a/loafwallet/src/WalletCoordinator.swift b/litewallet/src/WalletCoordinator.swift similarity index 95% rename from loafwallet/src/WalletCoordinator.swift rename to litewallet/src/WalletCoordinator.swift index dd60f73a1..83695f719 100644 --- a/loafwallet/src/WalletCoordinator.swift +++ b/litewallet/src/WalletCoordinator.swift @@ -117,7 +117,6 @@ class WalletCoordinator: Subscriber, Trackable { } @objc private func updateTransactions() { - print("Updating transactions") updateTimer?.invalidate() updateTimer = nil DispatchQueue.walletQueue.async { @@ -147,33 +146,35 @@ class WalletCoordinator: Subscriber, Trackable { } private func addWalletObservers() { - NotificationCenter.default.addObserver(forName: .walletBalanceChangedNotification, object: nil, queue: nil, using: { _ in - self.updateBalance() - self.requestTxUpdate() + weak var myself = self + NotificationCenter.default.addObserver(forName: .walletBalanceChangedNotification, object: nil, queue: nil, using: { + _ in + myself?.updateBalance() + myself?.requestTxUpdate() }) NotificationCenter.default.addObserver(forName: .walletTxStatusUpdateNotification, object: nil, queue: nil, using: { _ in - self.requestTxUpdate() + myself?.requestTxUpdate() }) NotificationCenter.default.addObserver(forName: .walletTxRejectedNotification, object: nil, queue: nil, using: { note in guard let recommendRescan = note.userInfo?["recommendRescan"] as? Bool else { return } - self.requestTxUpdate() + myself?.requestTxUpdate() if recommendRescan { - self.store.perform(action: RecommendRescan.set(recommendRescan)) + myself?.store.perform(action: RecommendRescan.set(recommendRescan)) } }) NotificationCenter.default.addObserver(forName: .walletSyncStartedNotification, object: nil, queue: nil, using: { _ in - self.onSyncStart() + myself?.onSyncStart() }) NotificationCenter.default.addObserver(forName: .walletSyncStoppedNotification, object: nil, queue: nil, using: { note in - self.onSyncStop(notification: note) + myself?.onSyncStop(notification: note) }) NotificationCenter.default.addObserver(forName: .languageChangedNotification, object: nil, queue: nil, using: { _ in - self.updateTransactions() + myself?.updateTransactions() }) } diff --git a/loafwallet/src/WalletManager+Auth.swift b/litewallet/src/WalletManager+Auth.swift similarity index 97% rename from loafwallet/src/WalletManager+Auth.swift rename to litewallet/src/WalletManager+Auth.swift index 5c7608f77..6393cc4fc 100644 --- a/loafwallet/src/WalletManager+Auth.swift +++ b/litewallet/src/WalletManager+Auth.swift @@ -2,7 +2,7 @@ import BRCore import FirebaseAnalytics import Foundation import LocalAuthentication -import sqlite3 +import SQLite3 import UIKit private let WalletSecAttrService = "com.litecoin.loafwallet" @@ -287,24 +287,6 @@ extension WalletManager: WalletAuthenticator { } } - /// Sign Transaction to Card: sign the given transaction for Litecoin Card transfer - /// - Parameters: - /// - tx: LItecoin Transaction - /// - completion: TransferCardResult - /// - Returns: Void - func signCardTransaction(_ tx: BRTxRef, completion: @escaping (TransferCardResult) -> Void) { - do { - guard let wallet = wallet - else { - return completion(.failure) - } - - signTx(tx) == true ? completion(.success) : completion(.failure) - } catch { - return completion(.failure) - } - } - // the 12 word wallet recovery phrase func seedPhrase(pin: String) -> String? { guard authenticate(pin: pin) else { return nil } diff --git a/loafwallet/src/WalletManager.swift b/litewallet/src/WalletManager.swift similarity index 99% rename from loafwallet/src/WalletManager.swift rename to litewallet/src/WalletManager.swift index f9b44abb5..71250d313 100644 --- a/loafwallet/src/WalletManager.swift +++ b/litewallet/src/WalletManager.swift @@ -1,6 +1,7 @@ import BRCore import Foundation -import sqlite3 +// import sqlite3 +import SQLite3 import SystemConfiguration internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self) diff --git a/loafwallet/id.lproj/BIP39Words.plist b/litewallet/tr.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/id.lproj/BIP39Words.plist rename to litewallet/tr.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/tr.lproj/Localizable.strings b/litewallet/tr.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/tr.lproj/Localizable.strings rename to litewallet/tr.lproj/Localizable.strings index 83c2061cf..48af23c33 100644 --- a/loafwallet/src/Strings/tr.lproj/Localizable.strings +++ b/litewallet/tr.lproj/Localizable.strings @@ -1084,8 +1084,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "Kağıt anahtarınızı en son%1$@ üzerine yazdınız"; -/* Start view message */ -"StartViewController.message" = "Litecoin'i kullanmanın en güvenli ve en güvenli yolu."; +/* Start view tagline */ +"StartViewController.tagline" = "Litecoin kullanmanın en güvenli ve en kolay yolu."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Litecoin Foundation'ı Destekleyin"; @@ -1449,3 +1449,14 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d/%2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Ücret: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Ücretler: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Ücretler:"; + + diff --git a/loafwallet/nb.lproj/BIP39Words.plist b/litewallet/uk.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/nb.lproj/BIP39Words.plist rename to litewallet/uk.lproj/BIP39Words.plist diff --git a/loafwallet/uk.lproj/LaunchScreen.strings b/litewallet/uk.lproj/LaunchScreen.strings similarity index 100% rename from loafwallet/uk.lproj/LaunchScreen.strings rename to litewallet/uk.lproj/LaunchScreen.strings diff --git a/loafwallet/src/Strings/uk.lproj/Localizable.strings b/litewallet/uk.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/uk.lproj/Localizable.strings rename to litewallet/uk.lproj/Localizable.strings index 28cce9514..4163bbbc1 100644 --- a/loafwallet/src/Strings/uk.lproj/Localizable.strings +++ b/litewallet/uk.lproj/Localizable.strings @@ -1084,8 +1084,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "Ви востаннє записали свій паперовий ключ %1$@"; -/* Start view message */ -"StartViewController.message" = "Найбезпечніший і найбезпечніший спосіб використання Litecoin."; +/* Start view tagline */ +"StartViewController.tagline" = "Найбезпечніший і найбезпечніший спосіб використання Litecoin."; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "Підтримайте Litecoin Foundation"; @@ -1449,3 +1449,14 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d з %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "Комісія: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "Збори: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "Збори:"; + + diff --git a/loafwallet/zh-Hans.lproj/BIP39Words.plist b/litewallet/zh-Hans.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/zh-Hans.lproj/BIP39Words.plist rename to litewallet/zh-Hans.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/zh-Hans.lproj/Localizable.strings b/litewallet/zh-Hans.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/zh-Hans.lproj/Localizable.strings rename to litewallet/zh-Hans.lproj/Localizable.strings index 589849593..3f7c482c0 100755 --- a/loafwallet/src/Strings/zh-Hans.lproj/Localizable.strings +++ b/litewallet/zh-Hans.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "捐款金额"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "网络费:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "处理时间:这些交易将花费 %1$@ 分钟来处理。"; @@ -1084,8 +1081,8 @@ /* Argument is date */ "StartPaperPhrase.date" = "您最后一次记录纸上密钥是在 %1$@"; -/* Start view message */ -"StartViewController.message" = "使用莱特币最安全且最可靠的方式。"; +/* Start view tagline */ +"StartViewController.tagline" = "使用莱特币最安全且最可靠的方式。"; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "支持Litecoin基金会"; @@ -1449,3 +1446,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%1$d / %2$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "费用: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "费用: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "费用:"; diff --git a/loafwallet/nl.lproj/BIP39Words.plist b/litewallet/zh-Hant.lproj/BIP39Words.plist similarity index 100% rename from loafwallet/nl.lproj/BIP39Words.plist rename to litewallet/zh-Hant.lproj/BIP39Words.plist diff --git a/loafwallet/src/Strings/zh-Hant.lproj/Localizable.strings b/litewallet/zh-Hant.lproj/Localizable.strings similarity index 99% rename from loafwallet/src/Strings/zh-Hant.lproj/Localizable.strings rename to litewallet/zh-Hant.lproj/Localizable.strings index 102de6e43..f701eb776 100755 --- a/loafwallet/src/Strings/zh-Hant.lproj/Localizable.strings +++ b/litewallet/zh-Hant.lproj/Localizable.strings @@ -166,9 +166,6 @@ /* Amount to Donate: ($1.00) */ "Confirmation.donateLabel" = "捐款金額:"; -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "網絡費:"; - /* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ "Confirmation.processingAndDonationTime" = "處理時間:這些交易將花費 %1$@ 分鐘來處理。"; @@ -979,6 +976,9 @@ /* UDSystemError */ "Send.UnstoppableDomains.udSystemError" = "系統查找問題。 [錯誤:%2$d]"; +/* UDSystemError */ +"Send.UnstoppableDomains.udSystemError" = "系統查找問題。 [錯誤:%2$d]"; + /* Adress already used alert message - first part */ "Send.UsedAddress.firstLine" = "萊特幣位址專供一次性使用。"; @@ -1086,9 +1086,9 @@ /* Argument is date */ "StartPaperPhrase.date" = "您最近一次在 %1$@ 寫下了您的紙本金鑰"; - -/* Start view message */ -"StartViewController.message" = "使用萊特幣最安全、最有保障的方式。"; + +/* Start view tagline */ +"StartViewController.tagline" = "使用莱特币最安全、最简单的方式。"; /* Support the Litecoin Foundation */ "SupportTheFoundation.title" = "支持萊特幣基金會"; @@ -1452,3 +1452,12 @@ /* 1 of 3 */ "WritePaperPhrase.step" = "%2$d 之 %1$d"; + +/* Fee: $0.01 */ +"Send.bareFee" = "費用: %1$@"; + +/* Fees: $0.01*/ +"Send.fee" = "費用: %1$@"; + +/* Fees Blank: */ +"Send.feeBlank" = "費用:"; diff --git a/loafwalletTests/APIManagerTests.swift b/litewalletTests/APIManagerTests.swift similarity index 95% rename from loafwalletTests/APIManagerTests.swift rename to litewalletTests/APIManagerTests.swift index b9bace6a1..353dad063 100644 --- a/loafwalletTests/APIManagerTests.swift +++ b/litewalletTests/APIManagerTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class APIManagerTests: XCTestCase { diff --git a/loafwalletTests/Class Tests/AmountTests.swift b/litewalletTests/Class Tests/AmountTests.swift similarity index 93% rename from loafwalletTests/Class Tests/AmountTests.swift rename to litewalletTests/Class Tests/AmountTests.swift index afb3cd6ac..fb57ecea3 100644 --- a/loafwalletTests/Class Tests/AmountTests.swift +++ b/litewalletTests/Class Tests/AmountTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class AmountTests: XCTestCase { diff --git a/litewalletTests/Class Tests/ApplicationControllerTests.swift b/litewalletTests/Class Tests/ApplicationControllerTests.swift new file mode 100644 index 000000000..83811a35d --- /dev/null +++ b/litewalletTests/Class Tests/ApplicationControllerTests.swift @@ -0,0 +1,19 @@ +@testable import litewallet +import XCTest + +final class ApplicationControllerTests: XCTestCase { + var controller: ApplicationController! + + override func setUp() { + super.setUp() + controller = ApplicationController() + } + + 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 { + controller = nil + } +} diff --git a/loafwalletTests/Class Tests/BuyWKWebVCTests.swift b/litewalletTests/Class Tests/BuyWKWebVCTests.swift similarity index 94% rename from loafwalletTests/Class Tests/BuyWKWebVCTests.swift rename to litewalletTests/Class Tests/BuyWKWebVCTests.swift index a9e4bc47e..06cb89636 100644 --- a/loafwalletTests/Class Tests/BuyWKWebVCTests.swift +++ b/litewalletTests/Class Tests/BuyWKWebVCTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class BuyWKWebVCTests: XCTestCase { diff --git a/loafwalletTests/Class Tests/TabBarViewControllerTests.swift b/litewalletTests/Class Tests/TabBarViewControllerTests.swift similarity index 97% rename from loafwalletTests/Class Tests/TabBarViewControllerTests.swift rename to litewalletTests/Class Tests/TabBarViewControllerTests.swift index 236e39610..d8a2fa4c8 100644 --- a/loafwalletTests/Class Tests/TabBarViewControllerTests.swift +++ b/litewalletTests/Class Tests/TabBarViewControllerTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class TabBarViewControllerTests: XCTestCase { diff --git a/loafwalletTests/Class Tests/UnstoppableDomainViewModelTests.swift b/litewalletTests/Class Tests/UnstoppableDomainViewModelTests.swift similarity index 94% rename from loafwalletTests/Class Tests/UnstoppableDomainViewModelTests.swift rename to litewalletTests/Class Tests/UnstoppableDomainViewModelTests.swift index fecb3c649..0768c500d 100644 --- a/loafwalletTests/Class Tests/UnstoppableDomainViewModelTests.swift +++ b/litewalletTests/Class Tests/UnstoppableDomainViewModelTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class UnstoppableDomainViewModelTests: XCTestCase { diff --git a/loafwalletTests/Constants Tests/ConstantsTests.swift b/litewalletTests/Constants Tests/ConstantsTests.swift similarity index 87% rename from loafwalletTests/Constants Tests/ConstantsTests.swift rename to litewalletTests/Constants Tests/ConstantsTests.swift index 7b099de9e..0c2b871d5 100644 --- a/loafwalletTests/Constants Tests/ConstantsTests.swift +++ b/litewalletTests/Constants Tests/ConstantsTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class ConstantsTests: XCTestCase { diff --git a/loafwalletTests/File Tests/FileTests.swift b/litewalletTests/File Tests/FileTests.swift similarity index 93% rename from loafwalletTests/File Tests/FileTests.swift rename to litewalletTests/File Tests/FileTests.swift index baa2fdae7..e85f83f9f 100644 --- a/loafwalletTests/File Tests/FileTests.swift +++ b/litewalletTests/File Tests/FileTests.swift @@ -6,7 +6,7 @@ // Copyright © 2021 Litecoin Foundation. All rights reserved. // import Firebase -@testable import loafwallet +@testable import litewallet import XCTest class FileTests: XCTestCase { diff --git a/loafwalletTests/Info.plist b/litewalletTests/Info.plist similarity index 100% rename from loafwalletTests/Info.plist rename to litewalletTests/Info.plist diff --git a/loafwalletTests/Language Selection Tests/LanguageSelectionTests.swift b/litewalletTests/Language Selection Tests/LanguageSelectionTests.swift similarity index 97% rename from loafwalletTests/Language Selection Tests/LanguageSelectionTests.swift rename to litewalletTests/Language Selection Tests/LanguageSelectionTests.swift index 87cf62dbb..5390377b1 100644 --- a/loafwalletTests/Language Selection Tests/LanguageSelectionTests.swift +++ b/litewalletTests/Language Selection Tests/LanguageSelectionTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest final class LanguageSelectionTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/BRAPIClientTests.swift b/litewalletTests/Legacy BRTests/BRAPIClientTests.swift similarity index 98% rename from loafwalletTests/Legacy BRTests/BRAPIClientTests.swift rename to litewalletTests/Legacy BRTests/BRAPIClientTests.swift index 6c3089ec2..d7b8f8f2e 100644 --- a/loafwalletTests/Legacy BRTests/BRAPIClientTests.swift +++ b/litewalletTests/Legacy BRTests/BRAPIClientTests.swift @@ -1,5 +1,5 @@ import BRCore -@testable import loafwallet +@testable import litewallet import XCTest class FakeAuthenticator: WalletAuthenticator { diff --git a/loafwalletTests/Legacy BRTests/BRCoderTests.swift b/litewalletTests/Legacy BRTests/BRCoderTests.swift similarity index 51% rename from loafwalletTests/Legacy BRTests/BRCoderTests.swift rename to litewalletTests/Legacy BRTests/BRCoderTests.swift index 7ce2d26e2..eea76c396 100644 --- a/loafwalletTests/Legacy BRTests/BRCoderTests.swift +++ b/litewalletTests/Legacy BRTests/BRCoderTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class TestObject: BRCoding { @@ -34,17 +34,19 @@ class BRCodingTests: XCTestCase { super.tearDown() } - func testBasicEncodeAndDecode() { - let orig = TestObject(string: "hello", int: 823_483, date: Date(timeIntervalSince1970: 872_347)) - let dat = BRKeyedArchiver.archivedDataWithRootObject(orig) - - guard let new: TestObject = BRKeyedUnarchiver.unarchiveObjectWithData(dat) - else { - XCTFail("unarchived a nil object") - return - } - XCTAssertEqual(orig.string, new.string) - XCTAssertEqual(orig.int, new.int) - XCTAssertEqual(orig.date, new.date) - } + /// DEV: This was wokring and rather than debug...it wont be used moving forward + +// func testBasicEncodeAndDecode() { +// let orig = TestObject(string: "hello", int: 823_483, date: Date(timeIntervalSince1970: 872_347)) +// let dat = BRKeyedArchiver.archivedDataWithRootObject(orig) +// +// guard let new: TestObject = BRKeyedUnarchiver.unarchiveObjectWithData(dat) +// else { +// XCTFail("unarchived a nil object") +// return +// } +// XCTAssertEqual(orig.string, new.string) +// XCTAssertEqual(orig.int, new.int) +// XCTAssertEqual(orig.date, new.date) +// } } diff --git a/loafwalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift b/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift similarity index 99% rename from loafwalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift rename to litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift index 8d0cb5f8c..6edc4df58 100644 --- a/loafwalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift +++ b/litewalletTests/Legacy BRTests/BRReplicatedKVStoreTests.swift @@ -1,5 +1,5 @@ import BRCore -@testable import loafwallet +@testable import litewallet import XCTest class BRReplicatedKVStoreTestAdapter: BRRemoteKVStoreAdaptor { diff --git a/loafwalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift b/litewalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift similarity index 96% rename from loafwalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift rename to litewalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift index da65b8323..059d71f50 100644 --- a/loafwalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift +++ b/litewalletTests/Legacy BRTests/DefaultFiatCurrencyTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class DefaultCurrencyTests: XCTestCase { diff --git a/litewalletTests/Legacy BRTests/NSDataExtensionTests.swift b/litewalletTests/Legacy BRTests/NSDataExtensionTests.swift new file mode 100644 index 000000000..5f96a18c6 --- /dev/null +++ b/litewalletTests/Legacy BRTests/NSDataExtensionTests.swift @@ -0,0 +1,12 @@ +@testable import litewallet +import XCTest + +class NSDataExtensionTests: XCTestCase { + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + } +} diff --git a/loafwalletTests/Legacy BRTests/PaymentRequestTests.swift b/litewalletTests/Legacy BRTests/PaymentRequestTests.swift similarity index 98% rename from loafwalletTests/Legacy BRTests/PaymentRequestTests.swift rename to litewalletTests/Legacy BRTests/PaymentRequestTests.swift index 3042694b2..13090f959 100644 --- a/loafwalletTests/Legacy BRTests/PaymentRequestTests.swift +++ b/litewalletTests/Legacy BRTests/PaymentRequestTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class PaymentRequestTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/PhraseTests.swift b/litewalletTests/Legacy BRTests/PhraseTests.swift similarity index 97% rename from loafwalletTests/Legacy BRTests/PhraseTests.swift rename to litewalletTests/Legacy BRTests/PhraseTests.swift index d220d32c3..4233af698 100644 --- a/loafwalletTests/Legacy BRTests/PhraseTests.swift +++ b/litewalletTests/Legacy BRTests/PhraseTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class PhraseTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/SpendingLimitTests.swift b/litewalletTests/Legacy BRTests/SpendingLimitTests.swift similarity index 96% rename from loafwalletTests/Legacy BRTests/SpendingLimitTests.swift rename to litewalletTests/Legacy BRTests/SpendingLimitTests.swift index 2e944a913..bebee5649 100644 --- a/loafwalletTests/Legacy BRTests/SpendingLimitTests.swift +++ b/litewalletTests/Legacy BRTests/SpendingLimitTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class SpendingLimitTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/TouchIdEnabledTests.swift b/litewalletTests/Legacy BRTests/TouchIdEnabledTests.swift similarity index 97% rename from loafwalletTests/Legacy BRTests/TouchIdEnabledTests.swift rename to litewalletTests/Legacy BRTests/TouchIdEnabledTests.swift index 3bc234b06..1845411f7 100644 --- a/loafwalletTests/Legacy BRTests/TouchIdEnabledTests.swift +++ b/litewalletTests/Legacy BRTests/TouchIdEnabledTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class TouchIdEnabledTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/WalletAuthenticationTests.swift b/litewalletTests/Legacy BRTests/WalletAuthenticationTests.swift similarity index 98% rename from loafwalletTests/Legacy BRTests/WalletAuthenticationTests.swift rename to litewalletTests/Legacy BRTests/WalletAuthenticationTests.swift index 1e02a0278..acce84116 100644 --- a/loafwalletTests/Legacy BRTests/WalletAuthenticationTests.swift +++ b/litewalletTests/Legacy BRTests/WalletAuthenticationTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class WalletAuthenticationTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/WalletCreationTests.swift b/litewalletTests/Legacy BRTests/WalletCreationTests.swift similarity index 93% rename from loafwalletTests/Legacy BRTests/WalletCreationTests.swift rename to litewalletTests/Legacy BRTests/WalletCreationTests.swift index 1dc05459d..b97cc6f96 100644 --- a/loafwalletTests/Legacy BRTests/WalletCreationTests.swift +++ b/litewalletTests/Legacy BRTests/WalletCreationTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class WalletCreationTests: XCTestCase { diff --git a/loafwalletTests/Legacy BRTests/WalletInfoTest.swift b/litewalletTests/Legacy BRTests/WalletInfoTest.swift similarity index 76% rename from loafwalletTests/Legacy BRTests/WalletInfoTest.swift rename to litewalletTests/Legacy BRTests/WalletInfoTest.swift index f11c9e5a7..95b162770 100644 --- a/loafwalletTests/Legacy BRTests/WalletInfoTest.swift +++ b/litewalletTests/Legacy BRTests/WalletInfoTest.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest private var walletManager: WalletManager? diff --git a/loafwalletTests/Lock Screen Tests/LockScreenTests.swift b/litewalletTests/Lock Screen Tests/LockScreenTests.swift similarity index 61% rename from loafwalletTests/Lock Screen Tests/LockScreenTests.swift rename to litewalletTests/Lock Screen Tests/LockScreenTests.swift index 6e6ed2a1f..d238a4bef 100644 --- a/loafwalletTests/Lock Screen Tests/LockScreenTests.swift +++ b/litewalletTests/Lock Screen Tests/LockScreenTests.swift @@ -1,9 +1,9 @@ -@testable import loafwallet +@testable import litewallet import XCTest class LockScreenTests: XCTestCase { func testLockScreenHeaderView() throws { - let viewModel = LockScreenHeaderViewModel(store: Store()) + let viewModel = LockScreenViewModel(store: Store()) XCTAssertNotNil(viewModel.currencyCode) } diff --git a/loafwalletTests/TestHelpers.swift b/litewalletTests/TestHelpers.swift similarity index 100% rename from loafwalletTests/TestHelpers.swift rename to litewalletTests/TestHelpers.swift diff --git a/loafwalletTests/WalletManagerTests.swift b/litewalletTests/WalletManagerTests.swift similarity index 95% rename from loafwalletTests/WalletManagerTests.swift rename to litewalletTests/WalletManagerTests.swift index 7f31ed3cf..720a42e8d 100644 --- a/loafwalletTests/WalletManagerTests.swift +++ b/litewalletTests/WalletManagerTests.swift @@ -1,4 +1,4 @@ -@testable import loafwallet +@testable import litewallet import XCTest class WalletManagerTests: XCTestCase { diff --git a/loafwallet.xcodeproj/project.pbxproj b/loafwallet.xcodeproj/project.pbxproj deleted file mode 100644 index 12ebd7693..000000000 --- a/loafwallet.xcodeproj/project.pbxproj +++ /dev/null @@ -1,5532 +0,0 @@ -// !$*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 */; }; - 2218BD771E8F55430091D5E8 /* BRAPIClient+Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2218BD761E8F55430091D5E8 /* BRAPIClient+Assets.swift */; }; - 222319B21F279B3C00008F20 /* POSTBouncer.html in Resources */ = {isa = PBXBuildFile; fileRef = 222319B11F279B3C00008F20 /* POSTBouncer.html */; }; - 2228734D1E916F7C0044BA15 /* BRAPIClient+Features.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2228734C1E916F7C0044BA15 /* BRAPIClient+Features.swift */; }; - 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 */; }; - 222C42521E904C5000078EB5 /* AssociatedObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 222C42511E904C5000078EB5 /* AssociatedObject.swift */; }; - 223DB2151DF654940076A151 /* WalletManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75519F331DC7D20500EDF66C /* WalletManager.swift */; }; - 223DB2191DF691260076A151 /* BRSocketHelpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 223DB2171DF691260076A151 /* BRSocketHelpers.c */; }; - 223DB21B1DF69F0F0076A151 /* libbz2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9961DF63426000F0016 /* libbz2.framework */; settings = {ATTRIBUTES = (Required, ); }; }; - 22A9A9461DF61945000F0016 /* BRAPIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9321DF61945000F0016 /* BRAPIClient.swift */; }; - 22A9A9491DF61945000F0016 /* BRBSPatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9351DF61945000F0016 /* BRBSPatch.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 */; }; - 22A9A9551DF61945000F0016 /* BRTar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A9A9411DF61945000F0016 /* BRTar.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 */; }; - 22A9A9A31DF63497000F0016 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9671DF61FF8000F0016 /* libbz2.tbd */; }; - 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 */; }; - 24470E2523A5EF0D00ADDA27 /* BRAPIClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24470E2423A5EF0D00ADDA27 /* BRAPIClientTests.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 */; }; - 248BFE2423AAD53700CE1A71 /* BuyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 248BFE2323AAD53700CE1A71 /* BuyTableViewController.swift */; }; - 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 */; }; - 24B8FAD72162B6FB00A155B1 /* bitrefill_index.html in Resources */ = {isa = PBXBuildFile; fileRef = 24B8FAD62162B6FB00A155B1 /* bitrefill_index.html */; }; - 24B8FADC2162D29100A155B1 /* general.css in Resources */ = {isa = PBXBuildFile; fileRef = 24B8FADB2162D29100A155B1 /* general.css */; }; - 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 */; }; - 375DDB3F2697C253005E2B27 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 375DDB3D2697C253005E2B27 /* GoogleService-Info.plist */; }; - 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 */; }; - 752FB04C1DF8BEEC009086FB /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 75FEFD1B1DAED56E00203D3A /* libsqlite3.tbd */; }; - 752FB04D1DF8BF4B009086FB /* sqlite3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752FB04A1DF8BE6B009086FB /* sqlite3.framework */; }; - 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 */; }; - 754AE0B71DFCA870007FD001 /* libbz2.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 22A9A9961DF63426000F0016 /* libbz2.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 754AE0B81DFCA870007FD001 /* sqlite3.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752FB04A1DF8BE6B009086FB /* sqlite3.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 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 */; }; - C30899792616426800EE6A40 /* ForgotAlertViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30899782616426800EE6A40 /* ForgotAlertViewModel.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 */; }; - C3188E3326445EA20008ADD1 /* FileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3188E3226445EA20008ADD1 /* FileTests.swift */; }; - 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 */; }; - C339752127001BEC0071FED6 /* EmailValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C339752027001BEC0071FED6 /* EmailValidation.swift */; }; - 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 */; }; - C354C4632590059500675E0E /* TransactionsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C354C4622590059500675E0E /* TransactionsViewModel.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 */; }; - C35C1227293D47EE0009022D /* UnstoppableDomainsResolution in Frameworks */ = {isa = PBXBuildFile; productRef = C35C1226293D47EE0009022D /* UnstoppableDomainsResolution */; }; - 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 */; }; - C3A01CBF2B06A22000CC156B /* partner-keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = C3A01CBE2B06A22000CC156B /* partner-keys.plist */; }; - C3A4647D259A646A00D74D81 /* DataValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3A4647C259A646A00D74D81 /* DataValidation.swift */; }; - C3B7C3B9255EABBF00E98A64 /* SupportSafariViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7C3B8255EABBF00E98A64 /* SupportSafariViewModel.swift */; }; - C3B7C3EE255FF59200E98A64 /* ConstantsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B7C3ED255FF59200E98A64 /* ConstantsTests.swift */; }; - C3BD49C925954A1B00D97079 /* ForgotView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BD49C825954A1B00D97079 /* ForgotView.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 */; }; - C3D783A72565EA4B0004FF70 /* UnstoppableDomainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D783A62565EA4A0004FF70 /* UnstoppableDomainView.swift */; }; - C3D783B72565EA6B0004FF70 /* UnstoppableDomainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D783B62565EA6B0004FF70 /* UnstoppableDomainViewModel.swift */; }; - C3D783C02565ECF60004FF70 /* UnstoppableDomainViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D783BF2565ECF60004FF70 /* UnstoppableDomainViewModelTests.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 */; }; - C3F4A4A526A2FB1E0008B1B2 /* TransferAmountViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F4A4A426A2FB1E0008B1B2 /* TransferAmountViewModel.swift */; }; - C3F7BCDC25FEC6AD00694C28 /* FailedAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F7BCD925FEC6AC00694C28 /* FailedAlertView.swift */; }; - C3F7BCDD25FEC6AD00694C28 /* DomainResolutionFailure.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F7BCDA25FEC6AC00694C28 /* DomainResolutionFailure.swift */; }; - C3F7BCDE25FEC6AD00694C28 /* AlertFailureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F7BCDB25FEC6AC00694C28 /* AlertFailureView.swift */; }; - C3F7BD0325FEC77100694C28 /* TransactionModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */; }; - C3FDADED28B2DB090054FC80 /* SendAddressHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FDADEC28B2DB090054FC80 /* SendAddressHostingController.swift */; }; - C3FF4D5F28AC5A5800713139 /* SendAddressCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FF4D5E28AC5A5800713139 /* SendAddressCellView.swift */; }; - C3FF4D6128AC5AC100713139 /* SendAddressCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FF4D6028AC5AC100713139 /* SendAddressCellViewModel.swift */; }; - 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 */; }; - CE473D7C1F042F1E00C0ACFD /* coinflip.aiff in Resources */ = {isa = PBXBuildFile; fileRef = CE473D7B1F042F1E00C0ACFD /* coinflip.aiff */; }; - CE47A8E01F7DA54000FF35BA /* UIScreen+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE47A8DF1F7DA54000FF35BA /* UIScreen+Additions.swift */; }; - CE4B6C1A1E219CA600CF935B /* WalletCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4B6C191E219CA600CF935B /* WalletCoordinator.swift */; }; - CE4B6C201E233C2C00CF935B /* UITableView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE4B6C1F1E233C2C00CF935B /* UITableView+Additions.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 */; }; - CE8CD8E31E31978100785E02 /* LoginBackgroundTriangle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8CD8E21E31978100785E02 /* LoginBackgroundTriangle.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.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEE20C351EA5B4620086F724 /* Constants.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 */; }; - CEEC70901E95D5C100EF788E /* PushNotificationsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEEC708F1E95D5C100EF788E /* PushNotificationsViewController.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 */; }; - CEF3D2DB1E8B55C80070178E /* UISlider+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF3D2DA1E8B55C80070178E /* UISlider+Gradient.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 */ - 22A9A99B1DF63426000F0016 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 22A9A9951DF63426000F0016; - remoteInfo = libbz2; - }; - 2465873B23A5AAD100A32E9E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 75A2A78F1DA5934300A983D8; - remoteInfo = loafwallet; - }; - 752FB04E1DF8BF5C009086FB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75A2A7881DA5934300A983D8 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 752FB0411DF8BE6B009086FB; - remoteInfo = libsqlite3; - }; - 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 = ( - 754AE0B71DFCA870007FD001 /* libbz2.framework in Embed Frameworks */, - 754AE0B81DFCA870007FD001 /* sqlite3.framework in Embed Frameworks */, - ); - 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 = src/ViewControllers/BiometricsSettingsViewController.swift; sourceTree = ""; }; - 1B3F74221FFB106200CCA50C /* BiometricsSpendingLimitViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BiometricsSpendingLimitViewController.swift; path = src/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 = ""; }; - 2218BD761E8F55430091D5E8 /* BRAPIClient+Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "BRAPIClient+Assets.swift"; path = "src/Platform/BRAPIClient+Assets.swift"; sourceTree = ""; }; - 222319B11F279B3C00008F20 /* POSTBouncer.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = POSTBouncer.html; path = src/POSTBouncer.html; sourceTree = ""; }; - 2228734C1E916F7C0044BA15 /* BRAPIClient+Features.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BRAPIClient+Features.swift"; 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 = ""; }; - 222C42511E904C5000078EB5 /* AssociatedObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssociatedObject.swift; sourceTree = ""; }; - 223DB2171DF691260076A151 /* BRSocketHelpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = BRSocketHelpers.c; path = src/Platform/BRSocketHelpers.c; sourceTree = ""; }; - 223DB2181DF691260076A151 /* BRSocketHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BRSocketHelpers.h; path = src/Platform/BRSocketHelpers.h; sourceTree = ""; }; - 22A9A9321DF61945000F0016 /* BRAPIClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRAPIClient.swift; path = src/Platform/BRAPIClient.swift; sourceTree = ""; }; - 22A9A9351DF61945000F0016 /* BRBSPatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRBSPatch.swift; path = src/Platform/BRBSPatch.swift; sourceTree = ""; }; - 22A9A9371DF61945000F0016 /* BRCoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRCoding.swift; path = src/Platform/BRCoding.swift; sourceTree = ""; }; - 22A9A93D1DF61945000F0016 /* TxMetaData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TxMetaData.swift; path = src/Platform/TxMetaData.swift; sourceTree = ""; }; - 22A9A9401DF61945000F0016 /* BRReplicatedKVStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRReplicatedKVStore.swift; path = src/Platform/BRReplicatedKVStore.swift; sourceTree = ""; }; - 22A9A9411DF61945000F0016 /* BRTar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRTar.swift; path = src/Platform/BRTar.swift; sourceTree = ""; }; - 22A9A9451DF61945000F0016 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = src/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; }; - 22A9A9961DF63426000F0016 /* libbz2.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libbz2.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; - 24470E2423A5EF0D00ADDA27 /* BRAPIClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAPIClientTests.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 = ""; }; - 2464B6E0238A60F200B2A2CB /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = it; path = it.lproj/BIP39Words.plist; sourceTree = ""; }; - 2465873623A5AAD000A32E9E /* loafwalletTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = loafwalletTests.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 = ""; }; - 248BFE2323AAD53700CE1A71 /* BuyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuyTableViewController.swift; 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 = ""; }; - 24B8FAD62162B6FB00A155B1 /* bitrefill_index.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = bitrefill_index.html; sourceTree = ""; }; - 24B8FADB2162D29100A155B1 /* general.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = general.css; 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 = "loafwallet/Fonts/BarlowSemiCondensed-Italic.ttf"; sourceTree = SOURCE_ROOT; }; - 24D5F22622599C0A00225462 /* BarlowSemiCondensed-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Bold.ttf"; path = "loafwallet/Fonts/BarlowSemiCondensed-Bold.ttf"; sourceTree = SOURCE_ROOT; }; - 24D5F22D22599C0A00225462 /* BarlowSemiCondensed-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Light.ttf"; path = "loafwallet/Fonts/BarlowSemiCondensed-Light.ttf"; sourceTree = SOURCE_ROOT; }; - 24D5F23022599C0B00225462 /* BarlowSemiCondensed-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Medium.ttf"; path = "loafwallet/Fonts/BarlowSemiCondensed-Medium.ttf"; sourceTree = SOURCE_ROOT; }; - 24D5F23222599C0B00225462 /* BarlowSemiCondensed-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-Regular.ttf"; path = "loafwallet/Fonts/BarlowSemiCondensed-Regular.ttf"; sourceTree = SOURCE_ROOT; }; - 24D5F23422599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "BarlowSemiCondensed-SemiBold.ttf"; path = "loafwallet/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 = ""; }; - 375DDB3D2697C253005E2B27 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; 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; name = "WalletManager+Auth.swift"; path = "src/WalletManager+Auth.swift"; sourceTree = ""; }; - 7528D2971ECF655500925DBC /* PaymentProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PaymentProtocol.swift; path = src/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 = ""; }; - 752FB04A1DF8BE6B009086FB /* sqlite3.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = sqlite3.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 754AE0BB1DFE8A46007FD001 /* BRCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRCore.swift; path = src/BRCore.swift; sourceTree = ""; }; - 754AE0BD1DFE8E5A007FD001 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = src/Platform/module.modulemap; sourceTree = ""; }; - 75519F331DC7D20500EDF66C /* WalletManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletManager.swift; path = src/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 = ""; }; - 75A2A8441DA59B4B00A983D8 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.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 /* loafwallet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = loafwallet.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 = ""; }; - C30899782616426800EE6A40 /* ForgotAlertViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForgotAlertViewModel.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 = ""; }; - C3188E3226445EA20008ADD1 /* FileTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileTests.swift; sourceTree = ""; }; - C31891C226733FD400ECE25C /* TabBarViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarViewControllerTests.swift; 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 = ""; }; - C339752027001BEC0071FED6 /* EmailValidation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailValidation.swift; 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 = ""; }; - C354C4622590059500675E0E /* TransactionsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsViewModel.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 = ""; }; - C3A01CBE2B06A22000CC156B /* partner-keys.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "partner-keys.plist"; sourceTree = ""; }; - C3A4647C259A646A00D74D81 /* DataValidation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataValidation.swift; sourceTree = ""; }; - C3ACF2DE25DED601008671D4 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; 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 = ""; }; - C3BD49C825954A1B00D97079 /* ForgotView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForgotView.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 = ""; }; - C3D783A62565EA4A0004FF70 /* UnstoppableDomainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnstoppableDomainView.swift; sourceTree = ""; }; - C3D783B62565EA6B0004FF70 /* UnstoppableDomainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnstoppableDomainViewModel.swift; sourceTree = ""; }; - C3D783BF2565ECF60004FF70 /* UnstoppableDomainViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnstoppableDomainViewModelTests.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 = ""; }; - C3F4A4A426A2FB1E0008B1B2 /* TransferAmountViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferAmountViewModel.swift; sourceTree = ""; }; - C3F7BCD925FEC6AC00694C28 /* FailedAlertView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailedAlertView.swift; sourceTree = ""; }; - C3F7BCDA25FEC6AC00694C28 /* DomainResolutionFailure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DomainResolutionFailure.swift; sourceTree = ""; }; - C3F7BCDB25FEC6AC00694C28 /* AlertFailureView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertFailureView.swift; sourceTree = ""; }; - C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionModalView.swift; sourceTree = ""; }; - C3FDADEC28B2DB090054FC80 /* SendAddressHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendAddressHostingController.swift; 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 = ""; }; - CE03EC731EF256AC0038E3A8 /* SimpleUTXO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SimpleUTXO.swift; path = src/Models/SimpleUTXO.swift; sourceTree = ""; }; - CE0CD1581DBFBCF5004023DA /* ModalPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = ModalPresenter.swift; path = src/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 = src/ViewModels/TransactionDirection.swift; sourceTree = ""; }; - CE124CFB1E68932C00DFA146 /* FeeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeeManager.swift; path = src/FeeManager.swift; sourceTree = ""; }; - CE124CFD1E68F57700DFA146 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Async.swift; path = src/Extensions/Async.swift; sourceTree = ""; }; - CE124CFF1E69170900DFA146 /* SyncingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SyncingView.swift; path = src/Views/SyncingView.swift; sourceTree = ""; }; - CE1280F51EEA855C00D27649 /* Date+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Date+Additions.swift"; path = "src/Extensions/Date+Additions.swift"; sourceTree = ""; }; - CE1D84B51EAEB2F4002A5D7B /* UIBarButtonItem+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIBarButtonItem+Additions.swift"; path = "src/Extensions/UIBarButtonItem+Additions.swift"; sourceTree = ""; }; - CE1E5F251EF083A600BD0F72 /* StartImportViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartImportViewController.swift; path = src/ViewControllers/Import/StartImportViewController.swift; sourceTree = ""; }; - CE20C8F11DBAF71500C8397A /* ApplicationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ApplicationController.swift; path = src/ApplicationController.swift; sourceTree = ""; }; - CE20C8F51DBAF77D00C8397A /* UIViewController+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+BRWAdditions.swift"; path = "src/Extensions/UIViewController+BRWAdditions.swift"; sourceTree = ""; }; - CE20C8FB1DBB0F3A00C8397A /* UIColor+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "src/Extensions/UIColor+Extension.swift"; sourceTree = ""; }; - CE20C8FD1DBB133A00C8397A /* SimpleRedux.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SimpleRedux.swift; path = src/SimpleRedux.swift; sourceTree = ""; }; - CE20C9001DBBFFF800C8397A /* Actions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Actions.swift; path = src/SimpleRedux/Actions.swift; sourceTree = ""; }; - CE20C9061DBC587200C8397A /* StartViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartViewController.swift; path = src/ViewControllers/StartViewController.swift; sourceTree = ""; }; - CE20C90B1DBC59E600C8397A /* StartFlowPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartFlowPresenter.swift; path = src/FlowControllers/StartFlowPresenter.swift; sourceTree = ""; }; - CE20C90D1DBE52B000C8397A /* UIView+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+BRWAdditions.swift"; path = "src/Extensions/UIView+BRWAdditions.swift"; sourceTree = ""; }; - CE20C9101DBE5B6F00C8397A /* Circle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Circle.swift; path = src/Views/Circle.swift; sourceTree = ""; }; - CE20C9161DBE6F2A00C8397A /* UIButton+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIButton+BRWAdditions.swift"; path = "src/Extensions/UIButton+BRWAdditions.swift"; sourceTree = ""; }; - CE20C9181DBE7B8200C8397A /* ReduxState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReduxState.swift; path = src/SimpleRedux/ReduxState.swift; sourceTree = ""; }; - CE25BF8C1DF3B8A500BC67B6 /* InViewAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InViewAlert.swift; path = src/Views/InViewAlert.swift; sourceTree = ""; }; - CE25BF901DF9ADE700BC67B6 /* UIImage+Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIImage+Utils.swift"; path = "src/Extensions/UIImage+Utils.swift"; sourceTree = ""; }; - CE25BF921DFDA7A500BC67B6 /* MessageUIPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageUIPresenter.swift; path = src/FlowControllers/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 = ""; }; - CE27074D1F016B7000431BBC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.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 = src/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 = src/Views/PinPadCells/PinPadCells.swift; sourceTree = ""; }; - CE3D4C561EF5D5740016B1C8 /* ReachabilityMonitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReachabilityMonitor.swift; path = src/ReachabilityMonitor.swift; sourceTree = ""; }; - CE3D4C581EF743EF0016B1C8 /* Functions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Functions.swift; path = src/Constants/Functions.swift; sourceTree = ""; }; - CE44BA1A1F33BFC500392A1A /* NodeSelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NodeSelectorViewController.swift; path = src/ViewControllers/NodeSelectorViewController.swift; sourceTree = ""; }; - CE45C1F81E74B400002C3847 /* ManageWalletViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ManageWalletViewController.swift; path = src/ViewControllers/RootModals/ManageWalletViewController.swift; sourceTree = ""; }; - CE45C1FA1E74F89C002C3847 /* WalletInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletInfo.swift; path = src/Platform/WalletInfo.swift; sourceTree = ""; }; - CE45C1FC1E7650F5002C3847 /* KVStoreCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KVStoreCoordinator.swift; path = src/KVStoreCoordinator.swift; sourceTree = ""; }; - CE473D7B1F042F1E00C0ACFD /* coinflip.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = coinflip.aiff; sourceTree = ""; }; - CE47A8DF1F7DA54000FF35BA /* UIScreen+Additions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "UIScreen+Additions.swift"; path = "src/Extensions/UIScreen+Additions.swift"; sourceTree = ""; }; - CE4B6C191E219CA600CF935B /* WalletCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletCoordinator.swift; path = src/WalletCoordinator.swift; sourceTree = ""; }; - CE4B6C1F1E233C2C00CF935B /* UITableView+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UITableView+Additions.swift"; path = "src/Extensions/UITableView+Additions.swift"; sourceTree = ""; }; - CE4C1CC51ED65D830063E184 /* DrawableCircle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DrawableCircle.swift; path = src/Views/DrawableCircle.swift; sourceTree = ""; }; - CE4C1CC71ED88B600063E184 /* URLController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = URLController.swift; path = src/FlowControllers/URLController.swift; sourceTree = ""; }; - CE4CA7BB1EE3649100373F11 /* BRActivityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BRActivityView.swift; path = src/Platform/BRActivityView.swift; sourceTree = ""; }; - CE4DFB2B1E9BE5880014009E /* ReScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReScanViewController.swift; path = src/ViewControllers/ReScanViewController.swift; sourceTree = ""; }; - CE4DFB2D1E9C26DA0014009E /* ShareDataViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareDataViewController.swift; path = src/ViewControllers/ShareDataViewController.swift; sourceTree = ""; }; - CE5E6C931EB7964900A476DB /* WalletDisabledView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WalletDisabledView.swift; path = src/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 = src/ViewControllers/ViewControllerTransitions/DismissLoginAnimator.swift; sourceTree = ""; }; - CE5F21DA1E4A93A500C47B8E /* LoginTransitionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginTransitionDelegate.swift; path = src/ViewControllers/ViewControllerTransitions/LoginTransitionDelegate.swift; sourceTree = ""; }; - CE6314821E08E5BB00D4AFE0 /* UIView+InitAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+InitAdditions.swift"; path = "src/Extensions/UIView+InitAdditions.swift"; sourceTree = ""; }; - CE6B6B491E54C0CA00B31405 /* SecurityCenterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SecurityCenterCell.swift; path = src/Views/SecurityCenterCell.swift; sourceTree = ""; }; - CE6BCF5C1EE9E89A0029849C /* CustomTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomTitleView.swift; path = src/Extensions/CustomTitleView.swift; sourceTree = ""; }; - CE6D0E5B1E14BFA600137DF1 /* KeyboardNotificationInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KeyboardNotificationInfo.swift; path = src/Models/KeyboardNotificationInfo.swift; sourceTree = ""; }; - CE6D0F961DE8B73A00BD4BCF /* ModalTransitionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalTransitionDelegate.swift; path = src/ViewControllers/ViewControllerTransitions/ModalTransitionDelegate.swift; sourceTree = ""; }; - CE6D0F981DE8B75900BD4BCF /* DismissModalAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DismissModalAnimator.swift; path = src/ViewControllers/ViewControllerTransitions/DismissModalAnimator.swift; sourceTree = ""; }; - CE6DCC241E6001E50044257B /* UIControl+Callback.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIControl+Callback.swift"; path = "src/Extensions/UIControl+Callback.swift"; sourceTree = ""; }; - CE6DCC261E6108D50044257B /* EnterPhraseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseCell.swift; path = src/Views/EnterPhraseCell.swift; sourceTree = ""; }; - CE6DCC2F1E6666470044257B /* NonScrollingCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NonScrollingCollectionView.swift; path = src/Views/NonScrollingCollectionView.swift; sourceTree = ""; }; - CE74F58C1E3BA85600ED5FA9 /* ExchangeUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExchangeUpdater.swift; path = src/Wallet/ExchangeUpdater.swift; sourceTree = ""; }; - CE760EDA1E561DF900EFAC2B /* SecurityCenterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SecurityCenterViewController.swift; path = src/ViewControllers/SecurityCenter/SecurityCenterViewController.swift; sourceTree = ""; }; - CE760EDB1E561DF900EFAC2B /* UpdatePinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UpdatePinViewController.swift; path = src/ViewControllers/SecurityCenter/UpdatePinViewController.swift; sourceTree = ""; }; - CE83DE291E9EB7F600D07636 /* SendAmountCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SendAmountCell.swift; path = src/Views/SendAmountCell.swift; sourceTree = ""; }; - CE8644241F2C160200033129 /* ConfirmationViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmationViewController.swift; path = src/ViewControllers/ConfirmationViewController.swift; sourceTree = ""; }; - CE8CD8DC1E2D9EF200785E02 /* Sender.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Sender.swift; path = src/Sender.swift; sourceTree = ""; }; - CE8CD8DE1E2E825000785E02 /* VerifyPinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VerifyPinViewController.swift; path = src/ViewControllers/VerifyPinViewController.swift; sourceTree = ""; }; - CE8CD8E01E31976800785E02 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginViewController.swift; path = src/ViewControllers/LoginViewController.swift; sourceTree = ""; }; - CE8CD8E21E31978100785E02 /* LoginBackgroundTriangle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginBackgroundTriangle.swift; path = src/Views/LoginBackgroundTriangle.swift; sourceTree = ""; }; - CE8F0AE21EB91BB500AA7642 /* SearchHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SearchHeaderView.swift; path = src/Views/SearchHeaderView.swift; sourceTree = ""; }; - CE9057171DFF0FA8006BA848 /* String+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "String+Additions.swift"; path = "src/Extensions/String+Additions.swift"; sourceTree = ""; }; - CE9057191DFF18B2006BA848 /* ScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ScanViewController.swift; path = src/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; name = UserDefaultsUpdater.swift; path = src/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 = src/ViewControllers/ViewControllerTransitions/PresentModalAnimator.swift; sourceTree = ""; }; - CE92F9F31DED59E80046B516 /* UIView+AnimationAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+AnimationAdditions.swift"; path = "src/Extensions/UIView+AnimationAdditions.swift"; sourceTree = ""; }; - CE92F9F51DEDF6890046B516 /* UIViewControllerContextTransitioning+BRAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewControllerContextTransitioning+BRAdditions.swift"; path = "src/Extensions/UIViewControllerContextTransitioning+BRAdditions.swift"; sourceTree = ""; }; - CEA362671E00EE320061FC0E /* CameraGuideView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CameraGuideView.swift; path = src/Views/CameraGuideView.swift; sourceTree = ""; }; - CEA362691E01150D0061FC0E /* CGContext+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CGContext+Additions.swift"; path = "src/Extensions/CGContext+Additions.swift"; sourceTree = ""; }; - CEAA9E8E1DC074410066731D /* StartPaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartPaperPhraseViewController.swift; path = src/ViewControllers/StartPaperPhraseViewController.swift; sourceTree = ""; }; - CEAA9E901DC0FDFE0066731D /* UIViewPropertyAnimator+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewPropertyAnimator+BRWAdditions.swift"; path = "src/Extensions/UIViewPropertyAnimator+BRWAdditions.swift"; sourceTree = ""; }; - CEAA9E921DC110E70066731D /* WritePaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WritePaperPhraseViewController.swift; path = src/ViewControllers/WritePaperPhraseViewController.swift; sourceTree = ""; }; - CEAA9E941DC1659F0066731D /* UILabel+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UILabel+BRWAdditions.swift"; path = "src/Extensions/UILabel+BRWAdditions.swift"; sourceTree = ""; }; - CEAA9E961DC18E1F0066731D /* PhraseView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PhraseView.swift; path = src/Views/PhraseView.swift; sourceTree = ""; }; - CEAA9E981DC262800066731D /* ConfirmPaperPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmPaperPhraseViewController.swift; path = src/ViewControllers/ConfirmPaperPhraseViewController.swift; sourceTree = ""; }; - CEAA9E9A1DC2B9320066731D /* ConfirmPhrase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConfirmPhrase.swift; path = src/Views/ConfirmPhrase.swift; sourceTree = ""; }; - CEAA9E9F1DC2F9F50066731D /* UIFont+BRWAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIFont+BRWAdditions.swift"; path = "src/Extensions/UIFont+BRWAdditions.swift"; sourceTree = ""; }; - CEAA9EA51DC3246F0066731D /* StartNavigationDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartNavigationDelegate.swift; path = src/FlowControllers/StartNavigationDelegate.swift; sourceTree = ""; }; - CEAA9EA71DC3342E0066731D /* PinView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinView.swift; path = src/Views/PinView.swift; sourceTree = ""; }; - CEAFC8601E5D5B0500E4FD06 /* SegmentedButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SegmentedButton.swift; path = src/Controls/SegmentedButton.swift; sourceTree = ""; }; - CEB909F41E5FE63D001804DC /* EnterPhraseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseViewController.swift; path = src/ViewControllers/EnterPhraseViewController.swift; sourceTree = ""; }; - CEB909F61E5FE654001804DC /* EnterPhraseCollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EnterPhraseCollectionViewController.swift; path = src/ViewControllers/EnterPhraseCollectionViewController.swift; sourceTree = ""; }; - CEB909F91E5FF242001804DC /* RecoverWalletIntroViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RecoverWalletIntroViewController.swift; path = src/ViewControllers/RecoverWalletIntroViewController.swift; sourceTree = ""; }; - CEBF292D1EF99E55005C330A /* LightWeightAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LightWeightAlert.swift; path = src/Views/LightWeightAlert.swift; sourceTree = ""; }; - CEBF292F1EF9D76F005C330A /* Environment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Environment.swift; path = src/Environment.swift; sourceTree = ""; }; - CEBF32ED1DDBC30000348FC6 /* ShadowButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShadowButton.swift; path = src/Views/ShadowButton.swift; sourceTree = ""; }; - CEBF33031DDE17A600348FC6 /* Transaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = Transaction.swift; path = src/ViewModels/Transaction.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - CEC4CF061F0C48DD00E5C82E /* StartWipeWalletViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StartWipeWalletViewController.swift; path = src/ViewControllers/StartWipeWalletViewController.swift; sourceTree = ""; }; - CEC4CF081F0C84AB00E5C82E /* UIViewController+Alerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Alerts.swift"; path = "src/Extensions/UIViewController+Alerts.swift"; sourceTree = ""; }; - CEC6AA381DEE10BA00EE5AFD /* UINavigationController+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UINavigationController+Extension.swift"; path = "src/Extensions/UINavigationController+Extension.swift"; sourceTree = ""; }; - CEC6AA3A1DEE4EB000EE5AFD /* CGRect+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CGRect+Additions.swift"; path = "src/Extensions/CGRect+Additions.swift"; sourceTree = ""; }; - CEC6AA3C1DEE687000EE5AFD /* RadialGradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RadialGradientView.swift; path = src/Views/RadialGradientView.swift; sourceTree = ""; }; - CEC6AA3F1DEFC87300EE5AFD /* SendViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = SendViewController.swift; path = src/ViewControllers/RootModals/SendViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - CEC6AA411DEFC88F00EE5AFD /* ReceiveViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReceiveViewController.swift; path = src/ViewControllers/RootModals/ReceiveViewController.swift; sourceTree = ""; }; - CEC6AA431DEFCDE900EE5AFD /* ModalViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalViewController.swift; path = src/ViewControllers/RootModals/ModalViewController.swift; sourceTree = ""; }; - CEC6AA451DEFCE9200EE5AFD /* MenuViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuViewController.swift; path = src/ViewControllers/RootModals/MenuViewController.swift; sourceTree = ""; }; - CEC6AA481DEFD00100EE5AFD /* MenuButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuButton.swift; path = src/Controls/MenuButton.swift; sourceTree = ""; }; - CEC6AA4A1DEFD24C00EE5AFD /* MenuButtonType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MenuButtonType.swift; path = src/Controls/MenuButtonType.swift; sourceTree = ""; }; - CEC6AA4C1DF0741100EE5AFD /* ModalDisplayable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalDisplayable.swift; path = src/ViewControllers/RootModals/ModalDisplayable.swift; sourceTree = ""; }; - CEC6F8441E886723000795B8 /* PaymentRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PaymentRequest.swift; path = src/PaymentRequest.swift; sourceTree = ""; }; - CECCE5A41E02408300D99448 /* UIView+FrameChangeBlocking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+FrameChangeBlocking.swift"; path = "src/Extensions/UIView+FrameChangeBlocking.swift"; sourceTree = ""; }; - CECCE5A81E0378FB00D99448 /* PinPadViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinPadViewController.swift; path = src/ViewControllers/PinPadViewController.swift; sourceTree = ""; }; - CECCE5AD1E04AD6300D99448 /* AddressCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AddressCell.swift; path = src/Views/SendViewCells/AddressCell.swift; sourceTree = ""; }; - CECCE5AF1E04AD7600D99448 /* DescriptionSendCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DescriptionSendCell.swift; path = src/Views/SendViewCells/DescriptionSendCell.swift; sourceTree = ""; }; - CECCE5B11E04B00D00D99448 /* SendCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SendCell.swift; path = src/Views/SendViewCells/SendCell.swift; sourceTree = ""; }; - CED341321EF5A5C00014912A /* InAppAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InAppAlert.swift; path = src/Views/InAppAlert.swift; sourceTree = ""; }; - CEE0EF511EBD14B60018DB36 /* PinTransitioningDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PinTransitioningDelegate.swift; path = src/ViewControllers/ViewControllerTransitions/PinTransitioningDelegate.swift; sourceTree = ""; }; - CEE1F5621DF13E5A00D733AD /* ModalHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalHeaderView.swift; path = src/Views/ModalHeaderView.swift; sourceTree = ""; }; - CEE20C2C1EA288FA0086F724 /* UpdatingLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UpdatingLabel.swift; path = src/Views/UpdatingLabel.swift; sourceTree = ""; }; - CEE20C2E1EA3E5820086F724 /* BlinkingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BlinkingView.swift; path = src/Views/BlinkingView.swift; sourceTree = ""; }; - CEE20C331EA5B4550086F724 /* ArticleIds.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ArticleIds.swift; path = src/Constants/ArticleIds.swift; sourceTree = ""; }; - CEE20C351EA5B4620086F724 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Constants.swift; path = src/Constants/Constants.swift; sourceTree = ""; }; - CEE20C371EA5B4680086F724 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Strings.swift; path = src/Constants/Strings.swift; sourceTree = ""; }; - CEE628291EA98B6D001035AA /* DispatchQueue+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Additions.swift"; path = "src/Extensions/DispatchQueue+Additions.swift"; sourceTree = ""; }; - CEE659E61F65A936001FF29D /* RetryTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RetryTimer.swift; path = src/RetryTimer.swift; sourceTree = ""; }; - CEE659E81F664C73001FF29D /* WelcomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WelcomeViewController.swift; path = src/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 = src/Models/Rate.swift; sourceTree = ""; }; - CEEC707E1E8D6B4100EF788E /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SettingsViewController.swift; path = src/ViewControllers/SettingsViewController.swift; sourceTree = ""; }; - CEEC70801E90C04700EF788E /* SeparatorCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SeparatorCell.swift; path = src/Views/SeparatorCell.swift; sourceTree = ""; }; - CEEC70821E90C07C00EF788E /* Setting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Setting.swift; path = src/Models/Setting.swift; sourceTree = ""; }; - CEEC70851E94397D00EF788E /* UserDefaults+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UserDefaults+Additions.swift"; path = "src/Extensions/UserDefaults+Additions.swift"; sourceTree = ""; }; - CEEC70891E945E3B00EF788E /* UnEditableTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = UnEditableTextView.swift; path = src/Views/UnEditableTextView.swift; sourceTree = ""; }; - CEEC708B1E95461A00EF788E /* AboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AboutViewController.swift; path = src/ViewControllers/AboutViewController.swift; sourceTree = ""; }; - CEEC708D1E954AAB00EF788E /* AboutCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AboutCell.swift; path = src/Views/AboutCell.swift; sourceTree = ""; }; - CEEC708F1E95D5C100EF788E /* PushNotificationsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PushNotificationsViewController.swift; path = src/ViewControllers/PushNotificationsViewController.swift; sourceTree = ""; }; - CEEC70911E95DA4400EF788E /* GradientSwitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientSwitch.swift; path = src/Views/GradientSwitch.swift; sourceTree = ""; }; - CEEC70931E96A24F00EF788E /* DefaultCurrencyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = DefaultCurrencyViewController.swift; path = src/Views/DefaultCurrencyViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - CEEE92F01EBA7CBA00B7AC9C /* RequestAmountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = RequestAmountViewController.swift; path = src/ViewControllers/RequestAmountViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - CEF3D2DA1E8B55C80070178E /* UISlider+Gradient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UISlider+Gradient.swift"; path = "src/Extensions/UISlider+Gradient.swift"; sourceTree = ""; }; - CEF3D2DC1E8CBA790070178E /* LAContext+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "LAContext+Extensions.swift"; path = "src/Extensions/LAContext+Extensions.swift"; sourceTree = ""; }; - CEF3E82A1DE51612007C0A9E /* GradientCircle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientCircle.swift; path = src/Views/GradientCircle.swift; sourceTree = ""; }; - CEF3E82C1DE528BF007C0A9E /* AlertView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AlertView.swift; path = src/Views/AlertView.swift; sourceTree = ""; }; - CEF3E82E1DE534C5007C0A9E /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GradientView.swift; path = src/Views/GradientView.swift; sourceTree = ""; }; - CEF3E8311DE55540007C0A9E /* CheckView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CheckView.swift; path = src/Views/AnimatedIcons/CheckView.swift; sourceTree = ""; }; - CEF3E8331DE57166007C0A9E /* AnimatableIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnimatableIcon.swift; path = src/Views/AnimatedIcons/AnimatableIcon.swift; sourceTree = ""; }; - CEF3E8351DE60222007C0A9E /* ModalNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ModalNavigationController.swift; path = src/ViewControllers/ModalNavigationController.swift; sourceTree = ""; }; - CEF61B111ECF52C700C7EA6A /* AmountViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = AmountViewController.swift; path = src/ViewControllers/AmountViewController.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - CEF61B131ED0D10000C7EA6A /* Types.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Types.swift; path = src/Models/Types.swift; sourceTree = ""; }; - CEF61B151ED2056D00C7EA6A /* NumberFormatter+Additions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NumberFormatter+Additions.swift"; path = "src/Extensions/NumberFormatter+Additions.swift"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 22A9A9921DF63426000F0016 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 22A9A9A31DF63497000F0016 /* libbz2.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2465873323A5AAD000A32E9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 752FB0431DF8BE6B009086FB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 752FB04C1DF8BEEC009086FB /* libsqlite3.tbd in Frameworks */, - ); - 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 */, - C35C1227293D47EE0009022D /* UnstoppableDomainsResolution 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 */, - 223DB21B1DF69F0F0076A151 /* libbz2.framework in Frameworks */, - C35C1222293D464A0009022D /* FirebaseAuth in Frameworks */, - 752FB04D1DF8BF4B009086FB /* sqlite3.framework 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 */, - 2218BD761E8F55430091D5E8 /* BRAPIClient+Assets.swift */, - 222C424F1E90492800078EB5 /* BRAPIClient+KV.swift */, - 2228734C1E916F7C0044BA15 /* BRAPIClient+Features.swift */, - 2228734E1E916FC30044BA15 /* BRAPIClient+Wallet.swift */, - 22122B711F0B8996000E9AB9 /* BRAPIClient+Events.swift */, - 22A9A9401DF61945000F0016 /* BRReplicatedKVStore.swift */, - 22A9A9351DF61945000F0016 /* BRBSPatch.swift */, - 22A9A9411DF61945000F0016 /* BRTar.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 = ""; - }; - 2412367B24035B7F00FFA499 /* Emitters */ = { - isa = PBXGroup; - children = ( - ); - name = Emitters; - 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 */, - ); - name = Main; - sourceTree = ""; - }; - 24470E2823A5F2C000ADDA27 /* Legacy BRTests */ = { - isa = PBXGroup; - children = ( - 24470E2423A5EF0D00ADDA27 /* BRAPIClientTests.swift */, - 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 */, - C3D783BF2565ECF60004FF70 /* UnstoppableDomainViewModelTests.swift */, - C31891C226733FD400ECE25C /* TabBarViewControllerTests.swift */, - ); - path = "Class Tests"; - sourceTree = ""; - }; - 2465873723A5AAD100A32E9E /* loafwalletTests */ = { - isa = PBXGroup; - children = ( - 584E24FF2951DA97005E0E8B /* Language Selection Tests */, - C3EFA9A42651A7C4005C59B5 /* Lock Screen Tests */, - C3188E3126445E5E0008ADD1 /* File Tests */, - C3B7C3EC255FF56100E98A64 /* Constants Tests */, - 24470E3923A5FF5700ADDA27 /* TestHelpers.swift */, - 24470E4323A6088700ADDA27 /* Class Tests */, - 24470E2823A5F2C000ADDA27 /* Legacy BRTests */, - 24470E2023A5DA9700ADDA27 /* APIManagerTests.swift */, - 24470E2223A5DB7D00ADDA27 /* WalletManagerTests.swift */, - 2465873A23A5AAD100A32E9E /* Info.plist */, - ); - path = loafwalletTests; - 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 = ""; - }; - 24B8FAD52162B6D400A155B1 /* Bitrefill_Web */ = { - isa = PBXGroup; - children = ( - 24B8FAD62162B6FB00A155B1 /* bitrefill_index.html */, - 24B8FADA2162CF7600A155B1 /* css */, - 24B8FAD92162CF7000A155B1 /* js */, - ); - name = Bitrefill_Web; - sourceTree = ""; - }; - 24B8FAD92162CF7000A155B1 /* js */ = { - isa = PBXGroup; - children = ( - ); - name = js; - sourceTree = ""; - }; - 24B8FADA2162CF7600A155B1 /* css */ = { - isa = PBXGroup; - children = ( - 24B8FADB2162D29100A155B1 /* general.css */, - ); - name = css; - sourceTree = ""; - }; - 24C516502158820E007CE038 /* Buy */ = { - isa = PBXGroup; - children = ( - 24B8FAD12162B10200A155B1 /* BuyCenterWebViewController.swift */, - 248BFE2323AAD53700CE1A71 /* BuyTableViewController.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 */, - ); - 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 = ( - C3A01CBE2B06A22000CC156B /* partner-keys.plist */, - 75A2A7921DA5934300A983D8 /* loafwallet */, - 2465873723A5AAD100A32E9E /* loafwalletTests */, - 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 */, - 22A9A9961DF63426000F0016 /* libbz2.framework */, - 752FB04A1DF8BE6B009086FB /* sqlite3.framework */, - 2465873623A5AAD000A32E9E /* loafwalletTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 75A2A7921DA5934300A983D8 /* loafwallet */ = { - isa = PBXGroup; - children = ( - 375DDB3D2697C253005E2B27 /* GoogleService-Info.plist */, - C3188E2526431E750008ADD1 /* Debug-GoogleService-Info.plist */, - C35ABD07257404C6002BB9BB /* SwiftUI+UIKit */, - 75A2A87C1DA59E4E00A983D8 /* loafwallet.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 */, - CE473D7B1F042F1E00C0ACFD /* coinflip.aiff */, - CE2990171EFD6DAF0093A0F2 /* Strings */, - 24306795238F3DDF00EBEA99 /* BartyCrouch */, - 24AF00FB221B32EC00FF636F /* Storyboards */, - CE20C90A1DBC59C500C8397A /* FlowControllers */, - CEE20C321EA5B2EC0086F724 /* Constants */, - 2412367B24035B7F00FFA499 /* Emitters */, - CE20C8EF1DBAF6D300C8397A /* ViewControllers */, - CE20C90F1DBE5B5100C8397A /* Views */, - CEBF33021DDE177F00348FC6 /* ViewModels */, - CE6D0E5A1E14BF8400137DF1 /* Models */, - 24B8FAD52162B6D400A155B1 /* Bitrefill_Web */, - CE20C8F01DBAF6E100C8397A /* Extensions */, - 22A9A9311DF61930000F0016 /* Platform */, - CEAA9E9C1DC2F8270066731D /* Fonts */, - 24670EAC2368EDE7006093E0 /* LFColorPalette.xcassets */, - 75A2A79A1DA5934300A983D8 /* Assets.xcassets */, - CE5E6C991EB9135000A476DB /* Icon.xcassets */, - 75A2A79C1DA5934300A983D8 /* LaunchScreen.storyboard */, - 75A2A79F1DA5934300A983D8 /* Info.plist */, - 24B523AF238A53DC0030594D /* BIP39Words.plist */, - 2485F7CE23728C19005962F1 /* RELEASE_NOTES.md */, - C3ACF2DE25DED601008671D4 /* CHANGELOG.md */, - ); - path = loafwallet; - 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 = ""; - }; - C3188E3126445E5E0008ADD1 /* File Tests */ = { - isa = PBXGroup; - children = ( - C3188E3226445EA20008ADD1 /* FileTests.swift */, - ); - path = "File Tests"; - sourceTree = ""; - }; - C32142E825C97CB900BECCD0 /* Transactions */ = { - isa = PBXGroup; - children = ( - C32142E925C97CD900BECCD0 /* TransactionCellView.swift */, - C3C8973725CD6B9300241FBE /* HostingTransactionCell.swift */, - C32142F925C988C800BECCD0 /* TransactionCellViewModel.swift */, - C3F7BD0225FEC77100694C28 /* TransactionModalView.swift */, - ); - name = Transactions; - sourceTree = ""; - }; - C3543A25264AFE190005D17A /* Settings */ = { - isa = PBXGroup; - children = ( - C3543A26264AFE490005D17A /* LocaleChangeView.swift */, - C3543A28264AFE720005D17A /* LocaleChangeViewModel.swift */, - ); - name = Settings; - sourceTree = ""; - }; - C35ABD07257404C6002BB9BB /* SwiftUI+UIKit */ = { - isa = PBXGroup; - children = ( - C3FF4D5D28AC5A2000713139 /* Send */, - C3543A25264AFE190005D17A /* Settings */, - C3F7BCD825FEC69B00694C28 /* Alerts */, - C32142E825C97CB900BECCD0 /* Transactions */, - C35ABD08257404D2002BB9BB /* Partners */, - C35ABD0925740518002BB9BB /* About */, - C3D783A52565EA1E0004FF70 /* Unstoppable */, - 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 = ""; - }; - C3B7C3EC255FF56100E98A64 /* Constants Tests */ = { - isa = PBXGroup; - children = ( - C3B7C3ED255FF59200E98A64 /* ConstantsTests.swift */, - ); - path = "Constants Tests"; - sourceTree = ""; - }; - C3D783A52565EA1E0004FF70 /* Unstoppable */ = { - isa = PBXGroup; - children = ( - C3D783A62565EA4A0004FF70 /* UnstoppableDomainView.swift */, - C3D783B62565EA6B0004FF70 /* UnstoppableDomainViewModel.swift */, - ); - name = Unstoppable; - 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 = ""; - }; - C3F7BCD825FEC69B00694C28 /* Alerts */ = { - isa = PBXGroup; - children = ( - C3F7BCDB25FEC6AC00694C28 /* AlertFailureView.swift */, - C3F7BCDA25FEC6AC00694C28 /* DomainResolutionFailure.swift */, - C3F7BCD925FEC6AC00694C28 /* FailedAlertView.swift */, - C30899782616426800EE6A40 /* ForgotAlertViewModel.swift */, - ); - name = Alerts; - sourceTree = ""; - }; - C3FF4D5D28AC5A2000713139 /* Send */ = { - isa = PBXGroup; - children = ( - C3FF4D5E28AC5A5800713139 /* SendAddressCellView.swift */, - C36375A228BD38A500CFB3D8 /* SendButtonHostingController.swift */, - C3FF4D6028AC5AC100713139 /* SendAddressCellViewModel.swift */, - C3FDADEC28B2DB090054FC80 /* SendAddressHostingController.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 */, - CEEC708F1E95D5C100EF788E /* PushNotificationsViewController.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 */, - CE4B6C1F1E233C2C00CF935B /* UITableView+Additions.swift */, - CE6DCC241E6001E50044257B /* UIControl+Callback.swift */, - CE124CFD1E68F57700DFA146 /* Async.swift */, - CEF3D2DA1E8B55C80070178E /* UISlider+Gradient.swift */, - CEF3D2DC1E8CBA790070178E /* LAContext+Extensions.swift */, - 222C42511E904C5000078EB5 /* AssociatedObject.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 */, - CE8CD8E21E31978100785E02 /* LoginBackgroundTriangle.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 */, - C3BD49C825954A1B00D97079 /* ForgotView.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 */, - CEF61B131ED0D10000C7EA6A /* Types.swift */, - C3A4647C259A646A00D74D81 /* DataValidation.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 */, - C3F4A4A426A2FB1E0008B1B2 /* TransferAmountViewModel.swift */, - CEBF33031DDE17A600348FC6 /* Transaction.swift */, - CE27F9581E2C8EA300F7F7F2 /* Amount.swift */, - CE124CF71E67A8E500DFA146 /* TransactionDirection.swift */, - C354C4622590059500675E0E /* TransactionsViewModel.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.swift */, - CEBF292F1EF9D76F005C330A /* Environment.swift */, - CEE20C331EA5B4550086F724 /* ArticleIds.swift */, - CE3D4C581EF743EF0016B1C8 /* Functions.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 PBXHeadersBuildPhase section */ - 22A9A9931DF63426000F0016 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 752FB0451DF8BE6B009086FB /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase 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 */ - 22A9A9951DF63426000F0016 /* libbz2 */ = { - isa = PBXNativeTarget; - buildConfigurationList = 22A9A99F1DF63426000F0016 /* Build configuration list for PBXNativeTarget "libbz2" */; - buildPhases = ( - 22A9A9911DF63426000F0016 /* Sources */, - 22A9A9921DF63426000F0016 /* Frameworks */, - 22A9A9931DF63426000F0016 /* Headers */, - 22A9A9941DF63426000F0016 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = libbz2; - productName = libbz2; - productReference = 22A9A9961DF63426000F0016 /* libbz2.framework */; - productType = "com.apple.product-type.framework"; - }; - 2465873523A5AAD000A32E9E /* loafwalletTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2465873D23A5AAD100A32E9E /* Build configuration list for PBXNativeTarget "loafwalletTests" */; - buildPhases = ( - 2465873223A5AAD000A32E9E /* Sources */, - 2465873323A5AAD000A32E9E /* Frameworks */, - 2465873423A5AAD000A32E9E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2465873C23A5AAD100A32E9E /* PBXTargetDependency */, - ); - name = loafwalletTests; - productName = loafwalletTests; - productReference = 2465873623A5AAD000A32E9E /* loafwalletTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 752FB0411DF8BE6B009086FB /* sqlite3 */ = { - isa = PBXNativeTarget; - buildConfigurationList = 752FB0471DF8BE6B009086FB /* Build configuration list for PBXNativeTarget "sqlite3" */; - buildPhases = ( - 752FB0421DF8BE6B009086FB /* Sources */, - 752FB0431DF8BE6B009086FB /* Frameworks */, - 752FB0451DF8BE6B009086FB /* Headers */, - 752FB0461DF8BE6B009086FB /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = sqlite3; - productName = libbz2; - productReference = 752FB04A1DF8BE6B009086FB /* sqlite3.framework */; - productType = "com.apple.product-type.framework"; - }; - 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 /* loafwallet */ = { - isa = PBXNativeTarget; - buildConfigurationList = 75A2A7E31DA5934400A983D8 /* Build configuration list for PBXNativeTarget "loafwallet" */; - 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 */, - 22A9A99C1DF63426000F0016 /* PBXTargetDependency */, - 752FB04F1DF8BF5C009086FB /* PBXTargetDependency */, - ); - name = loafwallet; - packageProductDependencies = ( - C35C121F293D464A0009022D /* FirebaseAnalytics */, - C35C1221293D464A0009022D /* FirebaseAuth */, - C35C1223293D464A0009022D /* FirebaseCrashlytics */, - C35C1226293D47EE0009022D /* UnstoppableDomainsResolution */, - C35C1229293D48340009022D /* KeychainAccess */, - ); - 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 = ""; - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1340; - ORGANIZATIONNAME = "Litecoin Foundation"; - TargetAttributes = { - 22A9A9951DF63426000F0016 = { - CreatedOnToolsVersion = 8.1; - ProvisioningStyle = Automatic; - }; - 2465873523A5AAD000A32E9E = { - CreatedOnToolsVersion = 11.3; - TestTargetID = 75A2A78F1DA5934300A983D8; - }; - 752FB0411DF8BE6B009086FB = { - ProvisioningStyle = Automatic; - }; - 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 "loafwallet" */; - compatibilityVersion = "Xcode 10.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - fr, - es, - ja, - "zh-Hans", - de, - ru, - it, - pt, - ko, - "zh-Hant", - id, - Base, - tr, - uk, - ); - mainGroup = 75A2A7871DA5934300A983D8; - packageReferences = ( - C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, - C35C1225293D47EE0009022D /* XCRemoteSwiftPackageReference "resolution-swift" */, - C35C1228293D48330009022D /* XCRemoteSwiftPackageReference "KeychainAccess" */, - ); - productRefGroup = 75A2A7911DA5934300A983D8 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 75A2A78F1DA5934300A983D8 /* loafwallet */, - 2465873523A5AAD000A32E9E /* loafwalletTests */, - 75A2A8071DA5936F00A983D8 /* TodayExtension */, - 755CD9C31DAA18420075898E /* unbound */, - 755CD9D01DAA197C0075898E /* BRCore */, - 75C735AE1DAA1C9F00251ECF /* nettle */, - 759DA0D71DAC8668008CC49B /* submodules */, - 22A9A9951DF63426000F0016 /* libbz2 */, - 752FB0411DF8BE6B009086FB /* sqlite3 */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 22A9A9941DF63426000F0016 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2465873423A5AAD000A32E9E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 752FB0461DF8BE6B009086FB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 75A2A78E1DA5934300A983D8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 24B8FAD72162B6FB00A155B1 /* bitrefill_index.html in Resources */, - 75A2A79E1DA5934300A983D8 /* LaunchScreen.storyboard in Resources */, - 24D5F23822599C0B00225462 /* BarlowSemiCondensed-Italic.ttf in Resources */, - 24D5F25922599C0B00225462 /* BarlowSemiCondensed-Medium.ttf in Resources */, - 24313C9B23824F5800A83F69 /* Transactions.storyboard in Resources */, - 222319B21F279B3C00008F20 /* POSTBouncer.html in Resources */, - 24670EAE2368EDE7006093E0 /* LFColorPalette.xcassets in Resources */, - 24313CA523824F5800A83F69 /* Buy.storyboard in Resources */, - 375DDB3F2697C253005E2B27 /* GoogleService-Info.plist in Resources */, - 24D5F23B22599C0B00225462 /* BarlowSemiCondensed-Bold.ttf in Resources */, - 24AF00FE221B331D00FF636F /* WarningConfirmation.storyboard in Resources */, - 24313C9D23824F5800A83F69 /* Alerts.storyboard in Resources */, - 24313CA123824F5800A83F69 /* Receive.storyboard in Resources */, - 24D5F26522599C0B00225462 /* BarlowSemiCondensed-SemiBold.ttf in Resources */, - CE473D7C1F042F1E00C0ACFD /* coinflip.aiff in Resources */, - CE5E6C9A1EB9135000A476DB /* Icon.xcassets in Resources */, - 24D5F25022599C0B00225462 /* BarlowSemiCondensed-Light.ttf in Resources */, - 2494037F23AE0C7100369261 /* SyncProgressHeaderView.xib in Resources */, - C3188E2726431E750008ADD1 /* Debug-GoogleService-Info.plist in Resources */, - CE29901A1EFD6DE50093A0F2 /* Localizable.strings in Resources */, - 24313C9F23824F5800A83F69 /* Animate.storyboard in Resources */, - 24B8FADC2162D29100A155B1 /* general.css 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 */, - 24DFCE6823B89CDE001F17F8 /* Settings.storyboard in Resources */, - 24393B5C23C259400075218D /* Phrase.storyboard in Resources */, - C3A01CBF2B06A22000CC156B /* partner-keys.plist 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; - 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 */ - 22A9A9911DF63426000F0016 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2465873223A5AAD000A32E9E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C3188E3326445EA20008ADD1 /* FileTests.swift in Sources */, - 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 */, - C3D783C02565ECF60004FF70 /* UnstoppableDomainViewModelTests.swift in Sources */, - 24470E2523A5EF0D00ADDA27 /* BRAPIClientTests.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 */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 752FB0421DF8BE6B009086FB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - 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 = ( - 248BFE2423AAD53700CE1A71 /* BuyTableViewController.swift in Sources */, - 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 */, - C3A4647D259A646A00D74D81 /* DataValidation.swift in Sources */, - 754AE0BC1DFE8A46007FD001 /* BRCore.swift in Sources */, - 24306797238F3DF900EBEA99 /* BartyCrouch.swift in Sources */, - C3D783B72565EA6B0004FF70 /* UnstoppableDomainViewModel.swift in Sources */, - CEC6AA3B1DEE4EB000EE5AFD /* CGRect+Additions.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 */, - CE124CFE1E68F57700DFA146 /* Async.swift in Sources */, - 2218BD771E8F55430091D5E8 /* BRAPIClient+Assets.swift in Sources */, - 2228734D1E916F7C0044BA15 /* BRAPIClient+Features.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 */, - 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 */, - 7528D2981ECF655500925DBC /* PaymentProtocol.swift in Sources */, - 22A9A9491DF61945000F0016 /* BRBSPatch.swift in Sources */, - C3543A27264AFE490005D17A /* LocaleChangeView.swift in Sources */, - C36DBF6128F1988900FBCB24 /* LocalWebViewModel.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 */, - 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 */, - C3F7BCDE25FEC6AD00694C28 /* AlertFailureView.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 */, - C30029EB25D019BC00F08C2B /* CopyButtonView.swift in Sources */, - 24313C922382433700A83F69 /* LFModalReceiveQRViewController.swift in Sources */, - CE20C9171DBE6F2A00C8397A /* UIButton+BRWAdditions.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 */, - C3F7BCDC25FEC6AD00694C28 /* FailedAlertView.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 */, - 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 */, - C3FDADED28B2DB090054FC80 /* SendAddressHostingController.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 */, - 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 */, - CEEC70901E95D5C100EF788E /* PushNotificationsViewController.swift in Sources */, - 24B8FADF2163C4D400A155B1 /* Currency.swift in Sources */, - 222C42501E90492800078EB5 /* BRAPIClient+KV.swift in Sources */, - C3F4A4A526A2FB1E0008B1B2 /* TransferAmountViewModel.swift in Sources */, - 2494037E23AE0C7100369261 /* SyncProgressHeaderView.swift in Sources */, - C3F7BCDD25FEC6AD00694C28 /* DomainResolutionFailure.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 */, - C3BD49C925954A1B00D97079 /* ForgotView.swift in Sources */, - CECCE5A91E0378FB00D99448 /* PinPadViewController.swift in Sources */, - 584E24F32951C11A005E0E8B /* Localization.swift in Sources */, - C354C4632590059500675E0E /* TransactionsViewModel.swift in Sources */, - CEF3D2DB1E8B55C80070178E /* UISlider+Gradient.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 */, - CEE20C341EA5B4550086F724 /* ArticleIds.swift in Sources */, - CEE65DF01E39056F0002994D /* Rate.swift in Sources */, - CEE20C361EA5B4620086F724 /* Constants.swift in Sources */, - CEC6AA461DEFCE9200EE5AFD /* MenuViewController.swift in Sources */, - CEEC707F1E8D6B4100EF788E /* SettingsViewController.swift in Sources */, - CEEE92F11EBA7CBA00B7AC9C /* RequestAmountViewController.swift in Sources */, - C36375A528BD390C00CFB3D8 /* SendButtonView.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 */, - 22A9A9551DF61945000F0016 /* BRTar.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 */, - CE8CD8E31E31978100785E02 /* LoginBackgroundTriangle.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 */, - C30899792616426800EE6A40 /* ForgotAlertViewModel.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 */, - CE4B6C201E233C2C00CF935B /* UITableView+Additions.swift in Sources */, - CE760EDC1E561DF900EFAC2B /* SecurityCenterViewController.swift in Sources */, - CEEC70861E94397D00EF788E /* UserDefaults+Additions.swift in Sources */, - C3F7BD0325FEC77100694C28 /* TransactionModalView.swift in Sources */, - C3D783A72565EA4B0004FF70 /* UnstoppableDomainView.swift in Sources */, - CE3D4C571EF5D5740016B1C8 /* ReachabilityMonitor.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 */, - 222C42521E904C5000078EB5 /* AssociatedObject.swift in Sources */, - CEB909F51E5FE63D001804DC /* EnterPhraseViewController.swift in Sources */, - CE6D0F971DE8B73A00BD4BCF /* ModalTransitionDelegate.swift in Sources */, - C3E751C82AF68AEB005571CA /* UnsafeMutablePointerExtension.swift in Sources */, - C3BD4A5325975C6000D97079 /* View+Extension.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 */ - 22A9A99C1DF63426000F0016 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 22A9A9951DF63426000F0016 /* libbz2 */; - targetProxy = 22A9A99B1DF63426000F0016 /* PBXContainerItemProxy */; - }; - 2465873C23A5AAD100A32E9E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 75A2A78F1DA5934300A983D8 /* loafwallet */; - targetProxy = 2465873B23A5AAD100A32E9E /* PBXContainerItemProxy */; - }; - 752FB04F1DF8BF5C009086FB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 752FB0411DF8BE6B009086FB /* sqlite3 */; - targetProxy = 752FB04E1DF8BF5C009086FB /* 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 */, - 2464B6E0238A60F200B2A2CB /* it */, - 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 */, - 75A2A8441DA59B4B00A983D8 /* it */, - 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 */, - CE27074D1F016B7000431BBC /* it */, - CE27074E1F016D2400431BBC /* pt */, - CEE659ED1F68AAB5001FF29D /* zh-Hant */, - CEE659EE1F68AAB9001FF29D /* zh-Hans */, - CE0FC0F81F72417200E7C626 /* ko */, - 24306799238F479500EBEA99 /* id */, - 2430679B238F5A2900EBEA99 /* en */, - C3BDB42826CC0338004DAE77 /* tr */, - C350788927DCAAA000A50819 /* uk */, - ); - name = Localizable.strings; - path = src/Strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 22A9A9A11DF63426000F0016 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/libbz2/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/libbz2/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/libbz2/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.libbz2; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 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"; - 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 = 13.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-ObjC"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/loafwallet/src/Platform"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Debug; - }; - 24470E0123A5BF3C00ADDA27 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = loafwallet/loafwallet.entitlements; - CURRENT_PROJECT_VERSION = 231116; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ZV7987N2ZC; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - FRAMEWORK_SEARCH_PATHS = ( - "$(SRCROOT)/**", - "$(PROJECT_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = "$(SRCROOT)/loafwallet/Info.plist"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 3.11.1; - OTHER_SWIFT_FLAGS = "-DDebug $(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; - PRODUCT_MODULE_NAME = loafwallet; - PRODUCT_NAME = Litewallet; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.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; - 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 = loafwalletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.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.loafwalletTests; - 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; - 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; - 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; - 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; - 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; - }; - 24470E0D23A5BF3C00ADDA27 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/libbz2/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/libbz2/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/libbz2/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.libbz2; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 24470E0E23A5BF3C00ADDA27 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/sqlite3/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/sqlite3/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/sqlite3/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.sqlite3; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - 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; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = loafwalletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.loafwalletTests; - 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; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = loafwalletTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet.loafwalletTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Litewallet.app/Litewallet"; - }; - name = Release; - }; - 752FB0491DF8BE6B009086FB /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/sqlite3/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/sqlite3/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/sqlite3/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.sqlite3; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 755CD9CC1DAA18420075898E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEVELOPMENT_TEAM = 4R7S6N88W9; - 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; - 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"; - ENABLE_NS_ASSERTIONS = NO; - 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 = 13.0; - MTL_ENABLE_DEBUG_INFO = NO; - "OTHER_LDFLAGS[arch=*]" = "-ObjC "; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/loafwallet/src/Platform"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 75A2A7E51DA5934400A983D8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = loafwallet/loafwallet.entitlements; - CURRENT_PROJECT_VERSION = 231116; - DEVELOPMENT_TEAM = ZV7987N2ZC; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; - FRAMEWORK_SEARCH_PATHS = ( - "$(SRCROOT)/**", - "$(PROJECT_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = "$(SRCROOT)/loafwallet/Info.plist"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 3.11.1; - OTHER_SWIFT_FLAGS = "$(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; - PRODUCT_MODULE_NAME = loafwallet; - PRODUCT_NAME = Litewallet; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 4.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; - 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; - 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; - 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 = 13.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_INCLUDE_PATHS = "$(SDK_DIR)/usr/include $(SRCROOT)/Modules $(SRCROOT)/loafwallet/src/Platform"; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Testnet; - }; - CEA7E69C1F0AAA84001F8C27 /* Testnet */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = loafwallet/loafwallet.entitlements; - CURRENT_PROJECT_VERSION = 231116; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = ZV7987N2ZC; - FRAMEWORK_SEARCH_PATHS = ( - "$(SRCROOT)/**", - "$(PROJECT_DIR)", - "$(inherited)", - ); - INFOPLIST_FILE = "$(SRCROOT)/loafwallet/Info.plist"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 3.11.1; - OTHER_SWIFT_FLAGS = "-DDebug -DTestnet $(inherited)"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.loafwallet; - PRODUCT_MODULE_NAME = loafwallet; - PRODUCT_NAME = Litewallet; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.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; - 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; - 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; - 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; - 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; - }; - CEA7E6A81F0AAA84001F8C27 /* Testnet */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/libbz2/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/libbz2/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/libbz2/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.libbz2; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Testnet; - }; - CEA7E6A91F0AAA84001F8C27 /* Testnet */ = { - isa = XCBuildConfiguration; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - CURRENT_PROJECT_VERSION = 2; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ZV7987N2ZC; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Modules/sqlite3/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - "MODULEMAP_FILE[sdk=iphoneos*]" = "$(SRCROOT)/Modules/sqlite3/iphone.modulemap"; - "MODULEMAP_FILE[sdk=iphonesimulator*]" = "$(SRCROOT)/Modules/sqlite3/iphonesim.modulemap"; - PRODUCT_BUNDLE_IDENTIFIER = com.litecoin.sqlite3; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Testnet; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 22A9A99F1DF63426000F0016 /* Build configuration list for PBXNativeTarget "libbz2" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24470E0D23A5BF3C00ADDA27 /* Debug */, - CEA7E6A81F0AAA84001F8C27 /* Testnet */, - 22A9A9A11DF63426000F0016 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2465873D23A5AAD100A32E9E /* Build configuration list for PBXNativeTarget "loafwalletTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24470E0323A5BF3C00ADDA27 /* Debug */, - 2465873F23A5AAD100A32E9E /* Testnet */, - 2465874023A5AAD100A32E9E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 752FB0471DF8BE6B009086FB /* Build configuration list for PBXNativeTarget "sqlite3" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24470E0E23A5BF3C00ADDA27 /* Debug */, - CEA7E6A91F0AAA84001F8C27 /* Testnet */, - 752FB0491DF8BE6B009086FB /* 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 "loafwallet" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24470E0023A5BF3C00ADDA27 /* Debug */, - CEA7E69B1F0AAA84001F8C27 /* Testnet */, - 75A2A7DA1DA5934400A983D8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 75A2A7E31DA5934400A983D8 /* Build configuration list for PBXNativeTarget "loafwallet" */ = { - 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 */ - C35C121E293D464A0009022D /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/firebase/firebase-ios-sdk.git"; - requirement = { - kind = exactVersion; - version = 10.17.0; - }; - }; - C35C1225293D47EE0009022D /* XCRemoteSwiftPackageReference "resolution-swift" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/unstoppabledomains/resolution-swift"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 6.1.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 */ - 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; - }; - C35C1226293D47EE0009022D /* UnstoppableDomainsResolution */ = { - isa = XCSwiftPackageProductDependency; - package = C35C1225293D47EE0009022D /* XCRemoteSwiftPackageReference "resolution-swift" */; - productName = UnstoppableDomainsResolution; - }; - C35C1229293D48340009022D /* KeychainAccess */ = { - isa = XCSwiftPackageProductDependency; - package = C35C1228293D48330009022D /* XCRemoteSwiftPackageReference "KeychainAccess" */; - productName = KeychainAccess; - }; -/* End XCSwiftPackageProductDependency section */ - }; - rootObject = 75A2A7881DA5934300A983D8 /* Project object */; -} diff --git a/loafwallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/loafwallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/loafwallet.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/loafwallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/loafwallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003..000000000 --- a/loafwallet.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Litewallet-fin_white-65.png b/loafwallet/Assets.xcassets/Branding/NewLogo/newLogotyoe-white.imageset/Litewallet-fin_white-65.png deleted file mode 100644 index 7763a3b8cacb36e4b7d2d1f647167c28f46b55c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10250 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�(E3AxBuJ+Sd_`ou05UqjQ0wKkb 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 diff --git a/loafwallet/DataValidation.swift b/loafwallet/DataValidation.swift deleted file mode 100644 index 7bf5ed3b2..000000000 --- a/loafwallet/DataValidation.swift +++ /dev/null @@ -1,127 +0,0 @@ -import Foundation - -enum ValidatorType { - case email - case genericString - case password - case mobileNumber - case requiredField(field: String) -} - -protocol ValidatorConvertible { - func validated(_ value: String) throws -> String -} - -struct ValidationError: Error { - var message: String - - init(_ message: String) { - self.message = message - } -} - -enum VaildatorFactory { - static func validatorFor(type: ValidatorType) -> ValidatorConvertible { - switch type { - case .genericString: return GenericStringValidator() - case .email: return EmailValidator() - case .password: return PasswordValidator() - case .mobileNumber: return MobileNumberValidator() - case let .requiredField(fieldName): return RequiredFieldValidator(fieldName) - } - } -} - -struct GenericStringValidator: ValidatorConvertible { - func validated(_ value: String) throws -> String { - guard !value.isEmpty else { throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .empty.localize()) } - return value - } -} - -struct MobileNumberValidator: ValidatorConvertible { - func validated(_ value: String) throws -> String { - guard value != "" else { throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .empty.localize()) } - - guard value.count >= 10 else { throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .numberDigitsRequired.localize()) } - return value - } -} - -struct RequiredFieldValidator: ValidatorConvertible { - private let fieldName: String - - init(_ field: String) { - fieldName = field - } - - func validated(_ value: String) throws -> String { - guard !value.isEmpty - else { - throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .requiredField.localize() + fieldName) - } - return value - } -} - -struct PasswordValidator: ValidatorConvertible { - func validated(_ value: String) throws -> String { - guard value != "" else { throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .empty.localize()) } - - guard value.count >= 6 else { throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .passwordCharacters.localize()) } - - do { - if try NSRegularExpression(pattern: "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{6,}$", options: .caseInsensitive).firstMatch(in: value, options: [], range: NSRange(location: 0, length: value.count)) == nil - { - throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .passwordComposition.localize()) - } - } catch { - throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .passwordComposition.localize()) - } - return value - } -} - -struct EmailValidator: ValidatorConvertible { - func validated(_ value: String) throws -> String { - do { - if try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$", options: .caseInsensitive).firstMatch(in: value, options: [], range: NSRange(location: 0, length: value.count)) == nil - { - throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .invalidEmail.localize()) - } - } catch { - throw ValidationError(S.LitecoinCard - .Registration - .ValidationError - .invalidEmail.localize()) - } - return value - } -} diff --git a/loafwallet/LFColorPalette.xcassets/Contents.json b/loafwallet/LFColorPalette.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/loafwallet/LFColorPalette.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/loafwallet/LocaleChangeView.swift b/loafwallet/LocaleChangeView.swift deleted file mode 100644 index bb02547a5..000000000 --- a/loafwallet/LocaleChangeView.swift +++ /dev/null @@ -1,44 +0,0 @@ -import SwiftUI - -struct LocaleChangeView: View { - // MARK: - Combine Variables - - @ObservedObject - var viewModel: LocaleChangeViewModel - - init(viewModel: LocaleChangeViewModel) { - self.viewModel = viewModel - } - - var body: some View { - VStack { - Text("\(S.Settings.currentLocale.localize()) \(viewModel.displayName)") - .font(Font(UIFont.barlowSemiBold(size: 18.0))) - .foregroundColor(.black) - .padding(.leading, 20) - .padding(.top, 10) - - Spacer() - } - } -} - -struct LocaleChangeView_Previews: PreviewProvider { - static let viewModel = LocaleChangeViewModel() - - static var previews: some View { - Group { - LocaleChangeView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhoneSE2)) - .previewDisplayName(DeviceType.Name.iPhoneSE2) - - LocaleChangeView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone8)) - .previewDisplayName(DeviceType.Name.iPhone8) - - LocaleChangeView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone12ProMax)) - .previewDisplayName(DeviceType.Name.iPhone12ProMax) - } - } -} diff --git a/loafwallet/LockScreenHeaderView.swift b/loafwallet/LockScreenHeaderView.swift deleted file mode 100644 index da9ac46c6..000000000 --- a/loafwallet/LockScreenHeaderView.swift +++ /dev/null @@ -1,52 +0,0 @@ -import SwiftUI - -struct LockScreenHeaderView: View { - // MARK: - Combine Variables - - @ObservedObject - var viewModel: LockScreenHeaderViewModel - - init(viewModel: LockScreenHeaderViewModel) { - self.viewModel = viewModel - } - - var body: some View { - Color - .liteWalletDarkBlue - .opacity(0.9) - .edgesIgnoringSafeArea(.all) - .overlay( - VStack { - Spacer() - Text(" 1 LTC = \(viewModel.currentValueInFiat)") - .font(Font(UIFont.barlowSemiBold(size: 16.0))) - .foregroundColor(.white) - - Text("\(S.History.currentLitecoinValue.localize()) \(viewModel.currencyCode)") - .font(Font(UIFont.barlowRegular(size: 14.0))) - .foregroundColor(Color.white.opacity(0.5)) - .padding(.bottom, 10) - }) - } -} - -struct LockScreenHeaderView_Previews: PreviewProvider { - static let store = Store() - static let viewModel = LockScreenHeaderViewModel(store: store) - - static var previews: some View { - Group { - LockScreenHeaderView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhoneSE2)) - .previewDisplayName(DeviceType.Name.iPhoneSE2) - - LockScreenHeaderView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone8)) - .previewDisplayName(DeviceType.Name.iPhone8) - - LockScreenHeaderView(viewModel: viewModel) - .previewDevice(PreviewDevice(rawValue: DeviceType.Name.iPhone12ProMax)) - .previewDisplayName(DeviceType.Name.iPhone12ProMax) - } - } -} diff --git a/loafwallet/TransferAmountViewModel.swift b/loafwallet/TransferAmountViewModel.swift deleted file mode 100644 index 8480145ff..000000000 --- a/loafwallet/TransferAmountViewModel.swift +++ /dev/null @@ -1,120 +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 - } - - // DEV: Need to get information back from Ternio 2FA - /// Transfer Litecoin from **Litecoin Card to Litewallet** - /// - Parameters: - /// - amount: Litecoin to 6 decimal places - /// - completion: To complete process - /// - address: Destination Litecoin address - func transferToLitewallet(amount _: Double, - address _: String, - completion _: @escaping () -> Void) - { - let keychain = Keychain(service: "com.litecoincard.service") - - // Fetches the latest token and UserID - guard let token = keychain["token"], - let userID = keychain["userID"] - else { - LWAnalytics.logEventWithParameters(itemName: ._20210804_ERR_KLF) - return - } - } - - /// Transfer Litecoin from **Litewallet to Litecoin Card** - /// - Parameters: - /// - amount: Litecoin to 6 decimal places - /// - completion: To complete process - /// - address: Destination Litecoin address - func transferToCard(amount: Double, - address: String, - completion: @escaping (Bool) -> Void) - { - /// 1 Litecoin = 100 000 000 litoshis - /// Litewallet core calculates values in litoshis - let litoshis = UInt64(amount * 100_000_000) - - transaction = walletManager.wallet?.createTransaction(forAmount: litoshis, - toAddress: address) - - guard let kvStore = walletManager.apiClient?.kv else { return } - - sender = Sender(walletManager: walletManager, kvStore: kvStore, store: store) - - sender?.sendToCard(amount: litoshis, - toAddress: address) { didSend in - completion(didSend) - } - } -} diff --git a/loafwallet/pl.lproj/BIP39Words.plist b/loafwallet/pl.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/pl.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/pt.lproj/BIP39Words.plist b/loafwallet/pt.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/pt.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/ru.lproj/BIP39Words.plist b/loafwallet/ru.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/ru.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/src/Constants/ArticleIds.swift b/loafwallet/src/Constants/ArticleIds.swift deleted file mode 100644 index de3f8094d..000000000 --- a/loafwallet/src/Constants/ArticleIds.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation - -enum ArticleIds { - static let displayCurrency = "display-currency" - static let recoverWallet = "recover-wallet" - static let reScan = "re-scan" - static let securityCenter = "security-center" - static let buyCenter = "buy-center" - static let paperKey = "paper-key" - static let enableTouchId = "enable-fingerprint-authentication" - static let touchIdSpendingLimit = "fingerprint-spending-limit" - static let transactionDetails = "transaction-details" - static let manageWallet = "manage-wallet" - static let receiveBitcoin = "receive-bitcoin" - static let requestAmount = "request-amount" - static let sendBitcoin = "send-bitcoin" - static let walletDisabled = "wallet-disabled" - static let resetPinWithPaperKey = "reset-pin-paper-key" - static let setPin = "set-pin" - static let importWallet = "import-wallet" - static let writePhrase = "write-phrase" - static let confirmPhrase = "confirm-phrase" - static let startView = "start-view" - static let wipeWallet = "wipe-wallet" - static let wipeEmptyWallet = "wipe-empty-wallet" -} diff --git a/loafwallet/src/Constants/Functions.swift b/loafwallet/src/Constants/Functions.swift deleted file mode 100644 index 903f6e705..000000000 --- a/loafwallet/src/Constants/Functions.swift +++ /dev/null @@ -1,36 +0,0 @@ -import UIKit - -func guardProtected(queue: DispatchQueue, callback: @escaping () -> Void) { - DispatchQueue.main.async { - if UIApplication.shared.isProtectedDataAvailable { - callback() - } else { - var observer: Any? - observer = NotificationCenter.default.addObserver(forName: .UIApplicationProtectedDataDidBecomeAvailable, object: nil, queue: nil, - using: { _ in - queue.async { - callback() - } - if let observer = observer { - NotificationCenter.default.removeObserver(observer) - } - }) - } - } -} - -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 -{ - return { [weak context] arguments in - guard let strongContext = context else { return } - closure(strongContext, arguments) - } -} diff --git a/loafwallet/src/Constants/Strings.swift b/loafwallet/src/Constants/Strings.swift deleted file mode 100644 index 768ea72d0..000000000 --- a/loafwallet/src/Constants/Strings.swift +++ /dev/null @@ -1,756 +0,0 @@ -import Foundation - -enum S { - enum Symbols { - static let photons = "mł" - static let lites = "ł" - static let ltc = "Ł" - static let narrowSpace = "\u{2009}" - static let lock = "\u{1F512}" - static let redX = "\u{274C}" - static func currencyButtonTitle(maxDigits: Int) -> String { - switch maxDigits { - case 2: - return "photons\(S.Symbols.narrowSpace)(m\(S.Symbols.lites))" - case 5: - return "lites\(S.Symbols.narrowSpace)(\(S.Symbols.lites))" - case 8: - return "LTC\(S.Symbols.narrowSpace)(\(S.Symbols.ltc))" - default: - return "lites\(S.Symbols.narrowSpace)(\(S.Symbols.lites))" - } - } - } - - enum Conjuction { - static let asOf = Localization(key: "Conjunction.asOf", value: "**as of**", comment: "as of a time or date") - } - - // MARK: - Generic Button labels - - enum Button { - static let ok = Localization(key: "Button.ok", value: "**OK**", comment: "OK button label") - static let cancel = Localization(key: "Button.cancel", value: "**Cancel**", comment: "Cancel button label") - static let settings = Localization(key: "Button.settings", value: "**Settings**", comment: "Settings button label") - static let submit = Localization(key: "Button.submit", value: "**Submit**", comment: "Settings button label") - static let ignore = Localization(key: "Button.ignore", value: "**Ignore**", comment: "Ignore button label") - static let yes = Localization(key: "Button.yes", value: "**Yes**", comment: "Yes button") - static let no = Localization(key: "Button.no", value: "**No**", comment: "No button") - static let send = Localization(key: "Button.send", value: "**send**", comment: "send button") - static let receive = Localization(key: "Button.receive", value: "**receive**", comment: "receive button") - static let menu = Localization(key: "Button.menu", value: "**menu**", comment: "menu button") - static let buy = Localization(key: "Button.buy", value: "**buy**", comment: "buy button") - static let resetFields = Localization(key: "Button.resetFields", value: "**reset**", comment: "resetFields") - } - - enum LitewalletAlert { - static let warning = Localization(key: "Alert.warning", value: "**Warning**", comment: "Warning alert title") - static let error = Localization(key: "Alert.error", value: "**Error**", comment: "Error alert title") - static let noInternet = Localization(key: "Alert.noInternet", value: "**No internet connection found. Check your connection and try again.**", comment: "No internet alert message") - static let corruptionError = Localization(key: "Alert.corruptionError", value: "**Database Corruption Error**", comment: "Corruption Error alert title") - static let corruptionMessage = Localization(key: "Alert.corruptionMessage", value: "**Your local database is corrupted. Go to Settings > Blockchain: Settings > Delete Database to refresh**", comment: "Corruption Error alert title") - } - - enum Scanner { - static let flashButtonLabel = Localization(key: "Scanner.flashButtonLabel", value: "**Camera Flash**", comment: "Scan Litecoin address camera flash toggle") - } - - enum Send { - static let title = Localization(key: "Send.title", value: "**Send**", comment: "Send modal title") - static let toLabel = Localization(key: "Send.toLabel", value: "**To**", comment: "Send money to label") - static let enterLTCAddressLabel = Localization(key: "Send.enterLTCAddress", value: "**Enter LTC Address**", comment: "Enter LTC Address") - static let amountLabel = Localization(key: "Send.amountLabel", value: "**Amount**", comment: "Send money amount label") - static let descriptionLabel = Localization(key: "Send.descriptionLabel", value: "**Memo**", comment: "Description for sending money label") - static let sendLabel = Localization(key: "Send.sendLabel", value: "**Send**", comment: "Send button label") - static let pasteLabel = Localization(key: "Send.pasteLabel", value: "**Paste**", comment: "Paste button label") - static let scanLabel = Localization(key: "Send.scanLabel", value: "**Scan**", comment: "Scan button label") - static let invalidAddressTitle = Localization(key: "Send.invalidAddressTitle", value: "**Invalid Address**", comment: "Invalid address alert title") - static let invalidAddressMessage = Localization(key: "Send.invalidAddressMessage", value: "**The destination address is not a valid Litecoin address.**", comment: "Invalid address alert message") - static let invalidAddressOnPasteboard = Localization(key: "Send.invalidAddressOnPasteboard", value: "**Pasteboard does not contain a valid Litecoin address.**", comment: "Invalid address on pasteboard message") - static let emptyPasteboard = Localization(key: "Send.emptyPasteboard", value: "**Pasteboard is empty**", comment: "Empty pasteboard error message") - static let cameraUnavailableTitle = Localization(key: "Send.cameraUnavailableTitle", value: "**Litewallet is not allowed to access the camera**", comment: "Camera not allowed alert title") - static let cameraUnavailableMessage = Localization(key: "Send.cameraunavailableMessage", value: "**Go to Settings to allow camera access.**", comment: "Camera not allowed message") - static let balance = Localization(key: "Send.balance", value: "**Balance: %1$@**", comment: "Balance: $4.00") - static let fee = Localization(key: "Send.fee", value: "**Network Fee: %1$@**", comment: "Network Fee: $0.01") - static let containsAddress = Localization(key: "Send.containsAddress", value: "**The destination is your own address. You cannot send to yourself.**", comment: "Warning when sending to self.") - enum UsedAddress { - static let title = Localization(key: "Send.UsedAddress.title", value: "**Address Already Used**", comment: "Adress already used alert title") - static let firstLine = Localization(key: "Send.UsedAddress.firstLine", value: "**Litecoin addresses are intended for single use only.**", comment: "Adress already used alert message - first part") - static let secondLine = Localization(key: "Send.UsedAddress.secondLIne", value: "**Re-use reduces privacy for both you and the recipient and can result in loss if the recipient doesn't directly control the address.**", comment: "Adress already used alert message - second part") - } - - static let identityNotCertified = Localization(key: "Send.identityNotCertified", value: "**Payee identity isn't certified.**", comment: "Payee identity not certified alert title.") - static let createTransactionError = Localization(key: "Send.creatTransactionError", value: "**Could not create transaction.**", comment: "Could not create transaction alert title") - static let publicTransactionError = Localization(key: "Send.publishTransactionError", value: "**Could not publish transaction.**", comment: "Could not publish transaction alert title") - static let noAddress = Localization(key: "Send.noAddress", value: "**Please enter the recipient's address.**", comment: "Empty address alert message") - static let noAmount = Localization(key: "Send.noAmount", value: "**Please enter an amount to send.**", comment: "Emtpy amount alert message") - static let isRescanning = Localization(key: "Send.isRescanning", value: "**Sending is disabled during a full rescan.**", comment: "Is rescanning error message") - static let remoteRequestError = Localization(key: "Send.remoteRequestError", value: "**Could not load payment request**", comment: "Could not load remote request error message") - 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 { - static let title = Localization(key: "Receive.title", value: "**Receive**", comment: "Receive modal title") - static let emailButton = Localization(key: "Receive.emailButton", value: "**Email**", comment: "Share via email button label") - static let textButton = Localization(key: "Receive.textButton", value: "**Text Message**", comment: "Share via text message (SMS)") - static let copied = Localization(key: "Receive.copied", value: "**Copied to clipboard.**", comment: "Address copied message.") - static let share = Localization(key: "Receive.share", value: "**Share**", comment: "Share button label") - static let request = Localization(key: "Receive.request", value: "**Request an Amount**", comment: "Request button label") - static let barItemTitle = Localization(key: "Receive.barItemTitle", value: "**Receive**", comment: "Receive Bar Item Title") - } - - // MARK: - Litewallet - - enum Litewallet { - static let name = Localization(key: "Litewallet.name", value: "**Litewallet**", comment: "Litewallet name") - } - - // MARK: - Litecoin Card - - enum LitecoinCard { - static let name = Localization(key: "LitecoinCard.name", value: "**Litecoin Card**", comment: "Card Bar Item Title") - static let barItemTitle = Localization(key: "LitecoinCard.barItemTitle", value: "**Card**", comment: "Card Bar Item Title") - static let login = Localization(key: "LitecoinCard.login", value: "**Login**", comment: "Login") - static let failedlogin = Localization(key: "LitecoinCard.failed.login", value: "**Failed Login**", comment: "Failed Login") - static let logout = Localization(key: "LitecoinCard.logout", value: "**Logout**", comment: "Logout") - static let forgotPassword = Localization(key: "LitecoinCard.forgotPassword", value: "**Forgot password?**", comment: "Forgot password?") - static let resetPassword = Localization(key: "LitecoinCard.resetPassword", value: "**Reset password**", comment: "Reset password") - static let resetPasswordDetail = Localization(key: "LitecoinCard.resetPasswordDetail", value: "**Enter the email that you used to register for your Litecoin Card and check for an email from support@litecoin.getblockcard.com.**", comment: "Reset password detail") - static let visitToReset = Localization(key: "LitecoinCard.visit.toReset", value: "**Reset Litecoin card visit**", comment: "Litecoin card visit") - static let registerCard = Localization(key: "LitecoinCard.registerCard", value: "**Register**", comment: "Register") - static let registeringUser = Localization(key: "LitecoinCard.registering.user", value: "**Registering user...**", comment: "Registering user...") - - static let cardBalance = Localization(key: "LitecoinCard.cardBalance", value: "", comment: "Card balance") - static let registrationSuccess = Localization(key: "LitecoinCard.registrationSuccess", value: "", comment: "Registration success") - static let registrationFailure = Localization(key: "LitecoinCard.registrationFailure", value: "", comment: "Registration failure") - static let enterCode = Localization(key: "LitecoinCard.enterCode", value: "", comment: "Enter code") - static let enterCodeDetail = Localization(key: "LitecoinCard.enterCode.detail", value: "", comment: "Enter code details") - static let twoFAOn = Localization(key: "LitecoinCard.twoFAOn", value: "", comment: "Message when 2FA is on") - static let twoFAOff = Localization(key: "LitecoinCard.twoFAOff", value: "", comment: "Message when 2FA is off") - static let cardBalanceOnlyDescription = Localization(key: "LitecoinCard.cardBalanceOnlyDescription", value: "", comment: "Message when 2FA is off and user is viewing the Card Balance") - static let twoFAErrorMessage = Localization(key: "LitecoinCard.twoFAErrorMessage", value: "2FA Error message", comment: "2FA Error message") - - // MARK: - Disclaimer - - enum Disclaimer { - static let title = Localization(key: "LitecoinCard.Disclaimer.title", value: "Beta Testing Litecoin Card", comment: "Beta Testing Litecoin Card") - static let description = Localization(key: "LitecoinCard.Disclaimer.description", value: "Description", comment: "Description of the status") - static let bullets = Localization(key: "LitecoinCard.Disclaimer.bullets", value: "bullets", comment: "Features and limitations") - static let referral = Localization(key: "LitecoinCard.Disclaimer.referral", value: "referral", comment: "Referral to the website") - } - - // MARK: - Transfer - - enum Transfer { - static let title = Localization(key: "LitecoinCard.Transfer.title", value: "Transfer", comment: "Transfer title") - static let description = Localization(key: "LitecoinCard.Transfer.description", value: "Choose the transferring wallet", comment: "Description of action") - static let litewalletBalance = Localization(key: "LitecoinCard.Transfer.litewalletBalance", value: "Litewallet balance", comment: "Litewallet balance label") - static let amountToCard = Localization(key: "LitecoinCard.Transfer.amountToCard", value: "Transfer to Card", comment: "Transfer to card label") - static let amountToLitewallet = Localization(key: "LitecoinCard.Transfer.amountToLitewallet", value: "Transfer to Litewallet", comment: "Transfer to Litewallet label") - static let setAmount = Localization(key: "LitecoinCard.Transfer.setAmount", value: "Slide to set transfer amount", comment: "Set transfer amount label") - static let startTransfer = Localization(key: "LitecoinCard.Transfer.startTransfer", value: "Start transfer", comment: "Start transfer label") - static let destinationAddress = Localization(key: "LitecoinCard.Transfer.destinationAddress", value: "Destination address", comment: "Destination address label") - } - - // MARK: - Registration - - enum Registration { - static let registerCardPhrase = Localization(key: "LitecoinCard.registerCardPhrase", value: "**Register for Litecoin Card**", comment: "Register for Litecoin Card") - static let password = Localization(key: "LitecoinCard.Registration.password", value: "", comment: "password") - static let confirmPassword = Localization(key: "LitecoinCard.Registration.confirmPassword", value: "", comment: "confirm password") - static let firstName = Localization(key: "LitecoinCard.Registration.firstName", value: "", comment: "First name") - static let lastName = Localization(key: "LitecoinCard.Registration.lastName", value: "", comment: "Last name") - static let kycSSN = Localization(key: "LitecoinCard.Registration.kycSSN", value: "", comment: "SSN") - static let kycIDNumber = Localization(key: "LitecoinCard.Registration.kycIDNumber", value: "", comment: "kycIDNumber") - static let kycIDType = Localization(key: "LitecoinCard.Registration.kycIDType", value: "", comment: "kycIDType") - static let address = Localization(key: "LitecoinCard.Registration.address", value: "", comment: "address") - static let city = Localization(key: "LitecoinCard.Registration.city", value: "", comment: "city") - static let stateProvince = Localization(key: "LitecoinCard.Registration.stateProvince", value: "", comment: "state province") - static let country = Localization(key: "LitecoinCard.Registration.country", value: "", comment: "country") - static let zipPostCode = Localization(key: "LitecoinCard.Registration.zipPostCode", value: "", comment: "zip post Code") - static let mobileNumber = Localization(key: "LitecoinCard.Registration.mobileNumber", value: "", comment: "mobile number") - static let identification = Localization(key: "LitecoinCard.Registration.identification", value: "", comment: "identification") - - enum ValidationError { - static let empty = Localization(key: "LitecoinCard.Registration.ValidationError.empty", value: "Most not be empty", comment: "must not be empty") - static let numberRequired = Localization(key: "LitecoinCard.Registration.ValidationError.numberRequired", value: "Mobile number required", comment: "Mobile number required") - static let numberDigitsRequired = Localization(key: "LitecoinCard.Registration.ValidationError.numberDigitsRequired", value: "Mobile number 10 digits required", comment: "Mobile number 10 digits required") - static let requiredField = Localization(key: "LitecoinCard.Registration.ValidationError.requiredField", value: "Required field", comment: "Required field") - static let passwordRequired = Localization(key: "LitecoinCard.Registration.ValidationError.passwordRequired", value: "Password required", comment: "Password required") - static let passwordCharacters = Localization(key: "LitecoinCard.Registration.ValidationError.passwordCharacters", value: "6 password Characters required", comment: "6 Password characters required") - static let passwordComposition = Localization(key: "LitecoinCard.Registration.ValidationError.passwordComposition", value: "Capital and numeric password characters required", comment: "Captial and numeric password characters required") - static let invalidEmail = Localization(key: "LitecoinCard.Registration.ValidationError.invalidEmail", value: "Invalid email address", comment: "Invalid email address") - } - } - } - - enum Account { - static let loadingMessage = Localization(key: "Account.loadingMessage", value: "**Loading Wallet**", comment: "Loading Wallet Message") - } - - enum History { - static let barItemTitle = Localization(key: "History.barItemTitle", value: "**History**", comment: "History Bar Item Title") - static let currentLitecoinValue = Localization(key: "History.currentLitecoinValue", value: "**History CurrentLitecoinValue**", comment: "History Current Litecoin Value") - } - - enum JailbreakWarnings { - static let title = Localization(key: "JailbreakWarnings.title", value: "**WARNING**", comment: "Jailbreak warning title") - static let messageWithBalance = Localization(key: "JailbreakWarnings.messageWithBalance", value: "**DEVICE SECURITY COMPROMISED\n Any 'jailbreak' app can access Litewallet's keychain data and steal your Litecoin! Wipe this wallet immediately and restore on a secure device.**", comment: "Jailbreak warning message") - static let messageWithoutBalance = Localization(key: "JailbreakWarnings.messageWithoutBalance", value: "**DEVICE SECURITY COMPROMISED\n Any 'jailbreak' app can access Litewallet's keychain data and steal your Litecoin. Please only use Litewallet on a non-jailbroken device.**", comment: "Jailbreak warning message") - static let ignore = Localization(key: "JailbreakWarnings.ignore", value: "**Ignore**", comment: "Ignore jailbreak warning button") - static let wipe = Localization(key: "JailbreakWarnings.wipe", value: "**Wipe**", comment: "Wipe wallet button") - static let close = Localization(key: "JailbreakWarnings.close", value: "**Close**", comment: "Close app button") - } - - enum ErrorMessages { - static let emailUnavailableTitle = Localization(key: "ErrorMessages.emailUnavailableTitle", value: "**Email Unavailable**", comment: "Email unavailable alert title") - static let emailUnavailableMessage = Localization(key: "ErrorMessages.emailUnavailableMessage", value: "**This device isn't configured to send email with the iOS mail app.**", comment: "Email unavailable alert title") - static let messagingUnavailableTitle = Localization(key: "ErrorMessages.messagingUnavailableTitle", value: "**Messaging Unavailable**", comment: "Messaging unavailable alert title") - static let messagingUnavailableMessage = Localization(key: "ErrorMessages.messagingUnavailableMessage", value: "**This device isn't configured to send messages.**", comment: "Messaging unavailable alert title") - } - - enum UnlockScreen { - static let myAddress = Localization(key: "UnlockScreen.myAddress", value: "**My Address**", comment: "My Address button title") - static let scan = Localization(key: "UnlockScreen.scan", value: "**Scan**", comment: "Scan button title") - static let touchIdText = Localization(key: "UnlockScreen.touchIdText", value: "**Unlock with TouchID**", comment: "Unlock with TouchID accessibility label") - static let touchIdPrompt = Localization(key: "UnlockScreen.touchIdPrompt", value: "**Unlock your LoafWallet.**", comment: "TouchID/FaceID prompt text") - static let enterPIN = Localization(key: "UnlockScreen.enterPin", value: "**Enter PIN**", comment: "Unlock Screen sub-header") - static let unlocked = Localization(key: "UnlockScreen.unlocked", value: "**Wallet Unlocked**", comment: "Wallet unlocked message") - static let disabled = Localization(key: "UnlockScreen.disabled", value: "**Disabled until: %1$@**", comment: "Disabled until date") - static let resetPin = Localization(key: "UnlockScreen.resetPin", value: "**Reset PIN**", comment: "Reset PIN with Paper Key button label.") - static let faceIdText = Localization(key: "UnlockScreen.faceIdText", value: "**Unlock with FaceID**", comment: "Unlock with FaceID accessibility label") - } - - enum Transaction { - static let justNow = Localization(key: "Transaction.justNow", value: "**just now**", comment: "Timestamp label for event that just happened") - static let invalid = Localization(key: "Transaction.invalid", value: "**INVALID**", comment: "Invalid transaction") - static let complete = Localization(key: "Transaction.complete", value: "**Complete**", comment: "Transaction complete label") - static let waiting = Localization(key: "Transaction.waiting", value: "**Waiting to be confirmed. Some merchants require confirmation to complete a transaction. Estimated time: 1-2 hours.**", comment: "Waiting to be confirmed string") - static let starting = Localization(key: "Transaction.starting", value: "**Starting balance: %1$@**", comment: "eg. Starting balance: $50.00") - static let fee = Localization(key: "Transaction.fee", value: "**(%1$@ fee)**", comment: "(b600 fee)") - static let ending = Localization(key: "Transaction.ending", value: "**Ending balance: %1$@**", comment: "eg. Ending balance: $50.00") - static let exchangeOnDaySent = Localization(key: "Transaction.exchangeOnDaySent", value: "**Exchange rate when sent:**", comment: "Exchange rate on date header") - static let exchangeOnDayReceived = Localization(key: "Transaction.exchangeOnDayReceived", value: "**Exchange rate when received:**", comment: "Exchange rate on date header") - static let receivedStatus = Localization(key: "Transaction.receivedStatus", value: "**In progress: %1$@**", comment: "Receive status text: 'In progress: 20%'") - static let sendingStatus = Localization(key: "Transaction.sendingStatus", value: "**In progress: %1$@**", comment: "Send status text: 'In progress: 20%'") - static let available = Localization(key: "Transaction.available", value: "**Available to Spend**", comment: "Availability status text") - static let txIDLabel = Localization(key: "Transaction.txIDLabel", value: "**Transaction txID**", comment: "Static TX iD Label") - static let amountDetailLabel = Localization(key: "Transaction.amountDetailLabel", value: "**Transaction amount detail**", comment: "Static amount Label") - static let startingAmountDetailLabel = Localization(key: "Transaction.startingAmountDetailLabel", value: "**Transaction starting amount detail**", comment: "Static starting amount Label") - static let endAmountDetailLabel = Localization(key: "Transaction.endAmountDetailLabel", value: "**Transaction end amount detail**", comment: "Static end amount Label") - static let blockHeightLabel = Localization(key: "Transaction.blockHeightLabel", value: "**Transaction blockHeightLabel**", comment: "Static blockHeight Label") - static let commentLabel = Localization(key: "Transaction.commentLabel", value: "**Transaction comment label**", comment: "Static comment Label") - } - - enum TransactionDetails { - static let title = Localization(key: "TransactionDetails.title", value: "**Transaction Details**", comment: "Transaction Details Title") - static let receiveModaltitle = Localization(key: "TransactionDetails.receivedModalTitle", value: "**RECEIVE LTC**", comment: "RECEIVE LTCTitle") - static let statusHeader = Localization(key: "TransactionDetails.statusHeader", value: "**Status**", comment: "Status section header") - static let commentsHeader = Localization(key: "TransactionDetails.commentsHeader", value: "**Memo**", comment: "Memo section header") - static let amountHeader = Localization(key: "TransactionDetails.amountHeader", value: "**Amount**", comment: "Amount section header") - static let emptyMessage = Localization(key: "TransactionDetails.emptyMessage", value: "**Your transactions will appear here.**", comment: "Empty transaction list message.") - static let txHashHeader = Localization(key: "TransactionDetails.txHashHeader", value: "**Litecoin Transaction ID**", comment: "Transaction ID header") - static let sentAmountDescription = Localization(key: "TransactionDetails.sentAmountDescription", value: "**Sent %1@**", comment: "Sent $5.00") - static let receivedAmountDescription = Localization(key: "TransactionDetails.receivedAmountDescription", value: "**Received %1@**", comment: "Received $5.00") - static let movedAmountDescription = Localization(key: "TransactionDetails.movedAmountDescription", value: "**Moved %1@**", comment: "Moved $5.00") - static let account = Localization(key: "TransactionDetails.account", value: "**account**", comment: "e.g. I received money from an account.") - static let sent = Localization(key: "TransactionDetails.sent", value: "**Sent %1$@**", comment: "Sent $5.00 (sent title 1/2)") - static let received = Localization(key: "TransactionDetails.received", value: "**Received %1$@**", comment: "Received $5.00 (received title 1/2)") - static let moved = Localization(key: "TransactionDetails.moved", value: "**Moved %1$@**", comment: "Moved $5.00") - static let to = Localization(key: "TransactionDetails.to", value: "**to %1$@**", comment: "[sent] to
(sent title 2/2)") - static let from = Localization(key: "TransactionDetails.from", value: "**at %1$@**", comment: "[received] at
(received title 2/2)") - static let blockHeightLabel = Localization(key: "TransactionDetails.blockHeightLabel", value: "**Confirmed in Block**", comment: "Block height label") - static let notConfirmedBlockHeightLabel = Localization(key: "TransactionDetails.notConfirmedBlockHeightLabel", value: "**Not Confirmed**", comment: "eg. Confirmed in Block: Not Confirmed") - static let staticTXIDLabel = Localization(key: "TransactionDetails.staticTXLabel", value: "**TXID:**", comment: "Label for TXID") - static let priceTimeStampLabel = Localization(key: "TransactionDetails.priceTimeStampPrefix", value: "**as of**", comment: "Prefix for price") - static let copyAllDetails = Localization(key: "TransactionDetails.copyAllDetails", value: "**Copy all details**", comment: "Copy all details") - static let copiedAll = Localization(key: "TransactionDetails.copiedAll", value: "**Copied**", comment: "Copied") - } - - // MARK: - Buy Center - - 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") - 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") - static let simplexTitle = Localization(key: "BuyCenter.simplexTitle", value: "**Simplex**", comment: "Simplex Title") - static let simplexFinancialDetails = Localization(key: "BuyCenter.simplexFinancialDetails", value: "**• Get Litecoin in 5 mins!\n• Buy Litecoin via credit card\n• Passport or State ID**", comment: "Simplex buy financial details") - static let changellyTitle = Localization(key: "BuyCenter.changellyTitle", value: "**Changelly**", comment: "Changelly Title") - static let changellyFinancialDetails = Localization(key: "BuyCenter.changellyFinancialDetails", value: "**• Change Litecoin for other cryptos\n• No ID Required\n• Buy via credit card\n• Global coverage**", comment: "Changelly buy financial details") - static let bitrefillTitle = Localization(key: "BuyCenter.BitrefillTitle", value: "**Bitrefill**", comment: "Bitrefill Title") - static let bitrefillFinancialDetails = Localization(key: "BuyCenter.bitrefillFinancialDetails", value: "**• Buy gift cards\n• Refill prepaid phones\n• Steam, Amazon, Hotels.com\n• Works in 170 countries**", comment: "Bitrefill buy financial details") - } - - static let barItemTitle = Localization(key: "BuyCenter.barItemTitle", value: "**Buy**", comment: "Buy Bar Item Title") - } - - // MARK: - Security Center - - enum SecurityCenter { - static let title = Localization(key: "SecurityCenter.title", value: "**Security Center**", comment: "Security Center Title") - static let info = Localization(key: "SecurityCenter.info", value: "**Enable all security features for maximum protection.**", comment: "Security Center Info") - enum Cells { - static let pinTitle = Localization(key: "SecurityCenter.pinTitle", value: "**6-Digit PIN**", comment: "PIN button title") - static let pinDescription = Localization(key: "SecurityCenter.pinDescription", value: "**Protects your Litewallet from unauthorized users.**", comment: "PIN button description") - static let touchIdTitle = Localization(key: "SecurityCenter.touchIdTitle", value: "**Touch ID**", comment: "Touch ID button title") - static let touchIdDescription = Localization(key: "SecurityCenter.touchIdDescription", value: "**Conveniently unlock your Litewallet and send money up to a set limit.**", comment: "Touch ID/FaceID button description") - static let paperKeyTitle = Localization(key: "SecurityCenter.paperKeyTitle", value: "**Paper Key**", comment: "Paper Key button title") - static let paperKeyDescription = Localization(key: "SecurityCenter.paperKeyDescription", value: "**The only way to access your Litecoin if you lose or upgrade your phone.**", comment: "Paper Key button description") - static let faceIdTitle = Localization(key: "SecurityCenter.faceIdTitle", value: "**Face ID**", comment: "Face ID button title") - } - } - - enum UpdatePin { - static let updateTitle = Localization(key: "UpdatePin.updateTitle", value: "**Update PIN**", comment: "Update PIN title") - static let createTitle = Localization(key: "UpdatePin.createTitle", value: "**Set PIN**", comment: "Update PIN title") - static let createTitleConfirm = Localization(key: "UpdatePin.createTitleConfirm", value: "**Re-Enter PIN**", comment: "Update PIN title") - static let createInstruction = Localization(key: "UpdatePin.createInstruction", value: "**Your PIN will be used to unlock your Litewallet and send money.**", comment: "PIN creation info.") - static let enterCurrent = Localization(key: "UpdatePin.enterCurrent", value: "**Enter your current PIN.**", comment: "Enter current PIN instruction") - static let enterNew = Localization(key: "UpdatePin.enterNew", value: "**Enter your new PIN.**", comment: "Enter new PIN instruction") - static let reEnterNew = Localization(key: "UpdatePin.reEnterNew", value: "**Re-Enter your new PIN.**", comment: "Re-Enter new PIN instruction") - static let caption = Localization(key: "UpdatePin.caption", value: "**Remember this PIN. If you forget it, you won't be able to access your Litecoin.**", comment: "Update PIN caption text") - static let setPinErrorTitle = Localization(key: "UpdatePin.setPinErrorTitle", value: "**Update PIN Error**", comment: "Update PIN failure alert view title") - static let setPinError = Localization(key: "UpdatePin.setPinError", value: "**Sorry, could not update PIN.**", comment: "Update PIN failure error message.") - } - - enum RecoverWallet { - static let next = Localization(key: "RecoverWallet.next", value: "**Next**", comment: "Next button label") - static let intro = Localization(key: "RecoverWallet.intro", value: "**Recover your Litewallet with your paper key.**", comment: "Recover wallet intro") - static let leftArrow = Localization(key: "RecoverWallet.leftArrow", value: "**Left Arrow**", comment: "Previous button accessibility label") - static let rightArrow = Localization(key: "RecoverWallet.rightArrow", value: "**Right Arrow**", comment: "Next button accessibility label") - static let done = Localization(key: "RecoverWallet.done", value: "**Done**", comment: "Done button text") - static let instruction = Localization(key: "RecoverWallet.instruction", value: "**Enter Paper Key**", comment: "Enter paper key instruction") - static let header = Localization(key: "RecoverWallet.header", value: "**Recover Wallet**", comment: "Recover wallet header") - static let subheader = Localization(key: "RecoverWallet.subheader", value: "**Enter the paper key for the wallet you want to recover.**", comment: "Recover wallet sub-header") - - static let headerResetPin = Localization(key: "RecoverWallet.header_reset_pin", value: "**Reset PIN**", comment: "Reset PIN with paper key: header") - static let subheaderResetPin = Localization(key: "RecoverWallet.subheader_reset_pin", value: "**To reset your PIN, enter the words from your paper key into the boxes below.**", comment: "Reset PIN with paper key: sub-header") - static let resetPinInfo = Localization(key: "RecoverWallet.reset_pin_more_info", value: "**Tap here for more information.**", comment: "Reset PIN with paper key: more information button.") - static let invalid = Localization(key: "RecoverWallet.invalid", value: "**The paper key you entered is invalid. Please double-check each word and try again.**", comment: "Invalid paper key message") - } - - enum ManageWallet { - static let title = Localization(key: "ManageWallet.title", value: "**Manage Wallet**", comment: "Manage wallet modal title") - static let textFieldLabel = Localization(key: "ManageWallet.textFeildLabel", value: "**Wallet Name**", comment: "Change Wallet name textfield label") - static let description = Localization(key: "ManageWallet.description", value: "**Your wallet name only appears in your account transaction history and cannot be seen by anyone else.**", comment: "Manage wallet description text") - static let creationDatePrefix = Localization(key: "ManageWallet.creationDatePrefix", value: "**You created your wallet on %1$@**", comment: "Wallet creation date prefix") - static let balance = Localization(key: "ManageWallet.balance", value: "**Balance**", comment: "Balance") - } - - enum AccountHeader { - static let defaultWalletName = Localization(key: "AccountHeader.defaultWalletName", value: "**My Litewallet**", comment: "Default wallet name") - static let manageButtonName = Localization(key: "AccountHeader.manageButtonName", value: "**MANAGE**", comment: "Manage wallet button title") - } - - enum VerifyPin { - static let title = Localization(key: "VerifyPin.title", value: "**PIN Required**", comment: "Verify PIN view title") - static let continueBody = Localization(key: "VerifyPin.continueBody", value: "**Please enter your PIN to continue.**", comment: "Verify PIN view body") - static let authorize = Localization(key: "VerifyPin.authorize", value: "**Please enter your PIN to authorize this transaction.**", comment: "Verify PIN for transaction view body") - static let touchIdMessage = Localization(key: "VerifyPin.touchIdMessage", value: "**Authorize this transaction**", comment: "Authorize transaction with touch id message") - } - - enum TouchIdSettings { - static let title = Localization(key: "TouchIdSettings.title", value: "**Touch ID**", comment: "Touch ID settings view title") - static let label = Localization(key: "TouchIdSettings.label", value: "**Use your fingerprint to unlock your Litewallet and send money up to a set limit.**", comment: "Touch Id screen label") - static let switchLabel = Localization(key: "TouchIdSettings.switchLabel", value: "**Enable Touch ID for Litewallet**", comment: "Touch id switch label.") - static let unavailableAlertTitle = Localization(key: "TouchIdSettings.unavailableAlertTitle", value: "**Touch ID Not Set Up**", comment: "Touch ID unavailable alert title") - static let unavailableAlertMessage = Localization(key: "TouchIdSettings.unavailableAlertMessage", value: "**You have not set up Touch ID on this device. Go to Settings->Touch ID & Passcode to set it up now.**", comment: "Touch ID unavailable alert message") - static let spendingLimit = Localization(key: "TouchIdSettings.spendingLimit", value: "**Spending limit: %1$@ (%2$@)**", comment: "Spending Limit: b100,000 ($100)") - static let limitValue = Localization(key: "TouchIdSettings.limitValue", value: "**%1$@ (%2$@)**", comment: " ł100,000 ($100)") - static let customizeText = Localization(key: "TouchIdSettings.customizeText", value: "**You can customize your Touch ID spending limit from the %1$@.**", comment: "You can customize your Touch ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button]") - static let linkText = Localization(key: "TouchIdSettings.linkText", value: "**Touch ID Spending Limit Screen**", comment: "Link Text (see TouchIdSettings.customizeText)") - } - - enum FaceIDSettings { - static let title = Localization(key: "FaceIDSettings.title", value: "**Face ID**", comment: "Face ID settings view title") - static let label = Localization(key: "FaceIDSettings.label", value: "**Use your face to unlock your Litewallet and send money up to a set limit.**", comment: "Face ID screen label") - static let switchLabel = Localization(key: "FaceIDSettings.switchLabel", value: "**Enable Face ID for Litewallet**", comment: "Face id switch label.") - static let unavailableAlertTitle = Localization(key: "FaceIDSettings.unavailableAlertTitle", value: "**Face ID Not Set Up**", comment: "Face ID unavailable alert title") - static let unavailableAlertMessage = Localization(key: "FaceIDSettings.unavailableAlertMessage", value: "**You have not set up Face ID on this device. Go to Settings->Face ID & Passcode to set it up now.**", comment: "Face ID unavailable alert message") - static let customizeText = Localization(key: "FaceIDSettings.customizeText", value: "**You can customize your Face ID spending limit from the %1$@.**", comment: "You can customize your Face ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button]") - static let linkText = Localization(key: "FaceIDSettings.linkText", value: "**Face ID Spending Limit Screen**", comment: "Link Text (see TouchIdSettings.customizeText)") - } - - enum SpendingLimit { - static let titleLabel = Localization(key: "SpendingLimit.title", value: "**Current Spending Limit: **", comment: "Current spending limit:") - } - - enum TouchIdSpendingLimit { - static let title = Localization(key: "TouchIdSpendingLimit.title", value: "**Touch ID Spending Limit**", comment: "Touch Id spending limit screen title") - static let body = Localization(key: "TouchIdSpendingLimit.body", value: "**You will be asked to enter your 6-digit PIN to send any transaction over your spending limit, and every 48 hours since the last time you entered your 6-digit PIN.**", comment: "Touch ID spending limit screen body") - static let requirePasscode = Localization(key: "TouchIdSpendingLimit", value: "**Always require passcode**", comment: "Always require passcode option") - } - - enum FaceIdSpendingLimit { - static let title = Localization(key: "FaceIDSpendingLimit.title", value: "**Face ID Spending Limit**", comment: "Face Id spending limit screen title") - } - - // MARK: - Settings - - enum Settings { - static let title = Localization(key: "Settings.title", value: "**Settings**", comment: "Settings title") - static let wallet = Localization(key: "Settings.wallet", value: "**Wallet**", comment: "Wallet Settings section header") - static let manage = Localization(key: "Settings.manage", value: "**Manage**", comment: "Manage settings section header") - static let support = Localization(key: "Settings.support", value: "**Support**", comment: "Support settings section header") - static let blockchain = Localization(key: "Settings.blockchain", value: "**Blockchain**", comment: "Blockchain settings section header") - static let importTile = Localization(key: "Settings.importTitle", value: "**Import Wallet**", comment: "Import wallet label") - static let notifications = Localization(key: "Settings.notifications", value: "**Notifications**", comment: "Notifications label") - static let touchIdLimit = Localization(key: "Settings.touchIdLimit", value: "**Touch ID Spending Limit**", comment: "Touch ID spending limit label") - static let currency = Localization(key: "Settings.currency", value: "**Display Currency**", comment: "Default currency label") - static let sync = Localization(key: "Settings.sync", value: "**Sync Blockchain**", comment: "Sync blockchain label") - static let shareData = Localization(key: "Settings.shareData", value: "**Share Anonymous Data**", comment: "Share anonymous data label") - static let earlyAccess = Localization(key: "Settings.earlyAccess", value: "**Join Early Access**", comment: "Join Early access label") - static let about = Localization(key: "Settings.about", value: "**About**", comment: "About label") - static let review = Localization(key: "Settings.review", value: "**Leave us a Review**", comment: "Leave review button label") - static let enjoying = Localization(key: "Settings.enjoying", value: "**Are you enjoying Litewallet?**", comment: "Are you enjoying Litewallet alert message body") - static let wipe = Localization(key: "Settings.wipe", value: "**Start/Recover Another Wallet**", comment: "Start or recover another wallet menu label.") - static let advancedTitle = Localization(key: "Settings.advancedTitle", value: "**Advanced Settings**", comment: "Advanced Settings title") - static let faceIdLimit = Localization(key: "Settings.faceIdLimit", value: "**Face ID Spending Limit**", comment: "Face ID spending limit label") - static let languages = Localization(key: "Settings.languages", value: "**Languages**", comment: "Languages label") - static let litewalletVersion = Localization(key: "Settings.litewallet.version", value: "**Litewallet Version:**", comment: "Litewallet version") - static let litewalletEnvironment = Localization(key: "Settings.litewallet.environment", value: "**Litewallet Environment:**", comment: "Litewallet environment") - static let socialLinks = Localization(key: "Settings.socialLinks", value: "**Social Links:**", comment: "Litewallet Social links") - static let litewalletPartners = Localization(key: "Settings.litewallet.partners", value: "**Litewallet Partners:**", comment: "Litewallet Partners") - static let currentLocale = Localization(key: "Settings.currentLocale", value: "**Current Locale:**", comment: "Current Locale") - static let changeLanguageMessage = Localization(key: "Settings.ChangeLanguage.alertMessage", value: nil, comment: nil) - } - - enum About { - static let title = Localization(key: "About.title", value: "**About**", comment: "About screen title") - static let blog = Localization(key: "About.blog", value: "**Website**", comment: "About screen website label") - static let twitter = Localization(key: "About.twitter", value: "**Twitter**", comment: "About screen twitter label") - static let reddit = Localization(key: "About.reddit", value: "**Reddit**", comment: "About screen reddit label") - static let privacy = Localization(key: "About.privacy", value: "**Privacy Policy**", comment: "Privay Policy button label") - static let footer = Localization(key: "About.footer", value: "**Made by the LiteWallet Team\nof the\nLitecoin Foundation\n%1$@**", comment: "About screen footer") - } - - enum PushNotifications { - static let title = Localization(key: "PushNotifications.title", value: "**Notifications**", comment: "Push notifications settings view title label") - static let body = Localization(key: "PushNotifications.body", value: "**Turn on notifications to receive special messages from Litewallet in the future.**", comment: "Push notifications settings view body") - static let label = Localization(key: "PushNotifications.label", value: "**Push Notifications**", comment: "Push notifications toggle switch label") - static let on = Localization(key: "PushNotifications.on", value: "**On**", comment: "Push notifications are on label") - static let off = Localization(key: "PushNotifications.off", value: "**Off**", comment: "Push notifications are off label") - } - - enum DefaultCurrency { - static let rateLabel = Localization(key: "DefaultCurrency.rateLabel", value: "**Exchange Rate**", comment: "Exchange rate label") - static let bitcoinLabel = Localization(key: "DefaultCurrency.bitcoinLabel", value: "**Litecoin Display Unit**", comment: "Litecoin denomination picker label") - static let chooseFiatLabel = Localization(key: "DefaultCurrency.chooseFiatLabel", value: "**Choose Fiat:**", comment: "Label to pick fiat") - } - - enum SyncingView { - static let syncing = Localization(key: "SyncingView.syncing", value: "**Syncing**", comment: "Syncing view syncing state header text") - static let connecting = Localization(key: "SyncingView.connecting", value: "**Connecting**", comment: "Syncing view connectiong state header text") - } - - enum SyncingHeader { - static let syncing = Localization(key: "SyncingHeader.syncing", value: "**Syncing...**", comment: "Syncing view syncing state header text") - static let connecting = Localization(key: "SyncingHeader.connecting", value: "**Connecting...**", comment: "Syncing view connection state header text") - static let success = Localization(key: "SyncingHeader.success", value: "**Success!**", comment: "Syncing header success state header text") - static let rescanning = Localization(key: "SyncingHeader.rescan", value: "**Rescanning...*", comment: "Rescanning header success state header text") - } - - enum ReScan { - static let header = Localization(key: "ReScan.header", value: "**Sync Blockchain**", comment: "Sync Blockchain view header") - static let subheader1 = Localization(key: "ReScan.subheader1", value: "**Estimated time**", comment: "Subheader label") - static let subheader2 = Localization(key: "ReScan.subheader2", value: "**When to Sync?**", comment: "Subheader label") - static let body1 = Localization(key: "ReScan.body1", value: "**20-45 minutes**", comment: "extimated time") - static let body2 = Localization(key: "ReScan.body2", value: "**If a transaction shows as completed on the Litecoin network but not in your Litewallet.**", comment: "Syncing explanation") - static let body3 = Localization(key: "ReScan.body3", value: "**You repeatedly get an error saying your transaction was rejected.**", comment: "Syncing explanation") - static let buttonTitle = Localization(key: "ReScan.buttonTitle", value: "**Start Sync**", comment: "Start Sync button label") - static let footer = Localization(key: "ReScan.footer", value: "**You will not be able to send money while syncing with the blockchain.**", comment: "Sync blockchain view footer") - static let alertTitle = Localization(key: "ReScan.alertTitle", value: "**Sync with Blockchain?**", comment: "Alert message title") - static let alertMessage = Localization(key: "ReScan.alertMessage", value: "**You will not be able to send money while syncing.**", comment: "Alert message body") - static let alertAction = Localization(key: "ReScan.alertAction", value: "**Sync**", comment: "Alert action button label") - } - - enum ShareData { - static let header = Localization(key: "ShareData.header", value: "**Share Data?**", comment: "Share data header") - static let body = Localization(key: "ShareData.body", value: "**Help improve Litewallet by sharing your anonymous data with us. This does not include any financial information. We respect your financial privacy.**", comment: "Share data view body") - static let toggleLabel = Localization(key: "ShareData.toggleLabel", value: "**Share Anonymous Data?**", comment: "Share data switch label.") - } - - enum ConfirmPaperPhrase { - static let word = Localization(key: "ConfirmPaperPhrase.word", value: "**Word #%1$@**", comment: "Word label eg. Word #1, Word #2") - static let label = Localization(key: "ConfirmPaperPhrase.label", value: "**To make sure everything was written down correctly, please enter the following words from your paper key.**", comment: "Confirm paper phrase view label.") - static let error = Localization(key: "ConfirmPaperPhrase.error", value: "**The words entered do not match your paper key. Please try again.**", comment: "Confirm paper phrase error message") - } - - enum StartPaperPhrase { - static let body = Localization(key: "StartPaperPhrase.body", value: "**Your paper key is the only way to restore your Litewallet if your mobile is unavailable.\n No one in the Litecoin Foundation team can give this paper key to you!\n\nWe will show you a list of words to write down on a piece of paper and keep safe.\n\nPLEASE MAKE BACKUPS AND DON'T LOSE IT!**", comment: "Paper key explanation text.") - static let buttonTitle = Localization(key: "StartPaperPhrase.buttonTitle", value: "**Write Down Paper Key**", comment: "button label") - static let againButtonTitle = Localization(key: "StartPaperPhrase.againButtonTitle", value: "**Write Down Paper Key Again**", comment: "button label") - static let date = Localization(key: "StartPaperPhrase.date", value: "**You last wrote down your paper key on %1$@**", comment: "Argument is date") - } - - enum WritePaperPhrase { - static let instruction = Localization(key: "WritePaperPhrase.instruction", value: "**Write down each word in order and store it in a safe place.**", comment: "Paper key instructions.") - static let step = Localization(key: "WritePaperPhrase.step", value: "**%1$d of %2$d**", comment: "1 of 3") - static let next = Localization(key: "WritePaperPhrase.next", value: "**Next**", comment: "button label") - static let previous = Localization(key: "WritePaperPhrase.previous", value: "**Previous**", comment: "button label") - } - - enum TransactionDirection { - static let to = Localization(key: "TransactionDirection.to", value: "**Sent to this Address**", comment: "(this transaction was) Sent to this address:") - static let received = Localization(key: "TransactionDirection.address", value: "**Received at this Address**", comment: "(this transaction was) Received at this address:") - } - - enum RequestAnAmount { - static let title = Localization(key: "RequestAnAmount.title", value: "**Request an Amount**", comment: "Request a specific amount of Litecoin") - static let noAmount = Localization(key: "RequestAnAmount.noAmount", value: "**Please enter an amount first.**", comment: "No amount entered error message.") - } - - // MARK: - Security Alerts - - enum SecurityAlerts { - static let pinSet = Localization(key: "Alerts.pinSet", value: "**PIN Set**", comment: "Alert Header label (the PIN was set)") - static let paperKeySet = Localization(key: "Alerts.paperKeySet", value: "**Paper Key Set**", comment: "Alert Header Label (the paper key was set)") - static let sendSuccess = Localization(key: "Alerts.sendSuccess", value: "**Send Confirmation**", comment: "Send success alert header label (confirmation that the send happened)") - static let resolvedSuccess = Localization(key: "Alerts.resolvedSuccess", value: "**Resolved Success**", comment: "Resolved Success") - static let resolvedSuccessSubheader = Localization(key: "Alerts.resolvedSuccessSubheader", value: "Resolved", comment: "Resolved Success subheader") - static let sendFailure = Localization(key: "Alerts.sendFailure", value: "**Send failed**", comment: "Send failure alert header label (the send failed to happen)") - static let paperKeySetSubheader = Localization(key: "Alerts.paperKeySetSubheader", value: "**Awesome!**", comment: "Alert Subheader label (playfully positive)") - static let sendSuccessSubheader = Localization(key: "Alerts.sendSuccessSubheader", value: "**Money Sent!**", comment: "Send success alert subheader label (e.g. the money was sent)") - static let copiedAddressesHeader = Localization(key: "Alerts.copiedAddressesHeader", value: "**Addresses Copied**", comment: "'the addresses were copied'' Alert title") - static let copiedAddressesSubheader = Localization(key: "Alerts.copiedAddressesSubheader", value: "**All wallet addresses successfully copied.**", comment: "Addresses Copied Alert sub header") - } - - enum MenuButton { - static let security = Localization(key: "MenuButton.security", value: "**Security Center**", comment: "Menu button title") - static let support = Localization(key: "MenuButton.customer.support", value: "**Customer support**", comment: "Menu button title") - static let settings = Localization(key: "MenuButton.settings", value: "**Settings**", comment: "Menu button title") - static let lock = Localization(key: "MenuButton.lock", value: "**Lock Wallet**", comment: "Menu button title") - static let buy = Localization(key: "MenuButton.buy", value: "**Buy Litecoin**", comment: "Buy Litecoin title") - } - - enum MenuViewController { - static let modalTitle = Localization(key: "MenuViewController.modalTitle", value: "**Menu**", comment: "Menu modal title") - } - - enum StartViewController { - static let createButton = Localization(key: "MenuViewController.createButton", value: "**Create New Wallet**", comment: "button label") - static let recoverButton = Localization(key: "MenuViewController.recoverButton", value: "**Recover Wallet**", comment: "button label") - static let message = Localization(key: "StartViewController.message", value: "**The most secure and safest way to use Litecoin.**", comment: "Start view message") - } - - enum AccessibilityLabels { - static let close = Localization(key: "AccessibilityLabels.close", value: "**Close**", comment: "Close modal button accessibility label") - static let faq = Localization(key: "AccessibilityLabels.faq", value: "**Support Center**", comment: "Support center accessibiliy label") - } - - enum Search { - static let sent = Localization(key: "Search.sent", value: "**sent**", comment: "Sent filter label") - static let received = Localization(key: "Search.received", value: "**received**", comment: "Received filter label") - static let pending = Localization(key: "Search.pending", value: "**pending**", comment: "Pending filter label") - static let complete = Localization(key: "Search.complete", value: "**complete**", comment: "Complete filter label") - } - - enum Prompts { - static let affirm = Localization(key: "Prompts.PaperKey.affirm", value: "**Continue**", comment: "Affirm button title.") - static let cancel = Localization(key: "Prompts.PaperKey.cancel", value: "**Cancel**", comment: "Cancel button.") - static let enable = Localization(key: "Prompts.PaperKey.enable", value: "**Enable**", comment: "Enable button.") - static let dismiss = Localization(key: "Prompts.dismiss", value: "****Dismiss**", comment: "Dismiss button.") - enum TouchId { - static let title = Localization(key: "Prompts.TouchId.title", value: "**Enable Touch ID**", comment: "Enable touch ID prompt title") - static let body = Localization(key: "Prompts.TouchId.body", value: "**Tap here to enable Touch ID**", comment: "Enable touch ID prompt body") - } - - enum PaperKey { - static let title = Localization(key: "Prompts.PaperKey.title", value: "**Action Required**", comment: "An action is required (You must do this action).") - static let body = Localization(key: "Prompts.PaperKey.body", value: "**Your Paper Key must be kept in a safe place. It is the only way modify or restore your Litewallet or transfer your Litecoin. Please write it down.**", comment: "Warning about paper key.") - } - - enum SetPin { - static let title = Localization(key: "Prompts.SetPin.title", value: "**Set PIN**", comment: "Set PIN prompt title.") - static let body = Localization(key: "Prompts.SetPin.body", value: "**Litewallet requires a 6-digit PIN. Please set and store your PIN in a safe place.**", comment: "Upgrade PIN prompt body.") - } - - enum RecommendRescan { - static let title = Localization(key: "Prompts.RecommendRescan.title", value: "**Transaction Rejected**", comment: "Transaction rejected prompt title") - static let body = Localization(key: "Prompts.RecommendRescan.body", value: "**Your wallet may be out of sync. This can often be fixed by rescanning the blockchain.**", comment: "Transaction rejected prompt body") - } - - enum NoPasscode { - static let title = Localization(key: "Prompts.NoPasscode.title", value: "**Turn device passcode on**", comment: "No Passcode set warning title") - static let body = Localization(key: "Prompts.NoPasscode.body", value: "**A device passcode is needed to safeguard your wallet.**", comment: "No passcode set warning body") - } - - enum ShareData { - static let title = Localization(key: "Prompts.ShareData.title", value: "**Share Anonymous Data**", comment: "Share data prompt title") - static let body = Localization(key: "Prompts.ShareData.body", value: "**Help improve Litewallet by sharing your anonymous data with us**", comment: "Share data prompt body") - } - - enum FaceId { - static let title = Localization(key: "Prompts.FaceId.title", value: "**Enable Face ID**", comment: "Enable face ID prompt title") - static let body = Localization(key: "Prompts.FaceId.body", value: "**Tap here to enable Face ID**", comment: "Enable face ID prompt body") - } - } - - // MARK: - Payment Protocol - - enum PaymentProtocol { - enum Errors { - static let untrustedCertificate = Localization(key: "PaymentProtocol.Errors.untrustedCertificate", value: "**untrusted certificate**", comment: "Untrusted certificate payment protocol error message") - static let missingCertificate = Localization(key: "PaymentProtocol.Errors.missingCertificate", value: "**missing certificate**", comment: "Missing certificate payment protocol error message") - static let unsupportedSignatureType = Localization(key: "PaymentProtocol.Errors.unsupportedSignatureType", value: "**unsupported signature type**", comment: "Unsupported signature type payment protocol error message") - static let requestExpired = Localization(key: "PaymentProtocol.Errors.requestExpired", value: "**request expired**", comment: "Request expired payment protocol error message") - static let badPaymentRequest = Localization(key: "PaymentProtocol.Errors.badPaymentRequest", value: "**Bad Payment Request**", comment: "Bad Payment request alert title") - static let smallOutputErrorTitle = Localization(key: "PaymentProtocol.Errors.smallOutputError", value: "**Couldn't make payment**", comment: "Payment too small alert title") - static let smallPayment = Localization(key: "PaymentProtocol.Errors.smallPayment", value: "**Litecoin payments can't be less than %1$@.**", comment: "Amount too small error message") - static let smallTransaction = Localization(key: "PaymentProtocol.Errors.smallTransaction", value: "**Litecoin transaction outputs can't be less than $@.**", comment: "Output too small error message.") - static let corruptedDocument = Localization(key: "PaymentProtocol.Errors.corruptedDocument", value: "**Unsupported or corrupted document**", comment: "Error opening payment protocol file message") - } - } - - enum URLHandling { - static let addressListAlertTitle = Localization(key: "URLHandling.addressListAlertTitle", value: "**Copy Wallet Addresses**", comment: "Authorize to copy wallet address alert title") - static let addressListAlertMessage = Localization(key: "URLHandling.addressaddressListAlertMessage", value: "**Copy wallet addresses to clipboard?**", comment: "Authorize to copy wallet addresses alert message") - static let addressListVerifyPrompt = Localization(key: "URLHandling.addressList", value: "**Authorize to copy wallet address to clipboard**", comment: "Authorize to copy wallet address PIN view prompt.") - static let copy = Localization(key: "URLHandling.copy", value: "**Copy**", comment: "Copy wallet addresses alert button label") - } - - enum ApiClient { - static let notReady = Localization(key: "ApiClient.notReady", value: "**Wallet not ready**", comment: "Wallet not ready error message") - static let jsonError = Localization(key: "ApiClient.jsonError", value: "**JSON Serialization Error**", comment: "JSON Serialization error message") - static let tokenError = Localization(key: "ApiClient.tokenError", value: "**Unable to retrieve API token**", comment: "API Token error message") - } - - enum CameraPlugin { - static let centerInstruction = Localization(key: "CameraPlugin.centerInstruction", value: "**Center your ID in the box**", comment: "Camera plugin instruction") - } - - enum LocationPlugin { - static let disabled = Localization(key: "LocationPlugin.disabled", value: "**Location services are disabled.**", comment: "Location services disabled error") - static let notAuthorized = Localization(key: "LocationPlugin.notAuthorized", value: "**Litewallet does not have permission to access location services.**", comment: "No permissions for location services") - } - - enum Webview { - static let updating = Localization(key: "Webview.updating", value: "**Updating...**", comment: "Updating webview message") - static let errorMessage = Localization(key: "Webview.errorMessage", value: "**There was an error loading the content. Please try again.**", comment: "Webview loading error message") - static let dismiss = Localization(key: "Webview.dismiss", value: "**Dismiss**", comment: "Dismiss button label") - } - - enum TimeSince { - static let seconds = Localization(key: "TimeSince.seconds", value: "**%1$@ s**", comment: "6 s (6 seconds)") - static let minutes = Localization(key: "TimeSince.minutes", value: "**%1$@ m**", comment: "6 m (6 minutes)") - static let hours = Localization(key: "TimeSince.hours", value: "**%1$@ h**", comment: "6 h (6 hours)") - static let days = Localization(key: "TimeSince.days", value: "**%1$@ d**", comment: "6 d (6 days)") - } - - enum Import { - static let leftCaption = Localization(key: "Import.leftCaption", value: "**Wallet to be imported**", comment: "Caption for graphics") - static let rightCaption = Localization(key: "Import.rightCaption", value: "**Your Litewallet Wallet**", comment: "Caption for graphics") - static let importMessage = Localization(key: "Import.message", value: "**Importing a wallet transfers all the money from your other wallet into your Litewallet wallet using a single transaction.**", comment: "Import wallet intro screen message") - static let importWarning = Localization(key: "Import.warning", value: "**Importing a wallet does not include transaction history or other details.**", comment: "Import wallet intro warning message") - static let scan = Localization(key: "Import.scan", value: "**Scan Private Key**", comment: "Scan Private key button label") - static let title = Localization(key: "Import.title", value: "**Import Wallet**", comment: "Import Wallet screen title") - static let importing = Localization(key: "Import.importing", value: "**Importing Wallet**", comment: "Importing wallet progress view label") - static let confirm = Localization(key: "Import.confirm", value: "**Send %1$@ from this private key into your wallet? The Litecoin network will receive a fee of %2$@.**", comment: "Sweep private key confirmation message") - static let checking = Localization(key: "Import.checking", value: "**Checking private key balance...**", comment: "Checking private key balance progress view text") - static let password = Localization(key: "Import.password", value: "**This private key is password protected.**", comment: "Enter password alert view title") - static let passwordPlaceholder = Localization(key: "Import.passwordPlaceholder", value: "**password**", comment: "password textfield placeholder") - static let unlockingActivity = Localization(key: "Import.unlockingActivity", value: "**Unlocking Key**", comment: "Unlocking Private key activity view message.") - static let importButton = Localization(key: "Import.importButton", value: "**Import**", comment: "Import button label") - static let success = Localization(key: "Import.success", value: "**Success**", comment: "Import wallet success alert title") - static let successBody = Localization(key: "Import.SuccessBody", value: "**Successfully imported wallet.**", comment: "Successfully imported wallet message body") - static let wrongPassword = Localization(key: "Import.wrongPassword", value: "**Wrong password, please try again.**", comment: "Wrong password alert message") - enum Error { - static let notValid = Localization(key: "Import.Error.notValid", value: "**Not a valid private key**", comment: "Not a valid private key error message") - static let duplicate = Localization(key: "Import.Error.duplicate", value: "**This private key is already in your wallet.**", comment: "Duplicate key error message") - static let empty = Localization(key: "Import.Error.empty", value: "**This private key is empty.**", comment: "empty private key error message") - static let highFees = Localization(key: "Import.Error.highFees", value: "**Transaction fees would cost more than the funds available on this private key.**", comment: "High fees error message") - static let signing = Localization(key: "Import.Error.signing", value: "**Error signing transaction**", comment: "Import signing error message") - } - } - - enum WipeWallet { - static let title = Localization(key: "WipeWallet.title", value: "**Start or Recover Another Wallet**", comment: "Wipe wallet navigation item title.") - static let alertTitle = Localization(key: "WipeWallet.alertTitle", value: "**Wipe Wallet?**", comment: "Wipe wallet alert title") - static let alertMessage = Localization(key: "WipeWallet.alertMessage", value: "**Are you sure you want to delete this wallet?**", comment: "Wipe wallet alert message") - static let wipe = Localization(key: "WipeWallet.wipe", value: "**Wipe**", comment: "Wipe wallet button title") - static let wiping = Localization(key: "WipeWallet.wiping", value: "**Wiping...**", comment: "Wiping activity message") - static let failedTitle = Localization(key: "WipeWallet.failedTitle", value: "**Failed**", comment: "Failed wipe wallet alert title") - static let failedMessage = Localization(key: "WipeWallet.failedMessage", value: "**Failed to wipe wallet.**", comment: "Failed wipe wallet alert message") - static let instruction = Localization(key: "WipeWallet.instruction", value: "**To start a new wallet or restore an existing wallet, you must first erase the wallet that is currently installed. To continue, enter the current wallet's Paper Key.**", comment: "Enter key to wipe wallet instruction.") - static let startMessage = Localization(key: "WipeWallet.startMessage", value: "**Starting or recovering another wallet allows you to access and manage a different Litewallet wallet on this device.**", comment: "Start wipe wallet view message") - static let startWarning = Localization(key: "WipeWallet.startWarning", value: "**Your current wallet will be removed from this device. If you wish to restore it in the future, you will need to enter your Paper Key.**", comment: "Start wipe wallet view warning") - static let emptyWallet = Localization(key: "WipeWallet.emptyWallet", value: "**Forget seed or PIN?**", comment: "Warning if user lost phrase") - static let resetTitle = Localization(key: "resetTitle", value: "** Delete my Litewallet **", comment: "Warning Empty Wipe title") - static let resetButton = Localization(key: "resetButton", value: "**Yes, reset wallet**", comment: "Reset walet button title") - static let warningTitle = Localization(key: "WipeWallet.warningTitle", value: "**PLEASE READ!**", comment: "Warning title") - static let warningDescription = Localization(key: "WipeWallet.warningDescription", value: "**Your LiteWallet is empty. Resetting will delete the old private key and wipe the app data.\n\nAfter the reset, be prepared to record the new 12 words and keep them in a very secure place.\n\nNo LiteWallet developers can retrieve this seed for you.**", comment: "Warning description") - static let warningAlert = Localization(key: "WipeWallet.warningAlert", value: "**DO NOT LOSE IT!**", comment: "Warning Alert") - static let deleteDatabase = Localization(key: "WipeWallet.deleteDatabase", value: "**Delete database**", comment: "Delete db") - static let alertDeleteTitle = Localization(key: "WipeWallet.alertDeleteTitle", value: "**Delet Database**", comment: "Delete database title") - static let deleteMessageTitle = Localization(key: "WipeWallet.deleteMessageTitle", value: "**This deletes the database but retains the PIN and phrase. You will be asked to confirm your existing PIN, seed and will re-sync the new db**", comment: "Delete database message") - static let deleteSync = Localization(key: "WipeWallet.deleteSync", value: "**Delete & Sync**", comment: "Delete and sync") - } - - enum FeeSelector { - static let title = Localization(key: "FeeSelector.title", value: "**Processing Speed**", comment: "Fee Selector title") - static let regularLabel = Localization(key: "FeeSelector.regularLabel", value: "**Estimated Delivery: 2.5 - 5+ minutes**", comment: "Fee Selector regular fee description") - static let economyLabel = Localization(key: "FeeSelector.economyLabel", value: "**Estimated Delivery: ~10 minutes**", comment: "Fee Selector economy fee description") - static let luxuryLabel = Localization(key: "FeeSelector.luxuryLabel", value: "**Delivery: 2.5 - 5+ minutes**", comment: "Fee Selector luxury fee description") - static let economyWarning = Localization(key: "FeeSelector.economyWarning", value: "**This option is not recommended for time-sensitive transactions.**", comment: "Warning message for economy fee") - static let luxuryMessage = Localization(key: "FeeSelector.luxuryMessage", value: "**This option virtually guarantees acceptance of your transaction while you pay a premium.**", comment: "Message for luxury fee") - - static let regular = Localization(key: "FeeSelector.regular", value: "**Regular**", comment: "Regular fee") - static let economy = Localization(key: "FeeSelector.economy", value: "**Economy**", comment: "Economy fee") - static let luxury = Localization(key: "FeeSelector.luxury", value: "**Luxury**", comment: "Luxury fee") - } - - enum Confirmation { - static let title = Localization(key: "Confirmation.title", value: "**Confirmation**", comment: "Confirmation Screen title") - static let send = Localization(key: "Confirmation.send", value: "**Send**", comment: "Send: (amount)") - static let to = Localization(key: "Confirmation.to", value: "**To**", comment: "To: (address)") - static let staticAddressLabel = Localization(key: "Confirmation.staticAddressLabel", value: "**ADDRESS:**", comment: "Address label") - - 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 feeLabel = Localization(key: "Confirmation.feeLabel", value: "**Network Fee:**", comment: "Network Fee: ($1.00)") - static let shortFeeLabel = Localization(key: "Confirmation.shortFeeLabel", value: "**FEE:**", comment: "Short Network Fee: ($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%") - } - - enum NodeSelector { - static let manualButton = Localization(key: "NodeSelector.manualButton", value: "**Switch to Manual Mode**", comment: "Switch to manual mode button label") - static let automaticButton = Localization(key: "NodeSelector.automaticButton", value: "**Switch to Automatic Mode**", comment: "Switch to automatic mode button label") - static let title = Localization(key: "NodeSelector.title", value: "**Litecoin Nodes**", comment: "Node Selector view title") - static let nodeLabel = Localization(key: "NodeSelector.nodeLabel", value: "**Current Primary Node**", comment: "Node address label") - static let statusLabel = Localization(key: "NodeSelector.statusLabel", value: "**Node Connection Status**", comment: "Node status label") - static let connected = Localization(key: "NodeSelector.connected", value: "**Connected**", comment: "Node is connected label") - static let notConnected = Localization(key: "NodeSelector.notConnected", value: "**Not Connected**", comment: "Node is not connected label") - static let enterTitle = Localization(key: "NodeSelector.enterTitle", value: "**Enter Node**", comment: "Enter Node ip address view title") - static let enterBody = Localization(key: "NodeSelector.enterBody", value: "**Enter Node IP address and port (optional)**", comment: "Enter node ip address view body") - } - - enum Welcome { - static let title = Localization(key: "Welcome.title", value: "**Welcome to Litewallet**", comment: "Welcome view title") - static let body = Localization(key: "Welcome.body", value: "**Litewallet now has a brand new look and some new features.\n\nAll coins are displayed in lites (ł). 1 Litecoin (Ł) = 1000 lites (ł).**", comment: "Welcome view body text") - } - - enum Fragments { - static let or = Localization(key: "Fragment.or", value: "**or**", comment: "Or") - static let confirm = Localization(key: "Fragment.confirm", value: "**confirm**", comment: "Confirm") - static let to = Localization(key: "Fragment.to", value: "**to**", comment: "to") - static let sorry = Localization(key: "Fragment.sorry", value: "**sorry**", comment: "sorry") - } -} diff --git a/loafwallet/src/Environment.swift b/loafwallet/src/Environment.swift deleted file mode 100644 index 2076ba04e..000000000 --- a/loafwallet/src/Environment.swift +++ /dev/null @@ -1,83 +0,0 @@ -import UIKit - -struct E { - static let isTestnet: Bool = { - #if Testnet - return true - #else - return false - #endif - }() - - static let isTestFlight: Bool = { - #if Testflight - return true - #else - return false - #endif - }() - - static let isSimulator: Bool = { - #if arch(i386) || arch(x86_64) - return true - #else - return false - #endif - }() - - static let isDebug: Bool = { - #if Debug - return true - #else - return false - #endif - }() - - static let isRelease: Bool = { - #if Release - return true - #else - return false - #endif - }() - - static let isScreenshots: Bool = { - #if Screenshots - return true - #else - return false - #endif - }() - - static var isIPhone4: Bool { - return (UIScreen.main.bounds.size.height == 480.0) - } - - static var isIPhone5: Bool { - return (UIScreen.main.bounds.size.height == 568.0) && (E.is32Bit) - } - - static var isIPhoneX: Bool { - return (UIScreen.main.bounds.size.height == 812.0) - } - - static var isIPhone8Plus: Bool { - return (UIScreen.main.bounds.size.height == 736.0) - } - - static var isIPhoneXsMax: Bool { - return (UIScreen.main.bounds.size.height == 812.0) - } - - static var isIPad: Bool { - return (UIDevice.current.userInterfaceIdiom == .pad) - } - - static let is32Bit: Bool = { - MemoryLayout.size == MemoryLayout.size - }() - - static var screenHeight: CGFloat { - return UIScreen.main.bounds.size.height - } -} diff --git a/loafwallet/src/Models/KeyboardNotificationInfo.swift b/loafwallet/src/Models/KeyboardNotificationInfo.swift deleted file mode 100644 index e5ce87348..000000000 --- a/loafwallet/src/Models/KeyboardNotificationInfo.swift +++ /dev/null @@ -1,33 +0,0 @@ -import UIKit - -struct KeyboardNotificationInfo { - var deltaY: CGFloat { - return endFrame.minY - startFrame.minY - } - - var animationOptions: UIViewAnimationOptions { - return UIViewAnimationOptions(rawValue: animationCurve << 16) - } - - let animationDuration: Double - - init?(_ userInfo: [AnyHashable: Any]?) { - guard let userInfo = userInfo else { return nil } - guard let endFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue, - let startFrame = userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue, - let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber, - let animationCurve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber - else { - return nil - } - - self.endFrame = endFrame.cgRectValue - self.startFrame = startFrame.cgRectValue - self.animationDuration = animationDuration.doubleValue - self.animationCurve = animationCurve.uintValue - } - - private let endFrame: CGRect - private let startFrame: CGRect - private let animationCurve: UInt -} diff --git a/loafwallet/src/POSTBouncer.html b/loafwallet/src/POSTBouncer.html deleted file mode 100644 index a710f739c..000000000 --- a/loafwallet/src/POSTBouncer.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -

Loading...

- - diff --git a/loafwallet/src/Platform/BRAPIClient+Assets.swift b/loafwallet/src/Platform/BRAPIClient+Assets.swift deleted file mode 100644 index 1fbe2ebee..000000000 --- a/loafwallet/src/Platform/BRAPIClient+Assets.swift +++ /dev/null @@ -1,296 +0,0 @@ -import Foundation - -open class AssetArchive { - let name: String - private let fileManager: FileManager - private let archiveUrl: URL - private let archivePath: String - private let extractedPath: String - let extractedUrl: URL - private let apiClient: BRAPIClient - - private var archiveExists: Bool { - return fileManager.fileExists(atPath: archivePath) - } - - private var extractedDirExists: Bool { - return fileManager.fileExists(atPath: extractedPath) - } - - private var version: String? { - guard let archiveContents = try? Data(contentsOf: archiveUrl) - else { - return nil - } - return archiveContents.sha256.hexString - } - - init?(name: String, apiClient: BRAPIClient) { - self.name = name - self.apiClient = apiClient - fileManager = FileManager.default - let bundleDirUrl = apiClient.bundleDirUrl - archiveUrl = bundleDirUrl.appendingPathComponent("\(name).tar") - extractedUrl = bundleDirUrl.appendingPathComponent("\(name)-extracted", isDirectory: true) - archivePath = archiveUrl.path - extractedPath = extractedUrl.path - } - - func update(completionHandler: @escaping (_ error: Error?) -> Void) { - do { - try ensureExtractedPath() - // If directory creation failed due to file existing - } catch let error as NSError where error.code == 512 && error.domain == NSCocoaErrorDomain { - do { - try fileManager.removeItem(at: apiClient.bundleDirUrl) - try fileManager.createDirectory(at: extractedUrl, withIntermediateDirectories: true, attributes: nil) - } catch let e { - return completionHandler(e) - } - } catch let e { - return completionHandler(e) - } - if !archiveExists { - // see if the archive was shipped with the app - copyBundledArchive() - } - if !archiveExists { - // we do not have the archive, download a fresh copy - return downloadCompleteArchive(completionHandler: completionHandler) - } - apiClient.getAssetVersions(name) { versions, err in - DispatchQueue.global(qos: .utility).async { - if let err = err { - print("[AssetArchive] could not get asset versions. error: \(err)") - return completionHandler(err) - } - guard let versions = versions, let version = self.version - else { - return completionHandler(BRAPIClientError.unknownError) - } - if versions.index(of: version) == versions.count - 1 { - // have the most recent version - print("[AssetArchive] already at most recent version of bundle \(self.name)") - do { - try self.extractArchive() - return completionHandler(nil) - } catch let e { - print("[AssetArchive] error extracting bundle: \(e)") - return completionHandler(BRAPIClientError.unknownError) - } - } else { - // need to update the version - self.downloadAndPatchArchive(fromVersion: version, completionHandler: completionHandler) - } - } - } - } - - fileprivate func downloadCompleteArchive(completionHandler: @escaping (_ error: Error?) -> Void) { - apiClient.downloadAssetArchive(name) { data, err in - DispatchQueue.global(qos: .utility).async { - if let err = err { - print("[AssetArchive] error downloading complete archive \(self.name) error=\(err)") - return completionHandler(err) - } - guard let data = data - else { - return completionHandler(BRAPIClientError.unknownError) - } - do { - try data.write(to: self.archiveUrl, options: .atomic) - try self.extractArchive() - return completionHandler(nil) - } catch let e { - print("[AssetArchive] error extracting complete archive \(self.name) error=\(e)") - return completionHandler(e) - } - } - } - } - - fileprivate func downloadAndPatchArchive(fromVersion: String, completionHandler: @escaping (_ error: Error?) -> Void) - { - apiClient.downloadAssetDiff(name, fromVersion: fromVersion) { data, err in - DispatchQueue.global(qos: .utility).async { - if let err = err { - print("[AssetArchive] error downloading asset path \(self.name) \(fromVersion) error=\(err)") - return completionHandler(err) - } - guard let data = data - else { - return completionHandler(BRAPIClientError.unknownError) - } - let fm = self.fileManager - let diffPath = self.apiClient.bundleDirUrl.appendingPathComponent("\(self.name).diff").path - let oldBundlePath = self.apiClient.bundleDirUrl.appendingPathComponent("\(self.name).old").path - do { - if fm.fileExists(atPath: diffPath) { - try fm.removeItem(atPath: diffPath) - } - if fm.fileExists(atPath: oldBundlePath) { - try fm.removeItem(atPath: oldBundlePath) - } - try data.write(to: URL(fileURLWithPath: diffPath), options: .atomic) - try fm.moveItem(atPath: self.archivePath, toPath: oldBundlePath) - _ = try BRBSPatch.patch( - oldBundlePath, newFilePath: self.archivePath, patchFilePath: diffPath - ) - try fm.removeItem(atPath: diffPath) - try fm.removeItem(atPath: oldBundlePath) - try self.extractArchive() - return completionHandler(nil) - } catch let e { - // something failed, clean up whatever we can, next attempt - // will download fresh - _ = try? fm.removeItem(atPath: diffPath) - _ = try? fm.removeItem(atPath: oldBundlePath) - _ = try? fm.removeItem(atPath: self.archivePath) - print("[AssetArchive] error applying diff \(self.name) error=\(e)") - } - } - } - } - - fileprivate func ensureExtractedPath() throws { - if !extractedDirExists { - try fileManager.createDirectory( - atPath: extractedPath, withIntermediateDirectories: true, attributes: nil - ) - } - } - - fileprivate func extractArchive() throws { - try BRTar.createFilesAndDirectoriesAtPath(extractedPath, withTarPath: archivePath) - } - - fileprivate func copyBundledArchive() { - if let bundledArchiveUrl = Bundle.main.url(forResource: name, withExtension: "tar") { - do { - try fileManager.copyItem(at: bundledArchiveUrl, to: archiveUrl) - print("[AssetArchive] used bundled archive for \(name)") - } catch let e { - print("[AssetArchive] unable to copy bundled archive `\(name)` \(bundledArchiveUrl) -> \(archiveUrl): \(e)") - } - } - } -} - -// Platform bundle management -extension BRAPIClient { - // updates asset bundles with names included in the AssetBundles.plist file - // if we are in a staging/debug/test environment the bundle names will have "-staging" appended to them - open func updateBundles(completionHandler: @escaping (_ results: [(String, Error?)]) -> Void) { - // ensure we can create the bundle directory - do { - try ensureBundlePaths() - } catch let e { - // if not return the creation error for every bundle name - return completionHandler([("INVALID", e)]) - } - guard let path = Bundle.main.path(forResource: "AssetBundles", ofType: "plist"), - var names = NSArray(contentsOfFile: path) as? [String] - else { - log("updateBundles unable to load bundle names") - return completionHandler([("INVALID", BRAPIClientError.unknownError)]) - } - - if E.isDebug || E.isTestFlight { - names = names.map { n in n + "-staging" } - } - - let grp = DispatchGroup() - let queue = DispatchQueue.global(qos: .utility) - var results: [(String, Error?)] = names.map { v in (v, nil) } - queue.async { - var i = 0 - for name in names { - if let archive = AssetArchive(name: name, apiClient: self) { - let resIdx = i - grp.enter() - archive.update(completionHandler: { err in - objc_sync_enter(results) - results[resIdx] = (name, err) - objc_sync_exit(results) - grp.leave() - }) - } - i += 1 - } - grp.wait() - completionHandler(results) - } - } - - fileprivate var bundleDirUrl: URL { - let fm = FileManager.default - let docsUrl = fm.urls(for: .documentDirectory, in: .userDomainMask).first! - let bundleDirUrl = docsUrl.appendingPathComponent("bundles", isDirectory: true) - return bundleDirUrl - } - - fileprivate func ensureBundlePaths() throws { - let fm = FileManager.default - var attrs = try? fm.attributesOfItem(atPath: bundleDirUrl.path) - if attrs == nil { - try fm.createDirectory(atPath: bundleDirUrl.path, withIntermediateDirectories: true, attributes: nil) - attrs = try fm.attributesOfItem(atPath: bundleDirUrl.path) - } - } - - open func getAssetVersions(_ name: String, completionHandler: @escaping ([String]?, Error?) -> Void) - { - let req = URLRequest(url: url("/assets/bundles/\(name)/versions")) - dataTaskWithRequest(req) { data, _, err in - if let err = err { - completionHandler(nil, err) - return - } - if let data = data, - let parsed = try? JSONSerialization.jsonObject(with: data, options: []), - let top = parsed as? NSDictionary, - let versions = top["versions"] as? [String] - { - completionHandler(versions, nil) - } else { - completionHandler(nil, BRAPIClientError.malformedDataError) - } - }.resume() - } - - open func downloadAssetArchive(_ name: String, completionHandler: @escaping (Data?, Error?) -> Void) - { - let req = URLRequest(url: url("/assets/bundles/\(name)/download")) - dataTaskWithRequest(req) { data, response, err in - if err != nil { - return completionHandler(nil, err) - } - if response?.statusCode != 200 { - return completionHandler(nil, BRAPIClientError.unknownError) - } - if let data = data { - return completionHandler(data, nil) - } else { - return completionHandler(nil, BRAPIClientError.malformedDataError) - } - }.resume() - } - - open func downloadAssetDiff(_ name: String, fromVersion: String, completionHandler: @escaping (Data?, Error?) -> Void) - { - let req = URLRequest(url: url("/assets/bundles/\(name)/diff/\(fromVersion)")) - dataTaskWithRequest(req, handler: { data, resp, err in - if err != nil { - return completionHandler(nil, err) - } - if resp?.statusCode != 200 { - return completionHandler(nil, BRAPIClientError.unknownError) - } - if let data = data { - return completionHandler(data, nil) - } else { - return completionHandler(nil, BRAPIClientError.malformedDataError) - } - }).resume() - } -} diff --git a/loafwallet/src/Platform/BRBSPatch.swift b/loafwallet/src/Platform/BRBSPatch.swift deleted file mode 100644 index be4818ba8..000000000 --- a/loafwallet/src/Platform/BRBSPatch.swift +++ /dev/null @@ -1,213 +0,0 @@ -import Foundation -import libbz2 - -enum BRBSPatchError: Error { - case unknown - case corruptPatch - case patchFileDoesntExist - case oldFileDoesntExist -} - -class BRBSPatch { - static let patchLogEnabled = true - - static func patch(_ oldFilePath: String, newFilePath: String, patchFilePath: String) - throws -> UnsafeMutablePointer - { - func offtin(_ b: UnsafePointer) -> off_t { - var y = off_t(b[0]) - y |= off_t(b[1]) << 8 - y |= off_t(b[2]) << 16 - y |= off_t(b[3]) << 24 - y |= off_t(b[4]) << 32 - y |= off_t(b[5]) << 40 - y |= off_t(b[6]) << 48 - y |= off_t(b[7] & 0x7F) << 56 - if Int(b[7]) & 0x80 != 0 { - y = -y - } - return y - } - let patchFilePathBytes = UnsafePointer((patchFilePath as NSString).utf8String) - let r = UnsafePointer(("r" as NSString).utf8String) - - // open patch file - guard let f = FileHandle(forReadingAtPath: patchFilePath) - else { - log("unable to open file for reading at path \(patchFilePath)") - throw BRBSPatchError.patchFileDoesntExist - } - - // read header - let headerData = f.readData(ofLength: 32) - let header = (headerData as NSData).bytes.bindMemory(to: CUnsignedChar.self, capacity: headerData.count) - if headerData.count != 32 { - log("incorrect header read length \(headerData.count)") - throw BRBSPatchError.corruptPatch - } - - // check for appropriate magic - let magicData = headerData.subdata(in: 0 ..< 8) - if let magic = String(bytes: magicData, encoding: String.Encoding.ascii), magic != "BSDIFF40" { - log("incorrect magic: \(magic)") - throw BRBSPatchError.corruptPatch - } - - // read lengths from header - let bzCrtlLen = offtin(header + 8) - let bzDataLen = offtin(header + 16) - let newSize = offtin(header + 24) - - if bzCrtlLen < 0 || bzDataLen < 0 || newSize < 0 { - log("incorrect header data: crtlLen: \(bzCrtlLen) dataLen: \(bzDataLen) newSize: \(newSize)") - throw BRBSPatchError.corruptPatch - } - - // close patch file and re-open it with bzip2 at the right positions - f.closeFile() - - let cpf = fopen(patchFilePathBytes, r) - if cpf == nil { - let s = String(cString: strerror(errno)) - let ff = String(cString: patchFilePathBytes!) - log("unable to open patch file c: \(s) \(ff)") - throw BRBSPatchError.unknown - } - let cpfseek = fseeko(cpf, 32, SEEK_SET) - if cpfseek != 0 { - log("unable to seek patch file c: \(cpfseek)") - throw BRBSPatchError.unknown - } - let cbz2err = UnsafeMutablePointer.allocate(capacity: 1) - let cpfbz2 = BZ2_bzReadOpen(cbz2err, cpf, 0, 0, nil, 0) - if cpfbz2 == nil { - log("unable to bzopen patch file c: \(cbz2err)") - throw BRBSPatchError.unknown - } - let dpf = fopen(patchFilePathBytes, r) - if dpf == nil { - log("unable to open patch file d") - throw BRBSPatchError.unknown - } - let dpfseek = fseeko(dpf, 32 + bzCrtlLen, SEEK_SET) - if dpfseek != 0 { - log("unable to seek patch file d: \(dpfseek)") - throw BRBSPatchError.unknown - } - let dbz2err = UnsafeMutablePointer.allocate(capacity: 1) - let dpfbz2 = BZ2_bzReadOpen(dbz2err, dpf, 0, 0, nil, 0) - if dpfbz2 == nil { - log("unable to bzopen patch file d: \(dbz2err)") - throw BRBSPatchError.unknown - } - let epf = fopen(patchFilePathBytes, r) - if epf == nil { - log("unable to open patch file e") - throw BRBSPatchError.unknown - } - let epfseek = fseeko(epf, 32 + bzCrtlLen + bzDataLen, SEEK_SET) - if epfseek != 0 { - log("unable to seek patch file e: \(epfseek)") - throw BRBSPatchError.unknown - } - let ebz2err = UnsafeMutablePointer.allocate(capacity: 1) - let epfbz2 = BZ2_bzReadOpen(ebz2err, epf, 0, 0, nil, 0) - if epfbz2 == nil { - log("unable to bzopen patch file e: \(ebz2err)") - throw BRBSPatchError.unknown - } - - guard let oldData = try? Data(contentsOf: URL(fileURLWithPath: oldFilePath)) - else { - log("unable to read old file path") - throw BRBSPatchError.unknown - } - let old = (oldData as NSData).bytes.bindMemory(to: CUnsignedChar.self, capacity: oldData.count) - let oldSize = off_t(oldData.count) - var oldPos: off_t = 0, newPos: off_t = 0 - let new = UnsafeMutablePointer.allocate(capacity: Int(newSize) + 1) - let buf = UnsafeMutablePointer.allocate(capacity: 8) - var crtl = [off_t](repeating: 0, count: 3) - while newPos < newSize { - // read control data - for i in 0 ... 2 { - let lenread = BZ2_bzRead(cbz2err, cpfbz2, buf, 8) - if (lenread < 8) || ((cbz2err.pointee != BZ_OK) && (cbz2err.pointee != BZ_STREAM_END)) { - log("unable to read control data \(lenread) \(cbz2err.pointee)") - throw BRBSPatchError.corruptPatch - } - crtl[i] = offtin(UnsafePointer(buf)) - } - // sanity check - if (newPos + crtl[0]) > newSize { - log("incorrect size of crtl[0]") - throw BRBSPatchError.corruptPatch - } - - // read diff string - let dlenread = BZ2_bzRead(dbz2err, dpfbz2, new + Int(newPos), Int32(crtl[0])) - if (dlenread < Int32(crtl[0])) || ((dbz2err.pointee != BZ_OK) && (dbz2err.pointee != BZ_STREAM_END)) - { - log("unable to read diff string \(dlenread) \(dbz2err.pointee)") - throw BRBSPatchError.corruptPatch - } - - // add old data to diff string - if crtl[0] > 0 { - for i in 0 ... (Int(crtl[0]) - 1) { - if oldPos + off_t(i) >= 0, oldPos + off_t(i) < oldSize { - let np = Int(newPos) + i, op = Int(oldPos) + i - new[np] = new[np] &+ old[op] - } - } - } - - // adjust pointers - newPos += crtl[0] - oldPos += crtl[0] - - // sanity check - if (newPos + crtl[1]) > newSize { - log("incorrect size of crtl[1]") - throw BRBSPatchError.corruptPatch - } - - // read extra string - let elenread = BZ2_bzRead(ebz2err, epfbz2, new + Int(newPos), Int32(crtl[1])) - if (elenread < Int32(crtl[1])) || ((ebz2err.pointee != BZ_OK) && (ebz2err.pointee != BZ_STREAM_END)) - { - log("unable to read extra string \(elenread) \(ebz2err.pointee)") - throw BRBSPatchError.corruptPatch - } - - // adjust pointers - newPos += crtl[1] - oldPos += crtl[2] - } - - // clean up bz2 reads - BZ2_bzReadClose(cbz2err, cpfbz2) - BZ2_bzReadClose(dbz2err, dpfbz2) - BZ2_bzReadClose(ebz2err, epfbz2) - - if (fclose(cpf) != 0) || (fclose(dpf) != 0) || (fclose(epf) != 0) { - log("unable to close bzip file handles") - throw BRBSPatchError.unknown - } - - // write out new file - let fm = FileManager.default - if fm.fileExists(atPath: newFilePath) { - try fm.removeItem(atPath: newFilePath) - } - let newData = Data(bytes: UnsafePointer(new), count: Int(newSize)) - try newData.write(to: URL(fileURLWithPath: newFilePath), options: .atomic) - return new - } - - fileprivate static func log(_ string: String) { - if patchLogEnabled { - print("[BRBSPatch] \(string)") - } - } -} diff --git a/loafwallet/src/Strings/da.lproj/Localizable.strings b/loafwallet/src/Strings/da.lproj/Localizable.strings deleted file mode 100755 index c00bd5105..000000000 --- a/loafwallet/src/Strings/da.lproj/Localizable.strings +++ /dev/null @@ -1,1451 +0,0 @@ -/* About screen blog label */ -"About.blog" = "Blog"; - -/* About screen footer */ -"About.footer" = "Lavet af det globale Litewallet hold. Version %1$@"; - -/* Privay Policy button label */ -"About.privacy" = "Privatlivspolitik"; - -/* About screen reddit label */ -"About.reddit" = "Reddit"; - -/* About screen title */ -"About.title" = "Om"; - -/* About screen twitter label */ -"About.twitter" = "Twitter"; - -/* Close modal button accessibility label */ -"AccessibilityLabels.close" = "Luk"; - -/* Support center accessibiliy label */ -"AccessibilityLabels.faq" = "Supportcenter"; - -/* Loading Wallet Message */ -"Account.loadingMessage" = "Indlæser pung"; - -/* Default wallet name */ -"AccountHeader.defaultWalletName" = "Mit Litewallet"; - -/* Manage wallet button title */ -"AccountHeader.manageButtonName" = "ADMINISTRER"; - -/* Corruption Error alert title */ -"Alert.corruptionError" = "Lokal korruptionsfejl"; - -/* Corruption Error alert title */ -"Alert.corruptionMessage" = "Lokal korruptionsfejl"; - -/* Error alert title */ -"Alert.error" = "Fejl"; - -/* No internet alert message */ -"Alert.noInternet" = "Ingen internetforbindelse fundet. Tjek din forbindelse og prøv igen."; - -/* Warning alert title */ -"Alert.warning" = "Advarsel"; - -/* 'the addresses were copied'' Alert title */ -"Alerts.copiedAddressesHeader" = "Adresser kopieret"; - -/* Addresses Copied Alert sub header */ -"Alerts.copiedAddressesSubheader" = "Alle pungens adresser er kopieret."; - -/* Alert Header Label (the paper key was set) */ -"Alerts.paperKeySet" = "Paper key indstillet"; - -/* Alert Subheader label (playfully positive) */ -"Alerts.paperKeySetSubheader" = "Fedt!"; - -/* Alert Header label (the PIN was set) */ -"Alerts.pinSet" = "PIN indstillet"; - -/* Resolved Success */ -"Alerts.resolvedSuccess" = "Domæneopløsning"; - -/* No comment provided by engineer. */ -"Alerts.resolvedSuccessSubheader" = "Din adresse blev løst!"; - -/* Send failure alert header label (the send failed to happen) */ -"Alerts.sendFailure" = "Afsendelse mislykkedes"; - -/* Send success alert header label (confirmation that the send happened) */ -"Alerts.sendSuccess" = "Send bekræftelse"; - -/* Send success alert subheader label (e.g. the money was sent) */ -"Alerts.sendSuccessSubheader" = "Pengene blev sendt!"; - -/* JSON Serialization error message */ -"ApiClient.jsonError" = "JSON serialiseringsfejl"; - -/* Wallet not ready error message */ -"ApiClient.notReady" = "Pung ikke klar"; - -/* API Token error message */ -"ApiClient.tokenError" = "Kunne ikke hente API-nøgle"; - -/* buy button */ -"Button.buy" = "købe"; - -/* Cancel button label */ -"Button.cancel" = "Annuller"; - -/* Ignore button label */ -"Button.ignore" = "Ignorer"; - -/* menu button */ -"Button.menu" = "menu"; - -/* No button */ -"Button.no" = "Nej"; - -/* OK button label */ -"Button.ok" = "OK"; - -/* receive button */ -"Button.receive" = "modtag"; - -/* resetFields */ -"Button.resetFields" = "Nulstil felter"; - -/* send button */ -"Button.send" = "send"; - -/* Settings button label */ -"Button.settings" = "Indstillinger"; - -/* Settings button label */ -"Button.submit" = "Send"; - -/* Yes button */ -"Button.yes" = "Ja"; - -/* Buy Bar Item Title */ -"BuyCenter.barItemTitle" = "KØBE"; - -/* Bitrefill buy financial details */ -"BuyCenter.bitrefillFinancialDetails" = "• Køb gavekort \n • Genopfyld forudbetalte telefoner \n • Steam, Amazon, Hotels.com \n • Fungerer i 170 lande"; - -/* Bitrefill Title */ -"BuyCenter.BitrefillTitle" = "Bitrefill"; - -/* Changelly buy financial details */ -"BuyCenter.changellyFinancialDetails" = "• Skift Litecoin til andre kryptos \n • Ingen ID krævet \n • Køb med kreditkort \n • Global dækning"; - -/* Changelly Title */ -"BuyCenter.changellyTitle" = "Changelly"; - -/* Buy Modal Title */ -"BuyCenter.ModalTitle" = "Købe Litecoin"; - -/* Moonpay buy financial details */ -"BuyCenter.moonpayFinancialDetails" = "• Køb LTC med mange fiat-par\n• Betal med flere metoder\n• Global betalingsudbyder"; - -/* Moonpay Title */ -"BuyCenter.moonpayTitle" = "Moonpay"; - -/* Simplex buy financial details */ -"BuyCenter.simplexFinancialDetails" = "• Få Litecoin inden for 5 minutter! \n • Køb Litecoin via kreditkort \n • Pas eller stats-ID"; - -/* Simplex Title */ -"BuyCenter.simplexTitle" = "Simplex"; - -/* Buy Center Title */ -"BuyCenter.title" = "Købe Litecoin"; - -/* Camera plugin instruction */ -"CameraPlugin.centerInstruction" = "Centrer dit ID i boksen"; - -/* $53.09/L + 1.07% */ -"Confirmation.amountDetailLabel" = "Udvekslingsoplysninger:"; - -/* Amount to Send: ($1.00) */ -"Confirmation.amountLabel" = "Beløb der skal sendes:"; - -/* Amount to Donate: ($1.00) */ -"Confirmation.donateLabel" = "Beløb til donation:"; - -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Netværksgebyr:"; - -/* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingAndDonationTime" = "Behandlingstid: Disse transaktioner tager %1$@ minutter at behandle."; - -/* eg. Processing time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingTime" = "Behandlingstid: denne transaktion vil tage %1$@ minutter at behandle."; - -/* Label for "send" button on final confirmation screen */ -"Confirmation.send" = "Send"; - -/* Short Network Fee: ($1.00) */ -"Confirmation.shortFeeLabel" = "BETALING:"; - -/* Address label */ -"Confirmation.staticAddressLabel" = "ADRESSE:"; - -/* Confirmation Screen title */ -"Confirmation.title" = "Bekræftelse"; - -/* To: (address) */ -"Confirmation.to" = "Til"; - -/* Total Cost: ($5.00) */ -"Confirmation.totalLabel" = "Samlede omkostninger:"; - -/* Confirm paper phrase error message */ -"ConfirmPaperPhrase.error" = "De indtastede ord stemmer ikke overens med din papirnøgle. Prøv igen."; - -/* Confirm paper phrase view label. */ -"ConfirmPaperPhrase.label" = "For at sørge for, at alt blev skrevet korrekt, bedes du indtaste følgende ord fra din paper key."; - -/* Word label eg. Word #1, Word #2 */ -"ConfirmPaperPhrase.word" = "Ord #%1$@"; - -/* as of a time or date */ -"Conjunction.asOf" = "fra"; - -/* No comment provided by engineer. */ -"Copy" = "Kopi"; - -/* Litecoin denomination picker label */ -"DefaultCurrency.bitcoinLabel" = "Litecoin visningsenhed"; - -/* Label to pick fiat */ -"DefaultCurrency.chooseFiatLabel" = "Vælge:"; - -/* Exchange rate label */ -"DefaultCurrency.rateLabel" = "Valutakurs"; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableMessage" = "Denne enhed er ikke konfigureret til at sende e-mail med iOS mailappen."; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableTitle" = "E-mail utilgængelig"; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableMessage" = "Denne enhed er ikke konfigureret til at sende beskeder."; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableTitle" = "Beskeder utilgængelig"; - -/* You can customize your Face ID Spending Limit from the [FaceIdSettings.linkText gets added here as a button] */ -"FaceIDSettings.customizeText" = "PLACEHOLDER"; - -/* Face Id screen label */ -"FaceIDSettings.label" = "PLACEHOLDER"; - -/* Link Text (see FaceIdSettings.customizeText) */ -"FaceIDSettings.linkText" = "PLACEHOLDER"; - -/* Face id switch label. */ -"FaceIDSettings.switchLabel" = "PLACEHOLDER"; - -/* Face ID settings view title */ -"FaceIDSettings.title" = "PLACEHOLDER"; - -/* Face ID unavailable alert message */ -"FaceIDSettings.unavailableAlertMessage" = "PLACEHOLDER"; - -/* Face ID unavailable alert title */ -"FaceIDSettings.unavailableAlertTitle" = "PLACEHOLDER"; - -/* Face Id spending limit screen title */ -"FaceIDSpendingLimit.title" = "PLACEHOLDER"; - -/* Economy fee */ -"FeeSelector.economy" = "Økonomi"; - -/* Fee Selector economly fee description */ -"FeeSelector.economyLabel" = "Forventet leveringstid: 10+ minutter"; - -/* Warning message for economy fee */ -"FeeSelector.economyWarning" = "Denne mulighed er ikke anbefalet for tidsfølsomme transaktioner."; - -/* Luxury fee */ -"FeeSelector.luxury" = "Luksus"; - -/* Fee Selector luxury fee description */ -"FeeSelector.luxuryLabel" = "Anslået levering: 2,5 - 5 minutter"; - -/* Message for luxury fee */ -"FeeSelector.luxuryMessage" = "Denne mulighed garanterer næsten accept af din transaktion, selvom du betaler en præmie."; - -/* Regular fee */ -"FeeSelector.regular" = "Almindelig"; - -/* Fee Selector regular fee description */ -"FeeSelector.regularLabel" = "Anslået levering: 2,5 - 5+ minutter"; - -/* Fee Selector title */ -"FeeSelector.title" = "Behandlingshastighed"; - -/* Confirm */ -"Fragment.confirm" = "Bekræfte"; - -/* Or */ -"Fragment.or" = "eller"; - -/* sorry */ -"Fragment.sorry" = "Undskyld"; - -/* to */ -"Fragment.to" = "til"; - -/* History Bar Item Title */ -"History.barItemTitle" = "HISTORIE"; - -/* History Current Litecoin Value */ -"History.currentLitecoinValue" = "Aktuel LTC-værdi i"; - -/* Checking private key balance progress view text */ -"Import.checking" = "Tjekker beløb på privat nøgle..."; - -/* Sweep private key confirmation message */ -"Import.confirm" = "Send %1$@ fra denne private nøgle til din pung? Litecoin netværket vil modtage et gebyr på %2$@."; - -/* Duplicate key error message */ -"Import.Error.duplicate" = "Denne private nøgle findes allerede i din pung."; - -/* empty private key error message */ -"Import.Error.empty" = "Denne private nøgle er tom."; - -/* High fees error message */ -"Import.Error.highFees" = "Transaktionsgebyrer vil koste mere end der er midler til på denne private nøgle."; - -/* Not a valid private key error message */ -"Import.Error.notValid" = "Ikke en gyldig privat nøgle"; - -/* Import signing error message */ -"Import.Error.signing" = "Fejl ved underskrivelse af transaktion"; - -/* Import button label */ -"Import.importButton" = "Importer"; - -/* Importing wallet progress view label */ -"Import.importing" = "Importerer pung"; - -/* Caption for graphics */ -"Import.leftCaption" = "Pung bliver importeret"; - -/* Import wallet intro screen message */ -"Import.message" = "Import af en pung overfører alle pengene fra din anden pung til din Litewallet pung, via en enkelt overførsel."; - -/* Enter password alert view title */ -"Import.password" = "Denne private nøgle er beskyttet med et kodeord."; - -/* password textfield placeholder */ -"Import.passwordPlaceholder" = "adgangskode"; - -/* Caption for graphics */ -"Import.rightCaption" = "Din Litewallet pung"; - -/* Scan Private key button label */ -"Import.scan" = "Scan privat nøgle"; - -/* Import wallet success alert title */ -"Import.success" = "Succes"; - -/* Successfully imported wallet message body */ -"Import.SuccessBody" = "Importeret til din pung."; - -/* Import Wallet screen title */ -"Import.title" = "Importer pung"; - -/* Unlocking Private key activity view message. */ -"Import.unlockingActivity" = "Låser op for nøgle"; - -/* Import wallet intro warning message */ -"Import.warning" = "Import af en pung inkluderer ikke transaktionshistorik eller andre oplysninger."; - -/* Wrong password alert message */ -"Import.wrongPassword" = "Forkert adgangskode, prøv venligst igen."; - -/* Close app button */ -"JailbreakWarnings.close" = "Luk"; - -/* Ignore jailbreak warning button */ -"JailbreakWarnings.ignore" = "Ignorer"; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithBalance" = "ENHEDENS SIKKERHED ER KOMPROMITTERET\n Enhver 'jailbreak' app kan få adgang til Litewallets nøgledata og stjæle dine Litecoin! Ryd straks denne pung og gendan på en sikker enhed."; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithoutBalance" = "ENHEDENS SIKKERHED ER KOMPROMITTERET\n Enhver 'jailbreak' app kan få adgang til Litewallets nøgledata og stjæle dine Litecoin. Brug kun Litewallet på en ikke jailbreaket enhed."; - -/* Jailbreak warning title */ -"JailbreakWarnings.title" = "ADVARSEL"; - -/* Wipe wallet button */ -"JailbreakWarnings.wipe" = "Ryd"; - -/* Card Bar Item Title */ -"LitecoinCard.barItemTitle" = "KORT"; - -/* Card balance */ -"LitecoinCard.cardBalance" = "Kortbalance"; - -/* Message when 2FA is off and user is viewing the Card Balance */ -"LitecoinCard.cardBalanceOnlyDescription" = "Log ud og aktiver 2FA for at tillade overførsler"; - -/* Features and limitations */ -"LitecoinCard.Disclaimer.bullets" = "- Registrering og login\n- Tilgængelig kortsaldo\n- Nulstil adgangskode\n- Ingen overførsel til Litewallet\n- Kun USA"; - -/* Description of the status */ -"LitecoinCard.Disclaimer.description" = "Litecoin Card har i øjeblikket begrænset funktionalitet i Litewallet."; - -/* Referral to the website */ -"LitecoinCard.Disclaimer.referral" = "Besøg litecoin.getblockcard.com for fuld adgang"; - -/* Beta Testing Litecoin Card */ -"LitecoinCard.Disclaimer.title" = "Litecoin-kort Beta"; - -/* Enter code */ -"LitecoinCard.enterCode" = "Indtast kode"; - -/* Enter code details */ -"LitecoinCard.enterCode.detail" = "Indtast koden, der for nylig blev sendt til din Litecoin Card -kontos e -mail."; - -/* Failed Login */ -"LitecoinCard.failed.login" = "Login mislykkedes"; - -/* Forgot password? */ -"LitecoinCard.forgotPassword" = "Glemt kodeord?"; - -/* Login */ -"LitecoinCard.login" = "Log på"; - -/* Logout */ -"LitecoinCard.logout" = "Log ud"; - -/* Card Bar Item Title */ -"LitecoinCard.name" = "Litecoin -kort"; - -/* Register */ -"LitecoinCard.registerCard" = "Tilmeld"; - -/* Register for Litecoin Card */ -"LitecoinCard.registerCardPhrase" = "Tilmeld dig Litecoin-kort"; - -/* Registering user... */ -"LitecoinCard.registering.user" = "Registrerer bruger ..."; - -/* address */ -"LitecoinCard.Registration.address" = "Vejnavn"; - -/* city */ -"LitecoinCard.Registration.city" = "By"; - -/* confirm password */ -"LitecoinCard.Registration.confirmPassword" = "bekræft kodeord"; - -/* country */ -"LitecoinCard.Registration.country" = "Land"; - -/* First name */ -"LitecoinCard.Registration.firstName" = "fornavn"; - -/* identification */ -"LitecoinCard.Registration.identification" = "Identifikation"; - -/* kycIDNumber */ -"LitecoinCard.Registration.kycIDNumber" = "Kend din kunde ID-type"; - -/* kycIDType */ -"LitecoinCard.Registration.kycIDType" = "ID-type"; - -/* SSN */ -"LitecoinCard.Registration.kycSSN" = "SSN"; - -/* Last name */ -"LitecoinCard.Registration.lastName" = "efternavn"; - -/* mobile number */ -"LitecoinCard.Registration.mobileNumber" = "Mobilnummer"; - -/* password */ -"LitecoinCard.Registration.password" = "adgangskode"; - -/* state province */ -"LitecoinCard.Registration.stateProvince" = "Stat / provins"; - -/* registraition username / email */ -"LitecoinCard.Registration.usernameEmail" = "Email"; - -/* must not be empty */ -"LitecoinCard.Registration.ValidationError.empty" = "Må ikke være tom"; - -/* Invalid email address */ -"LitecoinCard.Registration.ValidationError.invalidEmail" = "Ugyldig emailadresse"; - -/* Mobile number 10 digits required */ -"LitecoinCard.Registration.ValidationError.numberDigitsRequired" = "Mobilnummeret skal have mindst 10 cifre"; - -/* Mobile number required */ -"LitecoinCard.Registration.ValidationError.numberRequired" = "Mobilnummer er påkrævet"; - -/* 6 Password characters required */ -"LitecoinCard.Registration.ValidationError.passwordCharacters" = "Adgangskoden skal indeholde mindst 6 tegn"; - -/* Captial and numeric password characters required */ -"LitecoinCard.Registration.ValidationError.passwordComposition" = "Adgangskoden skal bestå af mere end 6 tegn med mindst et tegn og et numerisk tegn"; - -/* Password required */ -"LitecoinCard.Registration.ValidationError.passwordRequired" = "Adgangskode er påkrævet"; - -/* Required field */ -"LitecoinCard.Registration.ValidationError.requiredField" = "påkrævet område"; - -/* zip post Code */ -"LitecoinCard.Registration.zipPostCode" = "Postnummer"; - -/* Registration failure */ -"LitecoinCard.registrationFailure" = "Der var et problem med din registrering. Kontroller dine data, og prøv igen."; - -/* Registration success */ -"LitecoinCard.registrationSuccess" = "Du har tilmeldt dig! Kontroller og bekræft din e-mail. Så kom tilbage for at logge ind."; - -/* Reset Litecoin card password */ -"LitecoinCard.resetPassword" = "Nulstille kodeord"; - -/* Reset password detail */ -"LitecoinCard.resetPasswordDetail" = "Indtast den e-mail-adresse, der er knyttet til din Litecoin Card-konto, og se efter en e-mail med nulstillingsinstruktioner."; - -/* Transfer to card label */ -"LitecoinCard.Transfer.amountToCard" = "Overfør til kort"; - -/* Transfer to Litewallet label */ -"LitecoinCard.Transfer.amountToLitewallet" = "Overførsel til Litewallet"; - -/* Description of action */ -"LitecoinCard.Transfer.description" = "Vælg den overførende tegnebog:"; - -/* Destination address label */ -"LitecoinCard.Transfer.destinationAddress" = "Adresse"; - -/* Litewallet balance label */ -"LitecoinCard.Transfer.litewalletBalance" = "Litewallet balance"; - -/* Set transfer amount label */ -"LitecoinCard.Transfer.setAmount" = "Skub for at indstille overførselsbeløb"; - -/* Start transfer label */ -"LitecoinCard.Transfer.startTransfer" = "Start overførsel"; - -/* Transfer title */ -"LitecoinCard.Transfer.title" = "Overførsel"; - -/* 2FA Error message */ -"LitecoinCard.twoFAErrorMessage" = "Der opstod en fejl. Skift venligst 2FA til *Aktiveret*, indtast den e -mailede kode, og prøv igen."; - -/* Message when 2FA is off */ -"LitecoinCard.twoFAOff" = "2FA Ikke aktiveret"; - -/* Message when 2FA is on */ -"LitecoinCard.twoFAOn" = "2FA aktiveret"; - -/* Litecoin card visit */ -"LitecoinCard.visit.toReset" = "Besøg https://litecoin.dashboard.getblockcard.com/password/forgot for at nulstille din adgangskode."; - -/* Litewallet name */ -"Litewallet.name" = "Litewallet"; - -/* Location services disabled error */ -"LocationPlugin.disabled" = "Placeringstjenester er deaktiveret."; - -/* No permissions for location services */ -"LocationPlugin.notAuthorized" = "Litewallet har ikke adgang til placeringstjenester."; - -/* No comment provided by engineer. */ -"Malformed URI" = "Fejlformet URI"; - -/* Balance */ -"ManageWallet.balance" = "Balance"; - -/* Wallet creation date prefix */ -"ManageWallet.creationDatePrefix" = "Du lavede din pung den %1$@"; - -/* Manage wallet description text */ -"ManageWallet.description" = "Din pungs navn vises kun i din kontos transaktionshistorik, og kan ikke ses af nogen andre."; - -/* Change Wallet name textfield label */ -"ManageWallet.textFeildLabel" = "Pungens navn"; - -/* Manage wallet modal title */ -"ManageWallet.title" = "Administrer pung"; - -/* Buy Litecoin title */ -"MenuButton.buy" = "Køb Litecoin"; - -/* Menu button title */ -"MenuButton.customer.support" = "Kunde support"; - -/* Menu button title */ -"MenuButton.lock" = "Lås pung"; - -/* Menu button title */ -"MenuButton.security" = "Sikkerhedscenter"; - -/* Menu button title */ -"MenuButton.settings" = "Indstillinger"; - -/* Menu button title */ -"MenuButton.support" = "Support"; - -/* button label */ -"MenuViewController.createButton" = "Opret ny pung"; - -/* Menu modal title */ -"MenuViewController.modalTitle" = "Menu"; - -/* button label */ -"MenuViewController.recoverButton" = "Gendan pung"; - -/* No comment provided by engineer. */ -"No wallet" = "Ingen tegnebog"; - -/* Switch to automatic mode button label */ -"NodeSelector.automaticButton" = "Skift til automatisk tilstand"; - -/* Node is connected label */ -"NodeSelector.connected" = "Forbundet"; - -/* Enter node ip address view body */ -"NodeSelector.enterBody" = "Indtast node-IP-adresse og port (valgfrit)"; - -/* Enter Node ip address view title */ -"NodeSelector.enterTitle" = "Indtast node"; - -/* Switch to manual mode button label */ -"NodeSelector.manualButton" = "Skift til manuel tilstand"; - -/* Node address label */ -"NodeSelector.nodeLabel" = "Nuværende primære node"; - -/* Node is not connected label */ -"NodeSelector.notConnected" = "Ikke forbundet"; - -/* Node status label */ -"NodeSelector.statusLabel" = "Node forbindelsesstatus"; - -/* Node Selector view title */ -"NodeSelector.title" = "Litecoin-nodes"; - -/* Bad Payment request alert title */ -"PaymentProtocol.Errors.badPaymentRequest" = "Dårlig betalingsanmodning"; - -/* Error opening payment protocol file message */ -"PaymentProtocol.Errors.corruptedDocument" = "Ikke understøttet eller beskadiget dokument"; - -/* Missing certificate payment protocol error message */ -"PaymentProtocol.Errors.missingCertificate" = "manglende certifikat"; - -/* Request expired payment protocol error message */ -"PaymentProtocol.Errors.requestExpired" = "anmodning udløbet"; - -/* Payment too small alert title */ -"PaymentProtocol.Errors.smallOutputError" = "Kunne ikke foretage betaling"; - -/* Amount too small error message */ -"PaymentProtocol.Errors.smallPayment" = "Litecoin betalinger kan ikke være mindre end %1$@."; - -/* Output too small error message. */ -"PaymentProtocol.Errors.smallTransaction" = "Litecoin transaktionsoutput kan ikke være mindre end $@."; - -/* Unsupported signature type payment protocol error message */ -"PaymentProtocol.Errors.unsupportedSignatureType" = "ikke understøttet signaturtype"; - -/* Untrusted certificate payment protocol error message */ -"PaymentProtocol.Errors.untrustedCertificate" = "certifikat der ikke er tillid til"; - -/* Dismiss button. */ -"Prompts.dismiss" = "AFSKEDIGE"; - -/* Enable face ID prompt body */ -"Prompts.FaceId.body" = "PLACEHOLDER"; - -/* Enable face ID prompt title */ -"Prompts.FaceId.title" = "PLACEHOLDER"; - -/* No passcode set warning body */ -"Prompts.NoPasscode.body" = "En adgangskode til enheden er nødvendig for at beskytte din wallet. Gå til indstillinger og slå adgangskode til."; - -/* No Passcode set warning title */ -"Prompts.NoPasscode.title" = "Slå enhedens adgangskode til"; - -/* Affirm button title. */ -"Prompts.PaperKey.affirm" = "Blive ved"; - -/* Warning about paper key. */ -"Prompts.PaperKey.body" = "Din Papirnøgle skal gemmes i tilfælde af du nogensinde mister eller skifter telefon. Tryk her for at fortsætte."; - -/* Cancel button. */ -"Prompts.PaperKey.cancel" = "Afbestille"; - -/* Enable button. */ -"Prompts.PaperKey.enable" = "Aktiver"; - -/* An action is required (You must do this action). */ -"Prompts.PaperKey.title" = "Handling påkrævet"; - -/* Transaction rejected prompt body */ -"Prompts.RecommendRescan.body" = "Din pung er muligvis ikke synkroniseret. Dette kan ofte løses ved at genskanne blokkæden."; - -/* Transaction rejected prompt title */ -"Prompts.RecommendRescan.title" = "Transaktion afvist"; - -/* Upgrade PIN prompt body. */ -"Prompts.SetPin.body" = "Litewallet er blevet opgraderet til at bruge en 6-cifret PIN. Tryk her for at opgradere."; - -/* Upgrade PIN prompt title. */ -"Prompts.SetPin.title" = "Opgader PIN"; - -/* Share data prompt body */ -"Prompts.ShareData.body" = "Hjælp med at forbedre Litewallet ved at dele dine anonyme data med os"; - -/* Share data prompt title */ -"Prompts.ShareData.title" = "Del anonyme data"; - -/* Enable touch ID prompt body */ -"Prompts.TouchId.body" = "Tryk her for at aktivere Touch ID"; - -/* Enable touch ID prompt title */ -"Prompts.TouchId.title" = "Aktiver Touch ID"; - -/* Notifications will be added later but users can set their preferences now, which is why we specify "in the future". */ -"PushNotifications.body" = "Slå notifikationer til for at modtage særlige meddelelser fra Litewallet i fremtiden."; - -/* Push notifications toggle switch label */ -"PushNotifications.label" = "Push notifikationer"; - -/* Push notifications are off label */ -"PushNotifications.off" = "Fra"; - -/* Push notifications are on label */ -"PushNotifications.on" = "Til"; - -/* Push notifications settings view title label */ -"PushNotifications.title" = "Notifikationer"; - -/* Receive Bar Item Title */ -"Receive.barItemTitle" = "Modtage"; - -/* Address copied message. */ -"Receive.copied" = "Kopieret til udklipsholder."; - -/* Share via email button label */ -"Receive.emailButton" = "E-mail"; - -/* Request button label */ -"Receive.request" = "Anmod om et beløb"; - -/* Share button label */ -"Receive.share" = "Del"; - -/* Share via text message (SMS) */ -"Receive.textButton" = "SMS"; - -/* Receive modal title */ -"Receive.title" = "Modtag"; - -/* Done button text */ -"RecoverWallet.done" = "Færdig"; - -/* Recover wallet header */ -"RecoverWallet.header" = "Gendan pung"; - -/* Reset PIN with paper key: header */ -"RecoverWallet.header_reset_pin" = "Nulstil PIN"; - -/* Enter paper key instruction */ -"RecoverWallet.instruction" = "Indtast paper key"; - -/* Recover wallet intro */ -"RecoverWallet.intro" = "Gendan dit Litewallet med din paper key."; - -/* Invalid paper key message */ -"RecoverWallet.invalid" = "Den paper key du indtastede er ugyldig. Dobbelttjek hvert ord og prøv igen."; - -/* Previous button accessibility label */ -"RecoverWallet.leftArrow" = "Venstre pil"; - -/* Next button label */ -"RecoverWallet.next" = "Næste"; - -/* Reset PIN with paper key: more information button. */ -"RecoverWallet.reset_pin_more_info" = "Tryk her for flere oplysninger."; - -/* Next button accessibility label */ -"RecoverWallet.rightArrow" = "Højre pil"; - -/* Recover wallet sub-header */ -"RecoverWallet.subheader" = "Indtast paper key til pungen du vil gendanne."; - -/* Reset PIN with paper key: sub-header */ -"RecoverWallet.subheader_reset_pin" = "For at nulstille din PIN, skal du indtaste ordene fra din paper key i boksene nedenfor."; - -/* No amount entered error message. */ -"RequestAnAmount.noAmount" = "Indtast venligst et beløb først."; - -/* Request a specific amount of Litecoin */ -"RequestAnAmount.title" = "Anmod om et beløb"; - -/* Alert action button label */ -"ReScan.alertAction" = "Synkroniser"; - -/* Alert message body */ -"ReScan.alertMessage" = "Du vil ikke kunne sende penge mens du synkroniserer."; - -/* Alert message title */ -"ReScan.alertTitle" = "Synkroniser med blokkæde?"; - -/* extimated time */ -"ReScan.body1" = "20-45 minutter"; - -/* Syncing explanation */ -"ReScan.body2" = "Hvis en transaktion vises som gennemført i Litecoin netværket, men ikke i dit Litewallet."; - -/* Syncing explanation */ -"ReScan.body3" = "Du modtager gentagne gange en fejlmeddelelse om at din transaktion er blevet afvist."; - -/* Start Sync button label */ -"ReScan.buttonTitle" = "Start synkronisering"; - -/* Sync blockchain view footer */ -"ReScan.footer" = "Du vil ikke kunne bruge penge, når du synkroniserer med blokkæden."; - -/* Sync Blockchain view header */ -"ReScan.header" = "Synkroniser blokkæde"; - -/* Subheader label */ -"ReScan.subheader1" = "Anslået tid"; - -/* Subheader label */ -"ReScan.subheader2" = "Hvornår skal der synkroniseres?"; - -/* Reset walet button title */ -"resetButton" = "Ja, nulstil tegnebogen"; - -/* Warning Empty Wipe title */ -"resetTitle" = "Slet min Litewallet"; - -/* Scan bitcoin address camera flash toggle */ -"Scanner.flashButtonLabel" = "Kamerablitz"; - -/* Complete filter label */ -"Search.complete" = "færdig"; - -/* Pending filter label */ -"Search.pending" = "afventer"; - -/* Received filter label */ -"Search.received" = "modtaget"; - -/* Sent filter label */ -"Search.sent" = "sendt"; - -/* Face ID button title */ -"SecurityCenter.faceIdTitle" = "PLACEHOLDER"; - -/* Security Center Info */ -"SecurityCenter.info" = "Aktiver alle sikkerhedsfunktioner for maksimal beskyttelse."; - -/* Paper Key button description */ -"SecurityCenter.paperKeyDescription" = "Den eneste måde at få adgang til dine Litecoin på, hvis du mister eller opgraderer din telefon."; - -/* Paper Key button title */ -"SecurityCenter.paperKeyTitle" = "Paper key"; - -/* PIN button description */ -"SecurityCenter.pinDescription" = "Beskytter dit Litewallet mod uberettigede brugere."; - -/* PIN button title */ -"SecurityCenter.pinTitle" = "6-cifret PIN"; - -/* Security Center Title */ -"SecurityCenter.title" = "Sikkerhedscenter"; - -/* Touch ID button description */ -"SecurityCenter.touchIdDescription" = "Lås dit Break op og send penge op til en vis grænse."; - -/* Touch ID button title */ -"SecurityCenter.touchIdTitle" = "Touch ID"; - -/* Send money amount label */ -"Send.amountLabel" = "Beløb"; - -/* Balance: $4.00 */ -"Send.balance" = "Balance: %1$@"; - -/* Send Bar Item Title */ -"Send.barItemTitle" = "SENDE"; - -/* Camera not allowed message */ -"Send.cameraunavailableMessage" = "Gå til Indstillinger og giv adgang til kamera."; - -/* Camera not allowed alert title */ -"Send.cameraUnavailableTitle" = "Litewallet har ikke adgang til kameraet"; - -/* Warning when sending to self. */ -"Send.containsAddress" = "Destinationen er din egen adresse. Du kan ikke sende til dig selv."; - -/* Could not create transaction alert title */ -"Send.creatTransactionError" = "Kunne ikke oprette transaktion."; - -/* Description for sending money label */ -"Send.descriptionLabel" = "Memo"; - -/* Emtpy pasteboard error message */ -"Send.emptyPasteboard" = "Tegnebord er tomt"; - -/* Enter LTC Address */ -"Send.enterLTCAddress" = "Indtast en Litecoin-adresse"; - -/* Network Fee: $0.01 */ -"Send.fee" = "Netværksafgift: %1$@"; - -/* Payee identity not certified alert title. */ -"Send.identityNotCertified" = "Betalingsmodtagerens identitet er ikke bekræftet."; - -/* Insufficient funds error */ -"Send.insufficientFunds" = "ikke nok penge"; - -/* Invalid address alert message */ -"Send.invalidAddressMessage" = "Modtageradressen er ikke en gyldig Litecoin-adresse."; - -/* Invalid address on pasteboard message */ -"Send.invalidAddressOnPasteboard" = "Tegnebord indeholder ikke en gyldig Litecoin adresse."; - -/* Invalid address alert title */ -"Send.invalidAddressTitle" = "Ugyldig adresse"; - -/* Is rescanning error message */ -"Send.isRescanning" = "Afsendelse er deaktiveret under en ny scanning."; - -/* Loading request activity view message */ -"Send.loadingRequest" = "Behandler Anmodning"; - -/* Empty address alert message */ -"Send.noAddress" = "Indtast modtagerens adresse."; - -/* Emtpy amount alert message */ -"Send.noAmount" = "Indtast et beløb, der skal sendes."; - -/* Paste button label */ -"Send.pasteLabel" = "Indsæt"; - -/* Could not publish transaction alert title */ -"Send.publishTransactionError" = "Kunne ikke offentliggøre transaktion."; - -/* Could not load remote request error message */ -"Send.remoteRequestError" = "Kunne ikke behandle betalingsanmodning"; - -/* Scan button label */ -"Send.scanLabel" = "Scan"; - -/* Send button label (the action, "press here to send") */ -"Send.sendLabel" = "Send"; - -/* Send screen title (as in "this is the screen for sending money") */ -"Send.title" = "Send penge"; - -/* Send money to label */ -"Send.toLabel" = "Til"; - -/* Lookup */ -"Send.UnstoppableDomains.lookup" = "Kig op"; - -/* LookupDomainError */ -"Send.UnstoppableDomains.lookupDomainError" = "Beklager, domænet blev ikke fundet. [Fejl: %2$d]"; - -/* lookupFailureHeader */ -"Send.UnstoppableDomains.lookupFailureHeader" = "Opslag mislykkedes"; - -/* Enter to match domain name to LTC Address */ -"Send.UnstoppableDomains.placeholder" = "Indtast et .crypto- eller .zil-domæne"; - -/* UDSystemError */ -"Send.UnstoppableDomains.udSystemError" = "Problem med systemopslag. [Fejl: %2$d]"; - -/* Adress already used alert message - first part */ -"Send.UsedAddress.firstLine" = "Litecoin adresser er kun beregnet til en enkelt anvendelse."; - -/* Adress already used alert message - second part */ -"Send.UsedAddress.secondLIne" = "Genbrug reducerer privatliv for både dig og modtageren og kan resultere i tab, hvis modtageren ikke har direkte kontrol over adressen."; - -/* Adress already used alert title */ -"Send.UsedAddress.title" = "Adresse allerede brugt"; - -/* About label */ -"Settings.about" = "Om"; - -/* Advanced Settings title */ -"Settings.advancedTitle" = "Avancerede indstillinger"; - -/* Blockchain settings section header */ -"Settings.blockchain" = "blockchain"; - -/* i.e. the currency which will be displayed */ -"Settings.currency" = "Vis valuta"; - -/* Current Locale */ -"Settings.currentLocale" = "Nuværende landestandard:"; - -/* Join Early access label */ -"Settings.earlyAccess" = "Tilmeld dig Early Access"; - -/* Are you enjoying Litewallet alert message body */ -"Settings.enjoying" = "Nyder du Litewallet?"; - -/* Face ID spending limit label */ -"Settings.faceIdLimit" = "PLACEHOLDER"; - -/* Import wallet label */ -"Settings.importTitle" = "Importer pung"; - -/* Languages label */ -"Settings.languages" = "Sprog"; - -/* Litewallet environment */ -"Settings.litewallet.environment" = "Miljø:"; - -/* Litewallet Partners */ -"Settings.litewallet.partners" = "Litewallet-partnere"; - -/* Litewallet version */ -"Settings.litewallet.version" = "Litewallet version:"; - -/* Manage settings section header */ -"Settings.manage" = "Administrer"; - -/* Notifications label */ -"Settings.notifications" = "Notifikationer"; - -/* Leave review button label */ -"Settings.review" = "Giv os en anmeldelse"; - -/* Share anonymous data label */ -"Settings.shareData" = "Del anonyme data"; - -/* Litewallet Social links */ -"Settings.socialLinks" = "Social"; - -/* Support settings section header */ -"Settings.support" = "Support"; - -/* Sync blockchain label */ -"Settings.sync" = "Synkroniser blokkæde"; - -/* Settings title */ -"Settings.title" = "Indstillinger"; - -/* Touch ID spending limit label */ -"Settings.touchIdLimit" = "Touch ID brugsgrænse"; - -/* Wallet Settings section header */ -"Settings.wallet" = "Wallet"; - -/* Start or recover another wallet menu label. */ -"Settings.wipe" = "Start/gendan en anden wallet"; - -/* Share data view body */ -"ShareData.body" = "Hjælp med at forbedre Litewallet ved at dele dine anonyme data med os. Dette inkluderer ikke finansielle oplysninger. Vi respekterer dit finansielle privatliv."; - -/* Share data header */ -"ShareData.header" = "Del data?"; - -/* Share data switch label. */ -"ShareData.toggleLabel" = "Del anonyme data?"; - -/* Current spending limit: */ -"SpendingLimit.title" = "Nuværende forbrugsgrænse: "; - -/* button label */ -"StartPaperPhrase.againButtonTitle" = "Skriv paper key ned igen"; - -/* Paper key explanation text. */ -"StartPaperPhrase.body" = "Din paper key er den eneste måde at gendanne dit Litewallet på, hvis din telefon mistes, stjæles, går i stykker eller opgraderes.\n\nVi viser dig en liste over word du skal skrive ned på et papir, og holde sikkert."; - -/* button label */ -"StartPaperPhrase.buttonTitle" = "Skriv paper key ned"; - -/* Argument is date */ -"StartPaperPhrase.date" = "Du skrev sidst din paper key ned den %1$@"; - -/* Start view message */ -"StartViewController.message" = "Den mest sikre og trygge måde at bruge Litecoins på."; - -/* Support the Litecoin Foundation */ -"SupportTheFoundation.title" = "Støt Litecoin Foundation"; - -/* Syncing view connection state header text */ -"SyncingHeader.connecting" = "Tilslutning..."; - -/* Rescanning header success state header text */ -"SyncingHeader.rescan" = "Rescanning ..."; - -/* Syncing header success state header text */ -"SyncingHeader.success" = "Succes!"; - -/* Syncing view syncing state header text */ -"SyncingHeader.syncing" = "Synkronisering ..."; - -/* Syncing view connectiong state header text */ -"SyncingView.connecting" = "Tilslutter"; - -/* Syncing view syncing state header text */ -"SyncingView.syncing" = "Synkroniserer"; - -/* 6 d (6 days) */ -"TimeSince.days" = "%1$@ d"; - -/* 6 h (6 hours) */ -"TimeSince.hours" = "%1$@ h"; - -/* 6 m (6 minutes) */ -"TimeSince.minutes" = "%1$@ m"; - -/* 6 s (6 seconds) */ -"TimeSince.seconds" = "%1$@ s"; - -/* You can customize your Touch ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button] */ -"TouchIdSettings.customizeText" = "Du kan tilpasse forbrugsgrænsen for dit Touch ID fra %1$@."; - -/* Touch Id screen label */ -"TouchIdSettings.label" = "Brug dit fingeraftryk til at låse op for dit Litewallet og sende penge op til en vis grænse."; - -/* ł100,000 ($100) */ -"TouchIdSettings.limitValue" = "1$@ (%2$@)"; - -/* Link Text (see TouchIdSettings.customizeText) */ -"TouchIdSettings.linkText" = "Touch ID forbrugsgrænseside"; - -/* Spending Limit: b100,000 ($100) */ -"TouchIdSettings.spendingLimit" = "Brugsgrænse: %1$@ (%2$@)"; - -/* Touch id switch label. */ -"TouchIdSettings.switchLabel" = "Aktiver Touch ID til Litewallet"; - -/* Touch ID settings view title */ -"TouchIdSettings.title" = "Touch ID"; - -/* Touch ID unavailable alert message */ -"TouchIdSettings.unavailableAlertMessage" = "Du har ikke indstillet Touch ID på denne enhed. Gå til Indstillinger -> Touch ID og Adgangskode og indstil det nu."; - -/* Touch ID unavailable alert title */ -"TouchIdSettings.unavailableAlertTitle" = "Touch ID ikke indstillet"; - -/* Always require passcode option */ -"TouchIdSpendingLimit" = "Kræv altid adgangskode"; - -/* Touch ID spending limit screen body */ -"TouchIdSpendingLimit.body" = "Du bliver bedt om at indtaste din 6-cifrede PIN for at sende en transaktion over din brugsgrænse, og hver 48 timer siden du sidst indtastede din 6-cifrede PIN."; - -/* Touch Id spending limit screen title */ -"TouchIdSpendingLimit.title" = "Touch ID brugsgrænse"; - -/* Static amount Label */ -"Transaction.amountDetailLabel" = "Mængde detaljer:"; - -/* Availability status text */ -"Transaction.available" = "Tilgængelig at bruge"; - -/* Static blockHeight Label */ -"Transaction.blockHeightLabel" = "Blok:"; - -/* Static comment Label */ -"Transaction.commentLabel" = "BEMÆRK:"; - -/* Transaction complete label */ -"Transaction.complete" = "Færdig"; - -/* Static end amount Label */ -"Transaction.endAmountDetailLabel" = "Detaljer om transaktionssluttebeløb"; - -/* eg. Ending balance: $50.00 */ -"Transaction.ending" = "Slutbalance: %1$@"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDayReceived" = "Valutakurs ved modtagelsestidspunkt:"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDaySent" = "Valutakurs ved afsendelsestidspunkt:"; - -/* (b600 fee) */ -"Transaction.fee" = "(%1$@ gebyr)"; - -/* Invalid transaction */ -"Transaction.invalid" = "UGYLDIG"; - -/* Timestamp label for event that just happened */ -"Transaction.justNow" = "netop nu"; - -/* Receive status text: 'In progress: 20%' */ -"Transaction.receivedStatus" = "I gang: %1$@"; - -/* Send status text: 'In progress: 20%' */ -"Transaction.sendingStatus" = "I gang: %1$@"; - -/* eg. Starting balance: $50.00 */ -"Transaction.starting" = "Startbalance: %1$@"; - -/* Static starting amount Label */ -"Transaction.startingAmountDetailLabel" = "Detaljer for transaktionsstartbeløb"; - -/* Static TX iD Label */ -"Transaction.txIDLabel" = "Tx ID:"; - -/* Waiting to be confirmed string */ -"Transaction.waiting" = "Venter på bekræftelse. Nogen forhandlere kræver bekræftelse for at gennemføre en transaktion. Anslået tid: 1-2 timer."; - -/* e.g. I received money from an account. */ -"TransactionDetails.account" = "konto"; - -/* Amount section header */ -"TransactionDetails.amountHeader" = "Beløb"; - -/* Block height label */ -"TransactionDetails.blockHeightLabel" = "Bekræftet i blok"; - -/* Memo section header */ -"TransactionDetails.commentsHeader" = "Memo"; - -/* Copied */ -"TransactionDetails.copiedAll" = "Kopieret"; - -/* Copy all details */ -"TransactionDetails.copyAllDetails" = "Kopier alle detaljer"; - -/* Empty transaction list message. */ -"TransactionDetails.emptyMessage" = "Dine transaktioner vil vises her."; - -/* "Received [$5] at [which of my addresses]" => This is the "at [which of my addresses]" part. */ -"TransactionDetails.from" = "på %1$@"; - -/* Less button title */ -"TransactionDetails.less" = "Mindre"; - -/* Moved $5.00 (as in "I moved $5 to another location") */ -"TransactionDetails.moved" = "Flyttede %1$@"; - -/* Moved $5.00 */ -"TransactionDetails.movedAmountDescription" = "Flyttet %1@"; - -/* eg. Confirmed in Block: Not Confirmed */ -"TransactionDetails.notConfirmedBlockHeightLabel" = "Ikke bekræftet"; - -/* Prefix for price */ -"TransactionDetails.priceTimeStampPrefix" = "fra"; - -/* "Received [$5] at [which of my addresses]" => This is the "Received [$5]" part. */ -"TransactionDetails.received" = "Modtaget %1$@"; - -/* Received $5.00 */ -"TransactionDetails.receivedAmountDescription" = "Modtaget %1@"; - -/* RECEIVE LTCTitle */ -"TransactionDetails.receivedModalTitle" = "Modtag adresse"; - -/* "Sent [$5] to [address]" => This is the "Sent [$5]" part. */ -"TransactionDetails.sent" = "Sendt %1$@"; - -/* Sent $5.00 */ -"TransactionDetails.sentAmountDescription" = "Sendt %1@"; - -/* Label for TXID */ -"TransactionDetails.staticTXLabel" = "Tx ID:"; - -/* Status section header */ -"TransactionDetails.statusHeader" = "Status"; - -/* Transaction Details Title */ -"TransactionDetails.title" = "Transaktionsoplysninger"; - -/* "Sent [$5] to [address]" => This is the "to [address]" part. */ -"TransactionDetails.to" = "til %1$@"; - -/* Transaction ID header */ -"TransactionDetails.txHashHeader" = "Litecoin transaktions-ID"; - -/* (this transaction was) Received at this address: */ -"TransactionDirection.address" = "Modtaget på denne adresse"; - -/* (this transaction was) Sent to this address: */ -"TransactionDirection.to" = "Sendt til denne adresse"; - -/* Disabled until date */ -"UnlockScreen.disabled" = "Deaktiveret indtil: %1$@"; - -/* Unlock Screen sub-header */ -"UnlockScreen.enterPin" = "Indtast PIN-kode"; - -/* Unlock with FaceID accessibility label */ -"UnlockScreen.faceIdText" = "Lås op med FaceID"; - -/* My Address button title */ -"UnlockScreen.myAddress" = "Min adresse"; - -/* Reset PIN with Paper Key button label. */ -"UnlockScreen.resetPin" = "Nulstil PIN"; - -/* Scan button title */ -"UnlockScreen.scan" = "Scan"; - -/* TouchID prompt text */ -"UnlockScreen.touchIdPrompt" = "Lås op for dit Litewallet."; - -/* Unlock with TouchID accessibility label */ -"UnlockScreen.touchIdText" = "Lås op med Touch ID"; - -/* Wallet unlocked message */ -"UnlockScreen.unlocked" = "Pung låst op"; - -/* Update PIN caption text */ -"UpdatePin.caption" = "Husk denne PIN. Hvis du glemmer den, vil du ikke kunne få adgang til dine Litecoin."; - -/* PIN creation info. */ -"UpdatePin.createInstruction" = "Din PIN bliver brugt til at låse op for dit Litewallet og sende penge."; - -/* Update PIN title */ -"UpdatePin.createTitle" = "Indstil PIN"; - -/* Update PIN title */ -"UpdatePin.createTitleConfirm" = "Genindtast PIN"; - -/* Enter current PIN instruction */ -"UpdatePin.enterCurrent" = "Indtast din nuværende PIN."; - -/* Enter new PIN instruction */ -"UpdatePin.enterNew" = "Indtast din nye PIN."; - -/* Re-Enter new PIN instruction */ -"UpdatePin.reEnterNew" = "Genindtast din nye PIN."; - -/* Update PIN failure error message. */ -"UpdatePin.setPinError" = "Beklager, kunne ikke opdatere PIN."; - -/* Update PIN failure alert view title */ -"UpdatePin.setPinErrorTitle" = "Fejl ved opdatering af PIN"; - -/* Update PIN title */ -"UpdatePin.updateTitle" = "Opdater PIN"; - -/* Authorize to copy wallet addresses alert message */ -"URLHandling.addressaddressListAlertMessage" = "Kopier pungadresse til udklipsholderen?"; - -/* Authorize to copy wallet address PIN view prompt. */ -"URLHandling.addressList" = "Tillad at kopiere pungadresse til udklipsholder"; - -/* Authorize to copy wallet address alert title */ -"URLHandling.addressListAlertTitle" = "Kopier pungadresse"; - -/* Copy wallet addresses alert button label */ -"URLHandling.copy" = "Kopier"; - -/* Verify PIN for transaction view body */ -"VerifyPin.authorize" = "Indtast venligst din PIN for at godkende denne transaktion."; - -/* Verify PIN view body */ -"VerifyPin.continueBody" = "Indtast din PIN for at fortsætte."; - -/* Verify PIN view title */ -"VerifyPin.title" = "PIN påkrævet"; - -/* Authorize transaction with touch id message */ -"VerifyPin.touchIdMessage" = "Godkend denne transaktion"; - -/* 'No wallet' warning for watch app */ -"Watch.noWalletWarning" = "Åben Litewallet iPhone appen for at konfigurere din pung."; - -/* Dismiss button label */ -"Webview.dismiss" = "Afvis"; - -/* Webview loading error message */ -"Webview.errorMessage" = "Der var en fejl ved indlæsning af indholdet. Prøv igen."; - -/* Updating webview message */ -"Webview.updating" = "Opdaterer..."; - -/* Welcome screen text. (?) will be replaced with the help icon users should look for. */ -"Welcome.body" = "Velkommen til Litewallet!"; - -/* Top title of welcome screen */ -"Welcome.title" = "Velkommen til Litewallet!"; - -/* Delete database title */ -"WipeWallet.alertDeleteTitle" = "Slet database"; - -/* Wipe wallet alert message */ -"WipeWallet.alertMessage" = "Er du sikker på at du vil slette denne wallet?"; - -/* Wipe wallet alert title */ -"WipeWallet.alertTitle" = "Slet wallet?"; - -/* Delete db */ -"WipeWallet.deleteDatabase" = "Slet database"; - -/* Delete database message */ -"WipeWallet.deleteMessageTitle" = "Dette sletter databasen, men bevarer PIN-koden og sætningen. Bekræft din eksisterende PIN-kode, udsæd, og vent på at synkronisere med den nye db"; - -/* Delete and sync */ -"WipeWallet.deleteSync" = "Slet & synkroniser"; - -/* Warning if user lost phrase */ -"WipeWallet.emptyWallet" = "Glem din frø sætning eller pinkode?"; - -/* Failed wipe wallet alert message */ -"WipeWallet.failedMessage" = "Fejl ved sletning af wallet."; - -/* Failed wipe wallet alert title */ -"WipeWallet.failedTitle" = "Fejl"; - -/* Enter phrase to wipe wallet instruction. */ -"WipeWallet.instruction" = "Indtast denne wallets gendannelsessætning for at slette den og starte eller gendanne en anden. Din nuværende saldo forbliver med denne sætning."; - -/* Start wipe wallet view message */ -"WipeWallet.startMessage" = "Påbegyndelse eller gendannelse af en anden tegnebog giver mulighed for at få adgang samt administrere en Litewallet tegnebog på denne enhed."; - -/* Start wipe wallet view warning */ -"WipeWallet.startWarning" = "Du vil ikke længere være i stand til at få adgang til din nuværende Litewallet tegnebog fra denne enhed. Saldoen vil forblive på frasen."; - -/* Wipe wallet navigation item title. */ -"WipeWallet.title" = "Start eller gendan en anden wallet."; - -/* Warning Alert */ -"WipeWallet.warningAlert" = "Denne handling vil slette din Litewallet!"; - -/* Warning description */ -"WipeWallet.warningDescription" = "Sletning af din tegnebog betyder, at den private nøgle og sletning af appdata vil være væk. Du kan miste Litecoin for altid!\n\n\nIngen på Litewallet-teamet kan hente dette frø for dig. Vi er ikke ansvarlige, hvis du undlader at følge denne advarsel."; - -/* Warning title */ -"WipeWallet.warningTitle" = "LÆS VENLIGST!"; - -/* Wipe wallet button title */ -"WipeWallet.wipe" = "Slet"; - -/* Wiping activity message */ -"WipeWallet.wiping" = "Sletter..."; - -/* Paper key instructions. */ -"WritePaperPhrase.instruction" = "Skriv hvert ord ned i rækkefølge og opbevar den et sikkert sted."; - -/* button label */ -"WritePaperPhrase.next" = "Næste"; - -/* button label */ -"WritePaperPhrase.previous" = "Forrige"; - -/* 1 of 3 */ -"WritePaperPhrase.step" = "%1$d af %2$d"; - -/* domain */ -"Send.UnstoppableDomains.domain" = ""; - -/* Enter a */ -"Send.UnstoppableDomains.enterA" = ""; - -/* Enter domain */ -"Send.UnstoppableDomains.simpleplaceholder" = ""; - -/* Change language alert message */ -"Settings.ChangeLanguage.alertMessage" = ""; diff --git a/loafwallet/src/Strings/nl.lproj/Localizable.strings b/loafwallet/src/Strings/nl.lproj/Localizable.strings deleted file mode 100755 index 3b86afc58..000000000 --- a/loafwallet/src/Strings/nl.lproj/Localizable.strings +++ /dev/null @@ -1,1451 +0,0 @@ -/* About screen blog label */ -"About.blog" = "Blog"; - -/* About screen footer */ -"About.footer" = "Gemaakt door het globale Litewallet team. Versie %1$@"; - -/* Privay Policy button label */ -"About.privacy" = "Privacyverklaring"; - -/* About screen reddit label */ -"About.reddit" = "Reddit"; - -/* About screen title */ -"About.title" = "Over"; - -/* About screen twitter label */ -"About.twitter" = "Twitter"; - -/* Close modal button accessibility label */ -"AccessibilityLabels.close" = "Sluiten"; - -/* Support center accessibiliy label */ -"AccessibilityLabels.faq" = "Ondersteuningscentrum"; - -/* Loading Wallet Message */ -"Account.loadingMessage" = "Portemonnee Laden"; - -/* Default wallet name */ -"AccountHeader.defaultWalletName" = "Mijn Litewallet"; - -/* Manage wallet button title */ -"AccountHeader.manageButtonName" = "BEHEREN"; - -/* Corruption Error alert title */ -"Alert.corruptionError" = "Lokale corruptiefout"; - -/* Corruption Error alert title */ -"Alert.corruptionMessage" = "Uw lokale database is beschadigd. Ga naar Instellingen> Blockchain: Instellingen> Verwijder database om te vernieuwen"; - -/* Error alert title */ -"Alert.error" = "Error"; - -/* No internet alert message */ -"Alert.noInternet" = "Er is geen internetconnectie gevonden. Controleer je connectie en probeer opnieuw."; - -/* Warning alert title */ -"Alert.warning" = "Waarschuwing"; - -/* 'the addresses were copied'' Alert title */ -"Alerts.copiedAddressesHeader" = "Adressen Gekopieerd"; - -/* Addresses Copied Alert sub header */ -"Alerts.copiedAddressesSubheader" = "Alle portemonnee adressen zijn succesvol gekopieerd."; - -/* Alert Header Label (the paper key was set) */ -"Alerts.paperKeySet" = "Papieren Sleutel Set."; - -/* Alert Subheader label (playfully positive) */ -"Alerts.paperKeySetSubheader" = "Geweldig!"; - -/* Alert Header label (the PIN was set) */ -"Alerts.pinSet" = "PIN Set."; - -/* Resolved Success */ -"Alerts.resolvedSuccess" = "Domeinresolutie"; - -/* No comment provided by engineer. */ -"Alerts.resolvedSuccessSubheader" = "Uw adres is opgelost!"; - -/* Send failure alert header label (the send failed to happen) */ -"Alerts.sendFailure" = "Zending mislukt"; - -/* Send success alert header label (confirmation that the send happened) */ -"Alerts.sendSuccess" = "Zending Bevestiging"; - -/* Send success alert subheader label (e.g. the money was sent) */ -"Alerts.sendSuccessSubheader" = "Geld Verstuurd!"; - -/* JSON Serialization error message */ -"ApiClient.jsonError" = "JSON Serialisatie Error"; - -/* Wallet not ready error message */ -"ApiClient.notReady" = "Portemonnee niet gereed"; - -/* API Token error message */ -"ApiClient.tokenError" = "Niet in staat op API teken te vinden"; - -/* buy button */ -"Button.buy" = "kopen"; - -/* Cancel button label */ -"Button.cancel" = "Annuleren"; - -/* Ignore button label */ -"Button.ignore" = "Negeren"; - -/* menu button */ -"Button.menu" = "menu"; - -/* No button */ -"Button.no" = "Nee"; - -/* OK button label */ -"Button.ok" = "OK"; - -/* receive button */ -"Button.receive" = "ontvangen"; - -/* resetFields */ -"Button.resetFields" = "Reset velden"; - -/* send button */ -"Button.send" = "versturen"; - -/* Settings button label */ -"Button.settings" = "Instellingen"; - -/* Settings button label */ -"Button.submit" = "Indienen"; - -/* Yes button */ -"Button.yes" = "Ja"; - -/* Buy Bar Item Title */ -"BuyCenter.barItemTitle" = "KOPEN"; - -/* Bitrefill buy financial details */ -"BuyCenter.bitrefillFinancialDetails" = "• Cadeaubonnen kopen \n • Prepaid-telefoons bijvullen \n • Steam, Amazon, Hotels.com \n • Werkt in 170 landen"; - -/* Bitrefill Title */ -"BuyCenter.BitrefillTitle" = "Bitrefill"; - -/* Changelly buy financial details */ -"BuyCenter.changellyFinancialDetails" = "• Litecoin wijzigen voor andere crypto's \n • Geen ID vereist \n • Kopen via creditcard \n • Wereldwijde dekking"; - -/* Changelly Title */ -"BuyCenter.changellyTitle" = "Changelly"; - -/* Buy Modal Title */ -"BuyCenter.ModalTitle" = "Koop Litecoin"; - -/* Moonpay buy financial details */ -"BuyCenter.moonpayFinancialDetails" = "• Koop LTC met veel fiat-paren\n• Betaal met meerdere methoden\n• Wereldwijde betalingsprovider"; - -/* Moonpay Title */ -"BuyCenter.moonpayTitle" = "Moonpay"; - -/* Simplex buy financial details */ -"BuyCenter.simplexFinancialDetails" = "• Krijg Litecoin in 5 minuten! \n • Koop Litecoin via creditcard \n • Paspoort of staat ID"; - -/* Simplex Title */ -"BuyCenter.simplexTitle" = "Simplex"; - -/* Buy Center Title */ -"BuyCenter.title" = "Koop Litecoin"; - -/* Camera plugin instruction */ -"CameraPlugin.centerInstruction" = "Centreer je ID in het vak"; - -/* $53.09/L + 1.07% */ -"Confirmation.amountDetailLabel" = "Uitwisselingsgegevens:"; - -/* Amount to Send: ($1.00) */ -"Confirmation.amountLabel" = "Bedrag om te Versturen:"; - -/* Amount to Donate: ($1.00) */ -"Confirmation.donateLabel" = "Te doneren bedrag:"; - -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Netwerkkosten:"; - -/* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingAndDonationTime" = "Verwerkingstijd: het verwerken van deze transacties duurt %1$@ minuten."; - -/* eg. Processing time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingTime" = "Verwerkingstijd: Deze transactie zal %1$@ minuten kosten om te verwerken."; - -/* Label for "send" button on final confirmation screen */ -"Confirmation.send" = "Versturen"; - -/* Short Network Fee: ($1.00) */ -"Confirmation.shortFeeLabel" = "VERGOEDING:"; - -/* Address label */ -"Confirmation.staticAddressLabel" = "ADRES:"; - -/* Confirmation Screen title */ -"Confirmation.title" = "Bevestiging"; - -/* To: (address) */ -"Confirmation.to" = "Naar"; - -/* Total Cost: ($5.00) */ -"Confirmation.totalLabel" = "Totale Prijs:"; - -/* Confirm paper phrase error message */ -"ConfirmPaperPhrase.error" = "De ingevoerde woorden komen niet overeen met uw papieren sleutel. Probeer het opnieuw."; - -/* Confirm paper phrase view label. */ -"ConfirmPaperPhrase.label" = "Voer de volgende woorden in van je papieren sleutel om te verzekeren dat alles correct is opgeschreven."; - -/* Word label eg. Word #1, Word #2 */ -"ConfirmPaperPhrase.word" = "Woord #%1$@"; - -/* as of a time or date */ -"Conjunction.asOf" = "vanaf"; - -/* No comment provided by engineer. */ -"Copy" = "Kopiëren"; - -/* Litecoin denomination picker label */ -"DefaultCurrency.bitcoinLabel" = "Litecoin-eenheid"; - -/* Label to pick fiat */ -"DefaultCurrency.chooseFiatLabel" = "Kiezen:"; - -/* Exchange rate label */ -"DefaultCurrency.rateLabel" = "Wisselkoers"; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableMessage" = "Dit apparaat is niet geconfigureerd om e-mails te sturen via de iOS Mail app."; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableTitle" = "E-mail Niet Beschikbaar"; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableMessage" = "Dit apparaat is niet geconfigureerd om berichten te sturen."; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableTitle" = "Bericht Sturen Onbeschikbaar"; - -/* You can customize your Face ID Spending Limit from the [FaceIdSettings.linkText gets added here as a button] */ -"FaceIDSettings.customizeText" = "PLACEHOLDER"; - -/* Face Id screen label */ -"FaceIDSettings.label" = "PLACEHOLDER"; - -/* Link Text (see FaceIdSettings.customizeText) */ -"FaceIDSettings.linkText" = "PLACEHOLDER"; - -/* Face id switch label. */ -"FaceIDSettings.switchLabel" = "PLACEHOLDER"; - -/* Face ID settings view title */ -"FaceIDSettings.title" = "PLACEHOLDER"; - -/* Face ID unavailable alert message */ -"FaceIDSettings.unavailableAlertMessage" = "PLACEHOLDER"; - -/* Face ID unavailable alert title */ -"FaceIDSettings.unavailableAlertTitle" = "PLACEHOLDER"; - -/* Face Id spending limit screen title */ -"FaceIDSpendingLimit.title" = "PLACEHOLDER"; - -/* Economy fee */ -"FeeSelector.economy" = "Enonomy"; - -/* Fee Selector economly fee description */ -"FeeSelector.economyLabel" = "Geschatte Bezorgingstijd: 10+ minuten"; - -/* Warning message for economy fee */ -"FeeSelector.economyWarning" = "Deze optie wordt niet aangeraden voor tijdgevoelige transacties."; - -/* Luxury fee */ -"FeeSelector.luxury" = "Luxe"; - -/* Fee Selector luxury fee description */ -"FeeSelector.luxuryLabel" = "Verwachte levertijd: 2,5 - 5 minuten"; - -/* Message for luxury fee */ -"FeeSelector.luxuryMessage" = "Deze optie garandeert vrijwel acceptatie van uw transactie, hoewel u een premie betaalt."; - -/* Regular fee */ -"FeeSelector.regular" = "Normaal"; - -/* Fee Selector regular fee description */ -"FeeSelector.regularLabel" = "Verwachte levertijd: 2,5 - 5+ minuten"; - -/* Fee Selector title */ -"FeeSelector.title" = "Verwerkingssnelheid"; - -/* Confirm */ -"Fragment.confirm" = "Bevestigen"; - -/* Or */ -"Fragment.or" = "of"; - -/* sorry */ -"Fragment.sorry" = "Sorry"; - -/* to */ -"Fragment.to" = "tot"; - -/* History Bar Item Title */ -"History.barItemTitle" = "GESCHIEDENIS"; - -/* History Current Litecoin Value */ -"History.currentLitecoinValue" = "Huidige LTC-waarde in"; - -/* Checking private key balance progress view text */ -"Import.checking" = "Persoonlijke sleutel balans checken..."; - -/* Sweep private key confirmation message */ -"Import.confirm" = "%1$@ van deze persoonlijke sleutel naar je portemonnee sturen? Het Litecoin netwerk zal een heffing ontvangen van %2$@."; - -/* Duplicate key error message */ -"Import.Error.duplicate" = "Deze persoonlijke sleutel zit al in je portemonnee."; - -/* empty private key error message */ -"Import.Error.empty" = "Deze persoonlijke sleutel is leeg."; - -/* High fees error message */ -"Import.Error.highFees" = "Transactiekosten zouden hoger zijn dan de fondsen die op deze private sleutel aanwezig zijn."; - -/* Not a valid private key error message */ -"Import.Error.notValid" = "Geen geldige persoonlijke sleutel"; - -/* Import signing error message */ -"Import.Error.signing" = "Error transactie ondertekenen"; - -/* Import button label */ -"Import.importButton" = "Importeren"; - -/* Importing wallet progress view label */ -"Import.importing" = "Portemonnee Importeren"; - -/* Caption for graphics */ -"Import.leftCaption" = "Portemonnee die geïmporteerd kan worden"; - -/* Import wallet intro screen message */ -"Import.message" = "Door een portemonnee te importeren plaats je het geld van je andere portemonnee naar je Litewallet portemonnee via een enkele transactie."; - -/* Enter password alert view title */ -"Import.password" = "Deze persoonlijke sleutel is beveiligd met een wachtwoord."; - -/* password textfield placeholder */ -"Import.passwordPlaceholder" = "wachtwoord"; - -/* Caption for graphics */ -"Import.rightCaption" = "Jouw Litewallet Portemonnee"; - -/* Scan Private key button label */ -"Import.scan" = "Scan Persoonlijke Sleutel"; - -/* Import wallet success alert title */ -"Import.success" = "Succes"; - -/* Successfully imported wallet message body */ -"Import.SuccessBody" = "Succesvol portemonnee geïmporteerd."; - -/* Import Wallet screen title */ -"Import.title" = "Importeer Portemonnee"; - -/* Unlocking Private key activity view message. */ -"Import.unlockingActivity" = "Sleutel Ontgrendelen"; - -/* Import wallet intro warning message */ -"Import.warning" = "Door een portemonnee te importeren zet je niet de transactie geschiedenis of andere details over."; - -/* Wrong password alert message */ -"Import.wrongPassword" = "Verkeerd wachtwoord, probeer alstublieft opnieuw."; - -/* Close app button */ -"JailbreakWarnings.close" = "Sluiten"; - -/* Ignore jailbreak warning button */ -"JailbreakWarnings.ignore" = "Negeren"; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithBalance" = "APPARAAT BEVEILIGING BESCHADIGD\nElke 'jailbreak' app heeft toegang tot de sleutelhanger data van Litewallet en kan hiermee je Litecoins stelen! Wis deze portemonnee direct en herstel het op een veilig apparaat."; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithoutBalance" = "APPARAAT BEVEILIGING BESCHADIGD\nElke 'jailbreak' app heeft toegang tot de sleutelhanger data van Litewallet en kan hiermee je Litecoins stelen. Gebruik Litewallet a.u.b. alleen op een niet-gejailbreakt apparaat."; - -/* Jailbreak warning title */ -"JailbreakWarnings.title" = "WAARSCHUWING"; - -/* Wipe wallet button */ -"JailbreakWarnings.wipe" = "Wissen"; - -/* Card Bar Item Title */ -"LitecoinCard.barItemTitle" = "KAART"; - -/* Card balance */ -"LitecoinCard.cardBalance" = "Kaartsaldo"; - -/* Message when 2FA is off and user is viewing the Card Balance */ -"LitecoinCard.cardBalanceOnlyDescription" = "Uitloggen en 2FA inschakelen om overdrachten toe te staan"; - -/* Features and limitations */ -"LitecoinCard.Disclaimer.bullets" = "- Registratie en inloggen\n- Beschikbaar kaartsaldo\n- Wachtwoord opnieuw instellen\n- Geen overdracht naar Litewallet\n- Alleen in de USA."; - -/* Description of the status */ -"LitecoinCard.Disclaimer.description" = "Litecoin Card heeft momenteel beperkte functionaliteit in Litewallet."; - -/* Referral to the website */ -"LitecoinCard.Disclaimer.referral" = "Bezoek litecoin.getblockcard.com voor volledige toegang"; - -/* Beta Testing Litecoin Card */ -"LitecoinCard.Disclaimer.title" = "Litecoin Card Beta"; - -/* Enter code */ -"LitecoinCard.enterCode" = "Voer code in"; - -/* Enter code details */ -"LitecoinCard.enterCode.detail" = "Voer de code in die onlangs naar uw Litecoin Card-account is verzonden."; - -/* Failed Login */ -"LitecoinCard.failed.login" = "Inloggen mislukt"; - -/* Forgot password? */ -"LitecoinCard.forgotPassword" = "Wachtwoord vergeten?"; - -/* Login */ -"LitecoinCard.login" = "Log in"; - -/* Logout */ -"LitecoinCard.logout" = "Uitloggen"; - -/* Card Bar Item Title */ -"LitecoinCard.name" = "Litecoin-kaart"; - -/* Register */ -"LitecoinCard.registerCard" = "Registreren"; - -/* Register for Litecoin Card */ -"LitecoinCard.registerCardPhrase" = "Registreer voor Litecoin Card"; - -/* Registering user... */ -"LitecoinCard.registering.user" = "Gebruiker registreren ..."; - -/* address */ -"LitecoinCard.Registration.address" = "Woonadres"; - -/* city */ -"LitecoinCard.Registration.city" = "stad"; - -/* confirm password */ -"LitecoinCard.Registration.confirmPassword" = "bevestig wachtwoord"; - -/* country */ -"LitecoinCard.Registration.country" = "Land"; - -/* First name */ -"LitecoinCard.Registration.firstName" = "Voornaam"; - -/* identification */ -"LitecoinCard.Registration.identification" = "Identificatie"; - -/* kycIDNumber */ -"LitecoinCard.Registration.kycIDNumber" = "Ken uw klant ID Type"; - -/* kycIDType */ -"LitecoinCard.Registration.kycIDType" = "ID Type"; - -/* SSN */ -"LitecoinCard.Registration.kycSSN" = "SSN"; - -/* Last name */ -"LitecoinCard.Registration.lastName" = "achternaam"; - -/* mobile number */ -"LitecoinCard.Registration.mobileNumber" = "Mobiele nummer"; - -/* password */ -"LitecoinCard.Registration.password" = "wachtwoord"; - -/* state province */ -"LitecoinCard.Registration.stateProvince" = "Staat / Provincie"; - -/* registraition username / email */ -"LitecoinCard.Registration.usernameEmail" = "E-mail"; - -/* must not be empty */ -"LitecoinCard.Registration.ValidationError.empty" = "Mag niet leeg zijn"; - -/* Invalid email address */ -"LitecoinCard.Registration.ValidationError.invalidEmail" = "Ongeldig e-mailadres"; - -/* Mobile number 10 digits required */ -"LitecoinCard.Registration.ValidationError.numberDigitsRequired" = "Het mobiele nummer moet minimaal 10 cijfers hebben"; - -/* Mobile number required */ -"LitecoinCard.Registration.ValidationError.numberRequired" = "Mobiel nummer is vereist"; - -/* 6 Password characters required */ -"LitecoinCard.Registration.ValidationError.passwordCharacters" = "Wachtwoord moet minimaal 6 tekens bevatten"; - -/* Captial and numeric password characters required */ -"LitecoinCard.Registration.ValidationError.passwordComposition" = "Wachtwoord moet uit meer dan 6 tekens bestaan, met minimaal één teken en één numeriek teken"; - -/* Password required */ -"LitecoinCard.Registration.ValidationError.passwordRequired" = "Een wachtwoord is verplicht"; - -/* Required field */ -"LitecoinCard.Registration.ValidationError.requiredField" = "verplicht veld"; - -/* zip post Code */ -"LitecoinCard.Registration.zipPostCode" = "Postcode"; - -/* Registration failure */ -"LitecoinCard.registrationFailure" = "Er is een probleem opgetreden met uw registratie. Controleer uw gegevens en probeer het opnieuw."; - -/* Registration success */ -"LitecoinCard.registrationSuccess" = "U bent geregistreerd! Controleer en bevestig uw e-mail. Kom dan terug om in te loggen."; - -/* Reset Litecoin card password */ -"LitecoinCard.resetPassword" = "Wachtwoord opnieuw instellen"; - -/* Reset password detail */ -"LitecoinCard.resetPasswordDetail" = "Voer het e-mailadres in dat is gekoppeld aan uw Litecoin Card-account en zoek een e-mail met resetinstructies."; - -/* Transfer to card label */ -"LitecoinCard.Transfer.amountToCard" = "Overboeken naar kaart"; - -/* Transfer to Litewallet label */ -"LitecoinCard.Transfer.amountToLitewallet" = "Overzetten naar Litewallet"; - -/* Description of action */ -"LitecoinCard.Transfer.description" = "Kies de overmakende portemonnee:"; - -/* Destination address label */ -"LitecoinCard.Transfer.destinationAddress" = "Adres"; - -/* Litewallet balance label */ -"LitecoinCard.Transfer.litewalletBalance" = "Litewallet-saldo"; - -/* Set transfer amount label */ -"LitecoinCard.Transfer.setAmount" = "Schuif om het overboekingsbedrag in te stellen"; - -/* Start transfer label */ -"LitecoinCard.Transfer.startTransfer" = "Overdracht starten"; - -/* Transfer title */ -"LitecoinCard.Transfer.title" = "Overdracht"; - -/* 2FA Error message */ -"LitecoinCard.twoFAErrorMessage" = "Er is een fout opgetreden. Zet a.u.b. 2FA op *Enabled*, voer de code per e-mail in en probeer het opnieuw."; - -/* Message when 2FA is off */ -"LitecoinCard.twoFAOff" = "2FA niet ingeschakeld"; - -/* Message when 2FA is on */ -"LitecoinCard.twoFAOn" = "2FA ingeschakeld"; - -/* Litecoin card visit */ -"LitecoinCard.visit.toReset" = "Ga naar https://litecoin.dashboard.getblockcard.com/password/forgot om uw wachtwoord te resetten."; - -/* Litewallet name */ -"Litewallet.name" = "Litewallet"; - -/* Location services disabled error */ -"LocationPlugin.disabled" = "Locatievoorzieningen zijn uitgeschakeld."; - -/* No permissions for location services */ -"LocationPlugin.notAuthorized" = "Litewallet heeft geen toestemming om locatievoorzieningen te gebruiken."; - -/* No comment provided by engineer. */ -"Malformed URI" = "Misvormde URI"; - -/* Balance */ -"ManageWallet.balance" = "Saldo"; - -/* Wallet creation date prefix */ -"ManageWallet.creationDatePrefix" = "Je hebt je portemonnee gecreëerd op %1$@"; - -/* Manage wallet description text */ -"ManageWallet.description" = "Jouw portemonnee naam zal alleen verschijnen in je account transactie geschiedenis en kan door niemand anders worden gezien."; - -/* Change Wallet name textfield label */ -"ManageWallet.textFeildLabel" = "Portemonnee Naam"; - -/* Manage wallet modal title */ -"ManageWallet.title" = "Portemonnee Beheren"; - -/* Buy Litecoin title */ -"MenuButton.buy" = "Litecoins Kopen"; - -/* Menu button title */ -"MenuButton.customer.support" = "Klantenservice"; - -/* Menu button title */ -"MenuButton.lock" = "Portemonnee Vergrendelen"; - -/* Menu button title */ -"MenuButton.security" = "Veiligheidscentrum"; - -/* Menu button title */ -"MenuButton.settings" = "Instellingen"; - -/* Menu button title */ -"MenuButton.support" = "Ondersteuning"; - -/* button label */ -"MenuViewController.createButton" = "Nieuwe Portemonnee Creëren"; - -/* Menu modal title */ -"MenuViewController.modalTitle" = "Menu"; - -/* button label */ -"MenuViewController.recoverButton" = "Portemonnee Herstellen"; - -/* No comment provided by engineer. */ -"No wallet" = "Geen portemonnee"; - -/* Switch to automatic mode button label */ -"NodeSelector.automaticButton" = "Omschakelen naar automatische modus"; - -/* Node is connected label */ -"NodeSelector.connected" = "Verbonden"; - -/* Enter node ip address view body */ -"NodeSelector.enterBody" = "Voer het IP-adres en de poort (optioneel) van de node in"; - -/* Enter Node ip address view title */ -"NodeSelector.enterTitle" = "Node invoeren"; - -/* Switch to manual mode button label */ -"NodeSelector.manualButton" = "Omschakelen naar handmatige modus"; - -/* Node address label */ -"NodeSelector.nodeLabel" = "Huidige primaire node"; - -/* Node is not connected label */ -"NodeSelector.notConnected" = "Niet Verbonden"; - -/* Node status label */ -"NodeSelector.statusLabel" = "Connectiestatus van de node"; - -/* Node Selector view title */ -"NodeSelector.title" = "Litecoin-nodes"; - -/* Bad Payment request alert title */ -"PaymentProtocol.Errors.badPaymentRequest" = "Slecht Betalingsverzoek"; - -/* Error opening payment protocol file message */ -"PaymentProtocol.Errors.corruptedDocument" = "Niet-ondersteund of beschadigd document"; - -/* Missing certificate payment protocol error message */ -"PaymentProtocol.Errors.missingCertificate" = "missend certificaat"; - -/* Request expired payment protocol error message */ -"PaymentProtocol.Errors.requestExpired" = "verzoek verlopen"; - -/* Payment too small alert title */ -"PaymentProtocol.Errors.smallOutputError" = "Kon de betaling niet uitvoeren"; - -/* Amount too small error message */ -"PaymentProtocol.Errors.smallPayment" = "Litecoin betalingen kunnen niet minder zijn dan %1$@."; - -/* Output too small error message. */ -"PaymentProtocol.Errors.smallTransaction" = "Litecoin transactie outputs kunnen niet minder zijn dan $@."; - -/* Unsupported signature type payment protocol error message */ -"PaymentProtocol.Errors.unsupportedSignatureType" = "niet-ondersteund handtekening type"; - -/* Untrusted certificate payment protocol error message */ -"PaymentProtocol.Errors.untrustedCertificate" = "niet-vertrouwd certificaat"; - -/* Dismiss button. */ -"Prompts.dismiss" = "VERWERPEN"; - -/* Enable face ID prompt body */ -"Prompts.FaceId.body" = "PLACEHOLDER"; - -/* Enable face ID prompt title */ -"Prompts.FaceId.title" = "PLACEHOLDER"; - -/* No passcode set warning body */ -"Prompts.NoPasscode.body" = "Er is een apparaat-pascode nodig om je portomonnee te beschermen. Ga naar de instellingen en zet je pascode aan."; - -/* No Passcode set warning title */ -"Prompts.NoPasscode.title" = "Zet pascode voor apparaat aan"; - -/* Affirm button title. */ -"Prompts.PaperKey.affirm" = "Doorgaan met"; - -/* Warning about paper key. */ -"Prompts.PaperKey.body" = "Uw Papiersleutel moet opgeslagen worden voor het geval dat u uw telefoon ooit verliest of vervangt. Klik hier om door te gaan."; - -/* Cancel button. */ -"Prompts.PaperKey.cancel" = "annuleren"; - -/* Enable button. */ -"Prompts.PaperKey.enable" = "Inschakelen"; - -/* An action is required (You must do this action). */ -"Prompts.PaperKey.title" = "Actie Vereist"; - -/* Transaction rejected prompt body */ -"Prompts.RecommendRescan.body" = "Je portemonnee is misschien niet gesynchroniseerd. Dit kan vaak worden verholpen door de blokketen opnieuw te scannen."; - -/* Transaction rejected prompt title */ -"Prompts.RecommendRescan.title" = "Transactie Geweigerd"; - -/* Upgrade PIN prompt body. */ -"Prompts.SetPin.body" = "Litewallet is geüpgrade naar een 6-cijferige PIN. Tik hier om te upgraden."; - -/* Upgrade PIN prompt title. */ -"Prompts.SetPin.title" = "PIN Upgraden"; - -/* Share data prompt body */ -"Prompts.ShareData.body" = "Help ons bij het verbeteren van Litewallet door je anonieme data met ons te delen"; - -/* Share data prompt title */ -"Prompts.ShareData.title" = "Deel Anonieme Data"; - -/* Enable touch ID prompt body */ -"Prompts.TouchId.body" = "Tik hier om Touch ID in te schakelen"; - -/* Enable touch ID prompt title */ -"Prompts.TouchId.title" = "Touch ID Inschakelen"; - -/* Notifications will be added later but users can set their preferences now, which is why we specify "in the future". */ -"PushNotifications.body" = "Zet notificaties aan om in de toekomst speciale berichten van Litewallet te ontvangen."; - -/* Push notifications toggle switch label */ -"PushNotifications.label" = "Push Meldingen"; - -/* Push notifications are off label */ -"PushNotifications.off" = "Uit"; - -/* Push notifications are on label */ -"PushNotifications.on" = "Aan"; - -/* Push notifications settings view title label */ -"PushNotifications.title" = "Notificaties"; - -/* Receive Bar Item Title */ -"Receive.barItemTitle" = "TE ONTVANGEN"; - -/* Address copied message. */ -"Receive.copied" = "Gekopieerd naar plakbord."; - -/* Share via email button label */ -"Receive.emailButton" = "E-mail"; - -/* Request button label */ -"Receive.request" = "Een bedrag aanvragen"; - -/* Share button label */ -"Receive.share" = "Delen"; - -/* Share via text message (SMS) */ -"Receive.textButton" = "Bericht"; - -/* Receive modal title */ -"Receive.title" = "Ontvangen"; - -/* Done button text */ -"RecoverWallet.done" = "Voltooid"; - -/* Recover wallet header */ -"RecoverWallet.header" = "Portemonnee Herstellen"; - -/* Reset PIN with paper key: header */ -"RecoverWallet.header_reset_pin" = "PIN Resetten"; - -/* Enter paper key instruction */ -"RecoverWallet.instruction" = "Papieren Sleutel Invoeren"; - -/* Recover wallet intro */ -"RecoverWallet.intro" = "Herstel je Litewallet met je papieren sleutel."; - -/* Invalid paper key message */ -"RecoverWallet.invalid" = "De papieren sleutel die je hebt ingevoerd is ongeldig. Check ieder woord a.u.b. en probeer het opnieuw."; - -/* Previous button accessibility label */ -"RecoverWallet.leftArrow" = "Linker Pijl"; - -/* Next button label */ -"RecoverWallet.next" = "Volgende"; - -/* Reset PIN with paper key: more information button. */ -"RecoverWallet.reset_pin_more_info" = "Tik hier voor meer informatie."; - -/* Next button accessibility label */ -"RecoverWallet.rightArrow" = "Rechter Pijl"; - -/* Recover wallet sub-header */ -"RecoverWallet.subheader" = "Voer de papieren sleutel in voor de portemonnee die je wilt herstellen."; - -/* Reset PIN with paper key: sub-header */ -"RecoverWallet.subheader_reset_pin" = "Om je PIN te resetten moet je de woorden van je papieren sleutel in onderstaande velden invoeren."; - -/* No amount entered error message. */ -"RequestAnAmount.noAmount" = "Vul alstublieft eerst een bedrag in."; - -/* Request a specific amount of Litecoin */ -"RequestAnAmount.title" = "Een bedrag aanvragen"; - -/* Alert action button label */ -"ReScan.alertAction" = "Synchroniseren"; - -/* Alert message body */ -"ReScan.alertMessage" = "Je zult niet in staat zijn om geld te versturen wanneer je aan het synchroniseren bent."; - -/* Alert message title */ -"ReScan.alertTitle" = "Synchroniseren met Blockchain?"; - -/* extimated time */ -"ReScan.body1" = "20-45 minuten"; - -/* Syncing explanation */ -"ReScan.body2" = "Als een transactie als voltooid staat op het Litecoin netwerk maar niet in je Litewallet."; - -/* Syncing explanation */ -"ReScan.body3" = "Je kreeg herhaaldelijk een foutmelding die zei dat je transactie werd afgewezen."; - -/* Start Sync button label */ -"ReScan.buttonTitle" = "Start Synchronisatie"; - -/* Sync blockchain view footer */ -"ReScan.footer" = "Je zult niet in staat zijn om geld te versturen wanneer je aan het synchroniseren bent met de blokketen."; - -/* Sync Blockchain view header */ -"ReScan.header" = "Synchroniseer Blockchain"; - -/* Subheader label */ -"ReScan.subheader1" = "Geschatte tijd"; - -/* Subheader label */ -"ReScan.subheader2" = "Wanneer Synchroniseren?"; - -/* Reset walet button title */ -"resetButton" = "Ja, portemonnee opnieuw instellen"; - -/* Warning Empty Wipe title */ -"resetTitle" = "Mijn Litewallet verwijderen"; - -/* Scan Litecoin address camera flash toggle */ -"Scanner.flashButtonLabel" = "Camera Flits"; - -/* Complete filter label */ -"Search.complete" = "complete"; - -/* Pending filter label */ -"Search.pending" = "in afwachting van"; - -/* Received filter label */ -"Search.received" = "ontvangen"; - -/* Sent filter label */ -"Search.sent" = "verstuurd"; - -/* Face ID button title */ -"SecurityCenter.faceIdTitle" = "PLACEHOLDER"; - -/* Security Center Info */ -"SecurityCenter.info" = "Activeer alle veiligheidsmaatregelen voor maximale bescherming."; - -/* Paper Key button description */ -"SecurityCenter.paperKeyDescription" = "De enige manier om toegang te hebben tot je Litecoins is als je je telefoon verliest of upgrade."; - -/* Paper Key button title */ -"SecurityCenter.paperKeyTitle" = "Papieren Sleutel"; - -/* PIN button description */ -"SecurityCenter.pinDescription" = "Beschermt je Litewallet van ongeautoriseerde gebruikers."; - -/* PIN button title */ -"SecurityCenter.pinTitle" = "6-cijferige PIN"; - -/* Security Center Title */ -"SecurityCenter.title" = "Veiligheidscentrum"; - -/* Touch ID button description */ -"SecurityCenter.touchIdDescription" = "Ontgrendel je Litewallet handig en stuur geld tot een bepaalde ingestelde limiet."; - -/* Touch ID button title */ -"SecurityCenter.touchIdTitle" = "Touch ID"; - -/* Send money amount label */ -"Send.amountLabel" = "Bedrag"; - -/* Balance: $4.00 */ -"Send.balance" = "Balans: %1$@"; - -/* Send Bar Item Title */ -"Send.barItemTitle" = "STUREN"; - -/* Camera not allowed message */ -"Send.cameraunavailableMessage" = "Ga naar Instellingen om camera gebruik toe te staan."; - -/* Camera not allowed alert title */ -"Send.cameraUnavailableTitle" = "Litewallet heeft geen toestemming voor het gebruik van de camera"; - -/* Warning when sending to self. */ -"Send.containsAddress" = "De bestemming is je eigen adres. Je kunt het niet naar jezelf sturen."; - -/* Could not create transaction alert title */ -"Send.creatTransactionError" = "Kon de transactie niet creëren."; - -/* Description for sending money label */ -"Send.descriptionLabel" = "Memo"; - -/* Emtpy pasteboard error message */ -"Send.emptyPasteboard" = "Plakbord is leeg"; - -/* Enter LTC Address */ -"Send.enterLTCAddress" = "Voer een Litecoin-adres in"; - -/* Network Fee: $0.01 */ -"Send.fee" = "Netwerkkosten: %1$@"; - -/* Payee identity not certified alert title. */ -"Send.identityNotCertified" = "Begunstigde is niet gecertifcieerd."; - -/* Insufficient funds error */ -"Send.insufficientFunds" = "onvoldoende middelen"; - -/* Invalid address alert message */ -"Send.invalidAddressMessage" = "Het bestemmingsadres is geen geldig Litecoin-adres."; - -/* Invalid address on pasteboard message */ -"Send.invalidAddressOnPasteboard" = "Plakbord bevat geen geldig Litecoin adres."; - -/* Invalid address alert title */ -"Send.invalidAddressTitle" = "Ongeldig Adres"; - -/* Is rescanning error message */ -"Send.isRescanning" = "Zenden is uitgeschakeld tijdens volledig opnieuw scannen"; - -/* Loading request activity view message */ -"Send.loadingRequest" = "Verzoek aan het laden"; - -/* Empty address alert message */ -"Send.noAddress" = "Voer a.u.b. het adres van de begunstigde in."; - -/* Emtpy amount alert message */ -"Send.noAmount" = "Voer a.u.b. een bedrag in om te versturen."; - -/* Paste button label */ -"Send.pasteLabel" = "Plakken"; - -/* Could not publish transaction alert title */ -"Send.publishTransactionError" = "Kon de transactie niet publiceren."; - -/* Could not load remote request error message */ -"Send.remoteRequestError" = "Kon de betalingsaanvraag niet laden"; - -/* Scan button label */ -"Send.scanLabel" = "Scannen"; - -/* Send button label (the action, "press here to send") */ -"Send.sendLabel" = "Versturen"; - -/* Send screen title (as in "this is the screen for sending money") */ -"Send.title" = "Versturen"; - -/* Send money to label */ -"Send.toLabel" = "Naar"; - -/* Lookup */ -"Send.UnstoppableDomains.lookup" = "Opzoeken"; - -/* LookupDomainError */ -"Send.UnstoppableDomains.lookupDomainError" = "Sorry, het domein is niet gevonden. [Fout: %2$d]"; - -/* lookupFailureHeader */ -"Send.UnstoppableDomains.lookupFailureHeader" = "Opzoeken mislukt"; - -/* Enter to match domain name to LTC Address */ -"Send.UnstoppableDomains.placeholder" = "Voer een .crypto- of .zil-domein in"; - -/* UDSystemError */ -"Send.UnstoppableDomains.udSystemError" = "Systeem opzoeken probleem. [Fout: %2$d]"; - -/* Adress already used alert message - first part */ -"Send.UsedAddress.firstLine" = "Litecoin adressen zijn alleen bedoeld voor enkel gebruik."; - -/* Adress already used alert message - second part */ -"Send.UsedAddress.secondLIne" = "Hergebruikt vermindert privacy voor zowel jou en de ontvanger en kan resulteren in verlies als de ontvanger niet direct het adres beheert."; - -/* Adress already used alert title */ -"Send.UsedAddress.title" = "Adres Al Gebruikt"; - -/* About label */ -"Settings.about" = "Over"; - -/* Advanced Settings title */ -"Settings.advancedTitle" = "Geavanceerde instellingen"; - -/* Blockchain settings section header */ -"Settings.blockchain" = "blockchain"; - -/* i.e. the currency which will be displayed */ -"Settings.currency" = "Toon valuta"; - -/* Current Locale */ -"Settings.currentLocale" = "Huidige landinstelling:"; - -/* Join Early access label */ -"Settings.earlyAccess" = "Doe Mee aan Early Access"; - -/* Are you enjoying Litewallet alert message body */ -"Settings.enjoying" = "Vind je Litewallet leuk?"; - -/* Face ID spending limit label */ -"Settings.faceIdLimit" = "PLACEHOLDER"; - -/* Import wallet label */ -"Settings.importTitle" = "Importeer Portemonnee"; - -/* Languages label */ -"Settings.languages" = "talen"; - -/* Litewallet environment */ -"Settings.litewallet.environment" = "Milieu:"; - -/* Litewallet Partners */ -"Settings.litewallet.partners" = "Litewallet-partners"; - -/* Litewallet version */ -"Settings.litewallet.version" = "Litewallet-versie:"; - -/* Manage settings section header */ -"Settings.manage" = "Beheer"; - -/* Notifications label */ -"Settings.notifications" = "Notificaties"; - -/* Leave review button label */ -"Settings.review" = "Laat een review achter"; - -/* Share anonymous data label */ -"Settings.shareData" = "Deel Anonieme Data"; - -/* Litewallet Social links */ -"Settings.socialLinks" = "Sociaal"; - -/* Support settings section header */ -"Settings.support" = "Ondersteuning"; - -/* Sync blockchain label */ -"Settings.sync" = "Synchroniseer Blockchain"; - -/* Settings title */ -"Settings.title" = "Instellingen"; - -/* Touch ID spending limit label */ -"Settings.touchIdLimit" = "Touch ID Bestedingslimiet"; - -/* Wallet Settings section header */ -"Settings.wallet" = "Portemonnee"; - -/* Start or recover another wallet menu label. */ -"Settings.wipe" = "Begin of herstel een andere portomonnee"; - -/* Share data view body */ -"ShareData.body" = "Help om Litewallet te verbeteren door je anonieme data met ons te delen. Dit bevat geen financiële informatie. We respecteren je financiële privacy."; - -/* Share data header */ -"ShareData.header" = "Data Delen?"; - -/* Share data switch label. */ -"ShareData.toggleLabel" = "Anonieme Data Delen?"; - -/* Current spending limit: */ -"SpendingLimit.title" = "Huidige bestedingslimiet: "; - -/* button label */ -"StartPaperPhrase.againButtonTitle" = "Schrijf Papieren Sleutel Opnieuw Op"; - -/* Paper key explanation text. */ -"StartPaperPhrase.body" = "Je papieren sleutel is de enige manier om je Litewallet te herstellen als je telefoon verloren, gestolen, kapot of geüpgrade is.\n\nWe zullen je een lijst met woorden laten zie die je op een papiertje moet schrijven en veilig moet bewaren."; - -/* button label */ -"StartPaperPhrase.buttonTitle" = "Schrijf Papieren Sleutel Op"; - -/* Argument is date */ -"StartPaperPhrase.date" = "Je hebt voor het laatst je papieren sleutel opgeschreven op %1$@"; - -/* Start view message */ -"StartViewController.message" = "De veiligste en betrouwbaarste manier om Litecoin te gebruiken."; - -/* Support the Litecoin Foundation */ -"SupportTheFoundation.title" = "Steun de Stichting Litecoin"; - -/* Syncing view connection state header text */ -"SyncingHeader.connecting" = "Verbinden..."; - -/* Rescanning header success state header text */ -"SyncingHeader.rescan" = "Opnieuw scannen ..."; - -/* Syncing header success state header text */ -"SyncingHeader.success" = "Succes!"; - -/* Syncing view syncing state header text */ -"SyncingHeader.syncing" = "Synchroniseren ..."; - -/* Syncing view connectiong state header text */ -"SyncingView.connecting" = "Aan het verbinden"; - -/* Syncing view syncing state header text */ -"SyncingView.syncing" = "Aan het synchroniseren"; - -/* 6 d (6 days) */ -"TimeSince.days" = "%1$@ d"; - -/* 6 h (6 hours) */ -"TimeSince.hours" = "%1$@ h"; - -/* 6 m (6 minutes) */ -"TimeSince.minutes" = "%1$@ m"; - -/* 6 s (6 seconds) */ -"TimeSince.seconds" = "%1$@ s"; - -/* You can customize your Touch ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button] */ -"TouchIdSettings.customizeText" = "Je kunt je Touch-ID uitgavenlimiet aanpassen van de %1$@."; - -/* Touch Id screen label */ -"TouchIdSettings.label" = "Gebruik je vingerafdruk om je Litewallet te ontgrendelen en geld tot een ingestelde limiet te versturen."; - -/* ł100,000 ($100) */ -"TouchIdSettings.limitValue" = "%1$@ (%2$@)"; - -/* Link Text (see TouchIdSettings.customizeText) */ -"TouchIdSettings.linkText" = "Touch-ID uitgavenlimietscherm"; - -/* Spending Limit: b100,000 ($100) */ -"TouchIdSettings.spendingLimit" = "Bestedingslimiet: %1$@ (%2$@)"; - -/* Touch id switch label. */ -"TouchIdSettings.switchLabel" = "Schakel Touch ID in voor Litewallet"; - -/* Touch ID settings view title */ -"TouchIdSettings.title" = "Touch ID"; - -/* Touch ID unavailable alert message */ -"TouchIdSettings.unavailableAlertMessage" = "Je hebt je Touch ID niet ingesteld op dit apparaat. Ga naar Instellingen -> Touch ID & Wachtwoord om het nu in te stellen."; - -/* Touch ID unavailable alert title */ -"TouchIdSettings.unavailableAlertTitle" = "Touch ID Niet Ingesteld"; - -/* Always require passcode option */ -"TouchIdSpendingLimit" = "Vraag altijd naar wachtwoord"; - -/* Touch ID spending limit screen body */ -"TouchIdSpendingLimit.body" = "Je zal gevraagd worden om je 6-cijferige PIN in te voeren om elke transactie boven je bestedingslimiet te versturen, en elke 48 uur sinds de laatste keer dat je je 6-cijferige PIN hebt ingevoerd."; - -/* Touch Id spending limit screen title */ -"TouchIdSpendingLimit.title" = "Touch ID Bestedingslimiet"; - -/* Static amount Label */ -"Transaction.amountDetailLabel" = "Uitwisselingsgegevens: "; - -/* Availability status text */ -"Transaction.available" = "Beschikbaar om te besteden"; - -/* Static blockHeight Label */ -"Transaction.blockHeightLabel" = "Blok:"; - -/* Static comment Label */ -"Transaction.commentLabel" = "Memo: "; - -/* Transaction complete label */ -"Transaction.complete" = "Compleet"; - -/* Static end amount Label */ -"Transaction.endAmountDetailLabel" = "Detail eindbedrag transactie"; - -/* eg. Ending balance: $50.00 */ -"Transaction.ending" = "Eindbalans: %1$@"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDayReceived" = "Wisselkoers bij ontvangst:"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDaySent" = "Wisselkoers bij verzending:"; - -/* (b600 fee) */ -"Transaction.fee" = "(%1$@ fee)"; - -/* Invalid transaction */ -"Transaction.invalid" = "ONGELDIG"; - -/* Timestamp label for event that just happened */ -"Transaction.justNow" = "zojuist"; - -/* Receive status text: 'In progress: 20%' */ -"Transaction.receivedStatus" = "In uitvoering: %1$@"; - -/* Send status text: 'In progress: 20%' */ -"Transaction.sendingStatus" = "In uitvoering: %1$@"; - -/* eg. Starting balance: $50.00 */ -"Transaction.starting" = "Startbalans: %1$@"; - -/* Static starting amount Label */ -"Transaction.startingAmountDetailLabel" = "Transactie startbedrag detail"; - -/* Static TX iD Label */ -"Transaction.txIDLabel" = "Tx ID:"; - -/* Waiting to be confirmed string */ -"Transaction.waiting" = "Wachtend op bevestiging. Sommige handelaren willen bevestiging om een transactie af te roden. Geschatte tijd: 1-2 uur."; - -/* e.g. I received money from an account. */ -"TransactionDetails.account" = "account"; - -/* Amount section header */ -"TransactionDetails.amountHeader" = "Bedrag"; - -/* Block height label */ -"TransactionDetails.blockHeightLabel" = "Bevestigd in blok"; - -/* Memo section header */ -"TransactionDetails.commentsHeader" = "Memo"; - -/* Copied */ -"TransactionDetails.copiedAll" = "Gekopieerd"; - -/* Copy all details */ -"TransactionDetails.copyAllDetails" = "Kopieer alle details"; - -/* Empty transaction list message. */ -"TransactionDetails.emptyMessage" = "Je transacties zullen hier verschijnen."; - -/* "Received [$5] at [which of my addresses]" => This is the "at [which of my addresses]" part. */ -"TransactionDetails.from" = "op %1$@"; - -/* Less button title */ -"TransactionDetails.less" = "Minder"; - -/* Moved $5.00 (as in "I moved $5 to another location") */ -"TransactionDetails.moved" = "%1$@ verplaatst"; - -/* Moved $5.00 */ -"TransactionDetails.movedAmountDescription" = "%1@ verplaatst"; - -/* eg. Confirmed in Block: Not Confirmed */ -"TransactionDetails.notConfirmedBlockHeightLabel" = "Niet bevestigd"; - -/* Prefix for price */ -"TransactionDetails.priceTimeStampPrefix" = "vanaf"; - -/* "Received [$5] at [which of my addresses]" => This is the "Received [$5]" part. */ -"TransactionDetails.received" = "Ontvangen %1$@"; - -/* Received $5.00 */ -"TransactionDetails.receivedAmountDescription" = "Ontvangen %1@"; - -/* RECEIVE LTCTitle */ -"TransactionDetails.receivedModalTitle" = "ONTVANG ADRES"; - -/* "Sent [$5] to [address]" => This is the "Sent [$5]" part. */ -"TransactionDetails.sent" = "Verstuurd %1$@"; - -/* Sent $5.00 */ -"TransactionDetails.sentAmountDescription" = "Verstuurd %1@"; - -/* Label for TXID */ -"TransactionDetails.staticTXLabel" = "Tx ID:"; - -/* Status section header */ -"TransactionDetails.statusHeader" = "Status"; - -/* Transaction Details Title */ -"TransactionDetails.title" = "Transactie Details"; - -/* "Sent [$5] to [address]" => This is the "to [address]" part. */ -"TransactionDetails.to" = "aan %1$@"; - -/* Transaction ID header */ -"TransactionDetails.txHashHeader" = "Litecoin Transactie-ID"; - -/* (this transaction was) Received at this address: */ -"TransactionDirection.address" = "Ontvangen op dit adres"; - -/* (this transaction was) Sent to this address: */ -"TransactionDirection.to" = "Verstuurd naar dit adres"; - -/* Disabled until date */ -"UnlockScreen.disabled" = "Uitgeschakeld tot: %1$@"; - -/* Unlock Screen sub-header */ -"UnlockScreen.enterPin" = "Voer Pin-code in"; - -/* Unlock with FaceID accessibility label */ -"UnlockScreen.faceIdText" = "Ontgrendel met FaceID"; - -/* My Address button title */ -"UnlockScreen.myAddress" = "Mijn Adres"; - -/* Reset PIN with Paper Key button label. */ -"UnlockScreen.resetPin" = "PIN Resetten"; - -/* Scan button title */ -"UnlockScreen.scan" = "Scannen"; - -/* TouchID prompt text */ -"UnlockScreen.touchIdPrompt" = "Ontgrendel je Litewallet."; - -/* Unlock with TouchID accessibility label */ -"UnlockScreen.touchIdText" = "Ontgrendel met Touch ID"; - -/* Wallet unlocked message */ -"UnlockScreen.unlocked" = "Portemonnee Ontgrendeld"; - -/* Update PIN caption text */ -"UpdatePin.caption" = "Onthoud deze PIN. Als je deze vergeet, zul je niet in staat zijn om bij je Litecoins te kunnen."; - -/* PIN creation info. */ -"UpdatePin.createInstruction" = "Je PIN zal worden gebruikt om je Litewallet te ontgrendelen en geld te versturen."; - -/* Update PIN title */ -"UpdatePin.createTitle" = "PIN Instellen"; - -/* Update PIN title */ -"UpdatePin.createTitleConfirm" = "Voer PIN opnieuw in"; - -/* Enter current PIN instruction */ -"UpdatePin.enterCurrent" = "Voer je huidige PIN in."; - -/* Enter new PIN instruction */ -"UpdatePin.enterNew" = "Voer je nieuwe PIN in."; - -/* Re-Enter new PIN instruction */ -"UpdatePin.reEnterNew" = "Voer je nieuwe PIN opnieuw in."; - -/* Update PIN failure error message. */ -"UpdatePin.setPinError" = "Sorry, we konden je PIN niet updaten."; - -/* Update PIN failure alert view title */ -"UpdatePin.setPinErrorTitle" = "Update PIN Error"; - -/* Update PIN title */ -"UpdatePin.updateTitle" = "Update PIN"; - -/* Authorize to copy wallet addresses alert message */ -"URLHandling.addressaddressListAlertMessage" = "Portemonnee adressen naar plakbord kopiëren?"; - -/* Authorize to copy wallet address PIN view prompt. */ -"URLHandling.addressList" = "Autoriseer om portemonnee adres naar plakbord te kopiëren"; - -/* Authorize to copy wallet address alert title */ -"URLHandling.addressListAlertTitle" = "Kopieer Portemonnee Adressen"; - -/* Copy wallet addresses alert button label */ -"URLHandling.copy" = "Kopiëren"; - -/* Verify PIN for transaction view body */ -"VerifyPin.authorize" = "Voer alstublieft uw PIN in om deze transactie te autoriseren."; - -/* Verify PIN view body */ -"VerifyPin.continueBody" = "Voer a.u.b. je PIN in om verder te gaan."; - -/* Verify PIN view title */ -"VerifyPin.title" = "PIN Vereist"; - -/* Authorize transaction with touch id message */ -"VerifyPin.touchIdMessage" = "Autoriseer deze transactie"; - -/* 'No wallet' warning for watch app */ -"Watch.noWalletWarning" = "Open de Litewallet iPhone app om je portemonnee in te stellen."; - -/* Dismiss button label */ -"Webview.dismiss" = "Verwerpen"; - -/* Webview loading error message */ -"Webview.errorMessage" = "Er was een error bij het laden van de inhoud. Probeer a.u.b. opnieuw."; - -/* Updating webview message */ -"Webview.updating" = "Updaten..."; - -/* Welcome screen text. (?) will be replaced with the help icon users should look for. */ -"Welcome.body" = "Welkom bij Litewallet!"; - -/* Top title of welcome screen */ -"Welcome.title" = "Welkom bij Litewallet!"; - -/* Delete database title */ -"WipeWallet.alertDeleteTitle" = "Database verwijderen"; - -/* Wipe wallet alert message */ -"WipeWallet.alertMessage" = "Weet je zeker dat je deze portomonnee wilt verwijderen?"; - -/* Wipe wallet alert title */ -"WipeWallet.alertTitle" = "Portomonnee wissen?"; - -/* Delete db */ -"WipeWallet.deleteDatabase" = "Verwijder database"; - -/* Delete database message */ -"WipeWallet.deleteMessageTitle" = "Hiermee wordt de database verwijderd, maar worden de pincode en zinsdeel behouden. Bevestig uw bestaande pincode, start en wacht om te synchroniseren met de nieuwe DB"; - -/* Delete and sync */ -"WipeWallet.deleteSync" = "Verwijderen en synchroniseren"; - -/* Warning if user lost phrase */ -"WipeWallet.emptyWallet" = "Vergeet uw startzin of pincode?"; - -/* Failed wipe wallet alert message */ -"WipeWallet.failedMessage" = "Wissen van portomonnee niet gelukt"; - -/* Failed wipe wallet alert title */ -"WipeWallet.failedTitle" = "Mislukt"; - -/* Enter phrase to wipe wallet instruction. */ -"WipeWallet.instruction" = "Voer de herstelzin van deze portomonnee in om hem te wissen of een anderen te herstellen. Je huidige saldo zal op deze zin blijven."; - -/* Start wipe wallet view message */ -"WipeWallet.startMessage" = "Een andere portemonnee beginnen of herstellen zal u toestaan om nog een Litewallet portemonnee op dit apparaat te gebruiken."; - -/* Start wipe wallet view warning */ -"WipeWallet.startWarning" = "U zal niet langer uw huidige Litewallet portemonnee kunnen bereiken vanaf dit apparaat. Uw saldo zal hetzelfde blijven."; - -/* Wipe wallet navigation item title. */ -"WipeWallet.title" = "Start of herstel een anderen portomonnee"; - -/* Warning Alert */ -"WipeWallet.warningAlert" = "Deze actie zal je Litewallet wissen!"; - -/* Warning description */ -"WipeWallet.warningDescription" = "Als u uw portemonnee verwijdert, zijn de privésleutel en het wissen van de app-gegevens verdwenen. U kunt Litecoin voor altijd verliezen!\n\n\nNiemand in het Litewallet-team kan deze seed voor je ophalen. Wij zijn niet verantwoordelijk als u deze waarschuwing niet in acht neemt."; - -/* Warning title */ -"WipeWallet.warningTitle" = "GELIEVE TE LEZEN!"; - -/* Wipe wallet button title */ -"WipeWallet.wipe" = "Wissen"; - -/* Wiping activity message */ -"WipeWallet.wiping" = "Aan het wissen..."; - -/* Paper key instructions. */ -"WritePaperPhrase.instruction" = "Schrijf elk woord in de juiste volgorde op en bewaar het op een veilige plek."; - -/* button label */ -"WritePaperPhrase.next" = "Volgende"; - -/* button label */ -"WritePaperPhrase.previous" = "Vorige"; - -/* 1 of 3 */ -"WritePaperPhrase.step" = "%1$d van %2$d"; - -/* domain */ -"Send.UnstoppableDomains.domain" = ""; - -/* Enter a */ -"Send.UnstoppableDomains.enterA" = ""; - -/* Enter domain */ -"Send.UnstoppableDomains.simpleplaceholder" = ""; - -/* Change language alert message */ -"Settings.ChangeLanguage.alertMessage" = ""; diff --git a/loafwallet/src/Strings/sv.lproj/Localizable.strings b/loafwallet/src/Strings/sv.lproj/Localizable.strings deleted file mode 100755 index bd69c083e..000000000 --- a/loafwallet/src/Strings/sv.lproj/Localizable.strings +++ /dev/null @@ -1,1451 +0,0 @@ -/* About screen blog label */ -"About.blog" = "Blogg"; - -/* About screen footer */ -"About.footer" = "Skapad av det lokala teamet för Litewallet. Version %1$@"; - -/* Privay Policy button label */ -"About.privacy" = "Sekretesspolicy"; - -/* About screen reddit label */ -"About.reddit" = "Reddit"; - -/* About screen title */ -"About.title" = "Om"; - -/* About screen twitter label */ -"About.twitter" = "Twitter"; - -/* Close modal button accessibility label */ -"AccessibilityLabels.close" = "Stäng"; - -/* Support center accessibiliy label */ -"AccessibilityLabels.faq" = "Support Center"; - -/* Loading Wallet Message */ -"Account.loadingMessage" = "Laddar plånbok"; - -/* Default wallet name */ -"AccountHeader.defaultWalletName" = "Mitt Litewallet"; - -/* Manage wallet button title */ -"AccountHeader.manageButtonName" = "HANTERA"; - -/* Corruption Error alert title */ -"Alert.corruptionError" = "Lokalt korruptionsfel"; - -/* Corruption Error alert title */ -"Alert.corruptionMessage" = "Detta raderar databasen men behåller PIN-koden och frasen. Bekräfta din befintliga PIN-kod, frö och vänta på att synkronisera till den nya db"; - -/* Error alert title */ -"Alert.error" = "Fel"; - -/* No internet alert message */ -"Alert.noInternet" = "Ingen anslutning till internet hittades. Kontrollera din anslutning och försök igen."; - -/* Warning alert title */ -"Alert.warning" = "Varning"; - -/* 'the addresses were copied'' Alert title */ -"Alerts.copiedAddressesHeader" = "Adresser kopierade"; - -/* Addresses Copied Alert sub header */ -"Alerts.copiedAddressesSubheader" = "Alla plånboksadresser har kopierats."; - -/* Alert Header Label (the paper key was set) */ -"Alerts.paperKeySet" = "Ordnyckel är inställd"; - -/* Alert Subheader label (playfully positive) */ -"Alerts.paperKeySetSubheader" = "Härligt!"; - -/* Alert Header label (the PIN was set) */ -"Alerts.pinSet" = "PIN-kod är inställd"; - -/* Resolved Success */ -"Alerts.resolvedSuccess" = "Domänupplösning"; - -/* No comment provided by engineer. */ -"Alerts.resolvedSuccessSubheader" = "Din adress har lösts!"; - -/* Send failure alert header label (the send failed to happen) */ -"Alerts.sendFailure" = "Sändningen misslyckades"; - -/* Send success alert header label (confirmation that the send happened) */ -"Alerts.sendSuccess" = "Skicka bekräftelse"; - -/* Send success alert subheader label (e.g. the money was sent) */ -"Alerts.sendSuccessSubheader" = "Pengarna skickade!"; - -/* JSON Serialization error message */ -"ApiClient.jsonError" = "Fel vid JSON-serialisering"; - -/* Wallet not ready error message */ -"ApiClient.notReady" = "Plånboken ej redo"; - -/* API Token error message */ -"ApiClient.tokenError" = "Kan inte ta emot API-symbol"; - -/* buy button */ -"Button.buy" = "köpa"; - -/* Cancel button label */ -"Button.cancel" = "Avbryt"; - -/* Ignore button label */ -"Button.ignore" = "Ignorera"; - -/* menu button */ -"Button.menu" = "meny"; - -/* No button */ -"Button.no" = "Nej"; - -/* OK button label */ -"Button.ok" = "OK"; - -/* receive button */ -"Button.receive" = "ta emot"; - -/* resetFields */ -"Button.resetFields" = "Nollställ fält"; - -/* send button */ -"Button.send" = "skicka"; - -/* Settings button label */ -"Button.settings" = "Inställningar"; - -/* Settings button label */ -"Button.submit" = "Överlämna"; - -/* Yes button */ -"Button.yes" = "Ja"; - -/* Buy Bar Item Title */ -"BuyCenter.barItemTitle" = "KÖPA"; - -/* Bitrefill buy financial details */ -"BuyCenter.bitrefillFinancialDetails" = "• Köp presentkort \n • Fyll på förbetalda telefoner \n • Steam, Amazon, Hotels.com \n • Fungerar i 170 länder"; - -/* Bitrefill Title */ -"BuyCenter.BitrefillTitle" = "Bitrefill"; - -/* Changelly buy financial details */ -"BuyCenter.changellyFinancialDetails" = "• Byt Litecoin för andra kryptor \n • Ingen ID krävs \n • Köp via kreditkort \n • Global täckning"; - -/* Changelly Title */ -"BuyCenter.changellyTitle" = "Changelly"; - -/* Buy Modal Title */ -"BuyCenter.ModalTitle" = "Köp Litecoin"; - -/* Moonpay buy financial details */ -"BuyCenter.moonpayFinancialDetails" = "• Köp LTC med många fiatpar\n• Betala med flera metoder\n• Global betalningsleverantör"; - -/* Moonpay Title */ -"BuyCenter.moonpayTitle" = "Moonpay"; - -/* Simplex buy financial details */ -"BuyCenter.simplexFinancialDetails" = "• Skaffa Litecoin inom 5 minuter! \n • Köp Litecoin via kreditkort \n • Pass eller statligt ID"; - -/* Simplex Title */ -"BuyCenter.simplexTitle" = "Simplex"; - -/* Buy Center Title */ -"BuyCenter.title" = "Köp Litecoin"; - -/* Camera plugin instruction */ -"CameraPlugin.centerInstruction" = "Centrera ditt ID i boxen"; - -/* $53.09/L + 1.07% */ -"Confirmation.amountDetailLabel" = "Byt information:"; - -/* Amount to Send: ($1.00) */ -"Confirmation.amountLabel" = "Belopp att skicka:"; - -/* Amount to Donate: ($1.00) */ -"Confirmation.donateLabel" = "Belopp att donera:"; - -/* Network Fee: ($1.00) */ -"Confirmation.feeLabel" = "Nätverks-avgift"; - -/* eg. Processing with Donation time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingAndDonationTime" = "Bearbetningstid: Dessa transaktioner tar %1$@ minuter att behandla."; - -/* eg. Processing time: This transaction will take 10-30 minutes to process. */ -"Confirmation.processingTime" = "Bearbetningstid: Denna transaktion kommer att ta %1$@ minuter att bearbeta."; - -/* Label for "send" button on final confirmation screen */ -"Confirmation.send" = "Skicka"; - -/* Short Network Fee: ($1.00) */ -"Confirmation.shortFeeLabel" = "AVGIFT:"; - -/* Address label */ -"Confirmation.staticAddressLabel" = "ADRESS:"; - -/* Confirmation Screen title */ -"Confirmation.title" = "Bekräftelse"; - -/* To: (address) */ -"Confirmation.to" = "Till"; - -/* Total Cost: ($5.00) */ -"Confirmation.totalLabel" = "Total kostnad:"; - -/* Confirm paper phrase error message */ -"ConfirmPaperPhrase.error" = "De angivna orden matchar inte din pappersnyckel. Var god försök igen."; - -/* Confirm paper phrase view label. */ -"ConfirmPaperPhrase.label" = "Ange följande ord från din ordnyckel, för att vara säker på att allt skrevs korrekt."; - -/* Word label eg. Word #1, Word #2 */ -"ConfirmPaperPhrase.word" = "Ord #%1$@"; - -/* as of a time or date */ -"Conjunction.asOf" = "från och med"; - -/* No comment provided by engineer. */ -"Copy" = "Kopia"; - -/* Litecoin denomination picker label */ -"DefaultCurrency.bitcoinLabel" = "Litecoin visningsenhet"; - -/* Label to pick fiat */ -"DefaultCurrency.chooseFiatLabel" = "Välja:"; - -/* Exchange rate label */ -"DefaultCurrency.rateLabel" = "Växelkurs"; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableMessage" = "Enheten är inte konfigurerad för att skicka e-post med post-appen i iOS."; - -/* Email unavailable alert title */ -"ErrorMessages.emailUnavailableTitle" = "E-posten är inte tillgänglig"; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableMessage" = "Denna enhet är inte konfigurerad för att skicka meddelanden."; - -/* Messaging unavailable alert title */ -"ErrorMessages.messagingUnavailableTitle" = "Meddelandehantering inte tillgänglig"; - -/* You can customize your Face ID Spending Limit from the [FaceIdSettings.linkText gets added here as a button] */ -"FaceIDSettings.customizeText" = "PLACEHOLDER"; - -/* Face Id screen label */ -"FaceIDSettings.label" = "PLACEHOLDER"; - -/* Link Text (see FaceIdSettings.customizeText) */ -"FaceIDSettings.linkText" = "PLACEHOLDER"; - -/* Face id switch label. */ -"FaceIDSettings.switchLabel" = "PLACEHOLDER"; - -/* Face ID settings view title */ -"FaceIDSettings.title" = "PLACEHOLDER"; - -/* Face ID unavailable alert message */ -"FaceIDSettings.unavailableAlertMessage" = "PLACEHOLDER"; - -/* Face ID unavailable alert title */ -"FaceIDSettings.unavailableAlertTitle" = "PLACEHOLDER"; - -/* Face Id spending limit screen title */ -"FaceIDSpendingLimit.title" = "PLACEHOLDER"; - -/* Economy fee */ -"FeeSelector.economy" = "Ekonomi"; - -/* Fee Selector economly fee description */ -"FeeSelector.economyLabel" = "Beräknad leveranstid: 10+ minuter"; - -/* Warning message for economy fee */ -"FeeSelector.economyWarning" = "Detta alternativ rekommenderas inte för tidskänsliga transaktioner."; - -/* Luxury fee */ -"FeeSelector.luxury" = "Lyx"; - -/* Fee Selector luxury fee description */ -"FeeSelector.luxuryLabel" = "Uppskattad leverans: 2,5 - 5 minuter"; - -/* Message for luxury fee */ -"FeeSelector.luxuryMessage" = "Detta alternativ garanterar praktiskt taget accept av din transaktion även om du betalar en premie."; - -/* Regular fee */ -"FeeSelector.regular" = "Vanlig"; - -/* Fee Selector regular fee description */ -"FeeSelector.regularLabel" = "Uppskattad leverans: 2,5 - 5+ minuter"; - -/* Fee Selector title */ -"FeeSelector.title" = "Bearbetningshastighet"; - -/* Confirm */ -"Fragment.confirm" = "Bekräfta"; - -/* Or */ -"Fragment.or" = "eller"; - -/* sorry */ -"Fragment.sorry" = "Förlåt"; - -/* to */ -"Fragment.to" = "till"; - -/* History Bar Item Title */ -"History.barItemTitle" = "HISTORIA"; - -/* History Current Litecoin Value */ -"History.currentLitecoinValue" = "Aktuellt LTC-värde i"; - -/* Checking private key balance progress view text */ -"Import.checking" = "Kontrollerar privat nyckelsaldo..."; - -/* Sweep private key confirmation message */ -"Import.confirm" = "Skicka %1$@ från denna privata nyckel till din plånbok? Litecoins nätverk tar en avgift på %2$@."; - -/* Duplicate key error message */ -"Import.Error.duplicate" = "Denna privata nyckel finns redan i din plånbok."; - -/* empty private key error message */ -"Import.Error.empty" = "Denna privata nyckel är tom."; - -/* High fees error message */ -"Import.Error.highFees" = "Transaktionsavgifter skulle kosta mer än de medel som finns tillgängliga på denna privata nyckel."; - -/* Not a valid private key error message */ -"Import.Error.notValid" = "Inte någon privat nyckel"; - -/* Import signing error message */ -"Import.Error.signing" = "Fel vid signering av transaktion"; - -/* Import button label */ -"Import.importButton" = "Importera"; - -/* Importing wallet progress view label */ -"Import.importing" = "Importerar plånbok"; - -/* Caption for graphics */ -"Import.leftCaption" = "Plånbok som ska importeras"; - -/* Import wallet intro screen message */ -"Import.message" = "Genom att importera en plånbok överförs alla pengar från din andra plånbok till Litewallet genom en enda transaktion."; - -/* Enter password alert view title */ -"Import.password" = "Denna privata nyckel är lösenordsskyddad."; - -/* password textfield placeholder */ -"Import.passwordPlaceholder" = "lösenord"; - -/* Caption for graphics */ -"Import.rightCaption" = "Din Litewallet-plånbok"; - -/* Scan Private key button label */ -"Import.scan" = "Läs av privat nyckel"; - -/* Import wallet success alert title */ -"Import.success" = "Lyckades"; - -/* Successfully imported wallet message body */ -"Import.SuccessBody" = "Importerad plånbok."; - -/* Import Wallet screen title */ -"Import.title" = "Importera plånbok"; - -/* Unlocking Private key activity view message. */ -"Import.unlockingActivity" = "Nyckel för upplåsning"; - -/* Import wallet intro warning message */ -"Import.warning" = "Importering av en plånbok inkluderar inte transaktionshistorik eller andra uppgifter."; - -/* Wrong password alert message */ -"Import.wrongPassword" = "Fel lösenord, var god försök igen."; - -/* Close app button */ -"JailbreakWarnings.close" = "Stäng"; - -/* Ignore jailbreak warning button */ -"JailbreakWarnings.ignore" = "Ignorera"; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithBalance" = "ENHETENS SÄKERHET ÄR ÄVENTYRAD\nEn \"intrångs\"-app kan få tillgång till Litewallets nyckeldata och stjäla dina Litecoin! Töm denna plånbok direkt och återupprätta den på en säker enhet."; - -/* Jailbreak warning message */ -"JailbreakWarnings.messageWithoutBalance" = "ENHETENS SÄKERHET ÄR ÄVENTYRAD\nEn \"intrångs\"-app kan få tillgång till Litewallets nyckeldata och stjäla dina Litecoin! Använd Litewallet endast på en säker enhet."; - -/* Jailbreak warning title */ -"JailbreakWarnings.title" = "VARNING"; - -/* Wipe wallet button */ -"JailbreakWarnings.wipe" = "Töm"; - -/* Card Bar Item Title */ -"LitecoinCard.barItemTitle" = "KORT"; - -/* Card balance */ -"LitecoinCard.cardBalance" = "Kortbalans"; - -/* Message when 2FA is off and user is viewing the Card Balance */ -"LitecoinCard.cardBalanceOnlyDescription" = "Logga ut och aktivera 2FA för att tillåta överföringar"; - -/* Features and limitations */ -"LitecoinCard.Disclaimer.bullets" = "- Registrering & inloggning\n- Tillgängligt kortsaldo\n- Återställ lösenord\n- Ingen överföring till Litewallet\n- Endast USA"; - -/* Description of the status */ -"LitecoinCard.Disclaimer.description" = "Litecoin Card har för närvarande begränsad funktionalitet i Litewallet."; - -/* Referral to the website */ -"LitecoinCard.Disclaimer.referral" = "Besök litecoin.getblockcard.com för fullständig åtkomst"; - -/* Beta Testing Litecoin Card */ -"LitecoinCard.Disclaimer.title" = "Litecoin-kort Beta"; - -/* Enter code */ -"LitecoinCard.enterCode" = "Ange kod"; - -/* Enter code details */ -"LitecoinCard.enterCode.detail" = "Ange koden som nyligen skickades till ditt Litecoin -kortkontots e -postadress."; - -/* Failed Login */ -"LitecoinCard.failed.login" = "Inloggningen misslyckades"; - -/* Forgot password? */ -"LitecoinCard.forgotPassword" = "Glömt ditt lösenord?"; - -/* Login */ -"LitecoinCard.login" = "Logga in"; - -/* Logout */ -"LitecoinCard.logout" = "Logga ut"; - -/* Card Bar Item Title */ -"LitecoinCard.name" = "Litecoin -kort"; - -/* Register */ -"LitecoinCard.registerCard" = "Registrera"; - -/* Register for Litecoin Card */ -"LitecoinCard.registerCardPhrase" = "Registrera dig för Litecoin-kort"; - -/* Registering user... */ -"LitecoinCard.registering.user" = "Registrerar användare ..."; - -/* address */ -"LitecoinCard.Registration.address" = "Gatuadress"; - -/* city */ -"LitecoinCard.Registration.city" = "Stad"; - -/* confirm password */ -"LitecoinCard.Registration.confirmPassword" = "bekräfta lösenord"; - -/* country */ -"LitecoinCard.Registration.country" = "Land"; - -/* First name */ -"LitecoinCard.Registration.firstName" = "förnamn"; - -/* identification */ -"LitecoinCard.Registration.identification" = "Identifiering"; - -/* kycIDNumber */ -"LitecoinCard.Registration.kycIDNumber" = "Känn din kund ID-typ"; - -/* kycIDType */ -"LitecoinCard.Registration.kycIDType" = "ID-typ"; - -/* SSN */ -"LitecoinCard.Registration.kycSSN" = "SSN"; - -/* Last name */ -"LitecoinCard.Registration.lastName" = "efternamn"; - -/* mobile number */ -"LitecoinCard.Registration.mobileNumber" = "Mobilnummer"; - -/* password */ -"LitecoinCard.Registration.password" = "Lösenord"; - -/* state province */ -"LitecoinCard.Registration.stateProvince" = "Stat / provins"; - -/* registraition username / email */ -"LitecoinCard.Registration.usernameEmail" = "E-mail"; - -/* must not be empty */ -"LitecoinCard.Registration.ValidationError.empty" = "Får inte vara tom"; - -/* Invalid email address */ -"LitecoinCard.Registration.ValidationError.invalidEmail" = "Ogiltig e-postadress"; - -/* Mobile number 10 digits required */ -"LitecoinCard.Registration.ValidationError.numberDigitsRequired" = "Mobilnumret måste innehålla minst tio siffror"; - -/* Mobile number required */ -"LitecoinCard.Registration.ValidationError.numberRequired" = "Mobilnummer krävs"; - -/* 6 Password characters required */ -"LitecoinCard.Registration.ValidationError.passwordCharacters" = "Lösenordet måste innehålla minst sex tecken"; - -/* Captial and numeric password characters required */ -"LitecoinCard.Registration.ValidationError.passwordComposition" = "Lösenordet måste innehålla mer än sex tecken, med minst ett tecken och ett numeriskt tecken"; - -/* Password required */ -"LitecoinCard.Registration.ValidationError.passwordRequired" = "Lösenord krävs"; - -/* Required field */ -"LitecoinCard.Registration.ValidationError.requiredField" = "obligatoriskt fält"; - -/* zip post Code */ -"LitecoinCard.Registration.zipPostCode" = "Postnummer"; - -/* Registration failure */ -"LitecoinCard.registrationFailure" = "Det uppstod ett problem med din registrering.\nKontrollera dina uppgifter och försök igen."; - -/* Registration success */ -"LitecoinCard.registrationSuccess" = "Du har registrerat dig! Kontrollera och bekräfta din e-post.\nKom sedan tillbaka för att logga in."; - -/* Reset Litecoin card password */ -"LitecoinCard.resetPassword" = "Återställ lösenord"; - -/* Reset password detail */ -"LitecoinCard.resetPasswordDetail" = "Ange e-postadressen som är kopplad till ditt Litecoin-kortkonto och leta efter ett e-postmeddelande med återställningsinstruktioner."; - -/* Transfer to card label */ -"LitecoinCard.Transfer.amountToCard" = "Överför till kort"; - -/* Transfer to Litewallet label */ -"LitecoinCard.Transfer.amountToLitewallet" = "Överför till Litewallet"; - -/* Description of action */ -"LitecoinCard.Transfer.description" = "Välj den överförande plånboken:"; - -/* Destination address label */ -"LitecoinCard.Transfer.destinationAddress" = "Adress"; - -/* Litewallet balance label */ -"LitecoinCard.Transfer.litewalletBalance" = "Litewallet -balans"; - -/* Set transfer amount label */ -"LitecoinCard.Transfer.setAmount" = "Skjut för att ställa in överföringsbelopp"; - -/* Start transfer label */ -"LitecoinCard.Transfer.startTransfer" = "Starta överföringen"; - -/* Transfer title */ -"LitecoinCard.Transfer.title" = "Överföra"; - -/* 2FA Error message */ -"LitecoinCard.twoFAErrorMessage" = "Det var ett problem. Växla 2FA till *Enabled *, ange den mejlade koden och försök igen."; - -/* Message when 2FA is off */ -"LitecoinCard.twoFAOff" = "2FA Ej aktiverat"; - -/* Message when 2FA is on */ -"LitecoinCard.twoFAOn" = "2FA aktiverat"; - -/* Litecoin card visit */ -"LitecoinCard.visit.toReset" = "Besök https://litecoin.dashboard.getblockcard.com/password/forgot för att återställa ditt lösenord."; - -/* Litewallet name */ -"Litewallet.name" = "Litewallet"; - -/* Location services disabled error */ -"LocationPlugin.disabled" = "Platstjänster är inaktiverade."; - -/* No permissions for location services */ -"LocationPlugin.notAuthorized" = "Litewallet har inte rätt att utnyttja platstjänster"; - -/* No comment provided by engineer. */ -"Malformed URI" = "Felaktig URI"; - -/* Balance */ -"ManageWallet.balance" = "Balans"; - -/* Wallet creation date prefix */ -"ManageWallet.creationDatePrefix" = "Du skapade din plånbok på %1$@"; - -/* Manage wallet description text */ -"ManageWallet.description" = "Din plånboks namn visas bara i din kontohistorik och kan inte ses av någon annan."; - -/* Change Wallet name textfield label */ -"ManageWallet.textFeildLabel" = "Plånbokens namn"; - -/* Manage wallet modal title */ -"ManageWallet.title" = "Hantera plånbok"; - -/* Buy Litecoin title */ -"MenuButton.buy" = "Köp Litecoin"; - -/* Menu button title */ -"MenuButton.customer.support" = "Kundsupport"; - -/* Menu button title */ -"MenuButton.lock" = "Lås plånbok"; - -/* Menu button title */ -"MenuButton.security" = "Säkerhetscenter"; - -/* Menu button title */ -"MenuButton.settings" = "Inställningar"; - -/* Menu button title */ -"MenuButton.support" = "Support"; - -/* button label */ -"MenuViewController.createButton" = "Ska ny plånbok"; - -/* Menu modal title */ -"MenuViewController.modalTitle" = "Meny"; - -/* button label */ -"MenuViewController.recoverButton" = "Återupprätta plånbok"; - -/* No comment provided by engineer. */ -"No wallet" = "Ingen plånbok"; - -/* Switch to automatic mode button label */ -"NodeSelector.automaticButton" = "Byt till automatiskt läge"; - -/* Node is connected label */ -"NodeSelector.connected" = "Ansluten"; - -/* Enter node ip address view body */ -"NodeSelector.enterBody" = "Ange nodens IP-adress och port (valfritt)"; - -/* Enter Node ip address view title */ -"NodeSelector.enterTitle" = "Ange nod"; - -/* Switch to manual mode button label */ -"NodeSelector.manualButton" = "Byt till manuellt läge"; - -/* Node address label */ -"NodeSelector.nodeLabel" = "Nuvarande primär nod"; - -/* Node is not connected label */ -"NodeSelector.notConnected" = "Inte ansluten"; - -/* Node status label */ -"NodeSelector.statusLabel" = "Nodens anslutningsstatus"; - -/* Node Selector view title */ -"NodeSelector.title" = "Litecoin-noder"; - -/* Bad Payment request alert title */ -"PaymentProtocol.Errors.badPaymentRequest" = "Felaktig utbetalningsbegäran"; - -/* Error opening payment protocol file message */ -"PaymentProtocol.Errors.corruptedDocument" = "Dokumentet är felaktigt eller utan stöd"; - -/* Missing certificate payment protocol error message */ -"PaymentProtocol.Errors.missingCertificate" = "certifikat saknas"; - -/* Request expired payment protocol error message */ -"PaymentProtocol.Errors.requestExpired" = "begäran har utgått"; - -/* Payment too small alert title */ -"PaymentProtocol.Errors.smallOutputError" = "Kunde inte göra utbetalning"; - -/* Amount too small error message */ -"PaymentProtocol.Errors.smallPayment" = "Utbetalning av Litecoin får inte vara lägre än %1$@."; - -/* Output too small error message. */ -"PaymentProtocol.Errors.smallTransaction" = "Utbetalningstransaktioner av Litecoin får inte vara lägre än $@."; - -/* Unsupported signature type payment protocol error message */ -"PaymentProtocol.Errors.unsupportedSignatureType" = "signaturtypen saknar stöd"; - -/* Untrusted certificate payment protocol error message */ -"PaymentProtocol.Errors.untrustedCertificate" = "opålitligt certifikat"; - -/* Dismiss button. */ -"Prompts.dismiss" = "AVFÄRDA"; - -/* Enable face ID prompt body */ -"Prompts.FaceId.body" = "PLACEHOLDER"; - -/* Enable face ID prompt title */ -"Prompts.FaceId.title" = "PLACEHOLDER"; - -/* No passcode set warning body */ -"Prompts.NoPasscode.body" = "Ett enhets-lösenord behövs för att skydda din plånbok. Gå till inställningar och aktivera lösenord."; - -/* No Passcode set warning title */ -"Prompts.NoPasscode.title" = "Aktivera enhets-lösenord"; - -/* Affirm button title. */ -"Prompts.PaperKey.affirm" = "Fortsätta"; - -/* Warning about paper key. */ -"Prompts.PaperKey.body" = "Din pappersnyckel måste sparas ifall du skulle förlora eller byta ut din telefon. Tryck här för att fortsätta."; - -/* Cancel button. */ -"Prompts.PaperKey.cancel" = "Annullera"; - -/* Enable button. */ -"Prompts.PaperKey.enable" = "Gör det möjligt"; - -/* An action is required (You must do this action). */ -"Prompts.PaperKey.title" = "Åtgärd krävs"; - -/* Transaction rejected prompt body */ -"Prompts.RecommendRescan.body" = "Din plånbok kan vara osynkroniserad. Detta kan ofta lösas genom att läsa om blockkedjan."; - -/* Transaction rejected prompt title */ -"Prompts.RecommendRescan.title" = "Transaktionen avslogs"; - -/* Upgrade PIN prompt body. */ -"Prompts.SetPin.body" = "Litewallet har uppgraderat till att använda 6-siffrig PIN-kod. Klicka här för att uppgradera."; - -/* Upgrade PIN prompt title. */ -"Prompts.SetPin.title" = "Uppgradera PIN-kod"; - -/* Share data prompt body */ -"Prompts.ShareData.body" = "Hjälp till att förbättra Litewallet genom att dela dina anonyma data med oss"; - -/* Share data prompt title */ -"Prompts.ShareData.title" = "Dela anonyma data"; - -/* Enable touch ID prompt body */ -"Prompts.TouchId.body" = "Klicka här för att aktivera Touch ID"; - -/* Enable touch ID prompt title */ -"Prompts.TouchId.title" = "Aktivera Touch ID"; - -/* Notifications will be added later but users can set their preferences now, which is why we specify "in the future". */ -"PushNotifications.body" = "Slå på aviseringar för att få särskilda meddelanden från Litewallet i framtiden."; - -/* Push notifications toggle switch label */ -"PushNotifications.label" = "Push-meddelanden"; - -/* Push notifications are off label */ -"PushNotifications.off" = "Av"; - -/* Push notifications are on label */ -"PushNotifications.on" = "På"; - -/* Push notifications settings view title label */ -"PushNotifications.title" = "Meddelanden"; - -/* Receive Bar Item Title */ -"Receive.barItemTitle" = "MOTTA"; - -/* Address copied message. */ -"Receive.copied" = "Kopierad till urklipp."; - -/* Share via email button label */ -"Receive.emailButton" = "E-post"; - -/* Request button label */ -"Receive.request" = "Begär ett belopp"; - -/* Share button label */ -"Receive.share" = "Dela"; - -/* Share via text message (SMS) */ -"Receive.textButton" = "Textmeddelande"; - -/* Receive modal title */ -"Receive.title" = "Ta emot"; - -/* Done button text */ -"RecoverWallet.done" = "Klar"; - -/* Recover wallet header */ -"RecoverWallet.header" = "Återupprätta plånbok"; - -/* Reset PIN with paper key: header */ -"RecoverWallet.header_reset_pin" = "Återställ PIN-kod"; - -/* Enter paper key instruction */ -"RecoverWallet.instruction" = "Ange ordnyckel"; - -/* Recover wallet intro */ -"RecoverWallet.intro" = "Återupprätta Litewallet med din ordnyckel."; - -/* Invalid paper key message */ -"RecoverWallet.invalid" = "Den ordnyckel du angav är ogiltig. Dubbelkolla varje ord och försök igen."; - -/* Previous button accessibility label */ -"RecoverWallet.leftArrow" = "Vänster pil"; - -/* Next button label */ -"RecoverWallet.next" = "Nästa"; - -/* Reset PIN with paper key: more information button. */ -"RecoverWallet.reset_pin_more_info" = "Klicka här för fler uppgifter."; - -/* Next button accessibility label */ -"RecoverWallet.rightArrow" = "Höger pil"; - -/* Recover wallet sub-header */ -"RecoverWallet.subheader" = "Ange ordnyckel till den plånbok du vill återupprätta."; - -/* Reset PIN with paper key: sub-header */ -"RecoverWallet.subheader_reset_pin" = "För att återställa din PIN-kod anger du orden från din ordnyckel i boxarna nedan."; - -/* No amount entered error message. */ -"RequestAnAmount.noAmount" = "Var god ange ett belopp först."; - -/* Request a specific amount of Litecoin */ -"RequestAnAmount.title" = "Begär ett belopp"; - -/* Alert action button label */ -"ReScan.alertAction" = "Synka"; - -/* Alert message body */ -"ReScan.alertMessage" = "Du kan inte skicka pengar under synkning."; - -/* Alert message title */ -"ReScan.alertTitle" = "Synka med blockkedja?"; - -/* extimated time */ -"ReScan.body1" = "20-45 minuter"; - -/* Syncing explanation */ -"ReScan.body2" = "Om en transaktion visar sig som klar i Litecoins nätverk men inte i Litewallet."; - -/* Syncing explanation */ -"ReScan.body3" = "Du får gång på gång ett meddelande som säger att din transaktion avvisades."; - -/* Start Sync button label */ -"ReScan.buttonTitle" = "Starta synkning"; - -/* Sync blockchain view footer */ -"ReScan.footer" = "Du kan inte skicka pengar under synkningen med blockkedjan."; - -/* Sync Blockchain view header */ -"ReScan.header" = "Synka blockkedja"; - -/* Subheader label */ -"ReScan.subheader1" = "Uppskattad tid"; - -/* Subheader label */ -"ReScan.subheader2" = "När ska man synka?"; - -/* Reset walet button title */ -"resetButton" = "Ja, återställ plånboken"; - -/* Warning Empty Wipe title */ -"resetTitle" = "Ta bort min Litewallet"; - -/* Scan Litecoin address camera flash toggle */ -"Scanner.flashButtonLabel" = "Kamerablixt"; - -/* Complete filter label */ -"Search.complete" = "avsluta"; - -/* Pending filter label */ -"Search.pending" = "väntar"; - -/* Received filter label */ -"Search.received" = "mottaget"; - -/* Sent filter label */ -"Search.sent" = "skickat"; - -/* Face ID button title */ -"SecurityCenter.faceIdTitle" = "PLACEHOLDER"; - -/* Security Center Info */ -"SecurityCenter.info" = "Aktivera alla säkerhetsfunktioner för maximal säkerhet."; - -/* Paper Key button description */ -"SecurityCenter.paperKeyDescription" = "Det enda sättet att komma åt dina Litecoin om du förlorar eller uppgraderar din telefon."; - -/* Paper Key button title */ -"SecurityCenter.paperKeyTitle" = "Ordnyckel"; - -/* PIN button description */ -"SecurityCenter.pinDescription" = "Skyddar ditt Litewallet från obehöriga användare."; - -/* PIN button title */ -"SecurityCenter.pinTitle" = "6-siffrig PIN-kod"; - -/* Security Center Title */ -"SecurityCenter.title" = "Säkerhetscenter"; - -/* Touch ID button description */ -"SecurityCenter.touchIdDescription" = "Lås enkelt upp ditt Litewallet och skicka pengar upp till en inställd gräns."; - -/* Touch ID button title */ -"SecurityCenter.touchIdTitle" = "Touch ID"; - -/* Send money amount label */ -"Send.amountLabel" = "Belopp"; - -/* Balance: $4.00 */ -"Send.balance" = "Saldo: %1$@"; - -/* Send Bar Item Title */ -"Send.barItemTitle" = "SKICKA"; - -/* Camera not allowed message */ -"Send.cameraunavailableMessage" = "Gå till Inställningar för att ge tillgång till kameran."; - -/* Camera not allowed alert title */ -"Send.cameraUnavailableTitle" = "Litewallet har inte tillgång till kameran"; - -/* Warning when sending to self. */ -"Send.containsAddress" = "Destinationen är din egen adress. Du kan inte skicka till dig själv."; - -/* Could not create transaction alert title */ -"Send.creatTransactionError" = "Kunde inte skapa transaktion."; - -/* Description for sending money label */ -"Send.descriptionLabel" = "Memo"; - -/* Emtpy pasteboard error message */ -"Send.emptyPasteboard" = "Urklipp är tomt"; - -/* Enter LTC Address */ -"Send.enterLTCAddress" = "Ange en Litecoin-adress"; - -/* Network Fee: $0.01 */ -"Send.fee" = "Nätverksavgift: %1$@"; - -/* Payee identity not certified alert title. */ -"Send.identityNotCertified" = "Betalningsmottagaren är inte certifierad."; - -/* Insufficient funds error */ -"Send.insufficientFunds" = "otillräckliga medel"; - -/* Invalid address alert message */ -"Send.invalidAddressMessage" = "Mottagaradressen är inte en giltig Litecoin-adress."; - -/* Invalid address on pasteboard message */ -"Send.invalidAddressOnPasteboard" = "Urklipp innehåller inte en giltig Litecoinadress."; - -/* Invalid address alert title */ -"Send.invalidAddressTitle" = "Ogiltig adress"; - -/* Is rescanning error message */ -"Send.isRescanning" = "Skicka är avaktiverat under en full omskanning."; - -/* Loading request activity view message */ -"Send.loadingRequest" = "Laddar förfrågan"; - -/* Empty address alert message */ -"Send.noAddress" = "Ange mottagarens adress."; - -/* Emtpy amount alert message */ -"Send.noAmount" = "Ange ett belopp att skicka."; - -/* Paste button label */ -"Send.pasteLabel" = "Klistra in"; - -/* Could not publish transaction alert title */ -"Send.publishTransactionError" = "Kunde inte lägga ut transaktion."; - -/* Could not load remote request error message */ -"Send.remoteRequestError" = "Kunde inte ladda betalningsförfrågan"; - -/* Scan button label */ -"Send.scanLabel" = "Läs av"; - -/* Send button label (the action, "press here to send") */ -"Send.sendLabel" = "Skicka"; - -/* Send screen title (as in "this is the screen for sending money") */ -"Send.title" = "Skicka"; - -/* Send money to label */ -"Send.toLabel" = "Till"; - -/* Lookup */ -"Send.UnstoppableDomains.lookup" = "Slå upp"; - -/* LookupDomainError */ -"Send.UnstoppableDomains.lookupDomainError" = "Tyvärr hittades inte domänen. [Fel: %2$d]"; - -/* lookupFailureHeader */ -"Send.UnstoppableDomains.lookupFailureHeader" = "Sökningen misslyckades"; - -/* Enter to match domain name to LTC Address */ -"Send.UnstoppableDomains.placeholder" = "Ange en .crypto- eller .zil-domän"; - -/* UDSystemError */ -"Send.UnstoppableDomains.udSystemError" = "Problem med systemuppslag. [Fel: %2$d]"; - -/* Adress already used alert message - first part */ -"Send.UsedAddress.firstLine" = "Litecoin-adresser är avsedda för engångsanvändning."; - -/* Adress already used alert message - second part */ -"Send.UsedAddress.secondLIne" = "Återanvändning minskar sekretessen både för dig och mottagaren och kan sluta i förlust om mottagaren inte direkt kontrollerar adressen."; - -/* Adress already used alert title */ -"Send.UsedAddress.title" = "Adressen är redan använd"; - -/* About label */ -"Settings.about" = "Om"; - -/* Advanced Settings title */ -"Settings.advancedTitle" = "Avancerade inställningar"; - -/* Blockchain settings section header */ -"Settings.blockchain" = "blockchain"; - -/* i.e. the currency which will be displayed */ -"Settings.currency" = "Visa valuta"; - -/* Current Locale */ -"Settings.currentLocale" = "Aktuell lokal:"; - -/* Join Early access label */ -"Settings.earlyAccess" = "Använd Snabb tillgång"; - -/* Are you enjoying Litewallet alert message body */ -"Settings.enjoying" = "Gillar du Litewallet?"; - -/* Face ID spending limit label */ -"Settings.faceIdLimit" = "PLACEHOLDER"; - -/* Import wallet label */ -"Settings.importTitle" = "Importera plånbok"; - -/* Languages label */ -"Settings.languages" = "språk"; - -/* Litewallet environment */ -"Settings.litewallet.environment" = "Miljö:"; - -/* Litewallet Partners */ -"Settings.litewallet.partners" = "Litewallet-partners"; - -/* Litewallet version */ -"Settings.litewallet.version" = "Litewallet version:"; - -/* Manage settings section header */ -"Settings.manage" = "Hantera"; - -/* Notifications label */ -"Settings.notifications" = "Meddelanden"; - -/* Leave review button label */ -"Settings.review" = "Betygssätt oss"; - -/* Share anonymous data label */ -"Settings.shareData" = "Dela anonyma uppgifter"; - -/* Litewallet Social links */ -"Settings.socialLinks" = "Social"; - -/* Support settings section header */ -"Settings.support" = "Stöd"; - -/* Sync blockchain label */ -"Settings.sync" = "Synka blockkedja"; - -/* Settings title */ -"Settings.title" = "Inställningar"; - -/* Touch ID spending limit label */ -"Settings.touchIdLimit" = "Touch ID utnyttjandegräns"; - -/* Wallet Settings section header */ -"Settings.wallet" = "Plånbok"; - -/* Start or recover another wallet menu label. */ -"Settings.wipe" = "Starta/Återställ en annan plånbok"; - -/* Share data view body */ -"ShareData.body" = "Hjälp till att förbättra Litewallet genom att dela dina anonyma uppgifter med oss. Detta inbegriper inga ekonomiska uppgifter. Vi respekterar din ekonomiska sekretess."; - -/* Share data header */ -"ShareData.header" = "Dela uppgifter?"; - -/* Share data switch label. */ -"ShareData.toggleLabel" = "Dela anonyma uppgifter?"; - -/* Current spending limit: */ -"SpendingLimit.title" = "Nuvarande utgiftsgräns: "; - -/* button label */ -"StartPaperPhrase.againButtonTitle" = "Skriv ner ordnyckel på nytt"; - -/* Paper key explanation text. */ -"StartPaperPhrase.body" = "Din ordnyckel är enda sättet att återupprätta Litewallet om du förlorat din telefon, blivit bestulen på den eller har uppgraderat den.\n\nVi visar dig en lista över ord som du kan skriva ner på ett papper och gömma undan."; - -/* button label */ -"StartPaperPhrase.buttonTitle" = "Skriv ner ordnyckel"; - -/* Argument is date */ -"StartPaperPhrase.date" = "Senast skrev du ner din ordnyckel på %1$@"; - -/* Start view message */ -"StartViewController.message" = "Det säkraste och tryggaste sättet att använda Litecoin."; - -/* Support the Litecoin Foundation */ -"SupportTheFoundation.title" = "Stöd Litecoin Foundation"; - -/* Syncing view connection state header text */ -"SyncingHeader.connecting" = "Ansluter..."; - -/* Rescanning header success state header text */ -"SyncingHeader.rescan" = "Omscanning ..."; - -/* Syncing header success state header text */ -"SyncingHeader.success" = "Framgång!"; - -/* Syncing view syncing state header text */ -"SyncingHeader.syncing" = "Synkronisera ..."; - -/* Syncing view connectiong state header text */ -"SyncingView.connecting" = "Ansluter"; - -/* Syncing view syncing state header text */ -"SyncingView.syncing" = "Synkroniserar"; - -/* 6 d (6 days) */ -"TimeSince.days" = "%1$@ d"; - -/* 6 h (6 hours) */ -"TimeSince.hours" = "%1$@ t"; - -/* 6 m (6 minutes) */ -"TimeSince.minutes" = "%1$@ m"; - -/* 6 s (6 seconds) */ -"TimeSince.seconds" = "%1$@ s"; - -/* You can customize your Touch ID Spending Limit from the [TouchIdSettings.linkText gets added here as a button] */ -"TouchIdSettings.customizeText" = "Du kan anpassa din utgiftsgräns i Touch ID från %1$@."; - -/* Touch Id screen label */ -"TouchIdSettings.label" = "Använd ditt fingeravtryck för att låsa upp Litewallet och skicka pengar upp till en inställd gräns."; - -/* ł100,000 ($100) */ -"TouchIdSettings.limitValue" = "%1$@ (%2$@)"; - -/* Link Text (see TouchIdSettings.customizeText) */ -"TouchIdSettings.linkText" = "Sida för utgiftsgräns i Touch ID"; - -/* Spending Limit: b100,000 ($100) */ -"TouchIdSettings.spendingLimit" = "Utnyttjandegräns: %1$@ (%2$@)"; - -/* Touch id switch label. */ -"TouchIdSettings.switchLabel" = "Aktivera Touch ID för Litewallet"; - -/* Touch ID settings view title */ -"TouchIdSettings.title" = "Touch ID"; - -/* Touch ID unavailable alert message */ -"TouchIdSettings.unavailableAlertMessage" = "Du har inte ställt in Touch ID på denna enhet. Gå till Inställningar->Touch ID & Lösenkod för att ställa in det nu."; - -/* Touch ID unavailable alert title */ -"TouchIdSettings.unavailableAlertTitle" = "Touch ID är inte inställt"; - -/* Always require passcode option */ -"TouchIdSpendingLimit" = "Kräver alltid lösenord"; - -/* Touch ID spending limit screen body */ -"TouchIdSpendingLimit.body" = "Du kommer att behöva ange din 6-siffriga PIN-kod för att skicka transaktioner som överskrider din utnyttjandegräns och varje gång efter 48 timmar sedan du senast angav din 6-siffriga PIN-kod."; - -/* Touch Id spending limit screen title */ -"TouchIdSpendingLimit.title" = "Touch ID utnyttjandegräns"; - -/* Static amount Label */ -"Transaction.amountDetailLabel" = "Byt information:"; - -/* Availability status text */ -"Transaction.available" = "Tillgängligt att utnyttja"; - -/* Static blockHeight Label */ -"Transaction.blockHeightLabel" = "Blockera:"; - -/* Static comment Label */ -"Transaction.commentLabel" = "PM:"; - -/* Transaction complete label */ -"Transaction.complete" = "Avsluta"; - -/* Static end amount Label */ -"Transaction.endAmountDetailLabel" = "Transaktionssluttbeloppdetalj"; - -/* eg. Ending balance: $50.00 */ -"Transaction.ending" = "Utgående saldo: %1$@"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDayReceived" = "Växlingskurs vid mottagande:"; - -/* Exchange rate on date header */ -"Transaction.exchangeOnDaySent" = "Växlingskurs vid skickande:"; - -/* (b600 fee) */ -"Transaction.fee" = "(%1$@ avgift)"; - -/* Invalid transaction */ -"Transaction.invalid" = "OGILTIG"; - -/* Timestamp label for event that just happened */ -"Transaction.justNow" = "just nu"; - -/* Receive status text: 'In progress: 20%' */ -"Transaction.receivedStatus" = "Pågår: %1$@"; - -/* Send status text: 'In progress: 20%' */ -"Transaction.sendingStatus" = "Pågår: %1$@"; - -/* eg. Starting balance: $50.00 */ -"Transaction.starting" = "Ingående saldo: %1$@"; - -/* Static starting amount Label */ -"Transaction.startingAmountDetailLabel" = "Detaljer för transaktionsstartbelopp"; - -/* Static TX iD Label */ -"Transaction.txIDLabel" = "Tx ID:"; - -/* Waiting to be confirmed string */ -"Transaction.waiting" = "Väntar på bekräftelse. Vissa handlare kräver bekräftelse för att slutföra en transaktion. Uppskattad tid: 1-2 timmar."; - -/* e.g. I received money from an account. */ -"TransactionDetails.account" = "konto"; - -/* Amount section header */ -"TransactionDetails.amountHeader" = "Belopp"; - -/* Block height label */ -"TransactionDetails.blockHeightLabel" = "Bekräftad i block"; - -/* Memo section header */ -"TransactionDetails.commentsHeader" = "Memo"; - -/* Copied */ -"TransactionDetails.copiedAll" = "Kopierad"; - -/* Copy all details */ -"TransactionDetails.copyAllDetails" = "Kopiera alla detaljer"; - -/* Empty transaction list message. */ -"TransactionDetails.emptyMessage" = "Dina transaktioner visas här."; - -/* "Received [$5] at [which of my addresses]" => This is the "at [which of my addresses]" part. */ -"TransactionDetails.from" = "på %1$@"; - -/* Less button title */ -"TransactionDetails.less" = "Mindre"; - -/* Moved $5.00 (as in "I moved $5 to another location") */ -"TransactionDetails.moved" = "Flyttade %1$@"; - -/* Moved $5.00 */ -"TransactionDetails.movedAmountDescription" = "Flyttade %1@"; - -/* eg. Confirmed in Block: Not Confirmed */ -"TransactionDetails.notConfirmedBlockHeightLabel" = "Inte bekräftad"; - -/* Prefix for price */ -"TransactionDetails.priceTimeStampPrefix" = "från och med"; - -/* "Received [$5] at [which of my addresses]" => This is the "Received [$5]" part. */ -"TransactionDetails.received" = "Mottog %1$@"; - -/* Received $5.00 */ -"TransactionDetails.receivedAmountDescription" = "Tog emot %1@"; - -/* RECEIVE LTCTitle */ -"TransactionDetails.receivedModalTitle" = "FÅ ADDRESS"; - -/* "Sent [$5] to [address]" => This is the "Sent [$5]" part. */ -"TransactionDetails.sent" = "Skickade %1$@"; - -/* Sent $5.00 */ -"TransactionDetails.sentAmountDescription" = "Skickade %1@"; - -/* Label for TXID */ -"TransactionDetails.staticTXLabel" = "Tx ID:"; - -/* Status section header */ -"TransactionDetails.statusHeader" = "Status"; - -/* Transaction Details Title */ -"TransactionDetails.title" = "Transaktionsuppgifter"; - -/* "Sent [$5] to [address]" => This is the "to [address]" part. */ -"TransactionDetails.to" = "till %1$@"; - -/* Transaction ID header */ -"TransactionDetails.txHashHeader" = "Litecoin transaktions-ID"; - -/* (this transaction was) Received at this address: */ -"TransactionDirection.address" = "Togs emot på den här adressen"; - -/* (this transaction was) Sent to this address: */ -"TransactionDirection.to" = "Skickat till den här adressen"; - -/* Disabled until date */ -"UnlockScreen.disabled" = "Inaktiverad till: %1$@"; - -/* Unlock Screen sub-header */ -"UnlockScreen.enterPin" = "Ange PIN-koden"; - -/* Unlock with FaceID accessibility label */ -"UnlockScreen.faceIdText" = "Lås upp med FaceID"; - -/* My Address button title */ -"UnlockScreen.myAddress" = "Min adress"; - -/* Reset PIN with Paper Key button label. */ -"UnlockScreen.resetPin" = "Återställ PIN-kod"; - -/* Scan button title */ -"UnlockScreen.scan" = "Läs av"; - -/* TouchID prompt text */ -"UnlockScreen.touchIdPrompt" = "Lås upp Litewallet."; - -/* Unlock with TouchID accessibility label */ -"UnlockScreen.touchIdText" = "Lås upp med TouchID"; - -/* Wallet unlocked message */ -"UnlockScreen.unlocked" = "Plånbok upplåst"; - -/* Update PIN caption text */ -"UpdatePin.caption" = "Kom ihåg PIN-koden. Om du glömmer den, kommer du inte åt dina Litecoin."; - -/* PIN creation info. */ -"UpdatePin.createInstruction" = "Din PIN-kod används för att låsa upp ditt Litewallet och skicka pengar"; - -/* Update PIN title */ -"UpdatePin.createTitle" = "Ställ in PIN-kod"; - -/* Update PIN title */ -"UpdatePin.createTitleConfirm" = "Ange PIN-koden igen"; - -/* Enter current PIN instruction */ -"UpdatePin.enterCurrent" = "Ange aktuell PIN-kod."; - -/* Enter new PIN instruction */ -"UpdatePin.enterNew" = "Ange din nya PIN-kod."; - -/* Re-Enter new PIN instruction */ -"UpdatePin.reEnterNew" = "Ange din nya PIN-kod igen."; - -/* Update PIN failure error message. */ -"UpdatePin.setPinError" = "Förlåt, vi kunde inte uppdatera din PIN-kod."; - -/* Update PIN failure alert view title */ -"UpdatePin.setPinErrorTitle" = "Fel vid uppdatering av PIN-kod"; - -/* Update PIN title */ -"UpdatePin.updateTitle" = "Uppdatera PIN-kod"; - -/* Authorize to copy wallet addresses alert message */ -"URLHandling.addressaddressListAlertMessage" = "Kopiera plånboksadresser till urklipp?"; - -/* Authorize to copy wallet address PIN view prompt. */ -"URLHandling.addressList" = "Godkänn att kopiera plånbokens adress till urklipp"; - -/* Authorize to copy wallet address alert title */ -"URLHandling.addressListAlertTitle" = "Kopiera plånboksadresser"; - -/* Copy wallet addresses alert button label */ -"URLHandling.copy" = "Kopiera"; - -/* Verify PIN for transaction view body */ -"VerifyPin.authorize" = "Var god ange din pinkod för att godkänna denna transaktion."; - -/* Verify PIN view body */ -"VerifyPin.continueBody" = "Ange din PIN-kod för att fortsätta."; - -/* Verify PIN view title */ -"VerifyPin.title" = "PIN-kod krävs"; - -/* Authorize transaction with touch id message */ -"VerifyPin.touchIdMessage" = "Godkänn denna transaktion"; - -/* 'No wallet' warning for watch app */ -"Watch.noWalletWarning" = "Öppna iPhone-appen Litewallet för att ställa in din plånbok."; - -/* Dismiss button label */ -"Webview.dismiss" = "Avfärda"; - -/* Webview loading error message */ -"Webview.errorMessage" = "Det blev fel vid uppladdning av innehållet. Försök igen"; - -/* Updating webview message */ -"Webview.updating" = "Uppdaterar..."; - -/* Welcome screen text. (?) will be replaced with the help icon users should look for. */ -"Welcome.body" = "Välkommen till Litewallet!"; - -/* Top title of welcome screen */ -"Welcome.title" = "Välkommen till Litewallet!"; - -/* Delete database title */ -"WipeWallet.alertDeleteTitle" = "Radera databas"; - -/* Wipe wallet alert message */ -"WipeWallet.alertMessage" = "Är du säker på att du vill ta bort den här plånboken."; - -/* Wipe wallet alert title */ -"WipeWallet.alertTitle" = "Rensa plånbok?"; - -/* Delete db */ -"WipeWallet.deleteDatabase" = "Ta bort databasen"; - -/* Delete database message */ -"WipeWallet.deleteMessageTitle" = "Din lokala databas är skadad. Gå till Inställningar> Blockchain: Inställningar> Ta bort databas för att uppdatera"; - -/* Delete and sync */ -"WipeWallet.deleteSync" = "Radera & synkronisera"; - -/* Warning if user lost phrase */ -"WipeWallet.emptyWallet" = "Glömt din fröfras eller PIN-kod?"; - -/* Failed wipe wallet alert message */ -"WipeWallet.failedMessage" = "Rensning av plånboken misslyckades."; - -/* Failed wipe wallet alert title */ -"WipeWallet.failedTitle" = "Misslyckades"; - -/* Enter phrase to wipe wallet instruction. */ -"WipeWallet.instruction" = "Ange den här plånbokens återställningsfras för att rensa den och starta eller återställa en annan. Ditt nuvarande saldo är kvar på den här frasen."; - -/* Start wipe wallet view message */ -"WipeWallet.startMessage" = "Att starta eller återställa en annan plånbok ger dig tillgång till och låter dig hantera en annan Litewalletplånbok på denna enhet."; - -/* Start wipe wallet view warning */ -"WipeWallet.startWarning" = "Du kommer inte längre att kunna komma åt din aktuella Litewalletplånbok från denna enhet. Saldot kommer att kvarstå på frasen."; - -/* Wipe wallet navigation item title. */ -"WipeWallet.title" = "Starta eller hämta en annan plånbok"; - -/* Warning Alert */ -"WipeWallet.warningAlert" = "Denna åtgärd kommer att torka din Litewallet!"; - -/* Warning description */ -"WipeWallet.warningDescription" = "Om du tar bort din plånbok innebär det att den privata nyckeln och appdata försvinner. Du kan förlora Litecoin för alltid!\n\n\nIngen i Litewallet-teamet kan hämta detta frö åt dig. Vi är inte ansvariga om du inte följer denna varning."; - -/* Warning title */ -"WipeWallet.warningTitle" = "VÄNLIGEN LÄS!"; - -/* Wipe wallet button title */ -"WipeWallet.wipe" = "Rensa"; - -/* Wiping activity message */ -"WipeWallet.wiping" = "Rensar..."; - -/* Paper key instructions. */ -"WritePaperPhrase.instruction" = "Skriv ner varje ord i ordning och lagra dem på ett säkert ställe."; - -/* button label */ -"WritePaperPhrase.next" = "Nästa"; - -/* button label */ -"WritePaperPhrase.previous" = "Föregående"; - -/* 1 of 3 */ -"WritePaperPhrase.step" = "%1$d av %2$d"; - -/* domain */ -"Send.UnstoppableDomains.domain" = ""; - -/* Enter a */ -"Send.UnstoppableDomains.enterA" = ""; - -/* Enter domain */ -"Send.UnstoppableDomains.simpleplaceholder" = ""; - -/* Change language alert message */ -"Settings.ChangeLanguage.alertMessage" = ""; diff --git a/loafwallet/src/ViewControllers/PushNotificationsViewController.swift b/loafwallet/src/ViewControllers/PushNotificationsViewController.swift deleted file mode 100644 index dcd429698..000000000 --- a/loafwallet/src/ViewControllers/PushNotificationsViewController.swift +++ /dev/null @@ -1,78 +0,0 @@ -import UIKit - -class PushNotificationsViewController: UIViewController { - init(store: Store) { - self.store = store - super.init(nibName: nil, bundle: nil) - } - - private let store: Store - private let titleLabel = UILabel(font: .customBold(size: 26.0), color: .darkText) - private let body = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) - private let label = UILabel(font: .customBold(size: 16.0), color: .darkText) - private let toggle = GradientSwitch() - private let separator = UIView(color: .secondaryShadow) - - override func viewDidLoad() { - addSubviews() - addConstraints() - setData() - } - - private func addSubviews() { - view.addSubview(titleLabel) - view.addSubview(body) - view.addSubview(label) - view.addSubview(toggle) - view.addSubview(separator) - } - - private func addConstraints() { - titleLabel.constrain([ - titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: C.padding[2]), - titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: C.padding[2]), - ]) - body.constrain([ - body.leadingAnchor.constraint(equalTo: titleLabel.leadingAnchor), - body.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: C.padding[1]), - body.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -C.padding[2]), - ]) - label.constrain([ - label.leadingAnchor.constraint(equalTo: body.leadingAnchor), - label.topAnchor.constraint(equalTo: body.bottomAnchor, constant: C.padding[3]), - ]) - toggle.constrain([ - toggle.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -C.padding[2]), - toggle.centerYAnchor.constraint(equalTo: label.centerYAnchor), - ]) - separator.constrain([ - separator.leadingAnchor.constraint(equalTo: label.leadingAnchor), - separator.topAnchor.constraint(equalTo: toggle.bottomAnchor, constant: C.padding[2]), - separator.trailingAnchor.constraint(equalTo: toggle.trailingAnchor), - separator.heightAnchor.constraint(equalToConstant: 1.0), - ]) - } - - private func setData() { - view.backgroundColor = .whiteTint - titleLabel.text = S.PushNotifications.title.localize() - body.text = S.PushNotifications.body.localize() - label.text = S.PushNotifications.label.localize() - - toggle.isOn = store.state.isPushNotificationsEnabled - toggle.sendActions(for: .valueChanged) - - toggle.valueChanged = { [weak self] in - guard let myself = self else { return } - myself.store.perform(action: PushNotifications.setIsEnabled(myself.toggle.isOn)) - if myself.toggle.isOn { - myself.store.trigger(name: .registerForPushNotificationToken) - } - } - } - - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/loafwallet/src/ViewControllers/WelcomeViewController.swift b/loafwallet/src/ViewControllers/WelcomeViewController.swift deleted file mode 100644 index 249cb3053..000000000 --- a/loafwallet/src/ViewControllers/WelcomeViewController.swift +++ /dev/null @@ -1,86 +0,0 @@ -import UIKit - -class WelcomeViewController: UIViewController, ContentBoxPresenter { - let blurView = UIVisualEffectView() - let effect = UIBlurEffect(style: .dark) - let contentBox = UIView(color: .white) - - private let header = GradientView() - private let titleLabel = UILabel.wrapping(font: .customBody(size: 26.0), color: .darkText) - private let body = UILabel.wrapping(font: .customBody(size: 16.0), color: .darkText) - private let button = ShadowButton(title: S.Button.ok.localize(), type: .primary) - - override func viewDidLoad() { - addSubviews() - addConstraints() - setInitialData() - } - - private func addSubviews() { - view.addSubview(contentBox) - contentBox.addSubview(header) - contentBox.addSubview(titleLabel) - contentBox.addSubview(body) - contentBox.addSubview(button) - } - - private func addConstraints() { - contentBox.constrain([ - contentBox.centerXAnchor.constraint(equalTo: view.centerXAnchor), - contentBox.centerYAnchor.constraint(equalTo: view.centerYAnchor), - contentBox.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -C.padding[6]), - ]) - header.constrainTopCorners(height: 44.0) - titleLabel.constrain([ - titleLabel.leadingAnchor.constraint(equalTo: contentBox.leadingAnchor, constant: C.padding[2]), - titleLabel.topAnchor.constraint(equalTo: header.bottomAnchor, constant: C.padding[2]), - titleLabel.trailingAnchor.constraint(equalTo: contentBox.trailingAnchor, constant: -C.padding[2]), - ]) - - body.constrain([ - body.leadingAnchor.constraint(equalTo: titleLabel.leadingAnchor), - body.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: C.padding[2]), - body.trailingAnchor.constraint(equalTo: contentBox.trailingAnchor, constant: -C.padding[2]), - ]) - - button.constrain([ - button.leadingAnchor.constraint(equalTo: body.leadingAnchor), - button.topAnchor.constraint(equalTo: body.bottomAnchor, constant: C.padding[2]), - button.trailingAnchor.constraint(equalTo: body.trailingAnchor), - button.bottomAnchor.constraint(equalTo: contentBox.bottomAnchor, constant: -C.padding[2]), - ]) - } - - private func setInitialData() { - view.backgroundColor = .clear - contentBox.layer.cornerRadius = 6.0 - contentBox.layer.masksToBounds = true - titleLabel.textAlignment = .center - titleLabel.text = S.Welcome.title.localize() - setBodyText() - button.tap = strongify(self) { myself in - myself.dismiss(animated: true, completion: nil) - } - } - - private func setBodyText() { - let bodyText = S.Welcome.body.localize() - let attributedString = NSMutableAttributedString(string: S.Welcome.body.localize()) - let icon = NSTextAttachment() - icon.image = #imageLiteral(resourceName: "Faq") - icon.bounds = CGRect(x: 0, y: -3.0, width: body.font.pointSize, height: body.font.pointSize) - guard let range = S.Welcome.body.localize().range(of: "(?)") - else { - NSLog("ERROR: Range not found") - return - } - - let nsRange = bodyText.nsRange(from: range) - attributedString.replaceCharacters(in: nsRange, with: NSAttributedString(attachment: icon)) - body.attributedText = attributedString - } - - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } -} diff --git a/loafwallet/src/Views/SendViewCells/AddressCell.swift b/loafwallet/src/Views/SendViewCells/AddressCell.swift deleted file mode 100644 index 4e99d19f7..000000000 --- a/loafwallet/src/Views/SendViewCells/AddressCell.swift +++ /dev/null @@ -1,165 +0,0 @@ -import UIKit - -class AddressCell: UIView { - init() { - super.init(frame: .zero) - setupViews() - } - - var address: String? { - return contentLabel.text - } - - var didBeginEditing: (() -> Void)? - var didReceivePaymentRequest: ((PaymentRequest) -> Void)? - - func setContent(_ content: String?) { - contentLabel.text = content - textField.text = content - } - - var isEditable = false { - didSet { - gr.isEnabled = isEditable - } - } - - let textField = UITextField() - let paste = ShadowButton(title: S.Send.pasteLabel.localize(), type: .tertiary) - let scan = ShadowButton(title: S.Send.scanLabel.localize(), type: .tertiary) - fileprivate var contentLabel = UILabel(font: .customBody(size: 13.0), color: .darkText) - private var label = UILabel(font: .customBody(size: 16.0)) - fileprivate let gr = UITapGestureRecognizer() - fileprivate let tapView = UIView() - private let border = UIView(color: .secondaryShadow) - - private func setupViews() { - if #available(iOS 11.0, *) { - guard let textColor = UIColor(named: "labelTextColor") - else { - NSLog("ERROR: Main color") - return - } - contentLabel.textColor = textColor - label.textColor = textColor - } else { - contentLabel.textColor = .darkText - } - - addSubviews() - addConstraints() - setInitialData() - } - - private func addSubviews() { - addSubview(label) - addSubview(contentLabel) - addSubview(textField) - addSubview(tapView) - addSubview(border) - addSubview(paste) - addSubview(scan) - } - - private func addConstraints() { - label.constrain([ - label.constraint(.centerY, toView: self), - label.constraint(.leading, toView: self, constant: C.padding[2]), - ]) - contentLabel.constrain([ - contentLabel.constraint(.leading, toView: label), - contentLabel.constraint(toBottom: label, constant: 0.0), - contentLabel.trailingAnchor.constraint(equalTo: paste.leadingAnchor, constant: -C.padding[1]), - ]) - textField.constrain([ - textField.constraint(.leading, toView: label), - textField.constraint(toBottom: label, constant: 0.0), - textField.trailingAnchor.constraint(equalTo: paste.leadingAnchor, constant: -C.padding[1]), - ]) - tapView.constrain([ - tapView.leadingAnchor.constraint(equalTo: leadingAnchor), - tapView.topAnchor.constraint(equalTo: topAnchor), - tapView.bottomAnchor.constraint(equalTo: bottomAnchor), - tapView.trailingAnchor.constraint(equalTo: paste.leadingAnchor), - ]) - scan.constrain([ - scan.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -C.padding[2]), - scan.centerYAnchor.constraint(equalTo: centerYAnchor), - ]) - paste.constrain([ - paste.centerYAnchor.constraint(equalTo: centerYAnchor), - paste.trailingAnchor.constraint(equalTo: scan.leadingAnchor, constant: -C.padding[0.625]), - ]) - border.constrain([ - border.leadingAnchor.constraint(equalTo: leadingAnchor), - border.bottomAnchor.constraint(equalTo: bottomAnchor), - border.trailingAnchor.constraint(equalTo: trailingAnchor), - border.heightAnchor.constraint(equalToConstant: 1.0), - ]) - } - - private func setInitialData() { - label.text = S.Send.enterLTCAddressLabel.localize() - textField.font = contentLabel.font - textField.adjustsFontSizeToFitWidth = true - textField.minimumFontSize = 10.0 - textField.textColor = contentLabel.textColor - textField.isHidden = true - textField.returnKeyType = .done - textField.delegate = self - textField.clearButtonMode = .whileEditing - label.textColor = .grayTextTint - contentLabel.lineBreakMode = .byTruncatingMiddle - - textField.editingChanged = strongify(self) { myself in - myself.contentLabel.text = myself.textField.text - } - - // GR to start editing label - gr.addTarget(self, action: #selector(didTap)) - tapView.addGestureRecognizer(gr) - } - - @objc private func didTap() { - textField.becomeFirstResponder() - contentLabel.isHidden = true - textField.isHidden = false - } - - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -extension AddressCell: UITextFieldDelegate { - func textFieldDidBeginEditing(_: UITextField) { - didBeginEditing?() - contentLabel.isHidden = true - gr.isEnabled = false - tapView.isUserInteractionEnabled = false - } - - func textFieldDidEndEditing(_ textField: UITextField) { - contentLabel.isHidden = false - textField.isHidden = true - gr.isEnabled = true - tapView.isUserInteractionEnabled = true - contentLabel.text = textField.text - } - - func textFieldShouldReturn(_ textField: UITextField) -> Bool { - textField.resignFirstResponder() - return true - } - - func textField(_: UITextField, shouldChangeCharactersIn _: NSRange, replacementString string: String) -> Bool - { - if let request = PaymentRequest(string: string) { - didReceivePaymentRequest?(request) - return false - } else { - return true - } - } -} diff --git a/loafwallet/sv.lproj/BIP39Words.plist b/loafwallet/sv.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/sv.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/tr.lproj/BIP39Words.plist b/loafwallet/tr.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/tr.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/uk.lproj/BIP39Words.plist b/loafwallet/uk.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/uk.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwallet/zh-Hant.lproj/BIP39Words.plist b/loafwallet/zh-Hant.lproj/BIP39Words.plist deleted file mode 100644 index 01e69ff4c..000000000 --- a/loafwallet/zh-Hant.lproj/BIP39Words.plist +++ /dev/null @@ -1,2054 +0,0 @@ - - - - - abandon - ability - able - about - above - absent - absorb - abstract - absurd - abuse - access - accident - account - accuse - achieve - acid - acoustic - acquire - across - act - action - actor - actress - actual - adapt - add - addict - address - adjust - admit - adult - advance - advice - aerobic - affair - afford - afraid - again - age - agent - agree - ahead - aim - air - airport - aisle - alarm - album - alcohol - alert - alien - all - alley - allow - almost - alone - alpha - already - also - alter - always - amateur - amazing - among - amount - amused - analyst - anchor - ancient - anger - angle - angry - animal - ankle - announce - annual - another - answer - antenna - antique - anxiety - any - apart - apology - appear - apple - approve - april - arch - arctic - area - arena - argue - arm - armed - armor - army - around - arrange - arrest - arrive - arrow - art - artefact - artist - artwork - ask - aspect - assault - asset - assist - assume - asthma - athlete - atom - attack - attend - attitude - attract - auction - audit - august - aunt - author - auto - autumn - average - avocado - avoid - awake - aware - away - awesome - awful - awkward - axis - baby - bachelor - bacon - badge - bag - balance - balcony - ball - bamboo - banana - banner - bar - barely - bargain - barrel - base - basic - basket - battle - beach - bean - beauty - because - become - beef - before - begin - behave - behind - believe - below - belt - bench - benefit - best - betray - better - between - beyond - bicycle - bid - bike - bind - biology - bird - birth - bitter - black - blade - blame - blanket - blast - bleak - bless - blind - blood - blossom - blouse - blue - blur - blush - board - boat - body - boil - bomb - bone - bonus - book - boost - border - boring - borrow - boss - bottom - bounce - box - boy - bracket - brain - brand - brass - brave - bread - breeze - brick - bridge - brief - bright - bring - brisk - broccoli - broken - bronze - broom - brother - brown - brush - bubble - buddy - budget - buffalo - build - bulb - bulk - bullet - bundle - bunker - burden - burger - burst - bus - business - busy - butter - buyer - buzz - cabbage - cabin - cable - cactus - cage - cake - call - calm - camera - camp - can - canal - cancel - candy - cannon - canoe - canvas - canyon - capable - capital - captain - car - carbon - card - cargo - carpet - carry - cart - case - cash - casino - castle - casual - cat - catalog - catch - category - cattle - caught - cause - caution - cave - ceiling - celery - cement - census - century - cereal - certain - chair - chalk - champion - change - chaos - chapter - charge - chase - chat - cheap - check - cheese - chef - cherry - chest - chicken - chief - child - chimney - choice - choose - chronic - chuckle - chunk - churn - cigar - cinnamon - circle - citizen - city - civil - claim - clap - clarify - claw - clay - clean - clerk - clever - click - client - cliff - climb - clinic - clip - clock - clog - close - cloth - cloud - clown - club - clump - cluster - clutch - coach - coast - coconut - code - coffee - coil - coin - collect - color - column - combine - come - comfort - comic - common - company - concert - conduct - confirm - congress - connect - consider - control - convince - cook - cool - copper - copy - coral - core - corn - correct - cost - cotton - couch - country - couple - course - cousin - cover - coyote - crack - cradle - craft - cram - crane - crash - crater - crawl - crazy - cream - credit - creek - crew - cricket - crime - crisp - critic - crop - cross - crouch - crowd - crucial - cruel - cruise - crumble - crunch - crush - cry - crystal - cube - culture - cup - cupboard - curious - current - curtain - curve - cushion - custom - cute - cycle - dad - damage - damp - dance - danger - daring - dash - daughter - dawn - day - deal - debate - debris - decade - december - decide - decline - decorate - decrease - deer - defense - define - defy - degree - delay - deliver - demand - demise - denial - dentist - deny - depart - depend - deposit - depth - deputy - derive - describe - desert - design - desk - despair - destroy - detail - detect - develop - device - devote - diagram - dial - diamond - diary - dice - diesel - diet - differ - digital - dignity - dilemma - dinner - dinosaur - direct - dirt - disagree - discover - disease - dish - dismiss - disorder - display - distance - divert - divide - divorce - dizzy - doctor - document - dog - doll - dolphin - domain - donate - donkey - donor - door - dose - double - dove - draft - dragon - drama - drastic - draw - dream - dress - drift - drill - drink - drip - drive - drop - drum - dry - duck - dumb - dune - during - dust - dutch - duty - dwarf - dynamic - eager - eagle - early - earn - earth - easily - east - easy - echo - ecology - economy - edge - edit - educate - effort - egg - eight - either - elbow - elder - electric - elegant - element - elephant - elevator - elite - else - embark - embody - embrace - emerge - emotion - employ - empower - empty - enable - enact - end - endless - endorse - enemy - energy - enforce - engage - engine - enhance - enjoy - enlist - enough - enrich - enroll - ensure - enter - entire - entry - envelope - episode - equal - equip - era - erase - erode - erosion - error - erupt - escape - essay - essence - estate - eternal - ethics - evidence - evil - evoke - evolve - exact - example - excess - exchange - excite - exclude - excuse - execute - exercise - exhaust - exhibit - exile - exist - exit - exotic - expand - expect - expire - explain - expose - express - extend - extra - eye - eyebrow - fabric - face - faculty - fade - faint - faith - fall - false - fame - family - famous - fan - fancy - fantasy - farm - fashion - fat - fatal - father - fatigue - fault - favorite - feature - february - federal - fee - feed - feel - female - fence - festival - fetch - fever - few - fiber - fiction - field - figure - file - film - filter - final - find - fine - finger - finish - fire - firm - first - fiscal - fish - fit - fitness - fix - flag - flame - flash - flat - flavor - flee - flight - flip - float - flock - floor - flower - fluid - flush - fly - foam - focus - fog - foil - fold - follow - food - foot - force - forest - forget - fork - fortune - forum - forward - fossil - foster - found - fox - fragile - frame - frequent - fresh - friend - fringe - frog - front - frost - frown - frozen - fruit - fuel - fun - funny - furnace - fury - future - gadget - gain - galaxy - gallery - game - gap - garage - garbage - garden - garlic - garment - gas - gasp - gate - gather - gauge - gaze - general - genius - genre - gentle - genuine - gesture - ghost - giant - gift - giggle - ginger - giraffe - girl - give - glad - glance - glare - glass - glide - glimpse - globe - gloom - glory - glove - glow - glue - goat - goddess - gold - good - goose - gorilla - gospel - gossip - govern - gown - grab - grace - grain - grant - grape - grass - gravity - great - green - grid - grief - grit - grocery - group - grow - grunt - guard - guess - guide - guilt - guitar - gun - gym - habit - hair - half - hammer - hamster - hand - happy - harbor - hard - harsh - harvest - hat - have - hawk - hazard - head - health - heart - heavy - hedgehog - height - hello - helmet - help - hen - hero - hidden - high - hill - hint - hip - hire - history - hobby - hockey - hold - hole - holiday - hollow - home - honey - hood - hope - horn - horror - horse - hospital - host - hotel - hour - hover - hub - huge - human - humble - humor - hundred - hungry - hunt - hurdle - hurry - hurt - husband - hybrid - ice - icon - idea - identify - idle - ignore - ill - illegal - illness - image - imitate - immense - immune - impact - impose - improve - impulse - inch - include - income - increase - index - indicate - indoor - industry - infant - inflict - inform - inhale - inherit - initial - inject - injury - inmate - inner - innocent - input - inquiry - insane - insect - inside - inspire - install - intact - interest - into - invest - invite - involve - iron - island - isolate - issue - item - ivory - jacket - jaguar - jar - jazz - jealous - jeans - jelly - jewel - job - join - joke - journey - joy - judge - juice - jump - jungle - junior - junk - just - kangaroo - keen - keep - ketchup - key - kick - kid - kidney - kind - kingdom - kiss - kit - kitchen - kite - kitten - kiwi - knee - knife - knock - know - lab - label - labor - ladder - lady - lake - lamp - language - laptop - large - later - latin - laugh - laundry - lava - law - lawn - lawsuit - layer - lazy - leader - leaf - learn - leave - lecture - left - leg - legal - legend - leisure - lemon - lend - length - lens - leopard - lesson - letter - level - liar - liberty - library - license - life - lift - light - like - limb - limit - link - lion - liquid - list - little - live - lizard - load - loan - lobster - local - lock - logic - lonely - long - loop - lottery - loud - lounge - love - loyal - lucky - luggage - lumber - lunar - lunch - luxury - lyrics - machine - mad - magic - magnet - maid - mail - main - major - make - mammal - man - manage - mandate - mango - mansion - manual - maple - marble - march - margin - marine - market - marriage - mask - mass - master - match - material - math - matrix - matter - maximum - maze - meadow - mean - measure - meat - mechanic - medal - media - melody - melt - member - memory - mention - menu - mercy - merge - merit - merry - mesh - message - metal - method - middle - midnight - milk - million - mimic - mind - minimum - minor - minute - miracle - mirror - misery - miss - mistake - mix - mixed - mixture - mobile - model - modify - mom - moment - monitor - monkey - monster - month - moon - moral - more - morning - mosquito - mother - motion - motor - mountain - mouse - move - movie - much - muffin - mule - multiply - muscle - museum - mushroom - music - must - mutual - myself - mystery - myth - naive - name - napkin - narrow - nasty - nation - nature - near - neck - need - negative - neglect - neither - nephew - nerve - nest - net - network - neutral - never - news - next - nice - night - noble - noise - nominee - noodle - normal - north - nose - notable - note - nothing - notice - novel - now - nuclear - number - nurse - nut - oak - obey - object - oblige - obscure - observe - obtain - obvious - occur - ocean - october - odor - off - offer - office - often - oil - okay - old - olive - olympic - omit - once - one - onion - online - only - open - opera - opinion - oppose - option - orange - orbit - orchard - order - ordinary - organ - orient - original - orphan - ostrich - other - outdoor - outer - output - outside - oval - oven - over - own - owner - oxygen - oyster - ozone - pact - paddle - page - pair - palace - palm - panda - panel - panic - panther - paper - parade - parent - park - parrot - party - pass - patch - path - patient - patrol - pattern - pause - pave - payment - peace - peanut - pear - peasant - pelican - pen - penalty - pencil - people - pepper - perfect - permit - person - pet - phone - photo - phrase - physical - piano - picnic - picture - piece - pig - pigeon - pill - pilot - pink - pioneer - pipe - pistol - pitch - pizza - place - planet - plastic - plate - play - please - pledge - pluck - plug - plunge - poem - poet - point - polar - pole - police - pond - pony - pool - popular - portion - position - possible - post - potato - pottery - poverty - powder - power - practice - praise - predict - prefer - prepare - present - pretty - prevent - price - pride - primary - print - priority - prison - private - prize - problem - process - produce - profit - program - project - promote - proof - property - prosper - protect - proud - provide - public - pudding - pull - pulp - pulse - pumpkin - punch - pupil - puppy - purchase - purity - purpose - purse - push - put - puzzle - pyramid - quality - quantum - quarter - question - quick - quit - quiz - quote - rabbit - raccoon - race - rack - radar - radio - rail - rain - raise - rally - ramp - ranch - random - range - rapid - rare - rate - rather - raven - raw - razor - ready - real - reason - rebel - rebuild - recall - receive - recipe - record - recycle - reduce - reflect - reform - refuse - region - regret - regular - reject - relax - release - relief - rely - remain - remember - remind - remove - render - renew - rent - reopen - repair - repeat - replace - report - require - rescue - resemble - resist - resource - response - result - retire - retreat - return - reunion - reveal - review - reward - rhythm - rib - ribbon - rice - rich - ride - ridge - rifle - right - rigid - ring - riot - ripple - risk - ritual - rival - river - road - roast - robot - robust - rocket - romance - roof - rookie - room - rose - rotate - rough - round - route - royal - rubber - rude - rug - rule - run - runway - rural - sad - saddle - sadness - safe - sail - salad - salmon - salon - salt - salute - same - sample - sand - satisfy - satoshi - sauce - sausage - save - say - scale - scan - scare - scatter - scene - scheme - school - science - scissors - scorpion - scout - scrap - screen - script - scrub - sea - search - season - seat - second - secret - section - security - seed - seek - segment - select - sell - seminar - senior - sense - sentence - series - service - session - settle - setup - seven - shadow - shaft - shallow - share - shed - shell - sheriff - shield - shift - shine - ship - shiver - shock - shoe - shoot - shop - short - shoulder - shove - shrimp - shrug - shuffle - shy - sibling - sick - side - siege - sight - sign - silent - silk - silly - silver - similar - simple - since - sing - siren - sister - situate - six - size - skate - sketch - ski - skill - skin - skirt - skull - slab - slam - sleep - slender - slice - slide - slight - slim - slogan - slot - slow - slush - small - smart - smile - smoke - smooth - snack - snake - snap - sniff - snow - soap - soccer - social - sock - soda - soft - solar - soldier - solid - solution - solve - someone - song - soon - sorry - sort - soul - sound - soup - source - south - space - spare - spatial - spawn - speak - special - speed - spell - spend - sphere - spice - spider - spike - spin - spirit - split - spoil - sponsor - spoon - sport - spot - spray - spread - spring - spy - square - squeeze - squirrel - stable - stadium - staff - stage - stairs - stamp - stand - start - state - stay - steak - steel - stem - step - stereo - stick - still - sting - stock - stomach - stone - stool - story - stove - strategy - street - strike - strong - struggle - student - stuff - stumble - style - subject - submit - subway - success - such - sudden - suffer - sugar - suggest - suit - summer - sun - sunny - sunset - super - supply - supreme - sure - surface - surge - surprise - surround - survey - suspect - sustain - swallow - swamp - swap - swarm - swear - sweet - swift - swim - swing - switch - sword - symbol - symptom - syrup - system - table - tackle - tag - tail - talent - talk - tank - tape - target - task - taste - tattoo - taxi - teach - team - tell - ten - tenant - tennis - tent - term - test - text - thank - that - theme - then - theory - there - they - thing - this - thought - three - thrive - throw - thumb - thunder - ticket - tide - tiger - tilt - timber - time - tiny - tip - tired - tissue - title - toast - tobacco - today - toddler - toe - together - toilet - token - tomato - tomorrow - tone - tongue - tonight - tool - tooth - top - topic - topple - torch - tornado - tortoise - toss - total - tourist - toward - tower - town - toy - track - trade - traffic - tragic - train - transfer - trap - trash - travel - tray - treat - tree - trend - trial - tribe - trick - trigger - trim - trip - trophy - trouble - truck - true - truly - trumpet - trust - truth - try - tube - tuition - tumble - tuna - tunnel - turkey - turn - turtle - twelve - twenty - twice - twin - twist - two - type - typical - ugly - umbrella - unable - unaware - uncle - uncover - under - undo - unfair - unfold - unhappy - uniform - unique - unit - universe - unknown - unlock - until - unusual - unveil - update - upgrade - uphold - upon - upper - upset - urban - urge - usage - use - used - useful - useless - usual - utility - vacant - vacuum - vague - valid - valley - valve - van - vanish - vapor - various - vast - vault - vehicle - velvet - vendor - venture - venue - verb - verify - version - very - vessel - veteran - viable - vibrant - vicious - victory - video - view - village - vintage - violin - virtual - virus - visa - visit - visual - vital - vivid - vocal - voice - void - volcano - volume - vote - voyage - wage - wagon - wait - walk - wall - walnut - want - warfare - warm - warrior - wash - wasp - waste - water - wave - way - wealth - weapon - wear - weasel - weather - web - wedding - weekend - weird - welcome - west - wet - whale - what - wheat - wheel - when - where - whip - whisper - wide - width - wife - wild - will - win - window - wine - wing - wink - winner - winter - wire - wisdom - wise - wish - witness - wolf - woman - wonder - wood - wool - word - work - world - worry - worth - wrap - wreck - wrestle - wrist - write - wrong - yard - year - yellow - you - young - youth - zebra - zero - zone - zoo - - diff --git a/loafwalletTests/Legacy BRTests/NSDataExtensionTests.swift b/loafwalletTests/Legacy BRTests/NSDataExtensionTests.swift deleted file mode 100644 index a594e3aeb..000000000 --- a/loafwalletTests/Legacy BRTests/NSDataExtensionTests.swift +++ /dev/null @@ -1,30 +0,0 @@ -@testable import loafwallet -import XCTest - -class NSDataExtensionTests: XCTestCase { - override func setUp() { - super.setUp() - } - - override func tearDown() { - super.tearDown() - } - - func testRoundTrip() { - for _ in 0 ..< 10 { - let randomData = (1 ... 7321).map { _ in UInt8(arc4random_uniform(0x30)) } - let data = Data(bytes: UnsafePointer(randomData), count: randomData.count) - guard let compressed = data.bzCompressedData - else { - XCTFail("compressed data was nil") - return - } - guard let decompressed = Data(bzCompressedData: compressed) - else { - XCTFail("decompressed data was nil") - return - } - XCTAssertEqual(data.hexString, decompressed.hexString) - } - } -}