diff --git a/Podfile b/Podfile
index 80af0ba..fa8924d 100644
--- a/Podfile
+++ b/Podfile
@@ -8,6 +8,7 @@ target 'suixinkan' do
pod 'UMCommon'
pod 'UMDevice'
pod 'UMAPM'
+ pod 'IQKeyboardManagerSwift'
# 微信 Open SDK:仅接入分享能力,不调用支付 API。
pod 'WechatOpenSDK-XCFramework', '~> 2.0.4'
diff --git a/Podfile.lock b/Podfile.lock
index 48e9e52..03ed760 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -6,6 +6,46 @@ PODS:
- AMapFoundation-NO-IDFA (>= 1.9.0)
- AMapSearch-NO-IDFA (9.8.0):
- AMapFoundation-NO-IDFA (>= 1.9.0)
+ - IQKeyboardCore (1.0.9)
+ - IQKeyboardManagerSwift (8.0.3):
+ - IQKeyboardManagerSwift/Appearance (= 8.0.3)
+ - IQKeyboardManagerSwift/Core (= 8.0.3)
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.3)
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.3)
+ - IQKeyboardManagerSwift/IQTextView (= 8.0.3)
+ - IQKeyboardManagerSwift/Resign (= 8.0.3)
+ - IQKeyboardManagerSwift/Appearance (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/Core (8.0.3):
+ - IQKeyboardNotification
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.3):
+ - IQKeyboardReturnManager
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardToolbarManager
+ - IQKeyboardManagerSwift/IQTextView (8.0.3):
+ - IQTextView
+ - IQKeyboardManagerSwift/Resign (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQTextInputViewNotification
+ - IQKeyboardNotification (1.0.7)
+ - IQKeyboardReturnManager (1.0.6):
+ - IQKeyboardCore
+ - IQKeyboardToolbar (1.1.5):
+ - IQKeyboardToolbar/Core (= 1.1.5)
+ - IQKeyboardToolbar/Core (1.1.5):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Placeholderable
+ - IQKeyboardToolbar/Placeholderable (1.1.5)
+ - IQKeyboardToolbarManager (1.1.6):
+ - IQKeyboardToolbar
+ - IQTextInputViewNotification
+ - IQTextInputViewNotification (1.0.9):
+ - IQKeyboardCore
+ - IQTextView (1.0.5):
+ - IQKeyboardToolbar/Placeholderable
- UMAPM (2.0.7):
- UMCommon
- UMCommon (7.5.11):
@@ -17,6 +57,7 @@ DEPENDENCIES:
- AMap3DMap-NO-IDFA
- AMapLocation-NO-IDFA
- AMapSearch-NO-IDFA
+ - IQKeyboardManagerSwift
- UMAPM
- UMCommon
- UMDevice
@@ -28,6 +69,14 @@ SPEC REPOS:
- AMapFoundation-NO-IDFA
- AMapLocation-NO-IDFA
- AMapSearch-NO-IDFA
+ - IQKeyboardCore
+ - IQKeyboardManagerSwift
+ - IQKeyboardNotification
+ - IQKeyboardReturnManager
+ - IQKeyboardToolbar
+ - IQKeyboardToolbarManager
+ - IQTextInputViewNotification
+ - IQTextView
- UMAPM
- UMCommon
- UMDevice
@@ -38,11 +87,19 @@ SPEC CHECKSUMS:
AMapFoundation-NO-IDFA: a2e3c895398d7ee757278e1a0a8f9359da4b146e
AMapLocation-NO-IDFA: 7cd8fc837ea41edfbf4d937cd20572e277b77d18
AMapSearch-NO-IDFA: c0afd2a69a076d4228becda4401dbe4a279a03ef
+ IQKeyboardCore: 250a88dfc713b2ecbe1dce250811d054fc016959
+ IQKeyboardManagerSwift: 7f6a9a1e2285732d3ff5f485ff921215253ea77e
+ IQKeyboardNotification: 3b9bc812a5af2cf97df08a363d9daa9fc0dc1848
+ IQKeyboardReturnManager: fcbf51fc68d7536fc1fbcca5231c4e82576b12ac
+ IQKeyboardToolbar: b0f26e43b9e806e961fde2344fe379ae193236b9
+ IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
+ IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
+ IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
-PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f
+PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f
COCOAPODS: 1.16.2
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
new file mode 100644
index 0000000..a4e8fe6
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
@@ -0,0 +1,41 @@
+//
+// IQKeyboardConstants.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+/**
+ `IQEnableModeDefault`
+ Pick default settings.
+
+ `IQEnableModeEnabled`
+ setting is enabled.
+
+ `IQEnableModeDisabled`
+ setting is disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQEnableMode: Int {
+ case `default`
+ case enabled
+ case disabled
+}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
new file mode 100644
index 0000000..24b15d7
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
@@ -0,0 +1,65 @@
+//
+// IQKeyboardExtended.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/// Wrapper for IQKeyboardManager compatible types. This type provides an extension point for
+/// convenience methods in IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardExtension {
+ public private(set) weak var base: Base?
+ fileprivate init(_ base: Base) {
+ self.base = base
+ }
+}
+
+// swiftlint:disable identifier_name
+/// Represents an object type that is compatible with IQKeyboardManager. You can use `iq` property to get a
+/// value in the namespace of IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public protocol IQKeyboardExtended {
+ /// Type being extended.
+ associatedtype Base: AnyObject
+
+ /// Instance IQKeyboardManager extension point.
+ @MainActor
+ var iq: IQKeyboardExtension { get set }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+public extension IQKeyboardExtended where Self: UIView {
+
+ /// Instance IQKeyboardManager extension point.
+ @MainActor
+ var iq: IQKeyboardExtension {
+ get { IQKeyboardExtension(self) }
+ set {}
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension UIView: IQKeyboardExtended {}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
new file mode 100644
index 0000000..8b88f08
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
@@ -0,0 +1,99 @@
+//
+// IQTextInputView.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits {
+
+#if compiler(>=5.7) // Xcode 14
+ @available(iOS 16.0, *)
+ @objc var iqIsFindInteractionEnabled: Bool { get }
+
+ @available(iOS 16.0, *)
+ @objc var iqFindInteraction: UIFindInteraction? { get }
+#endif
+
+ @objc var returnKeyType: UIReturnKeyType { get set }
+ @objc var keyboardAppearance: UIKeyboardAppearance { get set }
+
+ @objc var iqIsEnabled: Bool { get }
+
+ @objc var inputAccessoryView: UIView? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQTextInputView {
+
+#if compiler(>=5.7) // Xcode 14
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { false }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { nil }
+#endif
+
+ public var iqIsEnabled: Bool { isEnabled }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextView: IQTextInputView {
+
+#if compiler(>=5.7) // Xcode 14
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { isFindInteractionEnabled }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { findInteraction }
+#endif
+
+ public var iqIsEnabled: Bool { isEditable }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UISearchBar: IQTextInputView {
+
+#if compiler(>=5.7) // Xcode 14
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { false }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { nil }
+#endif
+
+ public var iqIsEnabled: Bool {
+#if compiler(>=5.8) // Xcode 14.4
+ if #available(iOS 16.4, *) {
+ return isEnabled
+ } else {
+ return searchTextField.isEnabled
+ }
+#else
+ return searchTextField.isEnabled
+#endif
+ }
+}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
new file mode 100644
index 0000000..0eafafe
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
@@ -0,0 +1,180 @@
+//
+// UIView+Hierarchy.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+ UIView hierarchy category.
+ */
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ // MARK: viewControllers
+
+ /**
+ Returns the UIViewController object that manages the receiver.
+ */
+ func viewContainingController() -> UIViewController? {
+
+ var nextResponder: UIResponder? = base
+
+ repeat {
+ nextResponder = nextResponder?.next
+
+ if let viewController: UIViewController = nextResponder as? UIViewController {
+ return viewController
+ }
+
+ } while nextResponder != nil
+
+ return nil
+ }
+
+ @available(*, unavailable, message: "This has been removed because it no longer needed")
+ func topMostController() -> UIViewController? { nil }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ // MARK: Superviews
+ /**
+ Returns the superView of provided class type.
+
+ @param classType class type of the object which is to be search in above hierarchy and return
+
+ @param belowView view object in upper hierarchy where method should stop searching and return nil
+ */
+ func superviewOf(type classType: T.Type, belowView: UIView? = nil) -> T? {
+
+ var superView: UIView? = base?.superview
+
+ while let aSuperview: UIView = superView {
+
+ if aSuperview.isKind(of: classType) {
+
+ // If it's UIScrollView, then validating for special cases
+ if aSuperview is UIScrollView {
+
+ let classNameString: String = "\(type(of: aSuperview.self))"
+
+ // If it's not UITableViewWrapperView class,
+ // this is internal class which is actually manage in UITableview.
+ // The speciality of this class is that it's superview is UITableView.
+ // If it's not UITableViewCellScrollView class,
+ // this is internal class which is actually manage in UITableviewCell.
+ // The speciality of this class is that it's superview is UITableViewCell.
+ // If it's not _UIQueuingScrollView class,
+ // actually we validate for _ prefix which usually used by Apple internal classes
+ if !(aSuperview.superview is UITableView),
+ !(aSuperview.superview is UITableViewCell),
+ !classNameString.hasPrefix("_") {
+ return superView as? T
+ }
+ } else {
+ return superView as? T
+ }
+ } else if aSuperview == belowView {
+ return nil
+ }
+
+ superView = aSuperview.superview
+ }
+
+ return nil
+ }
+
+ // MARK: Special TextFields
+
+ /**
+ Returns searchBar if receiver object is UISearchBarTextField, otherwise return nil.
+ */
+ func textFieldSearchBar() -> UISearchBar? {
+
+ if base is UISearchTextField,
+ var textInputViewController = base?.iq.viewContainingController() {
+ if let navController: UINavigationController = textInputViewController as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ textInputViewController = topController
+ }
+
+ // Not adjusting for searchTextField inside searchController.
+ if textInputViewController.navigationItem.searchController?.searchBar.searchTextField == base {
+ return textInputViewController.navigationItem.searchController?.searchBar
+ }
+ } else {
+ var responder: UIResponder? = base?.next
+
+ while let bar: UIResponder = responder {
+
+ if let searchBar: UISearchBar = bar as? UISearchBar {
+ return searchBar
+ } else if bar is UIViewController {
+ break
+ }
+
+ responder = bar.next
+ }
+ }
+ return nil
+ }
+
+ /**
+ Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO.
+ */
+ func isAlertViewTextField() -> Bool {
+
+ var alertViewController: UIResponder? = viewContainingController()
+
+ var isAlertViewTextField: Bool = false
+
+ while let controller: UIResponder = alertViewController, !isAlertViewTextField {
+
+ if controller is UIAlertController {
+ isAlertViewTextField = true
+ break
+ }
+
+ alertViewController = controller.next
+ }
+
+ return isAlertViewTextField
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.viewContainingController()")
+ func viewContainingController() -> UIViewController? { nil }
+
+ @available(*, unavailable, message: "This has been removed because it no longer needed")
+ func topMostController() -> UIViewController? { nil }
+
+ @available(*, unavailable, renamed: "iq.superviewOf(type:belowView:)")
+ func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView? { nil }
+}
diff --git a/Pods/IQKeyboardCore/LICENSE b/Pods/IQKeyboardCore/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardCore/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardCore/README.md b/Pods/IQKeyboardCore/README.md
new file mode 100644
index 0000000..f098c96
--- /dev/null
+++ b/Pods/IQKeyboardCore/README.md
@@ -0,0 +1,75 @@
+# IQKeyboardCore
+
+[](https://travis-ci.org/hackiftekhar/IQKeyboardCore)
+[](https://cocoapods.org/pods/IQKeyboardCore)
+[](https://cocoapods.org/pods/IQKeyboardCore)
+[](https://cocoapods.org/pods/IQKeyboardCore)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardCore is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardCore'
+```
+
+## Usage
+
+IQKeyboardCore is not intended to use independently. It's just a helper and extension for most of the IQKeyboard related libraries
+
+This contains IQTextInputView protocol
+```swift
+@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits {
+}
+```
+UITextField, UITextView and UISearchBar are the known classes who adopted this protocol within the library
+
+```swift
+@objc extension UITextField: IQTextInputView {...}
+
+@objc extension UITextView: IQTextInputView {...}
+
+@objc extension UISearchBar: IQTextInputView {...}
+```
+
+This library also contains IQEnableMode which is used by other libraries
+```swift
+@objc public enum IQEnableMode: Int {
+ case `default`
+ case enabled
+ case disabled
+}
+```
+
+There are other extension functions which are available on UIView
+```swift
+public extension IQKeyboardExtension where Base: UIView {
+ func viewContainingController() -> UIViewController?
+ func superviewOf(type classType: T.Type, belowView: UIView? = nil) -> T?
+ func textFieldSearchBar() -> UISearchBar?
+ func isAlertViewTextField() -> Bool
+}
+```
+
+Above extension functions can be used like below
+```swift
+ view.iq.viewContainingController()
+ view.iq.superviewOf(type: UIScrollView.self)
+ view.iq.textFieldSearchBar()
+ view.iq.isAlertViewTextField()
+```
+
+## Author
+
+hackiftekhar, ideviftekhar@gmail.com
+
+## License
+
+IQKeyboardCore is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
new file mode 100644
index 0000000..49de03b
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
@@ -0,0 +1,43 @@
+//
+// IQKeyboardAppearanceConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardAppearanceConfiguration: NSObject {
+
+ /**
+ Override the keyboardAppearance for all textInputView. Default is NO.
+ */
+ public var overrideAppearance: Bool = false
+
+ /**
+ If overrideKeyboardAppearance is YES, then all the textInputView keyboardAppearance is set using this property.
+ */
+ public var appearance: UIKeyboardAppearance = .default
+}
+
+@available(*, unavailable, renamed: "IQKeyboardAppearanceConfiguration")
+@MainActor
+@objcMembers public final class IQKeyboardConfiguration: NSObject {}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
new file mode 100644
index 0000000..fd475c0
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
@@ -0,0 +1,50 @@
+//
+// IQKeyboardAppearanceManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardAppearanceManager {
+
+ func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardAppearanceManager")
+ }
+
+ func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardAppearanceManager",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ switch event {
+ case .beginEditing:
+ guard self.keyboardConfiguration.overrideAppearance,
+ textInputView.keyboardAppearance != self.keyboardConfiguration.appearance else { return }
+
+ textInputView.keyboardAppearance = self.keyboardConfiguration.appearance
+ textInputView.reloadInputViews()
+ case .endEditing:
+ break
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
new file mode 100644
index 0000000..4a6fdaa
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
@@ -0,0 +1,44 @@
+//
+// IQKeyboardAppearanceManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardAppearanceManager: NSObject {
+
+ let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ /**
+ Configuration related to keyboard appearance
+ */
+ var keyboardConfiguration: IQKeyboardAppearanceConfiguration = .init()
+
+ public override init() {
+ super.init()
+
+ // Registering one time only
+ addTextInputViewObserver()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
new file mode 100644
index 0000000..cea51c2
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
@@ -0,0 +1,55 @@
+//
+// IQKeyboardManager+Appearance.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var appearanceManager: Int = 0
+ }
+
+ internal var appearanceManager: IQKeyboardAppearanceManager {
+ if let object = objc_getAssociatedObject(self, &AssociatedKeys.appearanceManager)
+ as? IQKeyboardAppearanceManager {
+ return object
+ }
+
+ let object: IQKeyboardAppearanceManager = .init()
+ objc_setAssociatedObject(self, &AssociatedKeys.appearanceManager,
+ object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+ return object
+ }
+
+ /**
+ Configuration related to keyboard appearance
+ */
+ var keyboardConfiguration: IQKeyboardAppearanceConfiguration {
+ get { appearanceManager.keyboardConfiguration }
+ set { appearanceManager.keyboardConfiguration = newValue }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
new file mode 100644
index 0000000..8e9cfb5
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
@@ -0,0 +1,43 @@
+//
+// IQKeyboardManager+Appearance_Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "keyboardConfiguration.overrideAppearance")
+ var overrideKeyboardAppearance: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "keyboardConfiguration.appearance")
+ var keyboardAppearance: UIKeyboardAppearance {
+ get { .default }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift
new file mode 100644
index 0000000..8018027
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift
@@ -0,0 +1,273 @@
+//
+// IQActiveConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQKeyboardNotification
+import IQTextInputViewNotification
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal final class IQActiveConfiguration: NSObject {
+
+ private let keyboardObserver: IQKeyboardNotification = .init()
+ private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ private var changeObservers: [AnyHashable: ConfigurationCompletion] = [:]
+ var cancellable: Set = []
+
+ enum Event: Int {
+ case hide
+ case show
+ case change
+
+ var name: String {
+ switch self {
+ case .hide:
+ return "hide"
+ case .show:
+ return "show"
+ case .change:
+ return "change"
+ }
+ }
+ }
+
+ private var lastEvent: Event = .hide
+
+ var rootConfiguration: IQRootControllerConfiguration?
+
+ var isReady: Bool {
+ if textInputViewInfo != nil,
+ let rootConfiguration = rootConfiguration {
+ return rootConfiguration.isReady
+ }
+ return false
+ }
+
+ override init() {
+ super.init()
+ addKeyboardObserver()
+ addTextInputViewObserver()
+ }
+
+ private func sendEvent() {
+
+ guard let rootConfiguration = rootConfiguration,
+ rootConfiguration.isReady else { return }
+
+ if keyboardInfo.isVisible {
+ if lastEvent == .hide {
+ self.notify(event: .show, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ } else {
+ self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ }
+
+ } else if lastEvent != .hide {
+ if rootConfiguration.beginOrientation == rootConfiguration.currentOrientation {
+
+ // If interactive pop gesture is active then it manipulate viewController.view's frame
+ // To overcome with this, we have to do this workaround.
+ if rootConfiguration.isInteractiveGestureActive,
+ let rootController: UIViewController = rootConfiguration.rootController {
+
+ self.cancellable.forEach { $0.cancel() }
+ self.cancellable.removeAll()
+
+ // Saving current keyboard info and textInputView
+ let keyboardInfo = keyboardObserver.keyboardInfo
+ let textInputViewInfo = textInputViewObserver.textInputViewInfo
+
+ // Start observing frame changes.
+ // If pop successful, then we'll not get callbacks here again
+ // If user cancels the pop, then we'll get frame as .zero at some time
+ // Also the interactiveGesture becomes inactive (genuinely it's state is .possible)
+ // At this moment.
+ rootController.view.publisher(for: \.frame)
+ .removeDuplicates()
+ .sink(receiveValue: { [weak self] frame in
+ guard let self = self else { return }
+ guard frame.origin == .zero,
+ !rootConfiguration.isInteractiveGestureActive else { return }
+
+ self.cancellable.forEach { $0.cancel() }
+ self.cancellable.removeAll()
+
+ // Restore keyboard info and textInputViewInfo
+ self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ }).store(in: &cancellable)
+
+ } else {
+ self.notify(event: .hide, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ self.rootConfiguration = nil
+ }
+
+ } else if rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ }
+ }
+
+ private func updateRootController(textInputView: IQTextInputView?) {
+
+ guard let textInputView: UIView = textInputView,
+ let controller: UIViewController = textInputView.iq.parentContainerViewController() else {
+ if let rootConfiguration = rootConfiguration,
+ rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ rootConfiguration = nil
+ return
+ }
+
+ let newConfiguration = IQRootControllerConfiguration(rootController: controller)
+
+ guard newConfiguration.rootController?.view.window != rootConfiguration?.rootController?.view.window ||
+ newConfiguration.beginOrientation != rootConfiguration?.beginOrientation else { return }
+
+ if rootConfiguration?.rootController != newConfiguration.rootController {
+
+ // If there was an old configuration but things are changed
+ if let rootConfiguration = rootConfiguration,
+ rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ }
+
+ rootConfiguration = newConfiguration
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ var keyboardInfo: IQKeyboardInfo {
+ return keyboardObserver.keyboardInfo
+ }
+
+ private func addKeyboardObserver() {
+ keyboardObserver.subscribe(identifier: "IQActiveConfiguration", changeHandler: { [weak self] _, endFrame in
+
+ guard let self = self else { return }
+
+ guard self.keyboardObserver.oldKeyboardInfo.endFrame.height != endFrame.height else { return }
+
+ if let info = self.textInputViewInfo, self.keyboardInfo.isVisible {
+ if let rootConfiguration = self.rootConfiguration {
+ let beginIsPortrait: Bool = rootConfiguration.beginOrientation.isPortrait
+ let currentIsPortrait: Bool = rootConfiguration.currentOrientation.isPortrait
+ if beginIsPortrait != currentIsPortrait {
+ self.updateRootController(textInputView: info.textInputView)
+ }
+ } else {
+ self.updateRootController(textInputView: info.textInputView)
+ }
+ }
+
+ self.sendEvent()
+
+ // If interactive pop gesture is active then we don't want to remove this textField
+ if endFrame.height == 0,
+ !(self.rootConfiguration?.isInteractiveGestureActive ?? false) {
+ self.updateRootController(textInputView: nil)
+ }
+ })
+ }
+
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ keyboardObserver.animate(alongsideTransition: transition, completion: completion)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ var textInputView: (any IQTextInputView)? {
+ guard let textInputView: UIView = textInputViewObserver.textInputView,
+ textInputView.iq.isAlertViewTextField() == false else {
+ return nil
+ }
+
+ return textInputViewObserver.textInputView
+ }
+
+ var textInputViewInfo: IQTextInputViewInfo? {
+ guard let textInputView: UIView = textInputView,
+ textInputView.iq.isAlertViewTextField() == false else {
+ return nil
+ }
+
+ return textInputViewObserver.textInputViewInfo
+ }
+
+ private func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQActiveConfiguration",
+ changeHandler: { [weak self] event, textInputView in
+
+ guard let self = self else { return }
+
+ guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+ return
+ }
+
+ if event == .beginEditing {
+ self.updateRootController(textInputView: textInputView)
+ self.sendEvent()
+ }
+ })
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ typealias ConfigurationCompletion = (_ event: Event,
+ _ keyboardInfo: IQKeyboardInfo,
+ _ textInputViewInfo: IQTextInputViewInfo?) -> Void
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping ConfigurationCompletion) {
+ changeObservers[identifier] = changeHandler
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ changeObservers[identifier] = nil
+ }
+
+ private func notify(event: Event, keyboardInfo: IQKeyboardInfo, textInputViewInfo: IQTextInputViewInfo?) {
+ lastEvent = event
+
+ for block in changeObservers.values {
+ block(event, keyboardInfo, textInputViewInfo)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
new file mode 100644
index 0000000..4980b73
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
@@ -0,0 +1,95 @@
+//
+// IQRootControllerConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQRootControllerConfiguration {
+
+ weak var rootController: UIViewController?
+ let beginOrigin: CGPoint
+ let beginSafeAreaInsets: UIEdgeInsets
+ let beginOrientation: UIInterfaceOrientation
+
+ init(rootController: UIViewController) {
+ self.rootController = rootController
+ beginOrigin = rootController.view.frame.origin
+ beginSafeAreaInsets = rootController.view.safeAreaInsets
+
+ let interfaceOrientation: UIInterfaceOrientation
+ if let scene = rootController.view.window?.windowScene {
+ interfaceOrientation = scene.interfaceOrientation
+ } else {
+ interfaceOrientation = .unknown
+ }
+
+ beginOrientation = interfaceOrientation
+ }
+
+ var currentOrientation: UIInterfaceOrientation {
+ let interfaceOrientation: UIInterfaceOrientation
+ if let scene = rootController?.view.window?.windowScene {
+ interfaceOrientation = scene.interfaceOrientation
+ } else {
+ interfaceOrientation = .unknown
+ }
+ return interfaceOrientation
+ }
+
+ var isReady: Bool {
+ return rootController?.view.window != nil
+ }
+
+ var hasChanged: Bool {
+ let origin: CGPoint = rootController?.view.frame.origin ?? .zero
+ return !origin.equalTo(beginOrigin)
+ }
+
+ var isInteractiveGestureActive: Bool {
+ guard let rootController: UIViewController = rootController,
+ let navigationController: UINavigationController = rootController.navigationController,
+ let interactiveGestureRecognizer = navigationController.interactivePopGestureRecognizer else {
+ return false
+ }
+ switch interactiveGestureRecognizer.state {
+ case .began, .changed:
+ return true
+ case .possible, .ended, .cancelled, .failed, .recognized:
+ // swiftlint:disable:next no_fallthrough_only
+ fallthrough
+ default:
+ return false
+ }
+ }
+ @discardableResult
+ func restore() -> Bool {
+ guard let rootController: UIViewController = rootController,
+ !rootController.view.frame.origin.equalTo(beginOrigin) else { return false }
+ // Setting it's new frame
+ var rect: CGRect = rootController.view.frame
+ rect.origin = beginOrigin
+ rootController.view.frame = rect
+ return true
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
new file mode 100644
index 0000000..8ced7b5
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
@@ -0,0 +1,100 @@
+//
+// IQScrollViewConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQScrollViewConfiguration {
+ let scrollView: UIScrollView
+ let startingContentOffset: CGPoint
+ let startingScrollIndicatorInsets: UIEdgeInsets
+ let startingContentInset: UIEdgeInsets
+
+ private let canRestoreContentOffset: Bool
+
+ init(scrollView: UIScrollView, canRestoreContentOffset: Bool) {
+ self.scrollView = scrollView
+ self.canRestoreContentOffset = canRestoreContentOffset
+
+ startingContentOffset = scrollView.contentOffset
+ startingContentInset = scrollView.contentInset
+ startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets
+ }
+
+ var hasChanged: Bool {
+ if scrollView.contentInset != self.startingContentInset {
+ return true
+ }
+
+ if canRestoreContentOffset,
+ scrollView.iq.restoreContentOffset,
+ !scrollView.contentOffset.equalTo(startingContentOffset) {
+ return true
+ }
+ return false
+ }
+
+ @discardableResult
+ func restore(for textInputView: (some IQTextInputView)?) -> Bool {
+ var success: Bool = false
+
+ if scrollView.contentInset != self.startingContentInset {
+ scrollView.contentInset = self.startingContentInset
+ scrollView.layoutIfNeeded() // (Bug ID: #1996)
+ success = true
+ }
+
+ if scrollView.verticalScrollIndicatorInsets != self.startingScrollIndicatorInsets {
+ scrollView.verticalScrollIndicatorInsets = self.startingScrollIndicatorInsets
+ }
+
+ if canRestoreContentOffset,
+ scrollView.iq.restoreContentOffset,
+ !scrollView.contentOffset.equalTo(startingContentOffset) {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView?
+ if let textInputView: UIView = textInputView {
+ stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ } else {
+ stackView = nil
+ }
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = startingContentOffset
+ }
+ success = true
+ }
+
+ return success
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
new file mode 100644
index 0000000..ccea38b
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
@@ -0,0 +1,78 @@
+//
+// IQKeyboardManager+Debug.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var isDebuggingEnabled: Int = 0
+ static var logIndentation: Int = 0
+ }
+
+ var isDebuggingEnabled: Bool {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled) as? Bool ?? false
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ private var logIndentation: Int {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.logIndentation) as? Int ?? 0
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.logIndentation,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ internal func showLog(_ logString: String, indentation: Int = 0) {
+
+ guard isDebuggingEnabled else {
+ return
+ }
+
+ if indentation < 0 {
+ logIndentation = max(0, logIndentation + indentation)
+ }
+
+ var preLog: String = "IQKeyboardManager"
+ for _ in 0 ... logIndentation {
+ preLog += "|\t"
+ }
+
+ print(preLog + logString)
+
+ if indentation > 0 {
+ logIndentation += indentation
+ }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
new file mode 100644
index 0000000..87bb3f9
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
@@ -0,0 +1,169 @@
+//
+// IQKeyboardManager+Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "keyboardDistance")
+ var keyboardDistanceFromTextField: CGFloat {
+ get { fatalError() }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+ func registerTextFieldViewClass(_ aClass: UIView.Type,
+ didBeginEditingNotificationName: String,
+ didEndEditingNotificationName: String) {
+ }
+
+ @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+ func unregisterTextFieldViewClass(_ aClass: UIView.Type,
+ didBeginEditingNotificationName: String,
+ didEndEditingNotificationName: String) {
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ typealias SizeBlock = (_ size: CGSize) -> Void
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {}
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ func unregisterKeyboardSizeChange(identifier: AnyHashable) {}
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ var keyboardShowing: Bool { false }
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ var keyboardFrame: CGRect { .zero }
+}
+
+@available(*, unavailable, renamed: "IQKeyboardReturnManager", message: "Please use `IQKeyboardReturnManager` independently from https://github.com/hackiftekhar/IQKeyboardReturnManager")
+@MainActor
+@objcMembers public final class IQKeyboardReturnKeyHandler: NSObject {}
+
+@available(*, unavailable, renamed: "IQKeyboardNotification", message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+@MainActor
+@objcMembers public final class IQKeyboardListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification", message: "Please use `IQTextInputViewNotification` independently from https://github.com/hackiftekhar/IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQDeepResponderContainerView", message: "Please use `IQDeepResponderContainerView` class which is now part of `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager.")
+@MainActor
+@objcMembers open class IQPreviousNextView: UIView {}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfigurationDeprecated: NSObject {
+ public var showPlaceholder: Bool = true
+ public var font: UIFont?
+ public var color: UIColor?
+ public var buttonColor: UIColor?
+ public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQBarButtonItemConfigurationDeprecated: NSObject {
+
+ public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+ self.systemItem = systemItem
+ self.image = nil
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(image: UIImage, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = image
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(title: String, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = nil
+ self.title = title
+ self.action = action
+ super.init()
+ }
+
+ public let systemItem: UIBarButtonItem.SystemItem?
+ public let image: UIImage?
+ public let title: String?
+ public var action: Selector?
+ public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQAutoToolbarManageBehaviorDeprecated: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQPreviousNextDisplayModeDeprecated: Int {
+ case `default`
+ case alwaysHide
+ case alwaysShow
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarConfiguration: NSObject {
+
+ public var useTextInputViewTintColor: Bool = false
+ public var tintColor: UIColor?
+ public var barTintColor: UIColor?
+ public var previousNextDisplayMode: IQPreviousNextDisplayModeDeprecated = .default
+ public var manageBehavior: IQAutoToolbarManageBehaviorDeprecated = .bySubviews
+ public var previousBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public var nextBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public var doneBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public let placeholderConfiguration: IQToolbarPlaceholderConfigurationDeprecated = .init()
+}
+
+// swiftlint:enable line_length
+// swiftlint:enable unused_setter_value
+// swiftlint:enable type_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
new file mode 100644
index 0000000..a09bae8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
@@ -0,0 +1,126 @@
+//
+// IQKeyboardManager+ActiveConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import Combine
+
+// MARK: UIKeyboard Notifications
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func addActiveConfigurationObserver() {
+ activeConfiguration.subscribe(identifier: "IQKeyboardManager", changeHandler: { [weak self] event, _, _ in
+ guard let self = self else { return }
+
+ switch event {
+ case .show:
+ self.handleKeyboardTextInputViewVisible()
+ case .change:
+ self.handleKeyboardTextInputViewChanged()
+ case .hide:
+ self.handleKeyboardTextInputViewHide()
+ }
+ })
+ }
+
+ private func handleKeyboardTextInputViewVisible() {
+
+ setupTextInputView()
+
+ if privateIsEnabled() {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ }
+
+ private func handleKeyboardTextInputViewChanged() {
+
+ setupTextInputView()
+
+ if privateIsEnabled() {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ }
+
+ private func handleKeyboardTextInputViewHide() {
+
+ self.restorePosition()
+ self.banishTextInputViewSetup()
+
+ self.lastScrollViewConfiguration = nil
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func setupTextInputView() {
+
+ guard let textInputView = activeConfiguration.textInputView else {
+ return
+ }
+
+ if let startingConfiguration = startingTextViewConfiguration,
+ startingConfiguration.hasChanged {
+
+ if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+ showLog("""
+ Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+ """)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ startingConfiguration.restore(for: textInputView)
+ })
+ }
+ startingTextViewConfiguration = nil
+ }
+
+ func banishTextInputViewSetup() {
+
+ guard let textInputView = activeConfiguration.textInputView else {
+ return
+ }
+
+ if let startingConfiguration = startingTextViewConfiguration,
+ startingConfiguration.hasChanged {
+
+ if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+ showLog("""
+ Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+ """)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ startingConfiguration.restore(for: textInputView)
+ })
+ }
+ startingTextViewConfiguration = nil
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
new file mode 100644
index 0000000..cebe33a
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
@@ -0,0 +1,93 @@
+//
+// IQKeyboardManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func privateIsEnabled() -> Bool {
+
+ guard let textInputView: any IQTextInputView = activeConfiguration.textInputView else {
+ return isEnabled
+ }
+
+ switch textInputView.internalEnableMode {
+ case .default:
+ guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+ return isEnabled
+ }
+
+ if textInputView is UISearchTextField {
+ if let navController: UINavigationController = controller as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ controller = topController
+ }
+
+ // Not adjusting for searchTextField inside searchController.
+ if controller.navigationItem.searchController?.searchBar.searchTextField == textInputView {
+ return false
+ }
+ }
+
+ // If viewController is in enabledDistanceHandlingClasses, then assuming it's enabled.
+ let isWithEnabledClass: Bool = enabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) })
+ var isEnabled: Bool = isEnabled || isWithEnabledClass
+
+ if isEnabled {
+ // If viewController is in disabledDistanceHandlingClasses,
+ // then assuming it's disabled.
+ if disabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) {
+ isEnabled = false
+ } else {
+ // Special Controllers
+ let classNameString: String = "\(type(of: controller.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+
+ return isEnabled
+ case .enabled:
+ return true
+ case .disabled:
+ return false
+ @unknown default:
+ return false
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalEnableMode: IQEnableMode {
+ return iq.enableMode
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
new file mode 100644
index 0000000..beb9bf6
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
@@ -0,0 +1,798 @@
+//
+// IQKeyboardManager+Position.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+// swiftlint:disable file_length
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ private typealias IQLayoutGuide = (top: CGFloat, bottom: CGFloat)
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var movedDistance: Int = 0
+ static var movedDistanceChanged: Int = 0
+ static var lastScrollViewConfiguration: Int = 0
+ static var startingTextViewConfiguration: Int = 0
+ static var activeConfiguration: Int = 0
+ }
+
+ /**
+ moved distance to the top used to maintain distance between keyboard and textInputView.
+ Most of the time this will be a positive value.
+ */
+ private(set) var movedDistance: CGFloat {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ movedDistanceChanged?(movedDistance)
+ }
+ }
+
+ /**
+ Will be called then movedDistance will be changed
+ */
+ var movedDistanceChanged: ((CGFloat) -> Void)? {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void)
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ movedDistanceChanged?(movedDistance)
+ }
+ }
+
+ /** Variable to save lastScrollView that was scrolled. */
+ @nonobjc
+ internal var lastScrollViewConfiguration: IQScrollViewConfiguration? {
+ get {
+ return objc_getAssociatedObject(self,
+ &AssociatedKeys.lastScrollViewConfiguration) as? IQScrollViewConfiguration
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.lastScrollViewConfiguration,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ /** used to adjust contentInset of UITextView. */
+ @nonobjc
+ internal var startingTextViewConfiguration: IQScrollViewConfiguration? {
+ get {
+ return objc_getAssociatedObject(self,
+ &AssociatedKeys.startingTextViewConfiguration) as? IQScrollViewConfiguration
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewConfiguration,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ internal func applicationDidBecomeActive(_ notification: Notification) {
+
+ guard privateIsEnabled(),
+ activeConfiguration.keyboardInfo.isVisible,
+ activeConfiguration.isReady else {
+ return
+ }
+ adjustPosition()
+ }
+
+ /* Adjusting RootViewController's frame according to interface orientation. */
+ // swiftlint:disable function_body_length
+ internal func adjustPosition() {
+
+ guard UIApplication.shared.applicationState == .active,
+ let textInputView: any IQTextInputView = activeConfiguration.textInputView,
+ let superview: UIView = textInputView.superview,
+ let rootConfiguration = activeConfiguration.rootConfiguration,
+ let rootController: UIViewController = rootConfiguration.rootController,
+ let window: UIWindow = rootController.view.window else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ let textInputViewRectInWindow: CGRect = superview.convert(textInputView.frame, to: window)
+ let textInputViewRectInRootSuperview: CGRect = superview.convert(textInputView.frame,
+ to: rootController.view.superview)
+
+ // Getting RootViewOrigin.
+ let rootViewOrigin: CGPoint = rootController.view.frame.origin
+
+ let keyboardDistance: CGFloat = getSpecialTextInputViewDistance(textInputView: textInputView)
+
+ let kbSize: CGSize = Self.getKeyboardSize(keyboardDistance: keyboardDistance,
+ keyboardFrame: activeConfiguration.keyboardInfo.endFrame,
+ safeAreaInsets: rootConfiguration.beginSafeAreaInsets,
+ windowFrame: window.frame)
+ let originalKbSize: CGSize = activeConfiguration.keyboardInfo.endFrame.size
+
+ let isScrollableTextInputView: Bool
+
+ if let textInputView: UIScrollView = textInputView as? UITextView {
+ isScrollableTextInputView = textInputView.isScrollEnabled
+ } else {
+ isScrollableTextInputView = false
+ }
+
+ let layoutGuide: IQLayoutGuide = Self.getLayoutGuides(rootController: rootController, window: window,
+ isScrollableTextInputView: isScrollableTextInputView)
+
+ var superScrollView: UIScrollView?
+ var superView: UIScrollView? = (textInputView as UIView).iq.superviewOf(type: UIScrollView.self)
+
+ // Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285)
+ while let view: UIScrollView = superView {
+
+ if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+ superScrollView = view
+ break
+ } else {
+ // Getting it's superScrollView. // (Enhancement ID: #21, #24)
+ superView = view.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+
+ // Move positive = textInputView is hidden.
+ // Move negative = textInputView is showing.
+ // Calculating move position.
+ var moveUp: CGFloat = Self.getMoveUpDistance(keyboardSize: kbSize,
+ layoutGuide: layoutGuide,
+ textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+ textInputViewRectInWindow: textInputViewRectInWindow,
+ windowFrame: window.frame)
+
+ showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")")
+
+
+ setupActiveScrollViewConfiguration(superScrollView: superScrollView, textInputView: textInputView)
+
+ // Special case for ScrollView.
+ // If we found lastScrollView then setting it's contentOffset to show textInputView.
+ if let lastScrollViewConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
+ adjustScrollViewContentOffsets(moveUp: &moveUp, textInputView: textInputView,
+ lastScrollViewConfiguration: lastScrollViewConfiguration,
+ rootSuperview: rootController.view.superview, layoutGuide: layoutGuide,
+ textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+ isScrollableTextInputView: isScrollableTextInputView, window: window,
+ kbSize: kbSize, keyboardDistance: keyboardDistance,
+ rootBeginSafeAreaInsets: rootConfiguration.beginSafeAreaInsets)
+ }
+
+ // Special case for UITextView
+ // (Readjusting textInputView.contentInset when textInputView hight is too big to fit on screen)
+ // _lastScrollView If not having inside any scrollView, now contentInset manages the full screen textInputView.
+ // If is a UITextView type
+ if isScrollableTextInputView, let textInputView = textInputView as? UITextView {
+
+ adjustTextInputViewContentInset(window: window, originalKbSize: originalKbSize,
+ rootSuperview: rootController.view.superview,
+ layoutGuide: layoutGuide,
+ textInputView: textInputView)
+ }
+
+ adjustRootController(moveUp: moveUp, rootViewOrigin: rootViewOrigin, originalKbSize: originalKbSize,
+ rootController: rootController, rootBeginOrigin: rootConfiguration.beginOrigin)
+ }
+ // swiftlint:enable function_body_length
+
+ internal func restorePosition() {
+
+ // Setting rootViewController frame to it's original position. // (Bug ID: #18)
+ guard let configuration: IQRootControllerConfiguration = activeConfiguration.rootConfiguration else {
+ return
+ }
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ if configuration.hasChanged {
+ let classNameString: String = "\(type(of: configuration.rootController.self))"
+ self.showLog("Restoring \(classNameString) origin to: \(configuration.beginOrigin)")
+ }
+ configuration.restore()
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ configuration.rootController?.view.setNeedsLayout()
+ configuration.rootController?.view.layoutIfNeeded()
+ }
+ })
+ // Restoring the contentOffset of the lastScrollView
+ if let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
+ let textInputView: (any IQTextInputView)? = activeConfiguration.textInputView
+
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, textInputView: textInputView)
+
+ activeConfiguration.animate(alongsideTransition: {
+ // This is temporary solution. Have to implement the save and restore scrollView state
+ self.restoreScrollViewContentOffset(superScrollView: lastConfiguration.scrollView,
+ textInputView: textInputView)
+ })
+ }
+
+ self.movedDistance = 0
+ }
+}
+
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardManager {
+
+ func getSpecialTextInputViewDistance(textInputView: some IQTextInputView) -> CGFloat {
+ // Maintain keyboardDistance
+ let specialKeyboardDistance: CGFloat
+
+ if let searchBar: UISearchBar = textInputView.iq.textFieldSearchBar() {
+ specialKeyboardDistance = searchBar.iq.distanceFromKeyboard
+ } else {
+ specialKeyboardDistance = textInputView.iq.distanceFromKeyboard
+ }
+
+ if specialKeyboardDistance == UIView.defaultKeyboardDistance {
+ return keyboardDistance
+ } else {
+ return specialKeyboardDistance
+ }
+ }
+
+ static func getKeyboardSize(keyboardDistance: CGFloat, keyboardFrame: CGRect,
+ safeAreaInsets: UIEdgeInsets, windowFrame: CGRect) -> CGSize {
+ let kbSize: CGSize
+ var kbFrame: CGRect = keyboardFrame
+
+ kbFrame.origin.y -= keyboardDistance
+ kbFrame.size.height += keyboardDistance
+
+ kbFrame.origin.y -= safeAreaInsets.bottom
+ kbFrame.size.height += safeAreaInsets.bottom
+
+ // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+ // Calculating actual keyboard covered size respect to window,
+ // keyboard frame may be different when hardware keyboard is attached
+ let intersectRect: CGRect = kbFrame.intersection(windowFrame)
+
+ if intersectRect.isNull {
+ kbSize = CGSize(width: kbFrame.size.width, height: 0)
+ } else {
+ kbSize = intersectRect.size
+ }
+ return kbSize
+ }
+
+ static private func getLayoutGuides(rootController: UIViewController, window: UIWindow,
+ isScrollableTextInputView: Bool) -> IQLayoutGuide {
+ let navigationBarAreaHeight: CGFloat
+ if let navigationController: UINavigationController = rootController.navigationController {
+ navigationBarAreaHeight = navigationController.navigationBar.frame.maxY
+ } else {
+ let statusBarHeight: CGFloat = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
+ navigationBarAreaHeight = statusBarHeight
+ }
+
+ let directionalLayoutMargin: NSDirectionalEdgeInsets = rootController.view.directionalLayoutMargins
+ let topLayoutGuide: CGFloat = CGFloat.maximum(navigationBarAreaHeight, directionalLayoutMargin.top)
+
+ // Validation of textInputView for case where there is a tab bar
+ // at the bottom or running on iPhone X and textInputView is at the bottom.
+ let bottomLayoutGuide: CGFloat = isScrollableTextInputView ? 0 : directionalLayoutMargin.bottom
+ return (topLayoutGuide, bottomLayoutGuide)
+ }
+
+ static private func getMoveUpDistance(keyboardSize: CGSize,
+ layoutGuide: IQLayoutGuide,
+ textInputViewRectInRootSuperview: CGRect,
+ textInputViewRectInWindow: CGRect,
+ windowFrame: CGRect) -> CGFloat {
+
+ // Move positive = textInputView is hidden.
+ // Move negative = textInputView is showing.
+ // Calculating move position.
+ let visibleHeight: CGFloat = windowFrame.height-keyboardSize.height
+
+ let topMovement: CGFloat = textInputViewRectInRootSuperview.minY-layoutGuide.top
+ let bottomMovement: CGFloat = textInputViewRectInWindow.maxY - visibleHeight + layoutGuide.bottom
+ var moveUp: CGFloat = CGFloat.minimum(topMovement, bottomMovement)
+ moveUp = CGFloat(Int(moveUp))
+ return moveUp
+ }
+
+ func setupActiveScrollViewConfiguration(superScrollView: UIScrollView?, textInputView: some IQTextInputView) {
+ // If there was a lastScrollView. // (Bug ID: #34)
+ guard let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration else {
+ if let superScrollView: UIScrollView = superScrollView {
+ // If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.
+ let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+ canRestoreContentOffset: true)
+ self.lastScrollViewConfiguration = configuration
+ showLog("""
+ Saving ScrollView New contentInset: \(configuration.startingContentInset)
+ and contentOffset: \(configuration.startingContentOffset)
+ """)
+ }
+ return
+ }
+
+ // If we can't find current superScrollView, then setting lastScrollView to it's original form.
+ if superScrollView == nil {
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+ textInputView: textInputView)
+ self.lastScrollViewConfiguration = nil
+ } else if superScrollView != lastConfiguration.scrollView {
+ // If both scrollView's are different,
+ // then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+ textInputView: textInputView)
+
+ if let superScrollView = superScrollView {
+ let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+ canRestoreContentOffset: true)
+ self.lastScrollViewConfiguration = configuration
+ showLog("""
+ Saving ScrollView New contentInset: \(configuration.startingContentInset)
+ and contentOffset: \(configuration.startingContentOffset)
+ """)
+ } else {
+ self.lastScrollViewConfiguration = nil
+ }
+ }
+ // Else the case where superScrollView == lastScrollView means we are on same scrollView
+ // after switching to different textInputView. So doing nothing, going ahead
+ }
+
+ func restoreScrollViewConfigurationIfChanged(configuration: IQScrollViewConfiguration,
+ textInputView: (some IQTextInputView)?) {
+ guard configuration.hasChanged else { return }
+ if configuration.scrollView.contentInset != configuration.startingContentInset {
+ showLog("Restoring contentInset to: \(configuration.startingContentInset)")
+ }
+
+ if configuration.scrollView.iq.restoreContentOffset,
+ !configuration.scrollView.contentOffset.equalTo(configuration.startingContentOffset) {
+ showLog("Restoring contentOffset to: \(configuration.startingContentOffset)")
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ configuration.restore(for: textInputView)
+ })
+ }
+
+ // swiftlint:disable function_body_length
+ private func adjustScrollViewContentOffsets(moveUp: inout CGFloat, textInputView: some IQTextInputView,
+ lastScrollViewConfiguration: IQScrollViewConfiguration,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide,
+ textInputViewRectInRootSuperview: CGRect,
+ isScrollableTextInputView: Bool, window: UIWindow,
+ kbSize: CGSize, keyboardDistance: CGFloat,
+ rootBeginSafeAreaInsets: UIEdgeInsets) {
+ // Saving
+ var lastView: UIView = textInputView
+ var superScrollView: UIScrollView? = lastScrollViewConfiguration.scrollView
+
+ while let scrollView: UIScrollView = superScrollView {
+
+ var isContinue: Bool = false
+
+ if moveUp > 0 {
+ isContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top)
+
+ } else if let tableView: UITableView = scrollView.iq.superviewOf(type: UITableView.self) {
+ // Special treatment for UITableView due to their cell reusing logic
+
+ isContinue = scrollView.contentOffset.y > 0
+
+ Self.handleTableViewCase(moveUp: &moveUp, isContinue: isContinue, textInputView: textInputView,
+ tableView: tableView, rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+ } else if let collectionView = scrollView.iq.superviewOf(type: UICollectionView.self) {
+ // Special treatment for UICollectionView due to their cell reusing logic
+
+ isContinue = scrollView.contentOffset.y > 0
+
+ Self.handleCollectionViewCase(moveUp: &moveUp, isContinue: isContinue,
+ textInputView: textInputView, collectionView: collectionView,
+ rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+ } else {
+ isContinue = textInputViewRectInRootSuperview.minY < layoutGuide.top
+
+ if isContinue {
+ moveUp = CGFloat.minimum(0, textInputViewRectInRootSuperview.minY - layoutGuide.top)
+ }
+ }
+
+ // Looping in upper hierarchy until we don't found any scrollView
+ // in it's upper hierarchy till UIWindow object.
+ if isContinue {
+
+ var tempScrollView: UIScrollView? = scrollView.iq.superviewOf(type: UIScrollView.self)
+ var nextScrollView: UIScrollView?
+ while let view: UIScrollView = tempScrollView {
+
+ if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+ nextScrollView = view
+ break
+ } else {
+ tempScrollView = view.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+
+ // Getting lastViewRect.
+ if let lastViewRect: CGRect = lastView.superview?.convert(lastView.frame, to: scrollView) {
+
+ // Calculating the expected Y offset from move and scrollView's contentOffset.
+ let minimumMovement: CGFloat = CGFloat.minimum(scrollView.contentOffset.y, -moveUp)
+ var suggestedOffsetY: CGFloat = scrollView.contentOffset.y - minimumMovement
+
+ // Rearranging the expected Y offset according to the view.
+ suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, lastViewRect.minY)
+
+ updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: &suggestedOffsetY, moveUp: &moveUp,
+ isScrollableTextInputView: isScrollableTextInputView,
+ nextScrollView: nextScrollView, textInputView: textInputView,
+ window: window, layoutGuide: layoutGuide,
+ scrollViewContentOffset: scrollView.contentOffset)
+
+ let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: suggestedOffsetY)
+
+ if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+ updateScrollViewContentOffset(scrollView: scrollView, newContentOffset: newContentOffset,
+ moveUp: moveUp, textInputView: textInputView)
+ }
+ }
+
+ // Getting next lastView & superScrollView.
+ lastView = scrollView
+ superScrollView = nextScrollView
+ } else {
+ moveUp = 0
+ break
+ }
+ }
+
+ adjustScrollViewContentInset(lastScrollViewConfiguration: lastScrollViewConfiguration, window: window,
+ kbSize: kbSize, keyboardDistance: keyboardDistance,
+ rootBeginSafeAreaInsets: rootBeginSafeAreaInsets)
+ }
+ // swiftlint:enable function_body_length
+
+ private static func handleTableViewCase(moveUp: inout CGFloat, isContinue: Bool,
+ textInputView: some IQTextInputView, tableView: UITableView,
+ rootSuperview: UIView?, layoutGuide: IQLayoutGuide) {
+ guard isContinue,
+ let tableCell: UITableViewCell = textInputView.iq.superviewOf(type: UITableViewCell.self),
+ let indexPath: IndexPath = tableView.indexPath(for: tableCell),
+ let previousIndexPath: IndexPath = tableView.previousIndexPath(of: indexPath) else { return }
+
+ let previousCellRect: CGRect = tableView.rectForRow(at: previousIndexPath)
+ guard !previousCellRect.isEmpty else { return }
+
+ let previousCellRectInRootSuperview: CGRect = tableView.convert(previousCellRect,
+ to: rootSuperview)
+
+ moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+ }
+
+ private static func handleCollectionViewCase(moveUp: inout CGFloat, isContinue: Bool,
+ textInputView: some IQTextInputView, collectionView: UICollectionView,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide) {
+ guard isContinue,
+ let collectionCell = textInputView.iq.superviewOf(type: UICollectionViewCell.self),
+ let indexPath: IndexPath = collectionView.indexPath(for: collectionCell),
+ let previousIndexPath: IndexPath = collectionView.previousIndexPath(of: indexPath),
+ let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) else { return }
+
+ let previousCellRect: CGRect = attributes.frame
+ guard !previousCellRect.isEmpty else { return }
+ let previousCellRectInRootSuperview: CGRect = collectionView.convert(previousCellRect,
+ to: rootSuperview)
+
+ moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+ }
+
+ private func updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: inout CGFloat, moveUp: inout CGFloat,
+ isScrollableTextInputView: Bool, nextScrollView: UIScrollView?,
+ textInputView: some IQTextInputView, window: UIWindow,
+ layoutGuide: IQLayoutGuide,
+ scrollViewContentOffset: CGPoint) {
+ // If is a UITextView type
+ // nextScrollView == nil
+ // If processing scrollView is last scrollView in upper hierarchy
+ // (there is no other scrollView in upper hierarchy.)
+ //
+ // suggestedOffsetY >= 0
+ // suggestedOffsetY must be >= 0 in order to keep distance from navigationBar (Bug ID: #92)
+ guard isScrollableTextInputView,
+ nextScrollView == nil,
+ suggestedOffsetY >= 0,
+ let superview: UIView = textInputView.superview else {
+ // Subtracting the Y offset from the move variable,
+ // because we are going to change scrollView's contentOffset.y to suggestedOffsetY.
+ moveUp -= (suggestedOffsetY-scrollViewContentOffset.y)
+ return
+ }
+
+ let currentTextInputViewRect: CGRect = superview.convert(textInputView.frame,
+ to: window)
+
+ // Calculating expected fix distance which needs to be managed from navigation bar
+ let expectedFixDistance: CGFloat = currentTextInputViewRect.minY - layoutGuide.top
+
+ // Now if expectedOffsetY (scrollView.contentOffset.y + expectedFixDistance)
+ // is lower than current suggestedOffsetY, which means we're in a position where
+ // navigationBar up and hide, then reducing suggestedOffsetY with expectedOffsetY
+ // (scrollView.contentOffset.y + expectedFixDistance)
+ let expectedOffsetY: CGFloat = scrollViewContentOffset.y + expectedFixDistance
+ suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, expectedOffsetY)
+
+ // Setting move to 0 because now we don't want to move any view anymore
+ // (All will be managed by our contentInset logic.
+ moveUp = 0
+ }
+
+ func updateScrollViewContentOffset(scrollView: UIScrollView, newContentOffset: CGPoint,
+ moveUp: CGFloat, textInputView: some IQTextInputView) {
+ showLog("""
+ old contentOffset: \(scrollView.contentOffset)
+ new contentOffset: \(newContentOffset)
+ """)
+ showLog("Remaining Move: \(moveUp)")
+
+ // Getting problem while using `setContentOffset:animated:`, So I used animation API.
+ activeConfiguration.animate(alongsideTransition: {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView? = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = newContentOffset
+ }
+ }, completion: {
+
+ if scrollView is UITableView || scrollView is UICollectionView {
+ // Skip reloading input views during interactive navigation gesture to prevent toolbar flash (Issue #2102)
+ if self.activeConfiguration.rootConfiguration?.isInteractiveGestureActive == false {
+ // This will update the next/previous states
+ textInputView.reloadInputViews()
+ }
+ }
+ })
+ }
+
+ func adjustScrollViewContentInset(lastScrollViewConfiguration: IQScrollViewConfiguration,
+ window: UIWindow, kbSize: CGSize, keyboardDistance: CGFloat,
+ rootBeginSafeAreaInsets: UIEdgeInsets) {
+
+ let lastScrollView = lastScrollViewConfiguration.scrollView
+
+ guard let lastScrollViewRect: CGRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window),
+ !lastScrollView.iq.ignoreContentInsetAdjustment else { return }
+
+ // Updating contentInset
+ var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY)
+ let keyboardAndSafeArea: CGFloat = keyboardDistance + rootBeginSafeAreaInsets.bottom
+ var bottomScrollIndicatorInset: CGFloat = bottomInset - keyboardAndSafeArea
+
+ // Update the insets so that the scrollView doesn't shift incorrectly
+ // when the offset is near the bottom of the scroll view.
+ bottomInset = CGFloat.maximum(lastScrollViewConfiguration.startingContentInset.bottom, bottomInset)
+ let startingScrollInset: UIEdgeInsets = lastScrollViewConfiguration.startingScrollIndicatorInsets
+ bottomScrollIndicatorInset = CGFloat.maximum(startingScrollInset.bottom,
+ bottomScrollIndicatorInset)
+
+ bottomInset -= lastScrollView.safeAreaInsets.bottom
+ bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom
+
+ var movedInsets: UIEdgeInsets = lastScrollView.contentInset
+ movedInsets.bottom = bottomInset
+
+ guard lastScrollView.contentInset != movedInsets else { return }
+ showLog("""
+ old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets)
+ """)
+
+ activeConfiguration.animate(alongsideTransition: {
+ lastScrollView.contentInset = movedInsets
+ lastScrollView.layoutIfNeeded() // (Bug ID: #1996)
+
+ var newScrollIndicatorInset: UIEdgeInsets = lastScrollView.verticalScrollIndicatorInsets
+
+ newScrollIndicatorInset.bottom = bottomScrollIndicatorInset
+ lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset
+ })
+ }
+
+ private func adjustTextInputViewContentInset(window: UIWindow, originalKbSize: CGSize,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide,
+ textInputView: UIScrollView) {
+ let keyboardYPosition: CGFloat = window.frame.height - originalKbSize.height
+ var rootSuperViewFrameInWindow: CGRect = window.frame
+ if let rootSuperview: UIView = rootSuperview {
+ rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window)
+ }
+
+ let keyboardOverlapping: CGFloat = rootSuperViewFrameInWindow.maxY - keyboardYPosition
+
+ let availableHeight: CGFloat = rootSuperViewFrameInWindow.height-layoutGuide.top-keyboardOverlapping
+ let textInputViewHeight: CGFloat = CGFloat.minimum(textInputView.frame.height, availableHeight)
+
+ guard textInputView.frame.size.height-textInputView.contentInset.bottom>textInputViewHeight else { return }
+ // If frame is not change by library in past, then saving user textInputView properties (Bug ID: #92)
+ if startingTextViewConfiguration == nil {
+ startingTextViewConfiguration = IQScrollViewConfiguration(scrollView: textInputView,
+ canRestoreContentOffset: false)
+ }
+
+ var newContentInset: UIEdgeInsets = textInputView.contentInset
+ newContentInset.bottom = textInputView.frame.size.height-textInputViewHeight
+ newContentInset.bottom -= textInputView.safeAreaInsets.bottom
+
+ guard textInputView.contentInset != newContentInset else { return }
+ showLog("""
+ \(textInputView) Old textInputView.contentInset: \(textInputView.contentInset)
+ New textInputView.contentInset: \(newContentInset)
+ """)
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ textInputView.contentInset = newContentInset
+ textInputView.layoutIfNeeded() // (Bug ID: #1996)
+ textInputView.scrollIndicatorInsets = newContentInset
+ })
+ }
+
+ func adjustRootController(moveUp: CGFloat, rootViewOrigin: CGPoint, originalKbSize: CGSize,
+ rootController: UIViewController, rootBeginOrigin: CGPoint) {
+ // +Positive or zero.
+ var rootViewOrigin: CGPoint = rootViewOrigin
+ if moveUp >= 0 {
+
+ rootViewOrigin.y = CGFloat.maximum(rootViewOrigin.y - moveUp, CGFloat.minimum(0, -originalKbSize.height))
+
+ if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+ showLog("Moving Upward")
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ var rect: CGRect = rootController.view.frame
+ rect.origin = rootViewOrigin
+ rootController.view.frame = rect
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ rootController.view.setNeedsLayout()
+ rootController.view.layoutIfNeeded()
+ }
+
+ let classNameString: String = "\(type(of: rootController.self))"
+ self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+ })
+ }
+
+ movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+ } else { // -Negative
+ let disturbDistance: CGFloat = rootViewOrigin.y-rootBeginOrigin.y
+
+ // disturbDistance Negative = frame disturbed.
+ // disturbDistance positive = frame not disturbed.
+ if disturbDistance <= 0 {
+
+ rootViewOrigin.y -= CGFloat.maximum(moveUp, disturbDistance)
+
+ if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+ showLog("Moving Downward")
+ // Setting adjusted rootViewRect
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ var rect: CGRect = rootController.view.frame
+ rect.origin = rootViewOrigin
+ rootController.view.frame = rect
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ rootController.view.setNeedsLayout()
+ rootController.view.layoutIfNeeded()
+ }
+
+ let classNameString: String = "\(type(of: rootController.self))"
+ self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+ })
+ }
+
+ movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+ }
+ }
+ }
+
+ func restoreScrollViewContentOffset(superScrollView: UIScrollView, textInputView: (some IQTextInputView)?) {
+ var superScrollView: UIScrollView? = superScrollView
+ while let scrollView: UIScrollView = superScrollView {
+
+ let width: CGFloat = CGFloat.maximum(scrollView.contentSize.width, scrollView.frame.width)
+ let height: CGFloat = CGFloat.maximum(scrollView.contentSize.height, scrollView.frame.height)
+ let contentSize: CGSize = CGSize(width: width, height: height)
+
+ let minimumY: CGFloat = contentSize.height - scrollView.frame.height
+
+ if minimumY < scrollView.contentOffset.y {
+
+ let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: minimumY)
+ if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView?
+ if let textInputView: UIView = textInputView {
+ stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ } else {
+ stackView = nil
+ }
+
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = newContentOffset
+ }
+
+ showLog("Restoring contentOffset to: \(newContentOffset)")
+ }
+ }
+
+ superScrollView = scrollView.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+}
+// swiftlint:enable function_parameter_count
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
new file mode 100644
index 0000000..3a76df7
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
@@ -0,0 +1,238 @@
+//
+// IQKeyboardManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+ IQKeyboardManager is a code-less drop-in universal library that automatically prevents issues
+ of the keyboard sliding up and covering UITextField/UITextView.
+
+ ## Usage
+ Simply enable the manager in your AppDelegate:
+ ```swift
+ IQKeyboardManager.shared.isEnabled = true
+ ```
+
+ ## Thread Safety
+ All public APIs must be called from the main thread. The class is marked with @MainActor
+ to enforce this at compile time.
+
+ ## Example
+ ```swift
+ import IQKeyboardManagerSwift
+
+ @main
+ class AppDelegate: UIResponder, UIApplicationDelegate {
+ func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ IQKeyboardManager.shared.isEnabled = true
+ return true
+ }
+ }
+ ```
+ */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardManager: NSObject {
+
+ /**
+ Returns the default singleton instance.
+ */
+ @MainActor
+ public static let shared: IQKeyboardManager = .init()
+
+ internal var activeConfiguration: IQActiveConfiguration = .init()
+
+ // MARK: UIKeyboard handling
+
+ /**
+ Enable/disable managing distance between keyboard and textInputView.
+ Default is YES(Enabled when class loads in `+(void)load` method).
+ */
+ public var isEnabled: Bool = false {
+ didSet {
+ guard isEnabled != oldValue else { return }
+ // If not enable, enable it.
+ if isEnabled {
+ // If keyboard is currently showing.
+ if activeConfiguration.keyboardInfo.isVisible {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ showLog("Enabled")
+ } else { // If not disable, disable it.
+ restorePosition()
+ showLog("Disabled")
+ }
+ }
+ }
+
+ /**
+ Sets the default distance between the keyboard and the active text input view.
+
+ This distance is applied to all text inputs unless overridden by setting
+ `view.iq.distanceFromKeyboard` for specific views.
+
+ - Precondition: Value must be non-negative. Negative values will be logged as warnings.
+ - Default: `10.0` points
+ - Note: This is a global setting. Use `view.iq.distanceFromKeyboard` for per-view customization.
+
+ ## Example
+ ```swift
+ // Set global distance
+ IQKeyboardManager.shared.keyboardDistance = 20.0
+
+ // Override for specific text field
+ myTextField.iq.distanceFromKeyboard = 30.0
+ ```
+
+ - SeeAlso: `UIView.iq.distanceFromKeyboard` for per-view customization
+ */
+ public var keyboardDistance: CGFloat = 10.0 {
+ didSet {
+ if keyboardDistance < 0 {
+ showLog("⚠️ keyboardDistance shouldn't be negative.")
+ }
+ }
+ }
+
+ /*******************************************/
+
+ // MARK: UIAnimation handling
+
+ /**
+ If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.
+ */
+ public var layoutIfNeededOnUpdate: Bool = false
+
+ // MARK: Class Level disabling methods
+
+ /**
+ Classes that should have keyboard distance handling disabled.
+
+ When a view controller is of one of these types, keyboard distance handling
+ is disabled regardless of the `isEnabled` property.
+
+ - Precondition: All classes must be subclasses of `UIViewController`
+ - Default: `[UITableViewController.self, UIInputViewController.self, UIAlertController.self]`
+ - Note: This takes precedence over `enabledDistanceHandlingClasses`. If a class appears
+ in both arrays, it will be disabled.
+
+ ## Example
+ ```swift
+ // Disable for custom view controller
+ IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(MyCustomViewController.self)
+
+ // Disable for multiple controllers
+ IQKeyboardManager.shared.disabledDistanceHandlingClasses += [
+ LoginViewController.self,
+ SignupViewController.self
+ ]
+ ```
+
+ - SeeAlso: `enabledDistanceHandlingClasses` for force-enabling specific classes
+ */
+ public var disabledDistanceHandlingClasses: [UIViewController.Type] = [
+ UITableViewController.self,
+ UIInputViewController.self,
+ UIAlertController.self
+ ]
+
+ /**
+ Enable distance handling within the scope of enabled distance handling viewControllers classes.
+ Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledDistanceHandlingClasses list,
+ then enabledDistanceHandlingClasses will be ignored.
+ */
+ public var enabledDistanceHandlingClasses: [UIViewController.Type] = []
+
+ /**************************************************************************************/
+
+ // MARK: Initialization/De-initialization
+
+ /* Singleton Object Initialization. */
+ private override init() {
+
+ super.init()
+
+ self.addActiveConfigurationObserver()
+
+ NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)),
+ name: UIApplication.didBecomeActiveNotification, object: nil)
+ }
+
+
+ deinit {
+ // Disable the keyboard manager.
+ isEnabled = false
+ NotificationCenter.default.removeObserver(self)
+ }
+
+ // MARK: Public Methods
+
+ /**
+ Manually triggers a position adjustment for the active text input view.
+
+ Call this method when you've made external changes to the view hierarchy that
+ might affect keyboard positioning (e.g., programmatically changing view frames,
+ adding/removing views, changing constraints).
+
+ This method is safe to call even when no text input is active or the keyboard
+ is hidden - it will simply return early.
+
+ ## When to Call
+ - After programmatically modifying view frames
+ - After adding or removing views from the hierarchy
+ - After changing Auto Layout constraints that affect the active text field's position
+ - When orientation changes occur outside the normal notification flow
+
+ ## Example
+ ```swift
+ // After programmatic layout changes
+ myView.frame = newFrame
+ IQKeyboardManager.shared.reloadLayoutIfNeeded()
+
+ // After constraint updates
+ NSLayoutConstraint.activate(newConstraints)
+ view.layoutIfNeeded()
+ IQKeyboardManager.shared.reloadLayoutIfNeeded()
+ ```
+
+ - Note: This method only has an effect when:
+ - `isEnabled` is `true`
+ - A text input view is currently active
+ - The keyboard is visible
+ - The root configuration is ready
+ - SeeAlso: `isEnabled` for enabling/disabling the manager
+ */
+ public func reloadLayoutIfNeeded() {
+
+ guard privateIsEnabled(),
+ activeConfiguration.keyboardInfo.isVisible,
+ activeConfiguration.isReady else {
+ return
+ }
+ adjustPosition()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
new file mode 100644
index 0000000..91c2534
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
@@ -0,0 +1,118 @@
+//
+// UIScrollView+IQKeyboardManagerExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var ignoreScrollingAdjustment: Int = 0
+ static var ignoreContentInsetAdjustment: Int = 0
+ static var restoreContentOffset: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIScrollView {
+
+ /**
+ If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textInputView position.
+ Default is NO.
+ */
+ var ignoreScrollingAdjustment: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+
+ /**
+ If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown.
+ Default is NO.
+ */
+ var ignoreContentInsetAdjustment: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+
+ /**
+ If we should restore scrollView contentOffset to it's initial position
+ */
+ var restoreContentOffset: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.restoreContentOffset) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.restoreContentOffset,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIScrollView {
+ @available(*, unavailable, renamed: "iq.ignoreScrollingAdjustment")
+ var shouldIgnoreScrollingAdjustment: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.ignoreContentInsetAdjustment")
+ var shouldIgnoreContentInsetAdjustment: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.restoreContentOffset")
+ var shouldRestoreScrollViewContentOffset: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644
index 0000000..7a7c4b4
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
@@ -0,0 +1,46 @@
+//
+// UIScrollView+IQKeyboardManagerExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UIScrollView {
+
+ var iq_ignoreScrollingAdjustment: Bool {
+ get { iq.ignoreScrollingAdjustment }
+ set { iq.ignoreScrollingAdjustment = newValue }
+ }
+
+ var iq_ignoreContentInsetAdjustment: Bool {
+ get { iq.ignoreContentInsetAdjustment }
+ set { iq.ignoreContentInsetAdjustment = newValue }
+ }
+
+ var iq_restoreContentOffset: Bool {
+ get { iq.restoreContentOffset }
+ set { iq.restoreContentOffset = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
new file mode 100644
index 0000000..1c79e4d
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
@@ -0,0 +1,158 @@
+//
+// UIView+IQKeyboardManagerExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var distanceFromKeyboard: Int = 0
+ static var enableMode: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ nonisolated static let defaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, renamed: "UIView.defaultKeyboardDistance")
+nonisolated public let kIQUseDefaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+
+/**
+ Extension providing keyboard management functionality to UIView instances.
+
+ This extension allows per-view configuration of keyboard behavior, including
+ custom distance and enable/disable modes.
+
+ ## Usage
+ ```swift
+ // Set custom distance for a text field
+ textField.iq.distanceFromKeyboard = 30.0
+
+ // Disable keyboard management for a specific text field
+ textField.iq.enableMode = .disabled
+ ```
+ */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ Custom distance from keyboard for this specific text input view.
+
+ If set to `UIView.defaultKeyboardDistance`, the global `keyboardDistance`
+ value from `IQKeyboardManager.shared.keyboardDistance` will be used.
+ Otherwise, this value takes precedence.
+
+ - Default: `UIView.defaultKeyboardDistance` (uses global setting)
+ - Note: Value cannot be negative. Negative values may cause unexpected behavior.
+
+ ## Example
+ ```swift
+ // Use global setting
+ textField.iq.distanceFromKeyboard = UIView.defaultKeyboardDistance
+
+ // Use custom distance
+ textField.iq.distanceFromKeyboard = 50.0
+ ```
+ */
+ var distanceFromKeyboard: CGFloat {
+ get {
+ if let base = base {
+ if let value = objc_getAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard) as? CGFloat {
+ return value
+ }
+ }
+ return UIView.defaultKeyboardDistance
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+
+ if newValue < 0 {
+ IQKeyboardManager.shared.showLog("Warning: distanceFromKeyboard shouldn't be negative.")
+ }
+ }
+ }
+
+ /**
+ Enable mode for this specific text input view.
+
+ Controls whether keyboard management is enabled, disabled, or uses the default
+ global setting for this view.
+
+ - `.default`: Use global `IQKeyboardManager.shared.isEnabled` setting
+ - `.enabled`: Force enable keyboard management for this view
+ - `.disabled`: Force disable keyboard management for this view
+
+ ## Example
+ ```swift
+ // Use global setting
+ textField.iq.enableMode = .default
+
+ // Always enable for this field
+ textField.iq.enableMode = .enabled
+
+ // Always disable for this field
+ textField.iq.enableMode = .disabled
+ ```
+
+ - SeeAlso: `IQKeyboardManager.isEnabled` for global control
+ */
+ var enableMode: IQEnableMode {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default
+ }
+ return .default
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ @available(*, unavailable, renamed: "iq.distanceFromKeyboard")
+ var keyboardDistanceFromTextField: CGFloat {
+ get { 0 }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.enableMode")
+ var enableMode: IQEnableMode {
+ get { .default }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644
index 0000000..84b52c8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
@@ -0,0 +1,55 @@
+//
+// UIView+IQKeyboardManagerExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_distanceFromKeyboard: CGFloat {
+ get { iq.distanceFromKeyboard }
+ set { iq.distanceFromKeyboard = newValue }
+ }
+
+ var iq_enableMode: IQEnableMode {
+ get { iq.enableMode }
+ set { iq.enableMode = newValue }
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_distanceFromKeyboard: CGFloat {
+ get { iq.distanceFromKeyboard }
+ set { iq.distanceFromKeyboard = newValue }
+ }
+
+ var iq_enableMode: IQEnableMode {
+ get { iq.enableMode }
+ set { iq.enableMode = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
new file mode 100644
index 0000000..99238ad
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
@@ -0,0 +1,45 @@
+//
+// UICollectionView+IndexPaths.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UICollectionView {
+
+ func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+ var previousRow: Int = indexPath.row - 1
+ var previousSection: Int = indexPath.section
+
+ // Fixing indexPath
+ if previousRow < 0 {
+ previousSection -= 1
+ if previousSection >= 0 {
+ previousRow = self.numberOfItems(inSection: previousSection) - 1
+ }
+ }
+
+ guard previousRow >= 0, previousSection >= 0 else { return nil }
+ return IndexPath(item: previousRow, section: previousSection)
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
new file mode 100644
index 0000000..f3493cd
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
@@ -0,0 +1,46 @@
+//
+// UITableView+IndexPaths.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UITableView {
+
+ func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+ var previousRow: Int = indexPath.row - 1
+ var previousSection: Int = indexPath.section
+
+ // Fixing indexPath
+ if previousRow < 0 {
+ previousSection -= 1
+ if previousSection >= 0 {
+ let rowCount = self.numberOfRows(inSection: previousSection)
+ previousRow = rowCount > 0 ? rowCount - 1 : -1
+ }
+ }
+
+ guard previousRow >= 0, previousSection >= 0 else { return nil }
+ return IndexPath(row: previousRow, section: previousSection)
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
new file mode 100644
index 0000000..cf2e63c
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
@@ -0,0 +1,99 @@
+//
+// UIView+Parent.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+UIView hierarchy category.
+*/
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ /**
+ Returns the UIViewController object that is actually the parent of this object.
+ Most of the time it's the viewController object which actually contains it,
+ but result may be different if it's viewController is added as childViewController of another viewController.
+ */
+ func parentContainerViewController() -> UIViewController? {
+
+ var matchController: UIViewController? = viewContainingController()
+ var parentContainerViewController: UIViewController?
+
+ if var navController: UINavigationController = matchController?.navigationController {
+
+ while let parentNav: UINavigationController = navController.navigationController {
+ navController = parentNav
+ }
+
+ var parentController: UIViewController = navController
+
+ while let parent: UIViewController = parentController.parent,
+ !(parent is UINavigationController) &&
+ !(parent is UITabBarController) &&
+ !(parent is UISplitViewController) {
+
+ parentController = parent
+ }
+
+ if navController == parentController {
+ parentContainerViewController = navController.topViewController
+ } else {
+ parentContainerViewController = parentController
+ }
+ } else if let tabController: UITabBarController = matchController?.tabBarController {
+ let selectedController = tabController.selectedViewController
+ if let navController: UINavigationController = selectedController as? UINavigationController {
+ parentContainerViewController = navController.topViewController
+ } else {
+ parentContainerViewController = tabController.selectedViewController
+ }
+ } else {
+ while let parent: UIViewController = matchController?.parent,
+ !(parent is UINavigationController) &&
+ !(parent is UITabBarController) &&
+ !(parent is UISplitViewController) {
+
+ matchController = parent
+ }
+
+ parentContainerViewController = matchController
+ }
+
+ if let controller: UIViewController = parentContainerViewController?.iq_parentContainerViewController() {
+ return controller
+ } else {
+ return parentContainerViewController
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.parentContainerViewController()")
+ func parentContainerViewController() -> UIViewController? { nil }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
new file mode 100644
index 0000000..9c0730e
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
@@ -0,0 +1,31 @@
+//
+// UIView+ParentObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@objc public extension UIView {
+
+ func iq_parentContainerViewController() -> UIViewController? {
+ iq.parentContainerViewController()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
new file mode 100644
index 0000000..7fc96a9
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
@@ -0,0 +1,49 @@
+//
+// UIViewController+ParentContainer.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+
+ /**
+ This method is provided to override by viewController's
+ if the library lifts a viewController which you doesn't want to lift.
+ This may happen if you have implemented side menu feature
+ in your app and the library try to lift the side menu controller.
+ Overriding this method in side menu class to return correct controller should fix the problem.
+ */
+ open func iq_parentContainerViewController() -> UIViewController? {
+ return self
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+ @available(*, unavailable, renamed: "iq_parentContainerViewController()")
+ open func parentIQContainerViewController() -> UIViewController? {
+ return self
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
new file mode 100644
index 0000000..4cf109c
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
@@ -0,0 +1,137 @@
+//
+// IQKeyboardManager+ToolbarManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbarManager
+
+@available(iOSApplicationExtension, unavailable)
+// swiftlint:disable line_length
+@available(*, deprecated,
+ message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+// swiftlint:enable line_length
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var toolbarManager: Int = 0
+ }
+
+ internal var toolbarManager: IQKeyboardToolbarManager {
+ IQKeyboardToolbarManager.shared
+ }
+
+ var enableToolbarDebugging: Bool {
+ get { toolbarManager.isDebuggingEnabled }
+ set { toolbarManager.isDebuggingEnabled = newValue }
+ }
+
+ /**
+ Automatic add the toolbar functionality. Default is YES.
+ */
+ var enableAutoToolbar: Bool {
+ get { toolbarManager.isEnabled }
+ set { toolbarManager.isEnabled = newValue }
+ }
+
+ /**
+ Configurations related to the toolbar display over the keyboard.
+ */
+ var toolbarConfiguration: IQKeyboardToolbarConfiguration {
+ toolbarManager.toolbarConfiguration
+ }
+
+ // MARK: UISound handling
+
+ /**
+ If YES, then it plays inputClick sound on next/previous/done click.
+ */
+ var playInputClicks: Bool {
+ get { toolbarManager.playInputClicks }
+ set { toolbarManager.playInputClicks = newValue }
+ }
+
+ /**
+ Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+ Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+ */
+ var disabledToolbarClasses: [UIViewController.Type] {
+ get { toolbarManager.disabledToolbarClasses }
+ set { toolbarManager.disabledToolbarClasses = newValue }
+ }
+
+ /**
+ Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+ Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+ */
+ var enabledToolbarClasses: [UIViewController.Type] {
+ get { toolbarManager.enabledToolbarClasses }
+ set { toolbarManager.enabledToolbarClasses = newValue }
+ }
+
+ /**
+ Allowed subclasses of UIView to add all inner textField,
+ this will allow to navigate between textField contains in different superview.
+ Class should be kind of UIView.
+ */
+ var deepResponderAllowedContainerClasses: [UIView.Type] {
+ get { toolbarManager.deepResponderAllowedContainerClasses }
+ set { toolbarManager.deepResponderAllowedContainerClasses = newValue }
+ }
+
+ /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+ func reloadInputViews() {
+ toolbarManager.reloadInputViews()
+ }
+
+ /**
+ Returns YES if can navigate to previous responder textInputView, otherwise NO.
+ */
+ var canGoPrevious: Bool {
+ toolbarManager.canGoPrevious
+ }
+
+ /**
+ Returns YES if can navigate to next responder textInputViews, otherwise NO.
+ */
+ var canGoNext: Bool {
+ toolbarManager.canGoNext
+ }
+
+ /**
+ Navigate to previous responder textInputViews
+ */
+ @discardableResult
+ func goPrevious() -> Bool {
+ toolbarManager.goPrevious()
+ }
+
+ /**
+ Navigate to next responder textInputView.
+ */
+ @discardableResult
+ func goNext() -> Bool {
+ toolbarManager.goNext()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
new file mode 100644
index 0000000..e6b7321
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
@@ -0,0 +1,177 @@
+//
+// IQKeyboardManager+ToolbarManagerDeprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbarManager
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "playInputClicks")
+ var shouldPlayInputClicks: Bool {
+ get { false }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+ var toolbarManageBehaviour: IQKeyboardToolbarManageBehavior {
+ get { .bySubviews }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+ var shouldToolbarUsesTextFieldTintColor: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+ var toolbarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+ var toolbarBarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+ var previousNextDisplayMode: IQPreviousNextDisplayMode {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+ var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+ get { [] }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+ var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+ var shouldShowToolbarPlaceholder: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+ var placeholderFont: UIFont? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+ var placeholderColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+ var placeholderButtonColor: UIColor? {
+ get { nil }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
new file mode 100644
index 0000000..5fc408d
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
@@ -0,0 +1,100 @@
+//
+// IQKeyboardManager+Resign.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var resignHandler: Int = 0
+ }
+
+ internal var resignHandler: IQKeyboardResignHandler {
+ if let object = objc_getAssociatedObject(self, &AssociatedKeys.resignHandler)
+ as? IQKeyboardResignHandler {
+ return object
+ }
+
+ let object: IQKeyboardResignHandler = .init()
+ objc_setAssociatedObject(self, &AssociatedKeys.resignHandler,
+ object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+ return object
+ }
+
+ /**
+ Resigns Keyboard on touching outside TextInputView. Default is NO.
+ */
+ var resignOnTouchOutside: Bool {
+ get { resignHandler.resignOnTouchOutside }
+ set { resignHandler.resignOnTouchOutside = newValue }
+ }
+
+ /** TapGesture to resign keyboard on view's touch.
+ It's a readonly property and exposed only for adding/removing dependencies
+ if your added gesture does have collision with this one
+ */
+ var resignGesture: UITapGestureRecognizer {
+ get { resignHandler.resignGesture }
+ set { resignHandler.resignGesture = newValue }
+ }
+
+ /**
+ Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+ */
+ var disabledTouchResignedClasses: [UIViewController.Type] {
+ get { resignHandler.disabledTouchResignedClasses }
+ set { resignHandler.disabledTouchResignedClasses = newValue }
+ }
+
+ /**
+ Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+ Class should be kind of UIViewController
+ . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+ */
+ var enabledTouchResignedClasses: [UIViewController.Type] {
+ get { resignHandler.enabledTouchResignedClasses }
+ set { resignHandler.enabledTouchResignedClasses = newValue }
+ }
+
+ /**
+ if resignOnTouchOutside is enabled then you can customize the behavior
+ to not recognize gesture touches on some specific view subclasses.
+ Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+ */
+ var touchResignedGestureIgnoreClasses: [UIView.Type] {
+ get { resignHandler.touchResignedGestureIgnoreClasses }
+ set { resignHandler.touchResignedGestureIgnoreClasses = newValue }
+ }
+
+ /**
+ Resigns currently first responder field.
+ */
+ @discardableResult
+ func resignFirstResponder() -> Bool {
+ resignHandler.resignFirstResponder()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
new file mode 100644
index 0000000..b304c72
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
@@ -0,0 +1,37 @@
+//
+// IQKeyboardManager+Resign_Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "resignOnTouchOutside")
+ var shouldResignOnTouchOutside: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
new file mode 100644
index 0000000..6faff11
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
@@ -0,0 +1,105 @@
+//
+// IQKeyboardResignHandler+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardResignHandler {
+
+ func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardResignHandler")
+ }
+
+ func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardResignHandler",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ switch event {
+ case .beginEditing:
+ self.resignGesture.isEnabled = self.privateResignOnTouchOutside()
+ textInputView.window?.addGestureRecognizer(self.resignGesture)
+ case .endEditing:
+ textInputView.window?.removeGestureRecognizer(self.resignGesture)
+ }
+ })
+ }
+
+ func privateResignOnTouchOutside() -> Bool {
+
+ guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+ return resignOnTouchOutside
+ }
+
+ switch textInputView.internalResignOnTouchOutsideMode {
+ case .default:
+ guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+ return resignOnTouchOutside
+ }
+
+ // If it is searchBar textField embedded in Navigation Bar
+ if textInputView is UISearchTextField {
+ if let navController: UINavigationController = controller as? UINavigationController,
+ let topController: UIViewController = navController.topViewController,
+ controller.navigationItem.searchController?.searchBar.searchTextField == textInputView {
+ controller = topController
+ }
+ }
+
+ // If viewController is in enabledTouchResignedClasses, then assuming resignOnTouchOutside is enabled.
+ let isWithEnabledClass: Bool = enabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) })
+ var isEnabled: Bool = resignOnTouchOutside || isWithEnabledClass
+
+ if isEnabled {
+
+ // If viewController is in disabledTouchResignedClasses,
+ // then assuming resignOnTouchOutside is disable.
+ if disabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) {
+ isEnabled = false
+ } else {
+ let classNameString: String = "\(type(of: controller.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+ return isEnabled
+ case .enabled:
+ return true
+ case .disabled:
+ return false
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalResignOnTouchOutsideMode: IQEnableMode {
+ iq.resignOnTouchOutsideMode
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
new file mode 100644
index 0000000..75b2562
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
@@ -0,0 +1,154 @@
+//
+// IQKeyboardResignHandler.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardResignHandler: NSObject {
+
+ let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ /**
+ Resigns Keyboard on touching outside of TextInputView. Default is NO.
+ */
+ public var resignOnTouchOutside: Bool = false {
+
+ didSet {
+ resignGesture.isEnabled = privateResignOnTouchOutside()
+
+ IQKeyboardManager.shared.showLog("resignOnTouchOutside: \(resignOnTouchOutside ? "Yes" : "No")")
+ }
+ }
+
+ /** TapGesture to resign keyboard on view's touch.
+ It's a readonly property and exposed only for adding/removing dependencies
+ if your added gesture does have collision with this one
+ */
+ public var resignGesture: UITapGestureRecognizer = .init()
+
+ /**
+ Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+ */
+ public var disabledTouchResignedClasses: [UIViewController.Type] = [
+ UIAlertController.self,
+ UIInputViewController.self
+ ]
+
+ /**
+ Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+ Class should be kind of UIViewController
+ . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+ */
+ public var enabledTouchResignedClasses: [UIViewController.Type] = []
+
+ /**
+ if resignOnTouchOutside is enabled then you can customize the behavior
+ to not recognize gesture touches on some specific view subclasses.
+ Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+ */
+ public var touchResignedGestureIgnoreClasses: [UIView.Type] = [
+ UIControl.self,
+ UINavigationBar.self
+ ]
+
+ /**
+ Resigns currently first responder field.
+ */
+ @discardableResult
+ public func resignFirstResponder() -> Bool {
+
+ guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+ return false
+ }
+
+ // Resigning first responder
+ guard textInputView.resignFirstResponder() else {
+ IQKeyboardManager.shared.showLog("Warning: Refuses to resign first responder: \(textInputView)")
+ // If it refuses then becoming it as first responder again. (Bug ID: #96)
+ // If it refuses to resign then becoming it first responder again for getting notifications callback.
+ textInputView.becomeFirstResponder()
+ return false
+ }
+ return true
+ }
+
+ public override init() {
+ super.init()
+
+ resignGesture.addTarget(self, action: #selector(self.tapRecognized(_:)))
+ resignGesture.cancelsTouchesInView = false
+ resignGesture.delegate = self
+ resignGesture.isEnabled = false
+
+ addTextInputViewObserver()
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardResignHandler: UIGestureRecognizerDelegate {
+
+ /** Resigning on tap gesture. (Enhancement ID: #14)*/
+ private func tapRecognized(_ gesture: UITapGestureRecognizer) {
+
+ if gesture.state == .ended {
+
+ // Resigning currently responder textInputView.
+ resignFirstResponder()
+ }
+ }
+
+ /** Note: returning YES is guaranteed to allow simultaneous recognition.
+ returning NO is not guaranteed to prevent simultaneous recognition,
+ as the other gesture's delegate may return YES.
+ */
+ public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+ shouldRecognizeSimultaneouslyWith
+ otherGestureRecognizer: UIGestureRecognizer) -> Bool {
+ return false
+ }
+
+ /**
+ To not detect touch events in a subclass of UIControl,
+ these may have added their own selector for specific work
+ */
+ public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+ shouldReceive touch: UITouch) -> Bool {
+ // (Bug ID: #145)
+ // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(
+
+
+
+[](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md)
+[](https://travis-ci.org/hackiftekhar/IQKeyboardManager)
+
+[](http://cocoadocs.org/docsets/IQKeyboardManagerSwift)
+[](https://github.com/hackiftekhar/IQKeyboardManager/tags)
+
+## IQKeyboardManager Objective-C version source code is moved to https://github.com/hackiftekhar/IQKeyboardManagerObjC
+
+
+## Introduction
+While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent this issue of keyboard sliding up and covering `UITextField/UITextView` without needing you to write any code or make any additional setup. To use `IQKeyboardManager` you simply need to add source files to your project.
+
+
+## Key Features
+
+1. **One Line of Code** - Just enable and it works
+2. **Works Automatically** - No manual setup required
+3. **No More UIScrollView** - Automatically handles scroll views
+4. **No More Subclasses** - Works with standard UIKit components
+5. **No More Manual Work** - Handles all edge cases automatically
+6. **Modular Architecture** - Include only what you need via subspecs
+
+### What's Included
+
+- ✅ Automatic keyboard avoidance for UITextField/UITextView
+- ✅ Support for UIScrollView, UITableView, UICollectionView
+- ✅ All interface orientations
+- ✅ Configurable keyboard distance
+- ✅ Class-level enable/disable control
+
+### Optional Features (via Subspecs)
+
+- 📦 Toolbar with Previous/Next/Done buttons
+- 📦 Return key handling customization
+- 📦 Tap-to-resign keyboard
+- 📦 Keyboard appearance configuration
+- 📦 UITextView with placeholder supportv
+
+## Subspecs
+
+Now IQKeyboardManagerSwift uses a modular architecture with subspecs.
+By default, all subspecs are included, but you can include only what you need:
+
+### Available Subspecs
+
+- **Core** (always included): Basic keyboard distance management
+- **Appearance**: Keyboard appearance configuration
+- **IQKeyboardReturnManager**: Return key handling
+- **IQKeyboardToolbarManager**: Toolbar functionality (Previous/Next/Done buttons)
+- **IQTextView**: UITextView with placeholder support
+- **Resign**: Tap-to-resign keyboard functionality
+
+### Including Specific Subspecs
+
+```ruby
+# Include toolbar example
+pod 'IQKeyboardManagerSwift/IQKeyboardToolbarManager'
+```
+
+## Screenshot
+[](http://youtu.be/6nhLw6hju2A)
+[](http://youtu.be/6nhLw6hju2A)
+[](http://youtu.be/6nhLw6hju2A)
+[](http://youtu.be/6nhLw6hju2A)
+[](http://youtu.be/6nhLw6hju2A)
+
+## GIF animation
+[](http://youtu.be/6nhLw6hju2A)
+
+## Video
+
+
+
+## Tutorial video by @rebeloper ([#1135](https://github.com/hackiftekhar/IQKeyboardManager/issues/1135))
+
+@rebeloper demonstrated two videos on how to implement **IQKeyboardManager** at it's core:
+
+
+
+https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v
+
+## Warning
+
+- **If you're planning to build SDK/library/framework and want to handle UITextField/UITextView with IQKeyboardManager then you're totally going the wrong way.** I would never suggest to add **IQKeyboardManager** as **dependency/adding/shipping** with any third-party library. Instead of adding **IQKeyboardManager** you should implement your own solution to achieve same kind of results. **IQKeyboardManager** is totally designed for projects to help developers for their convenience, it's not designed for **adding/dependency/shipping** with any **third-party library**, because **doing this could block adoption by other developers for their projects as well (who are not using IQKeyboardManager and have implemented their custom solution to handle UITextField/UITextView in the project).**
+- If **IQKeyboardManager** conflicts with other **third-party library**, then it's **developer responsibility** to **enable/disable IQKeyboardManager** when **presenting/dismissing** third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager.
+
+## Requirements
+
+| | Minimum iOS Target | Minimum Xcode Version |
+|------------------------|--------------------|-----------------------|
+| IQKeyboardManagerSwift | iOS 13.0 | Xcode 13 |
+| Demo Project | | Xcode 15 |
+
+#### Swift versions support
+
+| Swift | Xcode | IQKeyboardManagerSwift |
+|-------------------|-------|------------------------|
+| 5.9, 5.8, 5.7 | 16 | >= 7.0.0 |
+| 5.9, 5.8, 5.7, 5.6| 15 | >= 7.0.0 |
+| 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11 | >= 6.5.7 |
+| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 |
+| 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 |
+| 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 |
+| 4.0, 3.2, 3.0 | 9.0 | 5.0.0 |
+
+
+Installation
+==========================
+
+#### CocoaPods
+
+To install it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236))
+
+```ruby
+pod 'IQKeyboardManagerSwift'
+```
+
+*Or you can choose the version you need based on Swift support table from [Requirements](README.md#requirements)*
+
+```ruby
+pod 'IQKeyboardManagerSwift', '8.0.0'
+```
+
+#### Carthage
+
+To integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, add the following line to your `Cartfile`:
+
+```ogdl
+github "hackiftekhar/IQKeyboardManager"
+```
+
+Run `carthage update --use-xcframeworks` to build the frameworks and drag `IQKeyboardManagerSwift.xcframework` into your Xcode project based on your need. Make sure to add only one framework, not both.
+
+#### Swift Package Manager (SPM)
+
+To install `IQKeyboardManagerSwift` package via Xcode
+
+ * Go to File -> Swift Packages -> Add Package Dependency...
+ * Then search for https://github.com/hackiftekhar/IQKeyboardManager.git
+ * And choose the version you want
+
+#### Source Code
+
+***IQKeyboardManagerSwift:*** Source code installation is not supported (since 7.2.0) because now the library depends on some other independent libraries. Due to this you may face compilation issues.
+
+#### Basic Usage
+
+### Minimal Setup (Core Only)
+
+In `AppDelegate.swift`, import and enable IQKeyboardManager:
+
+```swift
+import IQKeyboardManagerSwift
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ var window: UIWindow?
+
+ func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+
+ // Enable keyboard management
+ IQKeyboardManager.shared.isEnabled = true
+
+ return true
+ }
+}
+```
+
+That's it! The keyboard will now automatically adjust to avoid covering text fields.
+
+### With Toolbar (Requires IQKeyboardToolbarManager Subspec)
+
+```swift
+import IQKeyboardManagerSwift
+
+func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+
+ // Enable keyboard management
+ IQKeyboardManager.shared.isEnabled = true
+
+ // Enable toolbar (@Deprecated: Please use IQKeyboardToolbarManager pod independently)
+ IQKeyboardManager.shared.enableAutoToolbar = true
+
+ return true
+}
+```
+
+### With All Features
+
+```swift
+import IQKeyboardManagerSwift
+
+func application(_ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+
+ // Core functionality
+ IQKeyboardManager.shared.isEnabled = true
+ IQKeyboardManager.shared.keyboardDistance = 20.0
+
+ // Toolbar (if using IQKeyboardToolbarManager subspec)
+ IQKeyboardManager.shared.enableAutoToolbar = true
+
+ // Tap to resign (if using Resign subspec)
+ IQKeyboardManager.shared.resignOnTouchOutside = true
+
+ // Appearance (if using Appearance subspec)
+ IQKeyboardManager.shared.keyboardConfiguration.overrideKeyboardAppearance = true
+ IQKeyboardManager.shared.keyboardConfiguration.keyboardAppearance = .dark
+
+ return true
+}
+```
+
+
+Migration Guide
+==========================
+- [IQKeyboardManager 2.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%201.0%20TO%202.0.md)
+- [IQKeyboardManager 3.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%202.0%20TO%203.0.md)
+- [IQKeyboardManager 4.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%203.0%20TO%204.0.md)
+- [IQKeyboardManager 5.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%204.0%20TO%205.0.md)
+- [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%205.0%20TO%206.0.md)
+- [IQKeyboardManager 7.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%206.0%20TO%207.0.md)
+- [IQKeyboardManager 8.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%207.0%20TO%208.0.md)
+
+Other Links
+==========================
+
+- [Known Issues](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Known-Issues)
+- [Manual Management Tweaks](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Manual-Management)
+- [Properties and functions usage](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Properties-&-Functions)
+
+## Dependency Diagram
+[](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerDependency.jpg)
+
+LICENSE
+---
+Distributed under the MIT License.
+
+Contributions
+---
+Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub.
+
+Author
+---
+If you wish to contact me, email at: hack.iftekhar@gmail.com
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
new file mode 100644
index 0000000..6f247f9
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
@@ -0,0 +1,243 @@
+//
+// IQKeyboardInfo.swift
+// https://github.com/hackiftekhar/IQKeyboardNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardInfo: Equatable {
+ nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+ lhs.event == rhs.event &&
+ lhs.endFrame.equalTo(rhs.endFrame)
+ }
+
+ @objc public enum Event: Int, CaseIterable {
+ case willShow
+ case didShow
+ case willChangeFrame
+ case didChangeFrame
+ case willHide
+ case didHide
+
+ @MainActor
+ public var notification: Notification.Name {
+ switch self {
+ case .willShow:
+ return UIResponder.keyboardWillShowNotification
+ case .didShow:
+ return UIResponder.keyboardDidShowNotification
+ case .willChangeFrame:
+ return UIResponder.keyboardWillChangeFrameNotification
+ case .didChangeFrame:
+ return UIResponder.keyboardDidChangeFrameNotification
+ case .willHide:
+ return UIResponder.keyboardWillHideNotification
+ case .didHide:
+ return UIResponder.keyboardDidHideNotification
+ }
+ }
+ }
+
+ public let event: Event
+
+ /// `keyboardIsLocalUserInfoKey`.
+ public let isLocal: Bool
+
+ /// `UIKeyboardFrameBeginUserInfoKey`.
+ public let beginFrame: CGRect
+
+ /// `UIKeyboardFrameEndUserInfoKey`.
+ public let endFrame: CGRect
+
+ /// `UIKeyboardAnimationDurationUserInfoKey`.
+ public let animationDuration: TimeInterval
+
+ /// `UIKeyboardAnimationCurveUserInfoKey`.
+ public let animationCurve: UIView.AnimationCurve
+
+ public var animationOptions: UIView.AnimationOptions {
+ return UIView.AnimationOptions(rawValue: UInt(animationCurve.rawValue << 16))
+ }
+
+ public var isVisible: Bool {
+ endFrame.height > 0
+ }
+
+ internal init(notification: Notification?, event: Event) {
+ self.event = event
+
+ let screenBounds: CGRect
+ if let screen: UIScreen = notification?.object as? UIScreen {
+ screenBounds = screen.bounds
+ } else {
+ screenBounds = UIScreen.main.bounds
+ }
+
+ if let info: [AnyHashable: Any] = notification?.userInfo {
+
+ if let value = info[UIResponder.keyboardIsLocalUserInfoKey] as? Bool {
+ isLocal = value
+ } else {
+ isLocal = true
+ }
+
+ // Getting keyboard animation.
+ if let curveValue: Int = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int,
+ let curve: UIView.AnimationCurve = UIView.AnimationCurve(rawValue: curveValue) {
+ animationCurve = curve
+ } else {
+ animationCurve = .easeOut
+ }
+
+ // Getting keyboard animation duration
+ if let duration: TimeInterval = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,
+ duration != 0.0 {
+ animationDuration = duration
+ } else {
+ animationDuration = 0.25
+ }
+
+ if let beginKeyboardFrame: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect {
+ beginFrame = Self.getKeyboardFrame(of: beginKeyboardFrame, inScreenBounds: screenBounds)
+ } else {
+ beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+
+ var endFrame: CGRect
+ if let endKeyboardFrame: CGRect = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
+ endFrame = Self.getKeyboardFrame(of: endKeyboardFrame, inScreenBounds: screenBounds)
+ } else {
+ endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+
+ // With iOS 26, the endFrame returns height equal to the input accessory view height even when keyboard is dismissed.
+ // Unfortunately we have to assume this hack for iOS 26.
+ #if compiler(>=6.2) // Xcode 26
+ if #available(iOS 26.0, *) {
+ switch event {
+ case .willHide, .didHide:
+ endFrame.origin.y += endFrame.size.height
+ endFrame.size.height = 0
+ case .willShow, .didShow, .willChangeFrame, .didChangeFrame:
+ break
+ }
+ }
+ #endif
+ self.endFrame = endFrame
+ } else {
+ isLocal = true
+ animationCurve = .easeOut
+ animationDuration = 0.25
+ beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+ }
+
+ @MainActor
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+
+// if let timing = UIView.AnimationCurve.RawValue(exactly: animationCurve.rawValue),
+// let curve = UIView.AnimationCurve(rawValue: timing) {
+// let animator = UIViewPropertyAnimator(duration: animationDuration, curve: curve) {
+// transition()
+// }
+// animator.addCompletion { _ in
+// completion?()
+// }
+// animator.isUserInteractionEnabled = true
+// animator.startAnimation()
+// } else {
+ var animationOptions: UIView.AnimationOptions = self.animationOptions
+ animationOptions.formUnion(.allowUserInteraction)
+ animationOptions.formUnion(.beginFromCurrentState)
+ UIView.animate(withDuration: animationDuration, delay: 0,
+ options: animationOptions,
+ animations: transition,
+ completion: { _ in
+ completion?()
+ })
+// }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+private extension IQKeyboardInfo {
+
+ static func getKeyboardFrame(of rect: CGRect, inScreenBounds screenBounds: CGRect) -> CGRect {
+ var finalFrame: CGRect = rect
+ // If this is floating keyboard
+ if finalFrame.width < screenBounds.width,
+ finalFrame.maxY < screenBounds.height {
+ finalFrame.size = CGSize(width: finalFrame.size.width, height: 0)
+ } else {
+ // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+ // Calculating actual keyboard covered size respect to window,
+ // keyboard frame may be different when hardware keyboard is attached
+ let keyboardHeight = CGFloat.maximum(screenBounds.height - finalFrame.minY, 0)
+ finalFrame.size = CGSize(width: finalFrame.size.width, height: keyboardHeight)
+ }
+
+ return finalFrame
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQKeyboardInfoObjC: NSObject {
+ private let wrappedValue: IQKeyboardInfo
+
+ public var event: IQKeyboardInfo.Event { wrappedValue.event }
+
+ public var isLocal: Bool { wrappedValue.isLocal }
+
+ public var beginFrame: CGRect { wrappedValue.beginFrame }
+
+ public var endFrame: CGRect { wrappedValue.endFrame }
+
+ public var animationDuration: TimeInterval { wrappedValue.animationDuration }
+
+ public var animationCurve: UIView.AnimationCurve { wrappedValue.animationCurve }
+
+ public var animationOptions: UIView.AnimationOptions { wrappedValue.animationOptions }
+
+ public var isVisible: Bool { wrappedValue.isVisible }
+
+ init(wrappedValue: IQKeyboardInfo){
+ self.wrappedValue = wrappedValue
+ }
+
+ @MainActor
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ wrappedValue.animate(alongsideTransition: transition, completion: completion)
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+public extension IQKeyboardInfo {
+
+ @available(*, unavailable, renamed: "event")
+ var name: Event { event }
+
+ @available(*, unavailable, renamed: "isVisible")
+ var keyboardShowing: Bool { isVisible }
+}
+
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
new file mode 100644
index 0000000..9df3d62
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
@@ -0,0 +1,172 @@
+//
+// IQKeyboardNotification.swift
+// https://github.com/hackiftekhar/IQKeyboardNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardNotification: NSObject {
+
+ private var storage: Set = []
+
+ private var eventObservers: [IQKeyboardInfo.Event: [AnyHashable: SizeCompletion]] = [:]
+
+ public private(set) var oldKeyboardInfo: IQKeyboardInfo
+
+ public private(set) var keyboardInfo: IQKeyboardInfo {
+ didSet {
+ guard keyboardInfo != oldValue else { return }
+ oldKeyboardInfo = oldValue
+ sendKeyboardInfo(info: keyboardInfo)
+ }
+ }
+
+ public var isVisible: Bool {
+ keyboardInfo.isVisible
+ }
+
+ public var frame: CGRect {
+ keyboardInfo.endFrame
+ }
+
+ public override init() {
+ keyboardInfo = IQKeyboardInfo(notification: nil, event: .didHide)
+ oldKeyboardInfo = keyboardInfo
+ super.init()
+
+ // Registering for keyboard notification.
+ for event in IQKeyboardInfo.Event.allCases {
+ NotificationCenter.default.publisher(for: event.notification)
+ .map({ IQKeyboardInfo(notification: $0, event: event) })
+ .sink(receiveValue: { [weak self] keyboardInfo in
+ self?.keyboardInfo = keyboardInfo
+ })
+ .store(in: &storage)
+ }
+ }
+
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ keyboardInfo.animate(alongsideTransition: transition, completion: completion)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardNotification {
+
+ typealias SizeCompletion = (_ event: IQKeyboardInfo.Event, _ endFrame: CGRect) -> Void
+
+ func subscribe(for events: [IQKeyboardInfo.Event],
+ identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+
+ for event in events {
+ var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+ existingObservers[identifier] = changeHandler
+ eventObservers[event] = existingObservers
+ }
+
+ // If current event is the one user is subscribed to, then call changeHandler immediately for the first time.
+ if events.contains(keyboardInfo.event) {
+ changeHandler(keyboardInfo.event, keyboardInfo.endFrame)
+ }
+ }
+
+ func unsubscribe(for events: [IQKeyboardInfo.Event], identifier: AnyHashable) {
+
+ for event in events {
+ var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+ existingObservers[identifier] = nil
+ eventObservers[event] = existingObservers
+ }
+ }
+
+ func isSubscribed(for event: IQKeyboardInfo.Event? = nil, identifier: AnyHashable) -> Bool {
+ if let event = event {
+ guard let observers = eventObservers[event], !observers.isEmpty else { return false }
+ return observers[identifier] != nil
+ } else {
+
+ for event in IQKeyboardInfo.Event.allCases {
+ let observers = eventObservers[event] ?? [:]
+ if observers[identifier] != nil {
+ return true
+ }
+ }
+ return false
+ }
+ }
+
+ private func sendKeyboardInfo(info: IQKeyboardInfo) {
+
+ guard let observers = eventObservers[info.event], !observers.isEmpty else { return }
+
+ let endFrame: CGRect = info.endFrame
+
+ for block in observers.values {
+ block(info.event, endFrame)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardNotification {
+
+ var oldKeyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: oldKeyboardInfo) }
+
+ var keyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: keyboardInfo) }
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+ subscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier, changeHandler: changeHandler)
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ unsubscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier)
+ }
+
+ func isSubscribed(identifier: AnyHashable) -> Bool {
+ isSubscribed(for: nil, identifier: identifier)
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+@objc public extension IQKeyboardNotification {
+
+ // MARK: Deprecated
+
+ @available(*, unavailable, renamed: "isVisible")
+ var keyboardShowing: Bool { isVisible }
+
+ @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)")
+ func registerSizeChange(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+ subscribe(identifier: identifier, changeHandler: changeHandler)
+ }
+
+ @available(*, unavailable, renamed: "unsubscribe(identifier:)")
+ func unregisterSizeChange(identifier: AnyHashable) {
+ unsubscribe(identifier: identifier)
+ }
+}
+
diff --git a/Pods/IQKeyboardNotification/LICENSE b/Pods/IQKeyboardNotification/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardNotification/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardNotification/README.md b/Pods/IQKeyboardNotification/README.md
new file mode 100644
index 0000000..6efb6f7
--- /dev/null
+++ b/Pods/IQKeyboardNotification/README.md
@@ -0,0 +1,66 @@
+# IQKeyboardNotification
+Lightweight library to observe keyboard events with ease.
+
+[](https://travis-ci.org/hackiftekhar/IQKeyboardNotification)
+[](https://cocoapods.org/pods/IQKeyboardNotification)
+[](https://cocoapods.org/pods/IQKeyboardNotification)
+[](https://cocoapods.org/pods/IQKeyboardNotification)
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardNotification'
+```
+
+## Usage
+
+To observe keyboard events, subscribe to the keyboard events:-
+
+```swift
+import IQKeyboardNotification
+
+class ViewController: UIViewController {
+
+ private let keyboard: IQKeyboardNotification = .init()
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+
+ // Subscribe
+ keyboard.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") { event, frame in
+ print(frame)
+ // Write your own logic here based on event and keyboard frame
+ }
+ }
+
+ override func viewWillDisappear(_ animated: Bool) {
+ super.viewWillDisappear(animated)
+
+ // Unsubscribe
+ keyboard.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER")
+ }
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+
+
+## License
+
+IQKeyboardNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
new file mode 100644
index 0000000..42692cc
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
@@ -0,0 +1,286 @@
+//
+// IQKeyboardReturnManager+UITextFieldDelegate.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: UITextFieldDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextFieldDelegate {
+}
+
+@objc public extension IQKeyboardReturnManager {
+
+ func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
+
+ var returnValue: Bool = true
+
+ if delegate == nil,
+ let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector = #selector((any UITextFieldDelegate).textFieldShouldBeginEditing(_:))
+ if textFieldDelegate.responds(to: selector) {
+ returnValue = textFieldDelegate.textFieldShouldBeginEditing?(textField) ?? false
+ }
+ }
+
+ if returnValue {
+ updateReturnKey(textInputView: textField)
+ }
+
+ return returnValue
+ }
+
+ func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector = #selector((any UITextFieldDelegate).textFieldShouldEndEditing(_:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textFieldShouldEndEditing?(textField) ?? false
+ }
+ }
+
+ return true
+ }
+
+ func textFieldDidBeginEditing(_ textField: UITextField) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidBeginEditing?(textField)
+ }
+
+ func textFieldDidEndEditing(_ textField: UITextField) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidEndEditing?(textField)
+ }
+
+ func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidEndEditing?(textField, reason: reason)
+ }
+
+ func textField(_ textField: UITextField,
+ shouldChangeCharactersIn range: NSRange,
+ replacementString string: String) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersIn:
+ replacementString:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textField?(textField,
+ shouldChangeCharactersIn: range,
+ replacementString: string) ?? false
+ }
+ }
+ return true
+ }
+
+ func textFieldDidChangeSelection(_ textField: UITextField) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidChangeSelection?(textField)
+ }
+
+ func textFieldShouldClear(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector: Selector = #selector((any UITextFieldDelegate).textFieldShouldClear(_:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textFieldShouldClear?(textField) ?? false
+ }
+ }
+
+ return true
+ }
+
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ var isReturn: Bool = true
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector: Selector = #selector((any UITextFieldDelegate).textFieldShouldReturn(_:))
+ if textFieldDelegate.responds(to: selector) {
+ isReturn = textFieldDelegate.textFieldShouldReturn?(textField) ?? false
+ }
+ }
+
+ if isReturn {
+ goToNextResponderOrResign(from: textField)
+ return true
+ } else {
+ return goToNextResponderOrResign(from: textField)
+ }
+ }
+}
+
+#if compiler(>=5.7) // Xcode 14
+@available(iOS 16.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textField(_ textField: UITextField, editMenuForCharactersIn range: NSRange, suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+ guard delegate == nil else { return nil }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+
+ let selector = #selector((any UITextFieldDelegate).textField(_:editMenuForCharactersIn:suggestedActions:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textField?(textField, editMenuForCharactersIn: range, suggestedActions: suggestedActions)
+ }
+ }
+
+ return nil
+ }
+
+ func textField(_ textField: UITextField, willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textField?(textField, willPresentEditMenuWith: animator)
+ }
+
+ func textField(_ textField: UITextField, willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textField?(textField, willDismissEditMenuWith: animator)
+ }
+}
+#endif
+
+#if compiler(>=6.0) // Xcode 16
+@available(iOS 18.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+#if compiler(>=6.1) // Xcode 16.3
+ @available(iOS 18.4, *)
+ func textField(_ textField: UITextField, insertInputSuggestion inputSuggestion: UIInputSuggestion) {
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textField?(textField, insertInputSuggestion: inputSuggestion)
+ }
+#endif
+}
+#endif
+
+#if compiler(>=6.2) // Xcode 26
+@available(iOS 26.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textField(_ textField: UITextField, shouldChangeCharactersInRanges ranges: [NSValue], replacementString string: String) -> Bool {
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersInRanges:
+ replacementString:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textField?(textField,
+ shouldChangeCharactersInRanges: ranges,
+ replacementString: string) ?? false
+ }
+ }
+ return true
+ }
+
+ func textField(_ textField: UITextField, editMenuForCharactersInRanges ranges: [NSValue], suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+ guard delegate == nil else { return nil }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+
+ let selector = #selector((any UITextFieldDelegate).textField(_:editMenuForCharactersInRanges:suggestedActions:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textField?(textField, editMenuForCharactersInRanges: ranges, suggestedActions: suggestedActions)
+ }
+ }
+
+ return nil
+ }
+}
+#endif
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
new file mode 100644
index 0000000..1d21d18
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
@@ -0,0 +1,532 @@
+//
+// IQKeyboardReturnManager+UITextViewDelegate.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: UITextViewDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextViewDelegate {
+}
+
+@objc public extension IQKeyboardReturnManager {
+
+ func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
+
+ var returnValue: Bool = true
+
+ if delegate == nil,
+ let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldBeginEditing(_:))) {
+ returnValue = textViewDelegate.textViewShouldBeginEditing?(textView) ?? false
+ }
+ }
+
+ if returnValue {
+ updateReturnKey(textInputView: textView)
+ }
+
+ return returnValue
+ }
+
+ func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldEndEditing(_:))) {
+ return textViewDelegate.textViewShouldEndEditing?(textView) ?? false
+ }
+ }
+
+ return true
+ }
+
+ func textViewDidBeginEditing(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidBeginEditing?(textView)
+ }
+
+ func textViewDidEndEditing(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidEndEditing?(textView)
+ }
+
+ func textView(_ textView: UITextView,
+ shouldChangeTextIn range: NSRange,
+ replacementText text: String) -> Bool {
+
+ var shouldChange = true
+
+ if delegate == nil {
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextIn:replacementText:))
+ if textViewDelegate.responds(to: selector) {
+ shouldChange = (textViewDelegate.textView?(textView,
+ shouldChangeTextIn: range,
+ replacementText: text)) ?? true
+ }
+ }
+ }
+
+ if self.dismissTextViewOnReturn, text == "\n" {
+ goToNextResponderOrResign(from: textView)
+ return false
+ }
+
+ return shouldChange
+ }
+
+ func textViewDidChange(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidChange?(textView)
+ }
+
+ func textViewDidChangeSelection(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidChangeSelection?(textView)
+ }
+
+ @available(iOS, deprecated: 17.0)
+ func textView(_ aTextView: UITextView,
+ shouldInteractWith URL: URL,
+ in characterRange: NSRange,
+ interaction: UITextItemInteraction) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+ let selector: Selector = #selector(textView as (UITextView, URL, NSRange, UITextItemInteraction) -> Bool)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: URL,
+ in: characterRange,
+ interaction: interaction) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 17.0)
+ func textView(_ aTextView: UITextView,
+ shouldInteractWith textAttachment: NSTextAttachment,
+ in characterRange: NSRange,
+ interaction: UITextItemInteraction) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector: Selector = #selector(textView as
+ (UITextView, NSTextAttachment, NSRange, UITextItemInteraction)
+ -> Bool)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: textAttachment,
+ in: characterRange,
+ interaction: interaction) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 10.0)
+ func textView(_ aTextView: UITextView,
+ shouldInteractWith URL: URL,
+ in characterRange: NSRange) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+ let selector: Selector = #selector(textView as (UITextView, URL, NSRange) -> Bool)
+
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: URL,
+ in: characterRange) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 10.0)
+ func textView(_ aTextView: UITextView,
+ shouldInteractWith textAttachment: NSTextAttachment,
+ in characterRange: NSRange) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+ let selector: Selector = #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool)
+
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: textAttachment,
+ in: characterRange) ?? false
+ }
+ }
+
+ return true
+ }
+}
+
+#if compiler(>=5.7) // Xcode 14
+@available(iOS 16.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+ func textView(_ aTextView: UITextView,
+ editMenuForTextIn range: NSRange,
+ suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+ let selector = #selector((any UITextViewDelegate).textView(_:editMenuForTextIn:suggestedActions:))
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ editMenuForTextIn: range,
+ suggestedActions: suggestedActions)
+ }
+ }
+
+ return nil
+ }
+
+ func textView(_ aTextView: UITextView,
+ willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(aTextView, willPresentEditMenuWith: animator)
+ }
+
+ func textView(_ aTextView: UITextView,
+ willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(aTextView, willDismissEditMenuWith: animator)
+ }
+}
+#endif
+
+#if compiler(>=5.9) // Xcode 15
+@available(iOS 17.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textView(_ aTextView: UITextView,
+ primaryActionFor textItem: UITextItem,
+ defaultAction: UIAction) -> UIAction? {
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:primaryActionFor:defaultAction:))
+
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ primaryActionFor: textItem,
+ defaultAction: defaultAction)
+ }
+ }
+
+ return nil
+ }
+
+ func textView(_ aTextView: UITextView,
+ menuConfigurationFor textItem: UITextItem,
+ defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? {
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:menuConfigurationFor:defaultMenu:))
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ menuConfigurationFor: textItem,
+ defaultMenu: defaultMenu)
+ }
+ }
+
+ return nil
+ }
+
+ func textView(_ textView: UITextView,
+ textItemMenuWillDisplayFor textItem: UITextItem,
+ animator: any UIContextMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, textItemMenuWillDisplayFor: textItem, animator: animator)
+ }
+
+ func textView(_ textView: UITextView,
+ textItemMenuWillEndFor textItem: UITextItem,
+ animator: any UIContextMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, textItemMenuWillEndFor: textItem, animator: animator)
+ }
+}
+#endif
+
+#if compiler(>=6.0) // Xcode 16
+@available(iOS 18.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textViewWritingToolsWillBegin(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewWritingToolsWillBegin?(textView)
+ }
+
+ func textViewWritingToolsDidEnd(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewWritingToolsDidEnd?(textView)
+ }
+
+ func textView(_ textView: UITextView,
+ writingToolsIgnoredRangesInEnclosingRange enclosingRange: NSRange) -> [NSValue] {
+ guard delegate == nil else { return [] }
+
+ if let textViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:writingToolsIgnoredRangesInEnclosingRange:))
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(textView,
+ writingToolsIgnoredRangesInEnclosingRange: enclosingRange) ?? []
+ }
+ }
+ return []
+ }
+
+ func textView(_ textView: UITextView, willBeginFormattingWith viewController: UITextFormattingViewController) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, willBeginFormattingWith: viewController)
+ }
+
+ func textView(_ textView: UITextView, didBeginFormattingWith viewController: UITextFormattingViewController) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, didBeginFormattingWith: viewController)
+ }
+
+ func textView(_ textView: UITextView, willEndFormattingWith viewController: UITextFormattingViewController) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, willEndFormattingWith: viewController)
+ }
+
+ func textView(_ textView: UITextView, didEndFormattingWith viewController: UITextFormattingViewController) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, didEndFormattingWith: viewController)
+ }
+
+#if compiler(>=6.1) // Xcode 16.3
+ @available(iOS 18.4, *)
+ func textView(_ textView: UITextView, insertInputSuggestion inputSuggestion: UIInputSuggestion) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, insertInputSuggestion: inputSuggestion)
+ }
+#endif
+}
+#endif
+
+#if compiler(>=6.2) // Xcode 26
+@available(iOS 26.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textView(_ textView: UITextView, shouldChangeTextInRanges ranges: [NSValue], replacementText text: String) -> Bool {
+
+ var shouldChange = true
+
+ if delegate == nil {
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextInRanges:replacementText:))
+ if textViewDelegate.responds(to: selector) {
+ shouldChange = (textViewDelegate.textView?(textView,
+ shouldChangeTextInRanges: ranges,
+ replacementText: text)) ?? true
+ }
+ }
+ }
+
+ if self.dismissTextViewOnReturn, text == "\n" {
+ goToNextResponderOrResign(from: textView)
+ return false
+ }
+
+ return shouldChange
+ }
+
+ func textView(_ textView: UITextView, editMenuForTextInRanges ranges: [NSValue], suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+
+ let selector = #selector((any UITextViewDelegate).textView(_:editMenuForTextInRanges:suggestedActions:))
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(textView,
+ editMenuForTextInRanges: ranges,
+ suggestedActions: suggestedActions)
+ }
+ }
+
+ return nil
+ }
+}
+#endif
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
new file mode 100644
index 0000000..897b0aa
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
@@ -0,0 +1,278 @@
+//
+// IQKeyboardReturnManager.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+Manages the return key to work like next/done in a view hierarchy.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardReturnManager: NSObject {
+
+ // MARK: Private variables
+ private var textInputViewInfoCache: [IQTextInputViewInfoModel] = []
+
+ // MARK: Settings
+
+ /**
+ Delegate of textInputView
+ */
+ public weak var delegate: (any UITextFieldDelegate & UITextViewDelegate)?
+
+ /**
+ Set the last textInputView return key type. Default is UIReturnKeyDefault.
+ */
+ public var lastTextInputViewReturnKeyType: UIReturnKeyType = .default {
+
+ didSet {
+ if let activeModel = textInputViewInfoCache.first(where: {
+ guard let textInputView = $0.textInputView else {
+ return false
+ }
+ return textInputView.isFirstResponder
+ }), let view: any IQTextInputView = activeModel.textInputView {
+ updateReturnKey(textInputView: view)
+ }
+ }
+ }
+
+ public var dismissTextViewOnReturn: Bool = false
+
+ // MARK: Initialization/De-initialization
+
+ public override init() {
+ super.init()
+ }
+
+ @available(*, unavailable, message: "Please use addResponderSubviews(of:recursive:)")
+ public init(controller: UIViewController) {
+ super.init()
+ addResponderSubviews(of: controller.view, recursive: true)
+ }
+
+ deinit {
+
+ // for model in textInputViewInfoCache {
+ // model.restore()
+ // }
+
+ textInputViewInfoCache.removeAll()
+ }
+}
+
+// MARK: Registering/Unregistering textInputView
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ /**
+ Should pass TextInputView instance. Assign textInputView delegate to self, change it's returnKeyType.
+
+ @param textInputView TextInputView object to register.
+ */
+ func add(textInputView: any IQTextInputView) {
+
+ let model = IQTextInputViewInfoModel(textInputView: textInputView)
+ textInputViewInfoCache.append(model)
+
+ if let view: UITextField = textInputView as? UITextField {
+ view.delegate = self
+ } else if let view: UITextView = textInputView as? UITextView {
+ view.delegate = self
+ }
+ }
+
+ /**
+ Should pass TextInputView instance. Restore it's textInputView delegate and it's returnKeyType.
+
+ @param textInputView TextInputView object to unregister.
+ */
+ func remove(textInputView: any IQTextInputView) {
+
+ guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return }
+
+ let model = textInputViewInfoCache.remove(at: index)
+ model.restore()
+ }
+
+ /**
+ Add all the TextInputView responderView's.
+
+ @param view object to register all it's responder subviews.
+ */
+ func addResponderSubviews(of view: UIView, recursive: Bool) {
+
+ let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+ for view in textInputViews {
+ add(textInputView: view)
+ }
+ }
+
+ /**
+ Remove all the TextInputView responderView's.
+
+ @param view object to unregister all it's responder subviews.
+ */
+ func removeResponderSubviews(of view: UIView, recursive: Bool) {
+
+ let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+ for view in textInputViews {
+ remove(textInputView: view)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+ @discardableResult
+ func goToNextResponderOrResign(from textInputView: any IQTextInputView) -> Bool {
+
+ guard let textInfoCache: IQTextInputViewInfoModel = nextResponderFromTextInputView(textInputView),
+ let textInputView = textInfoCache.textInputView else {
+ textInputView.resignFirstResponder()
+ return true
+ }
+
+ textInputView.becomeFirstResponder()
+ return false
+ }
+}
+
+// MARK: Internal Functions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardReturnManager {
+
+ func nextResponderFromTextInputView(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+ guard let currentIndex: Int = textInputViewCachedInfoIndex(textInputView),
+ currentIndex < textInputViewInfoCache.count - 1 else { return nil }
+
+ let candidates = Array(textInputViewInfoCache[currentIndex+1.. Int? {
+ return textInputViewInfoCache.firstIndex {
+ guard let inputView = $0.textInputView else { return false }
+ return inputView == textInputView
+ }
+ }
+
+ func textInputViewCachedInfo(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+ guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return nil }
+ return textInputViewInfoCache[index]
+ }
+
+ func updateReturnKey(textInputView: some IQTextInputView) {
+
+ let returnKey: UIReturnKeyType
+ if nextResponderFromTextInputView(textInputView) != nil {
+ returnKey = .next
+ } else {
+ returnKey = lastTextInputViewReturnKeyType
+ }
+
+ if textInputView.returnKeyType != returnKey {
+ // If it's the last textInputView in responder view, else next
+ textInputView.returnKeyType = returnKey
+ textInputView.reloadInputViews()
+ }
+ }
+}
+
+// MARK: Deprecated
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ @available(*, unavailable, renamed: "lastTextInputViewReturnKeyType")
+ var lastTextFieldReturnKeyType: UIReturnKeyType {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "add(textInputView:)")
+ func addTextFieldView(_ textInputView: any IQTextInputView) { }
+
+ @available(*, unavailable, renamed: "remove(textInputView:)")
+ func removeTextFieldView(_ textInputView: any IQTextInputView) { }
+
+ @available(*, unavailable, renamed: "addResponderSubviews(of:recursive:)")
+ func addResponderFromView(_ view: UIView, recursive: Bool) { }
+
+ @available(*, unavailable, renamed: "removeResponderSubviews(of:recursive:)")
+ func removeResponderFromView(_ view: UIView, recursive: Bool = true) { }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension UIView {
+
+ func responderSubviews(recursive: Bool) -> [any IQTextInputView] {
+
+ // Array of TextInputViews.
+ var textInputViews: [any IQTextInputView] = []
+ for view in subviews {
+
+ if let view = view as? IQTextInputView {
+ textInputViews.append(view)
+ }
+ // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+ // so we added some more validations here (Bug ID: #458)
+ // Uncommented else (Bug ID: #625)
+ else if recursive, !view.subviews.isEmpty {
+ let deepResponders = view.responderSubviews(recursive: recursive)
+ textInputViews.append(contentsOf: deepResponders)
+ }
+ }
+
+ // subviews are returning in opposite order. Sorting according the frames 'y'.
+ return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+ let frame1: CGRect = view1.convert(view1.bounds, to: self)
+ let frame2: CGRect = view2.convert(view2.bounds, to: self)
+
+ if frame1.minY != frame2.minY {
+ return frame1.minY < frame2.minY
+ } else {
+ return frame1.minX < frame2.minX
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
new file mode 100644
index 0000000..c7b9099
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
@@ -0,0 +1,56 @@
+//
+// IQTextInputViewInfoModel.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal final class IQTextInputViewInfoModel: NSObject {
+
+ weak var textFieldDelegate: (any UITextFieldDelegate)?
+ weak var textViewDelegate: (any UITextViewDelegate)?
+ weak var textInputView: (any IQTextInputView)?
+ let originalReturnKeyType: UIReturnKeyType
+
+ init(textInputView: any IQTextInputView) {
+ self.textInputView = textInputView
+ self.originalReturnKeyType = textInputView.returnKeyType
+ if let textInputView = textInputView as? UITextField {
+ self.textFieldDelegate = textInputView.delegate
+ } else if let textInputView = textInputView as? UITextView {
+ self.textViewDelegate = textInputView.delegate
+ }
+
+ super.init()
+ }
+
+ func restore() {
+ textInputView?.returnKeyType = originalReturnKeyType
+ if let textInputView = textInputView as? UITextField {
+ textInputView.delegate = textFieldDelegate
+ } else if let textInputView = textInputView as? UITextView {
+ textInputView.delegate = textViewDelegate
+ }
+ }
+}
diff --git a/Pods/IQKeyboardReturnManager/LICENSE b/Pods/IQKeyboardReturnManager/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardReturnManager/README.md b/Pods/IQKeyboardReturnManager/README.md
new file mode 100644
index 0000000..5524787
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/README.md
@@ -0,0 +1,68 @@
+# IQKeyboardReturnManager
+
+[](https://travis-ci.org/hackiftekhar/IQKeyboardReturnManager)
+[](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[](https://cocoapods.org/pods/IQKeyboardReturnManager)
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardReturnManager is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardReturnManager'
+```
+
+## Usage
+
+To handle keyboard return key automatically:-
+
+```swift
+import IQKeyboardReturnManager
+
+class ViewController: UIViewController {
+
+ let returnManager: IQKeyboardReturnManager = .init()
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // This will add all textInputView of the controller and start observing for textFieldShouldReturn events
+ returnManager.addResponderSubviews(of: self.view, recursive: true)
+
+ // If you would like to dismiss the UITextView on tapping on return then add this
+ returnManager.dismissTextViewOnReturn = true
+
+ // If you would like to change last textInputView return key type to done or something else, then add this
+ returnManager.lastTextInputViewReturnKeyType = .done
+
+ // If you would like to customize the navigation between textField by your own order then add them manually
+ returnManager.add(textInputView: textField1)
+ returnManager.add(textInputView: textField2)
+ returnManager.add(textInputView: textField3)
+ returnManager.add(textInputView: textField4)
+ }
+}
+
+// IQKeyboardReturnManager will forward all delegate callbacks to you, so you can customize the decisions
+extension ViewController: UITextFieldDelegate {
+ @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {...}
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardReturnManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
new file mode 100644
index 0000000..42317e8
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
@@ -0,0 +1,150 @@
+//
+// IQBarButtonItem.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQBarButtonItem: UIBarButtonItem {
+
+ internal static let flexibleBarButtonItem: IQBarButtonItem = {
+ let barButton = IQBarButtonItem(barButtonSystemItem: .flexibleSpace,
+ target: nil, action: nil)
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ barButton.hidesSharedBackground = false
+ }
+#endif
+ return barButton
+ }()
+
+ /**
+ Fixed space bar button of toolbar.
+ */
+ internal static let fixedSpaceBarButton: IQBarButtonItem = {
+ let barButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace,
+ target: nil, action: nil)
+ barButton.isSystemItem = true
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ barButton.hidesSharedBackground = false
+ } else {
+ barButton.width = 6
+ }
+#else
+ barButton.width = 6
+#endif
+ return barButton
+ }()
+
+
+ public override init() {
+ super.init()
+ initialize()
+ }
+
+ public required init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ initialize()
+ }
+
+ private func initialize() {
+
+ let states: [UIControl.State] = [.normal, .highlighted, .disabled, .focused]
+
+ for state in states {
+
+ setBackgroundImage(UIImage(), for: state, barMetrics: .default)
+ setBackgroundImage(UIImage(), for: state, style: .plain, barMetrics: .default)
+ setBackButtonBackgroundImage(UIImage(), for: state, barMetrics: .default)
+ }
+
+ setTitlePositionAdjustment(UIOffset(), for: .default)
+ setBackgroundVerticalPositionAdjustment(0, for: .default)
+ setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default)
+ }
+
+ override open var tintColor: UIColor? {
+ didSet {
+
+ var textAttributes: [NSAttributedString.Key: Any] = [:]
+ textAttributes[.foregroundColor] = tintColor
+
+ if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) {
+ for (key, value) in attributes {
+ textAttributes[key] = value
+ }
+ }
+
+ setTitleTextAttributes(textAttributes, for: .normal)
+ }
+ }
+
+ /**
+ Boolean to know if it's a system item or custom item,
+ we are having a limitation that we cannot override a designated initializer,
+ so we are manually setting this property once in initialization
+ */
+ internal var isSystemItem: Bool = false
+
+ /**
+ Additional target & action to do get callback action.
+ Note that setting custom target & selector doesn't affect native functionality,
+ this is just an additional target to get a callback.
+
+ @param target Target object.
+ @param action Target Selector.
+ */
+ open func setTarget(_ target: AnyObject?, action: Selector?) {
+ if let target: AnyObject = target, let action: Selector = action {
+ invocation = IQInvocation(target: target, action: action)
+ } else {
+ invocation = nil
+ }
+ }
+
+ /**
+ Customized Invocation to be called when button is pressed.
+ invocation is internally created using setTarget:action: method.
+ */
+ open var invocation: IQInvocation? {
+ didSet {
+ // We have to put this condition here because if we override this function then
+ // We were getting "Cannot override '_' which has been marked unavailable" in Xcode 15
+ if let titleBarButton = self as? IQTitleBarButtonItem {
+
+ if let target = invocation?.target, let action = invocation?.action {
+ titleBarButton.isEnabled = true
+ titleBarButton.titleButton.isEnabled = true
+ titleBarButton.titleButton.addTarget(target, action: action, for: .touchUpInside)
+ } else {
+ titleBarButton.isEnabled = false
+ titleBarButton.titleButton.isEnabled = false
+ titleBarButton.titleButton.removeTarget(nil, action: nil, for: .touchUpInside)
+ }
+ }
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
new file mode 100644
index 0000000..4bb9e4f
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
@@ -0,0 +1,102 @@
+//
+// IQBarButtonItemConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+ IQBarButtonItemConfiguration for creating toolbar with bar button items
+ */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQBarButtonItemConfiguration: NSObject {
+
+ public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+ self.systemItem = systemItem
+ self.image = nil
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(image: UIImage, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = image
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(title: String, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = nil
+ self.title = title
+ self.action = action
+ super.init()
+ }
+
+ public let systemItem: UIBarButtonItem.SystemItem? // System Item to be used to instantiate bar button.
+
+ public let image: UIImage? // Image to show on bar button item if it's not a system item.
+
+ public let title: String? // Title to show on bar button item if it's not a system item.
+
+ public var action: Selector? // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
+
+ public override var accessibilityLabel: String? { didSet { } } // Accessibility related labels
+
+ public func apply(on oldBarButtonItem: IQBarButtonItem, target: AnyObject?) -> IQBarButtonItem {
+
+ var newBarButtonItem: IQBarButtonItem = oldBarButtonItem
+
+ if systemItem == nil, !oldBarButtonItem.isSystemItem {
+ newBarButtonItem.title = title
+ newBarButtonItem.image = image
+ newBarButtonItem.target = target
+ newBarButtonItem.action = action
+ } else {
+ if let systemItem: UIBarButtonItem.SystemItem = systemItem {
+ newBarButtonItem = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: action)
+ newBarButtonItem.isSystemItem = true
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ newBarButtonItem.style = .plain
+ }
+#endif
+ } else if let image: UIImage = image {
+ newBarButtonItem = IQBarButtonItem(image: image, style: .plain, target: target, action: action)
+ } else {
+ newBarButtonItem = IQBarButtonItem(title: title, style: .plain, target: target, action: action)
+ }
+
+ newBarButtonItem.invocation = oldBarButtonItem.invocation
+ newBarButtonItem.isEnabled = oldBarButtonItem.isEnabled
+ newBarButtonItem.tag = oldBarButtonItem.tag
+ }
+
+ newBarButtonItem.accessibilityLabel = accessibilityLabel
+ newBarButtonItem.accessibilityIdentifier = oldBarButtonItem.accessibilityLabel
+
+ return newBarButtonItem
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
new file mode 100644
index 0000000..95afb9f
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
@@ -0,0 +1,42 @@
+//
+// IQInvocation.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQInvocation: NSObject {
+ public weak var target: AnyObject?
+ public let action: Selector
+
+ public init(target: AnyObject, action: Selector) {
+ self.target = target
+ self.action = action
+ }
+
+ public func invoke(from: Any) {
+
+ guard let target: AnyObject = target else { return }
+ UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent())
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
new file mode 100644
index 0000000..0ff193d
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
@@ -0,0 +1,166 @@
+//
+// IQTitleBarButtonItem.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTitleBarButtonItem: IQBarButtonItem {
+
+ open var titleFont: UIFont? {
+
+ didSet {
+ if let titleFont: UIFont = titleFont {
+ titleButton.titleLabel?.font = titleFont
+ } else {
+ titleButton.titleLabel?.font = UIFont.systemFont(ofSize: 13)
+ }
+ }
+ }
+
+ override open var title: String? {
+ didSet {
+ titleButton.setTitle(title, for: .normal)
+ updateAccessibility()
+ }
+ }
+
+ /**
+ titleColor to be used for displaying button text when displaying title (disabled state).
+ */
+ open var titleColor: UIColor? {
+
+ didSet {
+
+ if let titleColor: UIColor = titleColor {
+ titleButton.setTitleColor(titleColor, for: .disabled)
+ } else {
+ titleButton.setTitleColor(UIColor.lightGray, for: .disabled)
+ }
+ }
+ }
+
+ /**
+ selectableTitleColor to be used for displaying button text when button is enabled.
+ */
+ open var selectableTitleColor: UIColor? {
+
+ didSet {
+
+ if let selectableTitleColor: UIColor = selectableTitleColor {
+ titleButton.setTitleColor(selectableTitleColor, for: .normal)
+ } else {
+ titleButton.setTitleColor(UIColor.systemBlue, for: .normal)
+ }
+ }
+ }
+
+ internal let titleButton: UIButton = UIButton(type: .system)
+ private let _titleView: UIView = UIView()
+
+ private override init() {
+ super.init()
+ }
+
+ public convenience init(title: String?) {
+
+ self.init(title: nil, style: .plain, target: nil, action: nil)
+
+ _titleView.backgroundColor = UIColor.clear
+
+ titleButton.isAccessibilityElement = false
+ titleButton.isEnabled = false
+ titleButton.titleLabel?.numberOfLines = 3
+ titleButton.setTitleColor(UIColor.lightGray, for: .disabled)
+ titleButton.setTitleColor(UIColor.systemBlue, for: .normal)
+ titleButton.backgroundColor = UIColor.clear
+ titleButton.titleLabel?.textAlignment = .center
+ titleButton.setTitle(title, for: .normal)
+ titleFont = UIFont.systemFont(ofSize: 13.0)
+ titleButton.titleLabel?.font = self.titleFont
+ _titleView.addSubview(titleButton)
+
+ let lowPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1)
+ let highPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1)
+
+ _titleView.translatesAutoresizingMaskIntoConstraints = false
+ _titleView.setContentHuggingPriority(lowPriority, for: .vertical)
+ _titleView.setContentHuggingPriority(lowPriority, for: .horizontal)
+ _titleView.setContentCompressionResistancePriority(highPriority, for: .vertical)
+ _titleView.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+ titleButton.translatesAutoresizingMaskIntoConstraints = false
+ titleButton.setContentHuggingPriority(lowPriority, for: .vertical)
+ titleButton.setContentHuggingPriority(lowPriority, for: .horizontal)
+ titleButton.setContentCompressionResistancePriority(highPriority, for: .vertical)
+ titleButton.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+ let top: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .top,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .top,
+ multiplier: 1, constant: 0)
+ let bottom: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .bottom,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .bottom,
+ multiplier: 1, constant: 0)
+ let leading: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .leading,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .leading,
+ multiplier: 1, constant: 0)
+ let trailing: NSLayoutConstraint = NSLayoutConstraint(item: titleButton, attribute: .trailing,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .trailing,
+ multiplier: 1, constant: 0)
+
+ _titleView.addConstraints([top, bottom, leading, trailing])
+
+ customView = _titleView
+ }
+
+ required public init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ }
+
+ private func updateAccessibility() {
+ if title == nil || title?.isEmpty == true {
+ isAccessibilityElement = false
+ // Swift 6: Reference to static property 'none'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .none
+ accessibilityTraits = .init(rawValue: 0)
+ } else if titleButton.isEnabled == true {
+ isAccessibilityElement = true
+ // Swift 6: Reference to static property 'button'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .button
+ accessibilityTraits = .init(rawValue: 1)
+ } else {
+ isAccessibilityElement = true
+
+ // Swift 6: Reference to static property 'staticText'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .staticText
+ accessibilityTraits = .init(rawValue: 64)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
new file mode 100644
index 0000000..01a882d
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
@@ -0,0 +1,389 @@
+//
+// UIView+IQKeyboardExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var toolbar: Int = 0
+ static var hidePlaceholder: Int = 0
+ static var placeholder: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ // MARK: Toolbar
+
+ /**
+ Toolbar references for better customization control.
+ */
+ var toolbar: IQKeyboardToolbar {
+ var toolbar: IQKeyboardToolbar? = base?.inputAccessoryView as? IQKeyboardToolbar
+
+ if toolbar == nil, let base = base {
+ toolbar = objc_getAssociatedObject(base, &AssociatedKeys.toolbar) as? IQKeyboardToolbar
+ }
+
+ if let toolbar: IQKeyboardToolbar = toolbar {
+ return toolbar
+ } else {
+
+ let width: CGFloat = base?.window?.windowScene?.screen.bounds.width ?? 0
+ let height: CGFloat
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ height = 58
+ } else {
+ height = 44
+ }
+#else
+ height = 44
+#endif
+
+ let frame = CGRect(origin: .zero, size: .init(width: width, height: height))
+ let newToolbar = IQKeyboardToolbar(frame: frame)
+
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.toolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+
+ return newToolbar
+ }
+ }
+
+ // MARK: Toolbar title
+
+ /**
+ If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
+ */
+ var hidePlaceholder: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ toolbar.titleBarButton.title = drawingPlaceholder
+ }
+ }
+ }
+
+ /**
+ `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
+ */
+ var placeholder: String? {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String
+ }
+ return nil
+ }
+ set(newValue) {
+ if let base = base {
+ // swiftlint:disable line_length
+ objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ toolbar.titleBarButton.title = drawingPlaceholder
+ // swiftlint:enable line_length
+ }
+ }
+ }
+
+ /**
+ `drawingToolbarPlaceholder` will be actual text used to draw on toolbar.
+ This would either `placeholder` or `toolbarPlaceholder`.
+ */
+ var drawingPlaceholder: String? {
+
+ guard !hidePlaceholder else { return nil }
+
+ if let placeholder = placeholder,
+ !placeholder.isEmpty {
+ return placeholder
+ }
+
+ guard let placeholderable: any IQPlaceholderable = base as? (any IQPlaceholderable) else { return nil }
+
+ if let placeholder = placeholderable.attributedPlaceholder?.string,
+ !placeholder.isEmpty {
+ return placeholder
+ } else if let placeholder = placeholderable.placeholder {
+ return placeholder
+ } else {
+ return nil
+ }
+ }
+
+ // MARK: Common
+
+ func addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ guard let base = base else { return }
+ // Creating a toolBar for phoneNumber keyboard
+ let toolbar: IQKeyboardToolbar = toolbar
+
+ let items: [UIBarButtonItem] = Self.constructBarButtonItems(target: target, toolbar: toolbar,
+ previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+
+ // Adding button to toolBar.
+ toolbar.items = items
+
+ switch base.keyboardAppearance {
+ case .dark:
+ toolbar.barStyle = .black
+ default:
+ toolbar.barStyle = .default
+ }
+
+ // Setting toolbar to keyboard.
+ let reloadInputViews: Bool = base.inputAccessoryView != toolbar
+ guard reloadInputViews else { return }
+
+ base.inputAccessoryView = toolbar
+
+ base.reloadInputViews()
+ }
+
+ // MARK: Right
+ func addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+
+ addDone(target: target, action: action,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ let rightConfiguration: IQBarButtonItemConfiguration
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: action)
+ } else {
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action)
+ }
+#else
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action)
+#endif
+
+ addToolbar(target: target, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addRightButton(target: target, configuration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ addToolbar(target: target, rightConfiguration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ // MARK: Right/Left
+ func addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addRightLeft(target: target,
+ rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ addToolbar(target: target,
+ previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ // MARK: Previous/Next/Right
+
+ func addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addPreviousNextRight(target: target,
+ previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ addToolbar(target: target,
+ previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction,
+ doneAction: doneAction,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+ let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+
+ let previousConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+ action: previousAction)
+ let nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+ action: nextAction)
+ let rightConfiguration: IQBarButtonItemConfiguration
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: doneAction)
+ } else {
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction)
+ }
+#else
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: doneAction)
+#endif
+
+ addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+ private static func constructBarButtonItems(target: AnyObject?,
+ toolbar: IQKeyboardToolbar,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) -> [UIBarButtonItem] {
+ var items: [UIBarButtonItem] = []
+
+ // Leading group
+ do {
+ if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration {
+ let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target)
+ toolbar.previousBarButton = prev
+ items.append(prev)
+ }
+
+ if previousConfiguration != nil, nextConfiguration != nil {
+ items.append(IQBarButtonItem.fixedSpaceBarButton)
+ }
+
+ if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration {
+ let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target)
+ toolbar.nextBarButton = next
+ items.append(next)
+ }
+
+ if !toolbar.additionalLeadingItems.isEmpty {
+ items.append(contentsOf: toolbar.additionalLeadingItems)
+ }
+ }
+
+ // Center Title bar button item
+ if let title = title, !title.isEmpty {
+ // Title button
+ toolbar.titleBarButton.title = title
+ toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
+ toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
+ toolbar.titleBarButton.customView?.frame = .zero
+
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ if !items.isEmpty {
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+ }
+ } else {
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+ }
+#else
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+#endif
+ items.append(toolbar.titleBarButton)
+ }
+
+ // Flexible space
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+
+ // Trailing group
+ do {
+ if !toolbar.additionalTrailingItems.isEmpty {
+ items.append(contentsOf: toolbar.additionalTrailingItems)
+ }
+
+ if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration {
+
+ let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target)
+ toolbar.doneBarButton = done
+ items.append(done)
+ }
+ }
+
+ return items
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
new file mode 100644
index 0000000..c3be1a4
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
@@ -0,0 +1,228 @@
+//
+// UIView+IQKeyboardExtensionDeprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.toolbar")
+ var keyboardToolbar: IQKeyboardToolbar {
+ get { fatalError() }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.hidePlaceholder")
+ var shouldHideToolbarPlaceholder: Bool {
+ get { false }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.placeholder")
+ var toolbarPlaceholder: String? {
+ get { nil }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.drawingPlaceholder")
+ var drawingToolbarPlaceholder: String? {
+ get { nil }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.addToolbar(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addKeyboardToolbarWithTarget(target: AnyObject?,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil,
+ rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
+ previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addDone(target:action:showPlaceholder:titleAccessibilityLabel:)")
+ func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addDone(target:action:title:titleAccessibilityLabel:)")
+ func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithText(_ text: String,
+ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithText(_ text: String,
+ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ cancelAction: Selector,
+ doneAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonTitle: String,
+ rightButtonTitle: String,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonImage: UIImage,
+ rightButtonImage: UIImage,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ cancelAction: Selector,
+ doneAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonTitle: String,
+ rightButtonTitle: String,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonImage: UIImage,
+ rightButtonImage: UIImage,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextDone(_ target: AnyObject?,
+ previousAction: Selector,
+ nextAction: Selector,
+ doneAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:title:titleAccessibilityLabel:)")
+ func addPreviousNextDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ previousAction: Selector,
+ nextAction: Selector,
+ doneAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonImage: UIImage,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonTitle: String,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonImage: UIImage,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonTitle: String,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable line_length
+// swiftlint:enable function_parameter_count
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
new file mode 100644
index 0000000..2dbcdbe
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
@@ -0,0 +1,254 @@
+//
+// UIView+IQKeyboardExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+ var iq_hidePlaceholder: Bool {
+ get { iq.hidePlaceholder }
+ set(newValue) { iq.hidePlaceholder = newValue }
+ }
+
+ var iq_placeholder: String? {
+ get { iq.placeholder }
+ set(newValue) { iq.placeholder = newValue }
+ }
+
+ var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+ func iq_addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector,
+ nextAction: Selector, doneAction: Selector,
+ showPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction, doneAction: doneAction,
+ showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction, doneAction: doneAction,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+ var iq_hidePlaceholder: Bool {
+ get { iq.hidePlaceholder }
+ set(newValue) { iq.hidePlaceholder = newValue }
+ }
+
+ var iq_placeholder: String? {
+ get { iq.placeholder }
+ set(newValue) { iq.placeholder = newValue }
+ }
+
+ var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+ func iq_addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector,
+ doneAction: Selector, showPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction,
+ doneAction: doneAction, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction,
+ doneAction: doneAction, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
new file mode 100644
index 0000000..ff225bc
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
@@ -0,0 +1,183 @@
+//
+// IQKeyboardToolbar.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/** @abstract IQKeyboardToolbar. */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQKeyboardToolbar: UIToolbar {
+
+ override public init(frame: CGRect) {
+ super.init(frame: frame)
+
+ initialize()
+ }
+
+ required public init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+
+ initialize()
+ }
+
+ private func initialize() {
+
+ sizeToFit()
+
+ autoresizingMask = .flexibleWidth
+ self.isTranslucent = true
+ self.barTintColor = nil
+
+ let positions: [UIBarPosition] = [.any, .bottom, .top, .topAttached]
+
+ for position in positions {
+
+ self.setBackgroundImage(nil, forToolbarPosition: position, barMetrics: .default)
+ self.setShadowImage(nil, forToolbarPosition: .any)
+ }
+
+ // Background color
+ self.backgroundColor = nil
+ }
+
+ /**
+ Additional bar buttons to show at the leading side.
+ */
+ open var additionalLeadingItems: [UIBarButtonItem] = []
+
+ /**
+ Additional bar buttons to show at the trailing side.
+ */
+ open var additionalTrailingItems: [UIBarButtonItem] = []
+
+ /**
+ Previous bar button of toolbar.
+ */
+ private var privatePreviousBarButton: IQBarButtonItem?
+ open var previousBarButton: IQBarButtonItem {
+ get {
+ if privatePreviousBarButton == nil {
+ privatePreviousBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
+ }
+ return privatePreviousBarButton!
+ }
+
+ set (newValue) {
+ privatePreviousBarButton = newValue
+ }
+ }
+
+ /**
+ Next bar button of toolbar.
+ */
+ private var privateNextBarButton: IQBarButtonItem?
+ open var nextBarButton: IQBarButtonItem {
+ get {
+ if privateNextBarButton == nil {
+ privateNextBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
+ }
+ return privateNextBarButton!
+ }
+
+ set (newValue) {
+ privateNextBarButton = newValue
+ }
+ }
+
+ /**
+ Title bar button of toolbar.
+ */
+ private var privateTitleBarButton: IQTitleBarButtonItem?
+ open var titleBarButton: IQTitleBarButtonItem {
+ get {
+ if privateTitleBarButton == nil {
+ privateTitleBarButton = IQTitleBarButtonItem(title: nil)
+ }
+ return privateTitleBarButton!
+ }
+
+ set (newValue) {
+ privateTitleBarButton = newValue
+ }
+ }
+
+ /**
+ Done bar button of toolbar.
+ */
+ private var privateDoneBarButton: IQBarButtonItem?
+ open var doneBarButton: IQBarButtonItem {
+ get {
+ if privateDoneBarButton == nil {
+ privateDoneBarButton = IQBarButtonItem(title: nil, style: .done, target: nil, action: nil)
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ privateDoneBarButton?.style = .plain
+ }
+#endif
+ }
+ return privateDoneBarButton!
+ }
+
+ set (newValue) {
+ privateDoneBarButton = newValue
+ }
+ }
+
+ override open func sizeThatFits(_ size: CGSize) -> CGSize {
+ var sizeThatFit: CGSize = super.sizeThatFits(size)
+ let height: CGFloat
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ height = 58
+ } else {
+ height = 44
+ }
+#else
+ height = 44
+#endif
+ sizeThatFit.height = height
+
+ return sizeThatFit
+ }
+
+ override open var tintColor: UIColor! {
+
+ didSet {
+ guard let items: [UIBarButtonItem] = items else { return }
+ for item in items {
+ item.tintColor = tintColor
+ }
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardToolbar: UIInputViewAudioFeedback {
+
+ open var enableInputClicksWhenVisible: Bool {
+ return true
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
new file mode 100644
index 0000000..9f543e5
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
@@ -0,0 +1,60 @@
+//
+// IQKeyboardToolbarPlaceholderConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarPlaceholderConfiguration: NSObject {
+
+ /**
+ If YES, then it add the textInputView's placeholder text on toolbar. Default is YES.
+ */
+ public var showPlaceholder: Bool = true
+
+ /**
+ Placeholder Font. Default is nil.
+ */
+ public var font: UIFont?
+
+ /**
+ Placeholder Color. Default is nil. Which means lightGray
+ */
+ public var color: UIColor?
+
+ /**
+ Placeholder Button Color when it's treated as button. Default is nil.
+ */
+ public var buttonColor: UIColor?
+
+ /**
+ Placeholder accessibility Label
+ */
+ public override var accessibilityLabel: String? { didSet { } }
+}
+// swiftlint:enable type_name
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarPlaceholderConfiguration")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfiguration: NSObject {}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
new file mode 100644
index 0000000..f0ceea2
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
@@ -0,0 +1,37 @@
+//
+// IQPlaceholderable.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQPlaceholderable: AnyObject {
+
+ var placeholder: String? { get set }
+ var attributedPlaceholder: NSAttributedString? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQPlaceholderable { }
diff --git a/Pods/IQKeyboardToolbar/LICENSE b/Pods/IQKeyboardToolbar/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardToolbar/README.md b/Pods/IQKeyboardToolbar/README.md
new file mode 100644
index 0000000..3b60eb8
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/README.md
@@ -0,0 +1,85 @@
+# IQKeyboardToolbar
+
+[](https://travis-ci.org/hackiftekhar/IQKeyboardToolbar)
+[](https://cocoapods.org/pods/IQKeyboardToolbar)
+[](https://cocoapods.org/pods/IQKeyboardToolbar)
+[](https://cocoapods.org/pods/IQKeyboardToolbar)
+
+
+
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardToolbar is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbar'
+```
+
+## Usage
+
+This library can be used to add toolbar to the keyboard
+
+Previous Next and Done button
+```swift
+ textField.iq.addPreviousNextDone(target: self,
+ previousAction: #selector(textField1PreviousAction),
+ nextAction: #selector(textField1NextAction),
+ doneAction: #selector(doneAction), showPlaceholder: true)
+```
+
+Previous Next and Right button with customized titles or images
+```swift
+ textField.iq.addPreviousNextRight(target: self,
+ previousConfiguration: .init(title: "Prev", action: #selector(textView1PreviousAction)),
+ nextConfiguration: .init(title: "Next", action: #selector(textView1NextAction)),
+ rightConfiguration: .init(image: UIImage(systemName: "chevron.down")!, action: #selector(doneAction)),
+ title: "Text View 1")
+```
+
+Action button
+```swift
+ textField.iq.addDone(target: self,
+ action: #selector(doneAction),
+ title: "Select Account")
+ textField.iq.toolbar.titleBarButton.setTarget(self,
+ action: #selector(selectAccount))
+```
+
+Additional leading and trailing buttons
+```swift
+ textField.iq.toolbar.additionalLeadingItems = [.init(barButtonSystemItem: .add, target: self, action: #selector(addAction))]
+ textField.iq.toolbar.additionalTrailingItems = [.init(barButtonSystemItem: .camera, target: self, action: #selector(cameraAction))]
+ textField.iq.addToolbar(target: self,
+ previousConfiguration: nil,
+ nextConfiguration: .init(title: "Next", action: #selector(doneAction)),
+ rightConfiguration: .init(title: "Finish", action: #selector(doneAction)),
+ title: "TextView 2")
+```
+
+Hide Placeholder
+```swift
+ textField1.iq.hidePlaceholder = true
+```
+
+Customized Placeholder
+```swift
+ textField1.iq.placeholder = "My Own Placeholder"
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbar is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
new file mode 100644
index 0000000..efebfb9
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
@@ -0,0 +1,90 @@
+//
+// IQKeyboardToolbarConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarConfiguration: NSObject {
+
+ /**
+ If YES, then uses textInputView's tintColor property,
+ otherwise tint color is default. Default is NO.
+ */
+ public var useTextInputViewTintColor: Bool = false
+
+ /**
+ This is used for toolbar.tintColor when textInputView.keyboardAppearance is UIKeyboardAppearanceDefault.
+ If useTextInputViewTintColor is YES then this property is ignored. Default is nil and uses black color.
+ */
+ public var tintColor: UIColor?
+
+ /**
+ This is used for toolbar.barTintColor. Default is nil.
+ */
+ public var barTintColor: UIColor?
+
+ /**
+ IQPreviousNextDisplayModeDefault: Show NextPrevious when there are more than 1 textInputView otherwise hide.
+ IQPreviousNextDisplayModeAlwaysHide: Do not show NextPrevious buttons in any case.
+ IQPreviousNextDisplayModeAlwaysShow: Always show nextPrevious buttons,
+ if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+ */
+ public var previousNextDisplayMode: IQPreviousNextDisplayMode = .default
+
+ /**
+ /**
+ IQAutoToolbarBySubviews: Creates Toolbar according to subview's hierarchy of TextInputView's in view.
+ IQAutoToolbarByTag: Creates Toolbar according to tag property of TextInputView's.
+ IQAutoToolbarByPosition: Creates Toolbar according to the y,x position
+ of textInputView in it's superview coordinate.
+
+ Default is IQAutoToolbarBySubviews.
+ */
+ AutoToolbar managing behavior. Default is IQAutoToolbarBySubviews.
+ */
+ public var manageBehavior: IQKeyboardToolbarManageBehavior = .bySubviews
+
+ /**
+ Buttons configuration displayed on the toolbar, the selector parameter is ignored in below configuration
+ */
+ public var previousBarButtonConfiguration: IQBarButtonItemConfiguration?
+ public var nextBarButtonConfiguration: IQBarButtonItemConfiguration?
+ public var doneBarButtonConfiguration: IQBarButtonItemConfiguration?
+
+ public let placeholderConfiguration: IQKeyboardToolbarPlaceholderConfiguration = .init()
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarConfiguration {
+
+ @available(*, unavailable, renamed: "useTextInputViewTintColor")
+ var useTextFieldTintColor: Bool {
+ get { fatalError() }
+ set {}
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
new file mode 100644
index 0000000..ee76ea3
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
@@ -0,0 +1,68 @@
+//
+// IQKeyboardToolbarConstants.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+// MARK: IQKeyboardToolbarManageBehavior
+
+/**
+`IQAutoToolbarBySubviews`
+Creates Toolbar according to subview's hierarchy of textInputView's in view.
+
+`IQAutoToolbarByTag`
+Creates Toolbar according to tag property of textInputView's.
+
+`IQAutoToolbarByPosition`
+Creates Toolbar according to the y,x position of textInputView in it's superview coordinate.
+*/
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQKeyboardToolbarManageBehavior: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarManageBehavior")
+@objc public enum IQAutoToolbarManageBehavior: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+/**
+ `IQPreviousNextDisplayModeDefault`
+ Show NextPrevious when there are more than 1 textInputView otherwise hide.
+
+ `IQPreviousNextDisplayModeAlwaysHide`
+ Do not show NextPrevious buttons in any case.
+
+ `IQPreviousNextDisplayModeAlwaysShow`
+ Always show nextPrevious buttons,
+ if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQPreviousNextDisplayMode: Int {
+ case `default`
+ case alwaysHide
+ case alwaysShow
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
new file mode 100644
index 0000000..8953423
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
@@ -0,0 +1,52 @@
+//
+// IQKeyboardToolbarManager+Debug
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ func showLog(_ logString: String, indentation: Int = 0) {
+
+ guard isDebuggingEnabled else {
+ return
+ }
+
+ if indentation < 0 {
+ self.logIndentation = max(0, self.logIndentation + indentation)
+ }
+
+ var preLog: String = "IQKeyboardToolbarManager"
+ for _ in 0 ... self.logIndentation {
+ preLog += "|\t"
+ }
+
+ print(preLog + logString)
+
+ if indentation > 0 {
+ self.logIndentation += indentation
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
new file mode 100644
index 0000000..abd7566
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
@@ -0,0 +1,29 @@
+//
+// IQDeepResponderContainerView.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQDeepResponderContainerView: UIView {
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
new file mode 100644
index 0000000..fc34aa0
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
@@ -0,0 +1,183 @@
+//
+// IQKeyboardToolbarManager+Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "isEnabled")
+ var enableAutoToolbar: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "playInputClicks")
+ var shouldPlayInputClicks: Bool {
+ get { false }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+ var toolbarManageBehaviour: IQAutoToolbarManageBehavior {
+ get { .bySubviews }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+ var shouldToolbarUsesTextFieldTintColor: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+ var toolbarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+ var toolbarBarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+ var previousNextDisplayMode: IQPreviousNextDisplayMode {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+ var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+ get { [] }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+ var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+ var shouldShowToolbarPlaceholder: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+ var placeholderFont: UIFont? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+ var placeholderColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+ var placeholderButtonColor: UIColor? {
+ get { nil }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
new file mode 100644
index 0000000..256e8e3
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
@@ -0,0 +1,148 @@
+//
+// IQKeyboardToolbarManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /** Get all textInputView siblings of textInputView. */
+ func responderViews(of textInputView: some IQTextInputView) -> [any IQTextInputView]? {
+
+ var superConsideredView: UIView?
+
+ // If find any consider responderView in it's upper hierarchy then will get deepResponderView.
+ for allowedClass in deepResponderAllowedContainerClasses {
+ superConsideredView = (textInputView as UIView).iq.superviewOf(type: allowedClass)
+ if superConsideredView != nil {
+ break
+ }
+ }
+
+ let swiftUIHostingView: UIView? = Self.getSwiftUIHostingView(textInputView: textInputView)
+
+ // (Enhancement ID: #22)
+ // If there is a superConsideredView in view's hierarchy,
+ // then fetching all it's subview that responds.
+ // No sorting for superConsideredView, it's by subView position.
+ if let view: UIView = swiftUIHostingView {
+ return view.iq.deepResponderViews()
+ } else if let view: UIView = superConsideredView {
+ return view.iq.deepResponderViews()
+ } else { // Otherwise fetching all the siblings
+
+ let textInputViews: [any IQTextInputView] = textInputView.iq.responderSiblings()
+
+ // Sorting textInputViews according to behavior
+ switch toolbarConfiguration.manageBehavior {
+ // If autoToolbar behavior is bySubviews, then returning it.
+ case .bySubviews: return textInputViews
+
+ // If autoToolbar behavior is by tag, then sorting it according to tag property.
+ case .byTag: return textInputViews.sortedByTag()
+
+ // If autoToolbar behavior is by tag, then sorting it according to tag property.
+ case .byPosition: return textInputViews.sortedByPosition()
+ }
+ }
+ }
+
+ func privateIsEnableAutoToolbar(of textInputView: some IQTextInputView) -> Bool {
+
+ var isEnabled: Bool = isEnabled
+
+ guard var textInputViewController = (textInputView as UIView).iq.viewContainingController() else {
+ return isEnabled
+ }
+
+ if textInputView is UISearchTextField {
+ if let navController: UINavigationController = textInputViewController as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ textInputViewController = topController
+ }
+
+ // Not adding toolbar for searchTextField inside searchController.
+ if textInputViewController.navigationItem.searchController?.searchBar.searchTextField == textInputView {
+ return false
+ }
+ }
+
+ if !isEnabled, enabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+ isEnabled = true
+ }
+
+ if isEnabled {
+
+ // If found any toolbar disabled classes then return.
+ if disabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+ isEnabled = false
+ }
+
+ // Special Controllers
+ if isEnabled {
+
+ let classNameString: String = "\(type(of: textInputViewController.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+
+ return isEnabled
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ private static func getSwiftUIHostingView(textInputView: some IQTextInputView) -> UIView? {
+ var swiftUIHostingView: UIView?
+ let swiftUIHostingViewName: String = "UIHostingView<"
+ var superView: UIView? = textInputView.superview
+ while let aSuperview: UIView = superView {
+
+ let classNameString: String = {
+ var name: String = "\(type(of: aSuperview.self))"
+ if name.hasPrefix("_") {
+ name.removeFirst()
+ }
+ return name
+ }()
+
+ if classNameString.hasPrefix(swiftUIHostingViewName) {
+ swiftUIHostingView = aSuperview
+ break
+ }
+
+ superView = aSuperview.superview
+ }
+ return swiftUIHostingView
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
new file mode 100644
index 0000000..f831fe5
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
@@ -0,0 +1,173 @@
+//
+// IQKeyboardToolbarManager.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+import IQKeyboardToolbar
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarManager: NSObject {
+
+ private let textInputViewObserver: IQTextInputViewNotification = .init()
+ private var storage: Set = []
+
+ internal var textInputView: (some IQTextInputView)? {
+ textInputViewObserver.textInputView
+ }
+
+ /**
+ Returns the default singleton instance.
+ */
+ @MainActor
+ @objc public static let shared: IQKeyboardToolbarManager = .init()
+
+ /**
+ Automatic add the toolbar functionality. Default is false.
+ */
+ public var isEnabled: Bool = false {
+ didSet {
+ reloadInputViews()
+ showLog("isEnabled: \(isEnabled ? "Yes" : "NO")")
+ }
+ }
+
+ public var isDebuggingEnabled: Bool = false
+
+ /**
+ Configurations related to the toolbar display over the keyboard.
+ */
+ public let toolbarConfiguration: IQKeyboardToolbarConfiguration = .init()
+
+ // MARK: UISound handling
+
+ /**
+ If YES, then it plays inputClick sound on next/previous/done click.
+ */
+ public var playInputClicks: Bool = true
+
+ /**
+ Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+ Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+ */
+ public var disabledToolbarClasses: [UIViewController.Type] = [
+ UIAlertController.self,
+ UIInputViewController.self
+ ]
+
+ /**
+ Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+ Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+ */
+ public var enabledToolbarClasses: [UIViewController.Type] = []
+
+ /**
+ Allowed subclasses of UIView to add all inner textInputView,
+ this will allow to navigate between textInputView contains in different superview.
+ Class should be kind of UIView.
+ */
+ public var deepResponderAllowedContainerClasses: [UIView.Type] = [
+ UITableView.self,
+ UICollectionView.self,
+ IQDeepResponderContainerView.self
+ ]
+
+ internal var logIndentation = 0
+
+ internal override init() {
+ super.init()
+
+ addTextInputViewObserver()
+ addBecomeActiveObserver()
+
+ // (Bug ID: #550)
+ // Loading IQKeyboardToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay
+ // If you experience exception breakpoint issue at below line then try these solutions
+ // https://stackoverflow.com/questions/27375640/all-exception-break-point-is-stopping-for-no-reason-on-simulator
+ DispatchQueue.main.async {
+ let textInputView: UITextField = UITextField()
+ textInputView.iq.addDone(target: nil, action: #selector(self.doneAction(_:)))
+ textInputView.iq.addPreviousNextDone(target: nil,
+ previousAction: #selector(self.previousAction(_:)),
+ nextAction: #selector(self.nextAction(_:)),
+ doneAction: #selector(self.doneAction(_:)))
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ private func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardToolbarManager")
+ }
+
+ private func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardToolbarManager",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+ return
+ }
+
+ switch event {
+ case .beginEditing:
+ reloadInputViews()
+ case .endEditing:
+ removeToolbarIfRequired(of: textInputView)
+ }
+ })
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ private func removeBecomeActiveObserver() {
+ storage.forEach { $0.cancel() }
+ storage.removeAll()
+ }
+
+ private func addBecomeActiveObserver() {
+ let beginEditingNotificationNames: [Notification.Name] = [
+ UIApplication.didBecomeActiveNotification
+ ]
+
+ for notificationName in beginEditingNotificationNames {
+ NotificationCenter.default.publisher(for: notificationName)
+ .sink(receiveValue: { [weak self] info in
+ guard let self = self else { return }
+
+ // In SwiftUI View's when app comes from background to foreground
+ // The inputAccessoryView was getting removed in iOS 26. So forcing to reload.
+ self.reloadInputViews()
+ })
+ .store(in: &storage)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
new file mode 100644
index 0000000..1a79819
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
@@ -0,0 +1,210 @@
+//
+// IQKeyboardToolbarManager+Action.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+// MARK: Previous next button actions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ /**
+ Returns YES if can navigate to previous responder textInputView, otherwise NO.
+ */
+ var canGoPrevious: Bool {
+ // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index > 0 else {
+ return false
+ }
+ return true
+ }
+
+ /**
+ Returns YES if can navigate to next responder textInputViews, otherwise NO.
+ */
+ var canGoNext: Bool {
+ // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index < textInputViews.count-1 else {
+ return false
+ }
+ return true
+ }
+
+ /**
+ Navigate to previous responder textInputViews
+ */
+ @discardableResult
+ func goPrevious() -> Bool {
+
+ // If it is not first textInputView. then it's previous object becomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index > 0 else {
+ return false
+ }
+
+ let nextTextInputView: any IQTextInputView = textInputViews[index-1]
+
+ let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+ // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96)
+ if !isAcceptAsFirstResponder {
+ showLog("Refuses to become first responder: \(nextTextInputView)")
+ }
+
+ return isAcceptAsFirstResponder
+ }
+
+ /**
+ Navigate to next responder textInputView.
+ */
+ @discardableResult
+ func goNext() -> Bool {
+
+ // If it is not first textInputView. then it's previous object becomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index < textInputViews.count-1 else {
+ return false
+ }
+
+ let nextTextInputView: any IQTextInputView = textInputViews[index+1]
+
+ let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+ // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96)
+ if !isAcceptAsFirstResponder {
+ showLog("Refuses to become first responder: \(nextTextInputView)")
+ }
+
+ return isAcceptAsFirstResponder
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /** previousAction. */
+ func previousAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard canGoPrevious,
+ let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ let isAcceptedAsFirstResponder: Bool = goPrevious()
+
+ if isAcceptedAsFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+
+ /** nextAction. */
+ func nextAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard canGoNext,
+ let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ let isAcceptedAsFirstResponder: Bool = goNext()
+
+ if isAcceptedAsFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+
+ /** doneAction. Resigning current textInputView. */
+ func doneAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ // Resign textInputView.
+ let isResignedFirstResponder: Bool = textInputView.resignFirstResponder()
+
+ if isResignedFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+ private static func sendInvokeAction(of barButton: IQBarButtonItem, sender: some IQTextInputView) {
+ // Handling search bar special case
+ if let searchBar: UISearchBar = sender.iq.textFieldSearchBar() {
+ switch barButton {
+ case sender.internalToolbar.nextBarButton:
+ searchBar.internalToolbar.nextBarButton.invocation?.invoke(from: searchBar)
+ case sender.internalToolbar.previousBarButton:
+ searchBar.internalToolbar.previousBarButton.invocation?.invoke(from: searchBar)
+ case sender.internalToolbar.doneBarButton:
+ searchBar.internalToolbar.doneBarButton.invocation?.invoke(from: searchBar)
+ default:
+ break
+ }
+ } else {
+ barButton.invocation?.invoke(from: sender)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalToolbar: IQKeyboardToolbar {
+ return iq.toolbar
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
new file mode 100644
index 0000000..b3dd0f4
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
@@ -0,0 +1,287 @@
+//
+// IQKeyboardToolbarManager+Toolbar.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+ /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+ func reloadInputViews() {
+
+ guard let textInputView = textInputView else { return }
+ // If enabled then adding toolbar.
+ if privateIsEnableAutoToolbar(of: textInputView) {
+ self.addToolbarIfRequired(of: textInputView)
+ } else {
+ self.removeToolbarIfRequired(of: textInputView)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /**
+ Default tag for toolbar with Done button -1001
+ */
+ private static let toolbarTag = -1001
+
+ // swiftlint:disable function_body_length
+ // swiftlint:disable cyclomatic_complexity
+ /**
+ Add toolbar if it is required to add on textInputViews and it's siblings.
+ */
+ func addToolbarIfRequired(of textInputView: some IQTextInputView) {
+
+ // Either there is no inputAccessoryView or
+ // if accessoryView is not appropriate for current situation
+ // (There is Previous/Next/Done toolbar)
+ guard let siblings: [any IQTextInputView] = responderViews(of: textInputView), !siblings.isEmpty,
+ !Self.hasUserDefinedInputAccessoryView(textInputView: textInputView) else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ showLog("Found \(siblings.count) responder sibling(s)")
+ let rightConfiguration: IQBarButtonItemConfiguration = getRightConfiguration()
+
+ let isTableCollectionView: Bool
+ if (textInputView as UIView).iq.superviewOf(type: UITableView.self) != nil ||
+ (textInputView as UIView).iq.superviewOf(type: UICollectionView.self) != nil {
+ isTableCollectionView = true
+ } else {
+ isTableCollectionView = false
+ }
+
+ let previousNextDisplayMode: IQPreviousNextDisplayMode = toolbarConfiguration.previousNextDisplayMode
+
+ let havePreviousNext: Bool
+ switch previousNextDisplayMode {
+ case .default:
+ // If the textInputView is part of UITableView/UICollectionView then we should be exposing previous/next too
+ // Because at this time we don't know previous or next cell if it contains another textInputView to move.
+ if isTableCollectionView {
+ havePreviousNext = true
+ } else if siblings.count <= 1 {
+ // If only one object is found, then adding only Done button.
+ havePreviousNext = false
+ } else {
+ havePreviousNext = true
+ }
+ case .alwaysShow:
+ havePreviousNext = true
+ case .alwaysHide:
+ havePreviousNext = false
+ }
+
+ let placeholderConfig: IQKeyboardToolbarPlaceholderConfiguration = toolbarConfiguration.placeholderConfiguration
+ let titleText: String? = placeholderConfig.showPlaceholder ? textInputView.iq.drawingPlaceholder : nil
+ if havePreviousNext {
+ let prevConfiguration: IQBarButtonItemConfiguration = getPreviousConfiguration()
+ let nextConfiguration: IQBarButtonItemConfiguration = getNextConfiguration()
+
+ textInputView.iq.addToolbar(target: self,
+ previousConfiguration: prevConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration, title: titleText,
+ titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+ if isTableCollectionView {
+ // (Bug ID: #56)
+ // In case of UITableView, the next/previous buttons should always be enabled.
+ textInputView.iq.toolbar.previousBarButton.isEnabled = true
+ textInputView.iq.toolbar.nextBarButton.isEnabled = true
+ } else {
+ // If first textInputView, then previous should not be enabled.
+ if let first = siblings.first {
+ textInputView.iq.toolbar.previousBarButton.isEnabled = first != textInputView
+ } else {
+ textInputView.iq.toolbar.previousBarButton.isEnabled = false
+ }
+ // If last textInputView, then next should not be enabled.
+ if let last = siblings.last {
+ textInputView.iq.toolbar.nextBarButton.isEnabled = last != textInputView
+ } else {
+ textInputView.iq.toolbar.nextBarButton.isEnabled = false
+ }
+ }
+ } else {
+ textInputView.iq.addToolbar(target: self, rightConfiguration: rightConfiguration,
+ title: titleText,
+ titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+ }
+ // (Bug ID: #78)
+ textInputView.inputAccessoryView?.tag = IQKeyboardToolbarManager.toolbarTag
+
+ Self.applyToolbarConfiguration(textInputView: textInputView, toolbarConfiguration: toolbarConfiguration)
+ }
+ // swiftlint:enable function_body_length
+ // swiftlint:enable cyclomatic_complexity
+
+ /** Remove any toolbar if it is IQKeyboardToolbar. */
+ func removeToolbarIfRequired(of textInputView: some IQTextInputView) { // (Bug ID: #18)
+
+ guard let toolbar: IQKeyboardToolbar = textInputView.inputAccessoryView as? IQKeyboardToolbar,
+ toolbar.tag == IQKeyboardToolbarManager.toolbarTag else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ textInputView.inputAccessoryView = nil
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ static func hasUserDefinedInputAccessoryView(textInputView: some IQTextInputView) -> Bool {
+ guard let inputAccessoryView: UIView = textInputView.inputAccessoryView,
+ inputAccessoryView.tag != IQKeyboardToolbarManager.toolbarTag else { return false }
+
+ let swiftUIAccessoryNamePrefixes: [String] = [
+ "InputAccessoryHost", // iOS 17 and below
+ "RootUIView", // iOS 18
+ "_UIInputViewContent", // iOS 18 system views
+ "_UIKeyboardInputAccessory" // Additional iOS 18 system view
+ ]
+ let classNameString: String = "\(type(of: inputAccessoryView.classForCoder))"
+
+ // If it's SwiftUI accessory view but doesn't have a height (fake accessory view), then we should
+ // add our own accessoryView otherwise, keep the SwiftUI accessoryView since user has added it from code
+ let isSwiftUIAccessoryView = swiftUIAccessoryNamePrefixes.contains(where: { classNameString.hasPrefix($0) })
+
+ // A height of 0 or very small height typically indicates a system placeholder
+ guard isSwiftUIAccessoryView,
+ inputAccessoryView.subviews.isEmpty else {
+ return true
+ }
+ return false
+ }
+
+ func getRightConfiguration() -> IQBarButtonItemConfiguration {
+ let rightConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.doneBarButtonConfiguration {
+ rightConfiguration = configuration
+ rightConfiguration.action = #selector(self.doneAction(_:))
+ } else {
+#if compiler(>=6.2) // Xcode 26
+ let requiresCompatibility: Bool = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false
+ if #available(iOS 26.0, *), !requiresCompatibility {
+ rightConfiguration = IQBarButtonItemConfiguration(image: UIImage(systemName: "checkmark")!, action: #selector(self.doneAction(_:)))
+ } else {
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:)))
+ }
+#else
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:)))
+#endif
+ rightConfiguration.accessibilityLabel = "Done"
+ }
+ return rightConfiguration
+ }
+
+ func getPreviousConfiguration() -> IQBarButtonItemConfiguration {
+ let prevConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.previousBarButtonConfiguration {
+ configuration.action = #selector(self.previousAction(_:))
+ prevConfiguration = configuration
+ } else {
+ let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+ prevConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+ action: #selector(self.previousAction(_:)))
+ prevConfiguration.accessibilityLabel = "Previous"
+ }
+ return prevConfiguration
+ }
+
+ func getNextConfiguration() -> IQBarButtonItemConfiguration {
+ let nextConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.nextBarButtonConfiguration {
+ configuration.action = #selector(self.nextAction(_:))
+ nextConfiguration = configuration
+ } else {
+ let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+ nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+ action: #selector(self.nextAction(_:)))
+ nextConfiguration.accessibilityLabel = "Next"
+ }
+ return nextConfiguration
+ }
+
+ static func applyToolbarConfiguration(textInputView: some IQTextInputView,
+ toolbarConfiguration: IQKeyboardToolbarConfiguration) {
+
+ let toolbar: IQKeyboardToolbar = textInputView.iq.toolbar
+
+ // Setting toolbar tintColor // (Enhancement ID: #30)
+ if toolbarConfiguration.useTextInputViewTintColor {
+ toolbar.tintColor = textInputView.tintColor
+ } else {
+ toolbar.tintColor = toolbarConfiguration.tintColor
+ }
+
+ // Bar style according to keyboard appearance
+ switch textInputView.keyboardAppearance {
+ case .dark:
+ toolbar.barStyle = .black
+ toolbar.barTintColor = nil
+ default:
+ toolbar.barStyle = .default
+ toolbar.barTintColor = toolbarConfiguration.barTintColor
+ }
+
+ // Setting toolbar title font. // (Enhancement ID: #30)
+ guard toolbarConfiguration.placeholderConfiguration.showPlaceholder,
+ !textInputView.iq.hidePlaceholder else {
+ toolbar.titleBarButton.title = nil
+ return
+ }
+
+ // Updating placeholder font to toolbar. //(Bug ID: #148, #272)
+ if toolbar.titleBarButton.title == nil ||
+ toolbar.titleBarButton.title != textInputView.iq.drawingPlaceholder {
+ toolbar.titleBarButton.title = textInputView.iq.drawingPlaceholder
+ }
+
+ // Setting toolbar title font. // (Enhancement ID: #30)
+ toolbar.titleBarButton.titleFont = toolbarConfiguration.placeholderConfiguration.font
+
+ // Setting toolbar title color. // (Enhancement ID: #880)
+ toolbar.titleBarButton.titleColor = toolbarConfiguration.placeholderConfiguration.color
+
+ // Setting toolbar button title color. // (Enhancement ID: #880)
+ toolbar.titleBarButton.selectableTitleColor = toolbarConfiguration.placeholderConfiguration.buttonColor
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
new file mode 100644
index 0000000..83a8b9c
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
@@ -0,0 +1,58 @@
+//
+// Array+Sort.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+UIView.subviews sorting category.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension Array where Element: IQTextInputView {
+
+ /**
+ Returns the array by sorting the UIView's by their tag property.
+ */
+ func sortedByTag() -> [Element] {
+
+ return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+
+ return (obj1.tag < obj2.tag)
+ })
+ }
+
+ /**
+ Returns the array by sorting the UIView's by their tag property.
+ */
+ func sortedByPosition() -> [Element] {
+
+ return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+ if obj1.frame.minY != obj2.frame.minY {
+ return obj1.frame.minY < obj2.frame.minY
+ } else {
+ return obj1.frame.minX < obj2.frame.minX
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
new file mode 100644
index 0000000..592399e
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
@@ -0,0 +1,179 @@
+//
+// UIView+Responders.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var ignoreSwitchingByNextPrevious: Int = 0
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ If ignoreSwitchingByNextPrevious is true then library will ignore this textInputView
+ while moving to other textInputView using keyboard toolbar next previous buttons.
+ Default is false
+ */
+ var ignoreSwitchingByNextPrevious: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ @available(*, unavailable, renamed: "iq.ignoreSwitchingByNextPrevious")
+ var ignoreSwitchingByNextPrevious: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ Returns all siblings of the receiver which canBecomeFirstResponder.
+ */
+ func responderSiblings() -> [any IQTextInputView] {
+
+ // Getting all siblings
+ guard let siblings: [UIView] = base?.superview?.subviews else { return [] }
+
+ // Array of textInputView.
+ var textInputViews: [any IQTextInputView] = []
+ for view in siblings {
+ if let view = view as? any IQTextInputView,
+ view == base || !view.internalIgnoreSwitchingByNextPrevious,
+ view.internalCanBecomeFirstResponder() {
+ textInputViews.append(view)
+ }
+ }
+
+ return textInputViews
+ }
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: UIView {
+
+ /**
+ Returns all deep subViews of the receiver which canBecomeFirstResponder.
+ */
+ func deepResponderViews() -> [any IQTextInputView] {
+
+ guard let subviews: [UIView] = base?.subviews, !subviews.isEmpty else { return [] }
+
+ // Array of textInputViews.
+ var textInputViews: [any IQTextInputView] = []
+
+ for view in subviews {
+
+ if let view = view as? any IQTextInputView,
+ view == base || !view.internalIgnoreSwitchingByNextPrevious,
+ view.internalCanBecomeFirstResponder() {
+ textInputViews.append(view)
+ }
+ // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+ // so we added some more validations here (Bug ID: #458)
+ // Uncommented else (Bug ID: #625)
+ else if view.subviews.count != 0,
+ base?.isUserInteractionEnabled == true,
+ base?.isHidden == false, base?.alpha != 0.0 {
+ for deepView in view.iq.deepResponderViews() {
+ textInputViews.append(deepView)
+ }
+ }
+ }
+
+ // subviews are returning in opposite order. Sorting according the frames 'y'.
+ return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+ let frame1: CGRect = view1.convert(view1.bounds, to: base)
+ let frame2: CGRect = view2.convert(view2.bounds, to: base)
+
+ if frame1.minY != frame2.minY {
+ return frame1.minY < frame2.minY
+ } else {
+ return frame1.minX < frame2.minX
+ }
+ })
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+ func canBecomeFirstResponder() -> Bool {
+
+ var canBecomeFirstResponder: Bool = base?.iqIsEnabled == true
+
+ if canBecomeFirstResponder {
+ canBecomeFirstResponder = base?.isUserInteractionEnabled == true &&
+ base?.isHidden == false &&
+ base?.alpha != 0.0 &&
+ !isAlertViewTextField() &&
+ textFieldSearchBar() == nil
+ }
+
+ return canBecomeFirstResponder
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalIgnoreSwitchingByNextPrevious: Bool {
+ return iq.ignoreSwitchingByNextPrevious
+ }
+ func internalCanBecomeFirstResponder() -> Bool {
+ return iq.canBecomeFirstResponder()
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
new file mode 100644
index 0000000..f8113e6
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
@@ -0,0 +1,44 @@
+//
+// UIView+RespondersObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_ignoreSwitchingByNextPrevious: Bool {
+ get { iq.ignoreSwitchingByNextPrevious }
+ set { iq.ignoreSwitchingByNextPrevious = newValue }
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_ignoreSwitchingByNextPrevious: Bool {
+ get { iq.ignoreSwitchingByNextPrevious }
+ set { iq.ignoreSwitchingByNextPrevious = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardToolbarManager/LICENSE b/Pods/IQKeyboardToolbarManager/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardToolbarManager/README.md b/Pods/IQKeyboardToolbarManager/README.md
new file mode 100644
index 0000000..1e995a9
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/README.md
@@ -0,0 +1,134 @@
+# IQKeyboardToolbarManager
+
+[](https://travis-ci.org/hackiftekhar/IQKeyboardToolbarManager)
+[](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+### Swift Package Manager (Recommended)
+
+IQKeyboardToolbarManager is available through [Swift Package Manager](https://swift.org/package-manager/).
+
+**Requirements:** iOS 13.0+, Swift 5.7+
+
+#### Using Xcode:
+1. In Xcode, go to `File` → `Add Package Dependencies...`
+2. Enter the repository URL: `https://github.com/hackiftekhar/IQKeyboardToolbarManager`
+3. Select the version rule (e.g., "Up to Next Major Version")
+4. Click `Add Package`
+5. Select the `IQKeyboardToolbarManager` library and click `Add Package`
+
+#### Using Package.swift:
+Add the following dependency to your `Package.swift` file:
+
+```swift
+dependencies: [
+ .package(url: "https://github.com/hackiftekhar/IQKeyboardToolbarManager", from: "1.1.3")
+]
+```
+
+Then add `IQKeyboardToolbarManager` to your target dependencies:
+
+```swift
+.target(
+ name: "YourTarget",
+ dependencies: ["IQKeyboardToolbarManager"]
+)
+```
+
+### CocoaPods
+
+IQKeyboardToolbarManager is also available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbarManager'
+```
+
+### Carthage
+
+Add the following line to your `Cartfile`:
+
+```
+github "hackiftekhar/IQKeyboardToolbarManager"
+```
+
+## Usage
+
+After adding IQKeyboardToolbarManager to your project, import it and enable toolbar handling in AppDelegate:
+
+```swift
+import UIKit
+import IQKeyboardToolbarManager
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ IQKeyboardToolbarManager.shared.isEnabled = true
+ return true
+ }
+```
+
+Cuistomize Behavior
+```swift
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = true
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = UIColor.systemGreen
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.barTintColor = UIColor.systemYellow
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.previousNextDisplayMode = .alwaysShow
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = .byPosition
+
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.previousBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.nextBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.showPlaceholder = false
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.font = UIFont.italicSystemFont(ofSize: 14)
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.color = UIColor.systemPurple
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.buttonColor = UIColor.systemBrown // This is used only if placeholder is an action button
+
+ IQKeyboardToolbarManager.shared.playInputClicks = false
+
+ IQKeyboardToolbarManager.shared.disabledToolbarClasses.append(ChatViewController.self)
+ IQKeyboardToolbarManager.shared.enabledToolbarClasses.append(LoginViewController.self)
+ IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses.append(UIStackView.self)
+```
+
+Useful functions and variables
+```swift
+ if IQKeyboardToolbarManager.shared.canGoPrevious {
+ ...
+ }
+
+ if IQKeyboardToolbarManager.shared.canGoNext {
+ ...
+ }
+
+ IQKeyboardToolbarManager.shared.goPrevious()
+ IQKeyboardToolbarManager.shared.goNext()
+
+ IQKeyboardToolbarManager.shared.reloadInputViews() // If some textInputView hierarchy are changed on the fly then use this to reload button states
+```
+
+Useful functions and variables for TextInputView
+```swift
+ textField.iq.ignoreSwitchingByNextPrevious = false
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbarManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
new file mode 100644
index 0000000..dfc954a
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
@@ -0,0 +1,91 @@
+//
+// IQTextInputViewInfo.swift
+// https://github.com/hackiftekhar/IQTextInputViewNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+public import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public struct IQTextInputViewInfo: Equatable {
+
+ nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.textInputView == rhs.textInputView &&
+ lhs.event == rhs.event
+ }
+
+ @MainActor
+ @objc public enum Event: Int {
+ case beginEditing
+ case endEditing
+
+ public var name: String {
+ switch self {
+ case .beginEditing:
+ return "BeginEditing"
+ case .endEditing:
+ return "EndEditing"
+ }
+ }
+ }
+
+ public let event: Event
+
+ public let textInputView: any IQTextInputView
+
+ internal init?(notification: Notification, event: Event) {
+ guard let view: any IQTextInputView = notification.object as? (any IQTextInputView) else {
+ return nil
+ }
+
+ self.event = event
+ textInputView = view
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+public extension IQTextInputViewInfo {
+
+ @available(*, unavailable, renamed: "event")
+ var name: Event { event }
+
+ @available(*, unavailable, renamed: "textInputView")
+ var textFieldView: any IQTextInputView { textInputView }
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewInfo")
+@MainActor
+public struct IQTextFieldViewInfo: Equatable {}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQTextInputViewInfoObjC: NSObject {
+ private let wrappedValue: IQTextInputViewInfo
+
+ public var event: IQTextInputViewInfo.Event { wrappedValue.event }
+
+ public var textInputView: any IQTextInputView { wrappedValue.textInputView }
+
+ init(wrappedValue: IQTextInputViewInfo){
+ self.wrappedValue = wrappedValue
+ }
+}
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
new file mode 100644
index 0000000..61bfd40
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
@@ -0,0 +1,196 @@
+//
+// IQTextInputViewNotification.swift
+// https://github.com/hackiftekhar/IQTextInputViewNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import Combine
+public import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQTextInputViewNotification: NSObject {
+
+ private var storage: Set = []
+
+ private var textInputViewObservers: [AnyHashable: TextInputViewCompletion] = [:]
+
+ private var findInteractionTextInputViewInfo: IQTextInputViewInfo?
+
+ public private(set) var textInputViewInfo: IQTextInputViewInfo?
+
+ public var event: IQTextInputViewInfo.Event? {
+ textInputViewInfo?.event
+ }
+
+ public var textInputView: (any IQTextInputView)? {
+ return textInputViewInfo?.textInputView
+ }
+
+ public override init() {
+ super.init()
+
+ // Registering for TextInputView notification.
+ do {
+ let beginEditingNotificationNames: [Notification.Name] = [
+ UITextField.textDidBeginEditingNotification,
+ UITextView.textDidBeginEditingNotification
+ ]
+
+ for notificationName in beginEditingNotificationNames {
+ NotificationCenter.default.publisher(for: notificationName)
+ .compactMap({ IQTextInputViewInfo(notification: $0, event: .beginEditing) })
+ .sink(receiveValue: { [weak self] info in
+ guard let self = self else { return }
+ self.didBeginEditing(info: info)
+ })
+ .store(in: &storage)
+ }
+ }
+
+ do {
+ let endEditingNotificationNames: [Notification.Name] = [
+ UITextField.textDidEndEditingNotification,
+ UITextView.textDidEndEditingNotification
+ ]
+
+ for notificationName in endEditingNotificationNames {
+ NotificationCenter.default.publisher(for: notificationName)
+ .compactMap({ IQTextInputViewInfo(notification: $0, event: .endEditing) })
+ .sink(receiveValue: { [weak self] info in
+ guard let self = self else { return }
+ self.didEndEditing(info: info)
+ })
+ .store(in: &storage)
+ }
+ }
+ }
+
+ private func didBeginEditing(info: IQTextInputViewInfo) {
+
+#if compiler(>=5.7) // Xcode 14
+ if #available(iOS 16.0, *),
+ let findInteractionTextInputViewInfo = findInteractionTextInputViewInfo,
+ findInteractionTextInputViewInfo.textInputView.iqFindInteraction?.isFindNavigatorVisible == true {
+ // // This means the this didBeginEditing call comes due to find interaction
+ textInputViewInfo = findInteractionTextInputViewInfo
+ sendEvent(info: findInteractionTextInputViewInfo)
+ } else if textInputViewInfo != info {
+ textInputViewInfo = info
+ findInteractionTextInputViewInfo = nil
+ sendEvent(info: info)
+ } else {
+ findInteractionTextInputViewInfo = nil
+ }
+#else
+ if textInputViewInfo != info {
+ textInputViewInfo = info
+ findInteractionTextInputViewInfo = nil
+ sendEvent(info: info)
+ } else {
+ findInteractionTextInputViewInfo = nil
+ }
+#endif
+ }
+
+ private func didEndEditing(info: IQTextInputViewInfo) {
+
+ if textInputViewInfo != info {
+#if compiler(>=5.7) // Xcode 14
+ if #available(iOS 16.0, *),
+ info.textInputView.iqIsFindInteractionEnabled {
+ findInteractionTextInputViewInfo = textInputViewInfo
+ } else {
+ findInteractionTextInputViewInfo = nil
+ }
+#else
+ findInteractionTextInputViewInfo = nil
+#endif
+ textInputViewInfo = info
+ sendEvent(info: info)
+ textInputViewInfo = nil
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+ typealias TextInputViewCompletion = (_ event: IQTextInputViewInfo.Event,
+ _ textInputView: any IQTextInputView) -> Void
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {
+ textInputViewObservers[identifier] = changeHandler
+
+ if let textInputViewInfo = textInputViewInfo {
+ changeHandler(textInputViewInfo.event, textInputViewInfo.textInputView)
+ }
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ textInputViewObservers[identifier] = nil
+ }
+
+ func isSubscribed(identifier: AnyHashable) -> Bool {
+ return textInputViewObservers[identifier] != nil
+ }
+
+ @nonobjc
+ private func sendEvent(info: IQTextInputViewInfo) {
+
+ for block in textInputViewObservers.values {
+ block(info.event, info.textInputView)
+ }
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQTextInputViewNotification {
+
+ @available(*, unavailable, renamed: "textInputViewInfo")
+ var textFieldViewInfo: IQTextInputViewInfo? { textInputViewInfo }
+
+ @available(*, unavailable, renamed: "textInputView")
+ var textFieldView: (some IQTextInputView)? { textInputView }
+
+ @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)")
+ func registerTextFieldViewChange(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {}
+
+ @available(*, unavailable, renamed: "unsubscribe(identifier:)")
+ func unregisterSizeChange(identifier: AnyHashable) {}
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+ var textInputViewInfoObjc: IQTextInputViewInfoObjC? {
+ guard let textInputViewInfo = textInputViewInfo else { return nil }
+ return IQTextInputViewInfoObjC(wrappedValue: textInputViewInfo)
+ }
+}
diff --git a/Pods/IQTextInputViewNotification/LICENSE b/Pods/IQTextInputViewNotification/LICENSE
new file mode 100644
index 0000000..4440a40
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2024 hackiftekhar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Pods/IQTextInputViewNotification/README.md b/Pods/IQTextInputViewNotification/README.md
new file mode 100644
index 0000000..3926512
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/README.md
@@ -0,0 +1,66 @@
+# IQTextInputViewNotification
+
+[](https://travis-ci.org/hackiftekhar/IQTextInputViewNotification)
+[](https://cocoapods.org/pods/IQTextInputViewNotification)
+[](https://cocoapods.org/pods/IQTextInputViewNotification)
+[](https://cocoapods.org/pods/IQTextInputViewNotification)
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextInputViewNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextInputViewNotification'
+```
+
+## Usage
+
+To observe textInputView becomeFirstResponder and resignFirstResponder changes, subscribe to the textInputView events:-
+
+```swift
+import IQTextInputViewNotification
+
+class ViewController: UIViewController {
+
+ private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+
+ // Subscribe
+ textInputViewObserver.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") {info in
+ print(info.event.name) // BeginEditing or EndEditing event
+ print(info.textInputView) // TextInputView which begin editing or end editing
+ // Write your own logic here based on event
+ }
+ }
+
+ override func viewWillDisappear(_ animated: Bool) {
+ super.viewWillDisappear(animated)
+
+ // Unsubscribe
+ textInputViewObserver.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER")
+ }
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+
+
+## License
+
+IQTextInputViewNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
new file mode 100644
index 0000000..1cf3954
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
@@ -0,0 +1,29 @@
+//
+// IQTextView.swift
+// https://github.com/hackiftekhar/IQTextView
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQTextView: IQPlaceholderable { }
diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift
new file mode 100644
index 0000000..9c49e51
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift
@@ -0,0 +1,193 @@
+//
+// IQTextView.swift
+// https://github.com/hackiftekhar/IQTextView
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/** @abstract UITextView with placeholder support */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTextView: UITextView {
+
+ required public init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ setup()
+ }
+
+ override public init(frame: CGRect, textContainer: NSTextContainer?) {
+ super.init(frame: frame, textContainer: textContainer)
+ setup()
+ }
+
+ override open func awakeFromNib() {
+ super.awakeFromNib()
+ setup()
+ }
+
+ private func setup() {
+ NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder),
+ name: UITextView.textDidChangeNotification, object: self)
+
+ do {
+ placeholderLabel.frame = placeholderExpectedFrame
+ placeholderLabel.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ placeholderLabel.lineBreakMode = .byWordWrapping
+ placeholderLabel.numberOfLines = 0
+ placeholderLabel.font = self.font
+ placeholderLabel.textAlignment = self.textAlignment
+ placeholderLabel.backgroundColor = UIColor.clear
+ placeholderLabel.isAccessibilityElement = false
+ placeholderLabel.textColor = UIColor.placeholderText
+ self.addSubview(placeholderLabel)
+ refreshPlaceholder()
+ }
+ }
+
+ private var placeholderInsets: UIEdgeInsets {
+ let top: CGFloat = self.textContainerInset.top
+ let left: CGFloat = self.textContainerInset.left + self.textContainer.lineFragmentPadding
+ let bottom: CGFloat = self.textContainerInset.bottom
+ let right: CGFloat = self.textContainerInset.right + self.textContainer.lineFragmentPadding
+ return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
+ }
+
+ private var placeholderExpectedFrame: CGRect {
+ let insets: UIEdgeInsets = self.placeholderInsets
+ let maxWidth: CGFloat = self.frame.width-insets.left-insets.right
+ let size: CGSize = CGSize(width: maxWidth, height: self.frame.height-insets.top-insets.bottom)
+ let expectedSize: CGSize = placeholderLabel.sizeThatFits(size)
+
+ return CGRect(x: insets.left, y: insets.top, width: maxWidth, height: expectedSize.height)
+ }
+
+ public let placeholderLabel: UILabel = .init()
+
+ /** @abstract To set textView's placeholder text color. */
+ @IBInspectable open var placeholderTextColor: UIColor? {
+
+ get {
+ return placeholderLabel.textColor
+ }
+
+ set {
+ placeholderLabel.textColor = newValue
+ }
+ }
+
+ /** @abstract To set textView's placeholder text. Default is nil. */
+ @IBInspectable open var placeholder: String? {
+
+ get {
+ return placeholderLabel.text
+ }
+
+ set {
+ placeholderLabel.text = newValue
+ refreshPlaceholder()
+ }
+ }
+
+ /** @abstract To set textView's placeholder attributed text. Default is nil. */
+ open var attributedPlaceholder: NSAttributedString? {
+ get {
+ return placeholderLabel.attributedText
+ }
+
+ set {
+ placeholderLabel.attributedText = newValue
+ refreshPlaceholder()
+ }
+ }
+
+ open override func layoutSubviews() {
+ super.layoutSubviews()
+
+ placeholderLabel.frame = placeholderExpectedFrame
+ }
+
+ @objc private func refreshPlaceholder() {
+
+ let text: String = text ?? attributedText?.string ?? ""
+ placeholderLabel.alpha = text.isEmpty ? 1 : 0
+ }
+
+ open override var text: String! {
+
+ didSet {
+ refreshPlaceholder()
+ }
+ }
+
+ open override var attributedText: NSAttributedString! {
+
+ didSet {
+ refreshPlaceholder()
+ }
+ }
+
+ open override var font: UIFont? {
+
+ didSet {
+
+ if let font: UIFont = font {
+ placeholderLabel.font = font
+ } else {
+ placeholderLabel.font = UIFont.systemFont(ofSize: 12)
+ }
+ }
+ }
+
+ open override var textAlignment: NSTextAlignment {
+ didSet {
+ placeholderLabel.textAlignment = textAlignment
+ }
+ }
+
+ open override var intrinsicContentSize: CGSize {
+ guard !hasText else {
+ return super.intrinsicContentSize
+ }
+
+ var newSize: CGSize = super.intrinsicContentSize
+ let placeholderInsets: UIEdgeInsets = self.placeholderInsets
+ newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom
+
+ return newSize
+ }
+
+ open override func caretRect(for position: UITextPosition) -> CGRect {
+ var originalRect = super.caretRect(for: position)
+
+ // When placeholder is visible and text alignment is centered
+ guard placeholderLabel.alpha == 1 && self.textAlignment == .center else { return originalRect }
+
+ // Calculate the width of the placeholder text
+ let font = placeholderLabel.font ?? UIFont.systemFont(ofSize: UIFont.systemFontSize)
+ let textSize = placeholderLabel.text?.size(withAttributes: [.font: font]) ?? .zero
+ // Calculate the starting x position of the centered placeholder text
+ let centeredTextX = (self.bounds.size.width - textSize.width) / 2
+ // Update the caret position to match the starting x position of the centered text
+ originalRect.origin.x = centeredTextX
+
+ return originalRect
+ }
+}
diff --git a/Pods/IQTextView/LICENSE b/Pods/IQTextView/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQTextView/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQTextView/README.md b/Pods/IQTextView/README.md
new file mode 100644
index 0000000..417325e
--- /dev/null
+++ b/Pods/IQTextView/README.md
@@ -0,0 +1,48 @@
+# IQTextView
+
+[](https://travis-ci.org/hackiftekhar/IQTextView)
+[](https://cocoapods.org/pods/IQTextView)
+[](https://cocoapods.org/pods/IQTextView)
+[](https://cocoapods.org/pods/IQTextView)
+
+
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextView is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextView'
+```
+
+## Usage
+
+You can set any UITextView class to IQTextView and then you can change the placeholder and placeholderTextColor from the storyboard
+
+To change them via code, you may have to set them programmatically
+```swift
+textView.placeholderTextColor = UIColor.lightGray
+textView.placeholder = "Enter your message here..."
+```
+
+To work this with IQKeyboardToolbarManager to show placeholder in toolbar, you may have to confirm IQPlaceholderable manually in your code
+```swift
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQTextView: IQPlaceholderable { }
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQTextView is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock
index 48e9e52..03ed760 100644
--- a/Pods/Manifest.lock
+++ b/Pods/Manifest.lock
@@ -6,6 +6,46 @@ PODS:
- AMapFoundation-NO-IDFA (>= 1.9.0)
- AMapSearch-NO-IDFA (9.8.0):
- AMapFoundation-NO-IDFA (>= 1.9.0)
+ - IQKeyboardCore (1.0.9)
+ - IQKeyboardManagerSwift (8.0.3):
+ - IQKeyboardManagerSwift/Appearance (= 8.0.3)
+ - IQKeyboardManagerSwift/Core (= 8.0.3)
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.3)
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.3)
+ - IQKeyboardManagerSwift/IQTextView (= 8.0.3)
+ - IQKeyboardManagerSwift/Resign (= 8.0.3)
+ - IQKeyboardManagerSwift/Appearance (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/Core (8.0.3):
+ - IQKeyboardNotification
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.3):
+ - IQKeyboardReturnManager
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardToolbarManager
+ - IQKeyboardManagerSwift/IQTextView (8.0.3):
+ - IQTextView
+ - IQKeyboardManagerSwift/Resign (8.0.3):
+ - IQKeyboardManagerSwift/Core
+ - IQTextInputViewNotification
+ - IQKeyboardNotification (1.0.7)
+ - IQKeyboardReturnManager (1.0.6):
+ - IQKeyboardCore
+ - IQKeyboardToolbar (1.1.5):
+ - IQKeyboardToolbar/Core (= 1.1.5)
+ - IQKeyboardToolbar/Core (1.1.5):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Placeholderable
+ - IQKeyboardToolbar/Placeholderable (1.1.5)
+ - IQKeyboardToolbarManager (1.1.6):
+ - IQKeyboardToolbar
+ - IQTextInputViewNotification
+ - IQTextInputViewNotification (1.0.9):
+ - IQKeyboardCore
+ - IQTextView (1.0.5):
+ - IQKeyboardToolbar/Placeholderable
- UMAPM (2.0.7):
- UMCommon
- UMCommon (7.5.11):
@@ -17,6 +57,7 @@ DEPENDENCIES:
- AMap3DMap-NO-IDFA
- AMapLocation-NO-IDFA
- AMapSearch-NO-IDFA
+ - IQKeyboardManagerSwift
- UMAPM
- UMCommon
- UMDevice
@@ -28,6 +69,14 @@ SPEC REPOS:
- AMapFoundation-NO-IDFA
- AMapLocation-NO-IDFA
- AMapSearch-NO-IDFA
+ - IQKeyboardCore
+ - IQKeyboardManagerSwift
+ - IQKeyboardNotification
+ - IQKeyboardReturnManager
+ - IQKeyboardToolbar
+ - IQKeyboardToolbarManager
+ - IQTextInputViewNotification
+ - IQTextView
- UMAPM
- UMCommon
- UMDevice
@@ -38,11 +87,19 @@ SPEC CHECKSUMS:
AMapFoundation-NO-IDFA: a2e3c895398d7ee757278e1a0a8f9359da4b146e
AMapLocation-NO-IDFA: 7cd8fc837ea41edfbf4d937cd20572e277b77d18
AMapSearch-NO-IDFA: c0afd2a69a076d4228becda4401dbe4a279a03ef
+ IQKeyboardCore: 250a88dfc713b2ecbe1dce250811d054fc016959
+ IQKeyboardManagerSwift: 7f6a9a1e2285732d3ff5f485ff921215253ea77e
+ IQKeyboardNotification: 3b9bc812a5af2cf97df08a363d9daa9fc0dc1848
+ IQKeyboardReturnManager: fcbf51fc68d7536fc1fbcca5231c4e82576b12ac
+ IQKeyboardToolbar: b0f26e43b9e806e961fde2344fe379ae193236b9
+ IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
+ IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
+ IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
-PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f
+PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f
COCOAPODS: 1.16.2
diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj
index 5a6dda6..ceb649a 100644
--- a/Pods/Pods.xcodeproj/project.pbxproj
+++ b/Pods/Pods.xcodeproj/project.pbxproj
@@ -9,12 +9,12 @@
/* Begin PBXAggregateTarget section */
09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */ = {
isa = PBXAggregateTarget;
- buildConfigurationList = 4BD363A7955A50B752C0F2EE46DF82FA /* Build configuration list for PBXAggregateTarget "UMCommon" */;
+ buildConfigurationList = 644D892EDFA6381DC82D71DC5C2F8D6F /* Build configuration list for PBXAggregateTarget "UMCommon" */;
buildPhases = (
- EF0E3FC9B6EE1A9C908433C323228B7C /* [CP] Copy XCFrameworks */,
+ FBE5DA9F98D23090BE0A41FECC364DF2 /* [CP] Copy XCFrameworks */,
);
dependencies = (
- 21EC4402F23CC89322584C4190C64981 /* PBXTargetDependency */,
+ 0F7A67AD8E9321DD125EDE4532C7B621 /* PBXTargetDependency */,
);
name = UMCommon;
};
@@ -24,7 +24,7 @@
buildPhases = (
);
dependencies = (
- AF80A180C5B3841DFC72A45C419B14BC /* PBXTargetDependency */,
+ 33555EC29BF8027B235703241C066690 /* PBXTargetDependency */,
);
name = "AMapLocation-NO-IDFA";
};
@@ -34,7 +34,7 @@
buildPhases = (
);
dependencies = (
- 29F474965F0AB7D17DB4A3D89EA9E86F /* PBXTargetDependency */,
+ EFD4EFE6FD52288812EE28A45E4AF5D9 /* PBXTargetDependency */,
);
name = "AMapSearch-NO-IDFA";
};
@@ -50,7 +50,7 @@
};
9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */ = {
isa = PBXAggregateTarget;
- buildConfigurationList = 946C13012BDBDC56DC9D26E19BA9D129 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */;
+ buildConfigurationList = D55DE508D232101A9401C119066B1179 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */;
buildPhases = (
);
dependencies = (
@@ -63,15 +63,15 @@
buildPhases = (
);
dependencies = (
- 39E8D398FFF9E2EF5EFCC030000214A6 /* PBXTargetDependency */,
+ 35ADED26003EA4A70C9A299D7FE29C82 /* PBXTargetDependency */,
);
name = "AMap3DMap-NO-IDFA";
};
CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */ = {
isa = PBXAggregateTarget;
- buildConfigurationList = B9E2AB2044DB991A9B55D980CEBF2D9A /* Build configuration list for PBXAggregateTarget "UMDevice" */;
+ buildConfigurationList = B4B24BD4D38051C4B3F72F56A9E471F1 /* Build configuration list for PBXAggregateTarget "UMDevice" */;
buildPhases = (
- EFB006F9E64CF4C9C37AA7A9DEC5BE68 /* [CP] Copy XCFrameworks */,
+ 1FBBEABC5CD4F9D8B761ABFBC501A335 /* [CP] Copy XCFrameworks */,
);
dependencies = (
);
@@ -84,281 +84,877 @@
47CF44479ABE0A5C18DEDA0F07935DF1 /* [CP] Copy XCFrameworks */,
);
dependencies = (
- 4EB0F71C76E065029AE9C426A2B43B81 /* PBXTargetDependency */,
+ D479FCE32A53C8D1560C1DC682887585 /* PBXTargetDependency */,
);
name = UMAPM;
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
- 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 38345B1EC1DA5F3668EE44701253E92A /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */; };
- 854C28C6CC7D858B9645ED10D409AF6C /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */; };
- 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; };
- 9EDCFA51CF55ABD87CD178D9700B89C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; };
+ 01216C042B056FFF0FC7EE32A002C38A /* IQKeyboardCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 12577E7D396AF4A0D52E8BF9EAB0B178 /* IQKeyboardCore-dummy.m */; };
+ 01772F3F31A552C1898094C34995FBFF /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE29BCA8BFDA54E4CD9B0D3354642A00 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */; };
+ 01F707D90E40C64CEF6B0130CD6A178E /* UIView+RespondersObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 538CBFD998EF3722E7689C6296456C1C /* UIView+RespondersObjc.swift */; };
+ 03B31AAA8FE764D9264C465B87FF5958 /* IQKeyboardToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05DAA96D10BBDD4CD0563EF76883B8CA /* IQKeyboardToolbarManager.swift */; };
+ 054617E019D116086EBE9EE351830049 /* IQKeyboardToolbar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 98C600FCCEF4A91D173BC8EFDC782856 /* IQKeyboardToolbar-dummy.m */; };
+ 065F8A3FABA2CA581B78AC88FCC1DF04 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 066ED3786057BC51273F52D91A507355 /* IQKeyboardToolbarManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A2FAE36062DB36A7A86FD2D8816B14 /* IQKeyboardToolbarManager+Toolbar.swift */; };
+ 0722BBD7A89C873C7C0E877B434244D8 /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C330EE82C2618812608F6AE8A6E63A9 /* IQKeyboardReturnManager+UITextViewDelegate.swift */; };
+ 07609DBC62C85DFEEECD636C0653127E /* IQKeyboardManager+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DC6694ECD3E3A0881A97E842D83D49 /* IQKeyboardManager+Resign.swift */; };
+ 0C9FB8BAE5BAD8ED89791BD43900B800 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 100A572B2597C5AD09168107D45F9929 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; };
+ 13AAA3B389AEE7BFD334A90B67B9509B /* IQKeyboardReturnManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E609D1C2E46F6003B156E9308AED0D51 /* IQKeyboardReturnManager-dummy.m */; };
+ 13B75C893C5241E8C6D4A8A7C1FE56C9 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4BF580BDA53A23D79EE15962CCF36C /* IQKeyboardManager+Position.swift */; };
+ 16A2854239094F2F08D7D8A0579E7CA4 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C0982FA7F37AF2EF650B5353744211C /* UIView+IQKeyboardExtensionDeprecated.swift */; };
+ 189A6E9D301AAF25AE03E5696A0539D7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ 1A0ED97718867A07C7020B8BBD889B25 /* UIView+Parent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D9EBCEF6F3F2A232E2FD51767D24513 /* UIView+Parent.swift */; };
+ 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 1DFA9FF0E56B7211CC945955627F680B /* IQTextView+Placeholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0138A528AE020D49E92C528899B69E6 /* IQTextView+Placeholderable.swift */; };
+ 2188FDE07E4F76E9F50623C7DEC91B90 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 25C8C1DC571620C676F59FEBA032B95F /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = C318D1B54A3D843401F9DA4933592E1B /* IQKeyboardManager+Debug.swift */; };
+ 2C9181EF6A244D525D5CDE45CC776350 /* IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68F50E3C54264FA6F8FEC4D7C86F2A8E /* IQKeyboardToolbar.swift */; };
+ 2E2E33A7CE9A23D5A01049599E8ED1B4 /* IQKeyboardManager+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2036A3FB465FF366E97BF39DEE669F09 /* IQKeyboardManager+Appearance.swift */; };
+ 371EE3B1682699E7C9A8F2835032478E /* UIView+IQKeyboardExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B35E9590B445883D21697E01ACFFF1E /* UIView+IQKeyboardExtensionObjc.swift */; };
+ 378BD5280F6C07B11CF30B253D824972 /* IQKeyboardExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7F6E3397C4BCFEFDBC1AFAF7AD8F64 /* IQKeyboardExtended.swift */; };
+ 3AA85F341A703A0E91707613BC1FBB2F /* UIView+ParentObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E7C51C9D03E4F23E428C0C1AFFE32A7 /* UIView+ParentObjc.swift */; };
+ 3AFBD37DF163254F6695A0CF8105B741 /* IQTextView-IQTextView in Resources */ = {isa = PBXBuildFile; fileRef = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */; };
+ 3BDC0695F069416FED48F824C55F90AB /* UICollectionView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC30B9EBF71A33CFE3B7A50F7A262A1 /* UICollectionView+IndexPaths.swift */; };
+ 3E715D5BADDEACEEF30D6A4CA82CDA9B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ 3EE43A1A7294F331DA0172D3DA2DE250 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */ = {isa = PBXBuildFile; fileRef = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */; };
+ 4C35AD6D6C1964E0B62736D44627D9BF /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3B88D3B9242AE15CCC3E92D2613A589 /* IQScrollViewConfiguration.swift */; };
+ 4E012E4A4CE4435DF6D829CB6904687D /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63070DE77E76B5B254CA451C68509EF5 /* IQBarButtonItem.swift */; };
+ 50A311C55B25BE8EA6B5C20EDAF6E231 /* UIView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A209F6A3ED70A0B4E017DDC44D73C2 /* UIView+IQKeyboardManagerExtension.swift */; };
+ 540CFC9075EC06780C6F934353584833 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FED7E40B8371E0302367A1C49C8E619E /* IQTextView.swift */; };
+ 576EBE7A8D8A0C1E332CC7479B95B08A /* IQKeyboardNotification-IQKeyboardNotification in Resources */ = {isa = PBXBuildFile; fileRef = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */; };
+ 57B5DEB0C98D408C28CEE2B381C1964D /* IQKeyboardToolbarConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2DFAB27A0DAF494EABA388687CED00A /* IQKeyboardToolbarConstants.swift */; };
+ 5C2FE44A1373EE5446FB2094E0CCE0E9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 5E310DC66AA22AA31602DAD6B8A7C787 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ 61BDE8E1D8CFD674C6CCD41C70CB981D /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; };
+ 62CD171ED278181D9297D4FC844F7023 /* UIView+IQKeyboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED47720D629B7CC0D7D00CF5C5E40FF0 /* UIView+IQKeyboardExtension.swift */; };
+ 688879C0DA9CFC4701AB33689DFAA299 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 69657BED56A2DDAE4D94D0FF7F296F48 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE0A38788022564F1272806A4515ED11 /* IQKeyboardManager+Appearance_Deprecated.swift */; };
+ 696AD590527FF3A1B986BF7974851C45 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC889F43B2C6A6F8CAF9AE34A437535A /* IQKeyboardToolbarManager+Deprecated.swift */; };
+ 698B6FF2D3EB35756E187675DB447A0D /* IQKeyboardToolbarManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5CC8BDBC24E508A9EAFA3BD070E373D /* IQKeyboardToolbarManager+Internal.swift */; };
+ 6BB50CA0467930C6314FD196D4D7E3D4 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586ADA6A1632DBA2224552BFBA22581D /* IQInvocation.swift */; };
+ 6C1E1FB34F5E4795759BBA858F006598 /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A67B65E64610A804D78568AFE2057CF4 /* IQKeyboardManagerSwift-dummy.m */; };
+ 6CC5606CD458DDB113E3F74401F34970 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26AA0168FEE4652E795A487F2D628BA0 /* IQKeyboardManager+ActiveConfiguration.swift */; };
+ 6DE9FD143CBC24075601F8FE2ADC4115 /* IQKeyboardCore-IQKeyboardCore in Resources */ = {isa = PBXBuildFile; fileRef = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */; };
+ 709D0EF3CAC21F2C46996DC012F853CA /* IQKeyboardAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861EDB4B4F61692A313FF611C8CF95AF /* IQKeyboardAppearanceConfiguration.swift */; };
+ 70C33A3C8A6F1EC98EEB3887921E1346 /* IQDeepResponderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C2DC792A6DF0C698B5CA877445AD73 /* IQDeepResponderContainerView.swift */; };
+ 7199EAFCB9BFD43B5CF333627BBE6715 /* IQKeyboardToolbar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A7D9DC50C63535042164A35DFD40EC2 /* IQKeyboardToolbar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 737ED0AA4A3560B77672478137FD3077 /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B8186A80AC5E0814DA1D966D3E40BF /* IQActiveConfiguration.swift */; };
+ 7CC8EFB6010B9B87FEEDE9150EE5F617 /* IQTextInputViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F9CC787EDE5D230D3BB2F2DA0ABEB99 /* IQTextInputViewInfo.swift */; };
+ 7E3D82D0DF9EE0F14DA44AC251B45E27 /* IQKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80D24BAD77BA27807693623CE7D270D /* IQKeyboardNotification.swift */; };
+ 802C058F68EEFCECDA6841FA9FF5F7AB /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BB99887E76717DB51BAD581A6B441E /* IQKeyboardManager+ToolbarManagerDeprecated.swift */; };
+ 82EE52834AB7023FE255776D547678BF /* IQKeyboardAppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C958D24E4FE5EFD8C5B81405559A4BD /* IQKeyboardAppearanceManager.swift */; };
+ 879D2E821C85A4C9A91327C8823707C3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */; };
+ 8B39ADF4DB39DD5A427D89AA15826EE3 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = A338431F5EE59F889439480E11F55A35 /* IQKeyboardManager+Internal.swift */; };
+ 8B932FE2562968B4AD79FB11FF1F31F0 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = FE5C672CF96BECD4AEF2D01E86D7A5BC /* PrivacyInfo.xcprivacy */; };
+ 8E9854AD5BEB1529B0C974C729FBC812 /* IQKeyboardNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A975906B3CFBF2DD2C0D832B624B43E5 /* IQKeyboardNotification-dummy.m */; };
+ 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ 9493F02F394A370868EFE569ABB2C1A2 /* IQKeyboardToolbarManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CCC40E939F7246E1F0244955BDFF328 /* IQKeyboardToolbarManager-dummy.m */; };
+ 94D1ED5D39A994EBD9DDDFC5494EE2D4 /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */; };
+ 986DC523CD4D441E2FEC4D3310F3B6AF /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDF616BAC83E63DB1F6D89BD0C25949 /* IQKeyboardManager.swift */; };
+ 99E2272BA8CC1502E45DC65CBFBCBCD4 /* Array+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B228B45C2AF15F26A0708FF1F4C049 /* Array+Sort.swift */; };
+ 9A6363832DBE2489783687308B9FC759 /* IQKeyboardManager+ToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80DCD72F7A8519A9463BFC22D8AD02A4 /* IQKeyboardManager+ToolbarManager.swift */; };
+ 9B0D1C2CD421BD42B4585E158EA8FE59 /* IQKeyboardToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = F441F8B8B18B288CC0A7425FDC5F01A1 /* IQKeyboardToolbarConfiguration.swift */; };
+ 9B2C0863AD3BAB0F877DC1F340119AA0 /* IQTextInputViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6183432F20DA00F9E0A8AD4AB8569CFF /* IQTextInputViewNotification.swift */; };
+ 9CD18FBC522BC9FAF825298EE13E385A /* UIViewController+ParentContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526DA4BEC1A96C86419B2B0A724CEAAC /* UIViewController+ParentContainer.swift */; };
+ 9F2B162734E484C90062F141ED4BB39C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ A11F813E8520CCD02F84535FEF70C004 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */; };
+ A39FE5F72261B202CC63722A7B357206 /* IQTextInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D7F4C8DBE08B54A8D13ABD8BDF9D13A /* IQTextInputView.swift */; };
+ A3DE47F84D7FE267487C39CBC071916D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ A896B59D4DE9C73E1B26FD3778930977 /* IQKeyboardResignHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E255579824F1D21C00ED5B029E99BDA6 /* IQKeyboardResignHandler.swift */; };
+ A9A9B3D2801DD30DA93C8F20A506CCED /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */ = {isa = PBXBuildFile; fileRef = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */; };
+ AE2A39A6A21769A88C36DA4A6ACF2A40 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */ = {isa = PBXBuildFile; fileRef = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */; };
+ B4E63E50E80BA0DE0FDC0222727DBD11 /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474B492B560C872CE952C1D51969406A /* IQKeyboardInfo.swift */; };
+ B552868FC458E31F528E3AD3A483D677 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E3CA5E36443AE3EFB66EE0A3530956 /* IQKeyboardManager+Deprecated.swift */; };
+ B596B09A2EFFA3DFCC75D0CB687464CC /* IQKeyboardToolbarManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CE3D2D5C77B484A469AB0BF920206EF /* IQKeyboardToolbarManager+Debug.swift */; };
+ B709C2DB9B3599F3904D99978DFE31BE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = FBCCE2BB919F40B9EBCD3FF8F5880D9D /* PrivacyInfo.xcprivacy */; };
+ BA411DCFF67E3F2117FB300E4D728936 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ BAB572B2D91EB9FE4085013E8BCF11A2 /* UIView+Responders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80ADE748531456ABDDE44B5173787FA4 /* UIView+Responders.swift */; };
+ BD2157407D719E3B22097A99592F1434 /* IQKeyboardReturnManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8972D89261103F625BBE350DC6A5E5BD /* IQKeyboardReturnManager.swift */; };
+ BE50FCAC87378A04725C360266735624 /* IQKeyboardToolbarManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B8F7D50992F93A9D502BFAD4018B610 /* IQKeyboardToolbarManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ BEC863764D1B70E42F25A95161D8FA16 /* IQKeyboardResignHandler+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7606BACFB790485C35F7EC8C0871429 /* IQKeyboardResignHandler+Internal.swift */; };
+ BF67A2DCA85E702041E48BC18DB39DEF /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECE7DDCA61A0E3D33D4AD9803F445BE /* IQTitleBarButtonItem.swift */; };
+ C13E73214F37BAE28B4F8AD6EFEECA95 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C83AC5811D580B3B54EA282688BDAA41 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C313DB17200D1B45E8C337318BA05813 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */ = {isa = PBXBuildFile; fileRef = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; };
+ C51D4A9FE595DCE7457E080705A98F11 /* IQTextInputViewNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D27223F0D62482873E0DD988417E334F /* IQTextInputViewNotification-dummy.m */; };
+ C8ADA0B4C5E93DC1F608726FFB26AA95 /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ C945CB4EC42271D435BF23E7749BE6BF /* IQKeyboardConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85D9B67B548F1C9544DCB01D4EB6FE1D /* IQKeyboardConstants.swift */; };
+ CBF2EBCCBEA754DA8890D0A93C07B935 /* IQTextView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 48055AC80B1D94B7F9E2BF87BB984279 /* IQTextView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ CE4289FB36C1751B29FF3A08BAB1303F /* IQKeyboardNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ACF0BBF875B1A829EB0CEF621C75A491 /* IQKeyboardNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D3ABAF6EDA21C1A1BA048EBE771A3C34 /* IQKeyboardAppearanceManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5279670AC68B19C16BC817052738C47C /* IQKeyboardAppearanceManager+Internal.swift */; };
+ D3F608CA68128687287C578A5AE78032 /* IQKeyboardReturnManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5277185841774F1173A60C70BEEAB43 /* IQKeyboardReturnManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D59795F3072DB898B23C7ECAB9648A40 /* IQTextInputViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF1C389FEE92688E867B717F7F760B81 /* IQTextInputViewInfoModel.swift */; };
+ D6EFA9EAA562143F338EB164836B7837 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
+ DA59A956BADB58A8F56351BEF801A4A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ DAE95FD71F66232D13925E728762532B /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73E69C62CB648A1F39A51A68FCE70203 /* UIScrollView+IQKeyboardManagerExtension.swift */; };
+ DCCD3E35C57D99BB47B7CF853C5A9748 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */ = {isa = PBXBuildFile; fileRef = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; };
+ DEE20091E649C632B6EE2FD421214811 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EB59B9412536BB983F181D5769060818 /* PrivacyInfo.xcprivacy */; };
+ DEF9DEE9A4E977FD0789D15512C400B6 /* UIView+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DCD55C5C01982AECFC7B1BE8AD51098 /* UIView+Resign.swift */; };
+ DFB7A2D3A180F3D0F22CC7FFF9FD5436 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ DFC69465EAE2C498CA6ABDEFADD9C2F2 /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B7EC073F09A1F9D54780D9C77AF25BF /* IQKeyboardToolbarPlaceholderConfiguration.swift */; };
+ E16CD42A35F0C4177E59F6ABF0D54E18 /* UIView+ResignObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C8B1DA3B268A12F02985D29EFC8C82 /* UIView+ResignObjc.swift */; };
+ E1734E56DB48E6F238408C9A232C7051 /* UIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE8F0BF8A36B8140B1C8B56EB114A086 /* UIView+Hierarchy.swift */; };
+ E1C18171B224E80E6F9E87A2F1BFC47C /* IQKeyboardManager+Resign_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B381E333A40EB0E75671BF9FB617AC37 /* IQKeyboardManager+Resign_Deprecated.swift */; };
+ E519794B26536386633E398EE481A94F /* UITableView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C3AD78BD7F4CF62CFCE4A94DE54DED /* UITableView+IndexPaths.swift */; };
+ E928EA2BF42B4F59378A201F124A24DC /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3A2160EF949B7A580D286F038B1A56B5 /* PrivacyInfo.xcprivacy */; };
+ EE075828CDE3D146F5E1C6534F99B52C /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3916E4E5989A0F0254EAD32C392B5F5C /* PrivacyInfo.xcprivacy */; };
+ EE2DEE5FC0FCE377B0B91053D1EEE1C4 /* IQTextView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EFF97AF8ED94B2E1B53EC25523191C20 /* IQTextView-dummy.m */; };
+ EE58D262313604F9499EF080BB7570E2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 65502F5FF9DEEAC1D8D36A27E85FEE02 /* PrivacyInfo.xcprivacy */; };
+ EFA0B9BD4DB27C2114AFA46A63F19D79 /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B64ACDF6D4EC7B93904691EB45C5C93 /* IQBarButtonItemConfiguration.swift */; };
+ EFC13162E3A35D0EC2C76C2B23E5A09C /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA40485EE83F94DDC2D4C718DE4758D /* IQRootControllerConfiguration.swift */; };
+ F2DD24E632D6EA8129EF60E0A4AFD91C /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B35C123F478E358FFB01C3A7721D04 /* UIView+IQKeyboardManagerExtensionObjc.swift */; };
+ F6EBBAAB0ACF8232BF1F1E249998ED97 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */; };
+ F73E398751F521AA064471055F9D76B8 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4C53D4D2AA9A89E5F58608BDE976D61 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */; };
+ F95C52480DA8BDDB020022F7FD010453 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 72BBF069358CCF73D8E674385813A466 /* PrivacyInfo.xcprivacy */; };
+ F9F4D20D5371CB1BD4FC03401DC7B980 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49433A7414A4DAC29B5BF7295ADBC92D /* IQPlaceholderable.swift */; };
+ FB53E4A87D410605B4F27174DF76FF4D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 9F5FA7D2322208B09B5EA5D72D7209C6 /* PrivacyInfo.xcprivacy */; };
+ FB7CE812CC13A8D408545AB087AAB154 /* IQKeyboardToolbarManager+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344274B89E7EEEF54409242ACD059475 /* IQKeyboardToolbarManager+Action.swift */; };
+ FC31BD8F5A7ABFAD5F87EFE19920F85C /* IQTextInputViewNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F7D7AA57F77A17CD3D74D75AEBA7070 /* IQTextInputViewNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ FE0D3260BF27D388B0200F1AC8151619 /* IQKeyboardCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8DC3BD343769A8E67DC140B14E40AFA /* IQKeyboardCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ FEC86D7371EEAC597840AD4C80D95F6D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
- 067A6759ACA9A549384C729E1010EEB2 /* PBXContainerItemProxy */ = {
+ 072E4E27975479BDD58563BEB3D24683 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
- remoteInfo = "AMapFoundation-NO-IDFA";
+ remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+ remoteInfo = IQKeyboardNotification;
};
- 21C4E3AF810B766F005A0D66D3AB059F /* PBXContainerItemProxy */ = {
+ 0D2EB4A67CE62F8166C4AEE9F28A2794 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971;
- remoteInfo = UMCommon;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
};
- 24A06925FD6662781797D78547B19FC7 /* PBXContainerItemProxy */ = {
+ 11F6CAD234D50E3B19009ACDB7B04828 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 7F18C31A804695333763EEC303E265D7;
- remoteInfo = "WechatOpenSDK-XCFramework";
+ remoteGlobalIDString = A6602BCAA6F4F932A586C41D0B7E019C;
+ remoteInfo = "IQTextView-IQTextView";
};
- 2F48F1B754086F0F2514AA521AB8B493 /* PBXContainerItemProxy */ = {
+ 1FFB29A77F93BDAC1566FEC554B6C293 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5;
- remoteInfo = "AMapSearch-NO-IDFA";
+ remoteGlobalIDString = 7C5613175BBC4BF67E36DB4FBEBC01D0;
+ remoteInfo = "IQKeyboardToolbarManager-IQKeyboardToolbarManager";
};
- 33B5943FAAD2EDE37C3C94F327FA50BC /* PBXContainerItemProxy */ = {
+ 2FE8AB43E3CB0161C772ED070487B9E4 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C;
- remoteInfo = "AMapLocation-NO-IDFA";
+ remoteGlobalIDString = 2B8FF445A5162845FAB9EC00FC92B694;
+ remoteInfo = "IQKeyboardNotification-IQKeyboardNotification";
};
- 3D12EEA2C94F5E7D1A04E3DCB8056418 /* PBXContainerItemProxy */ = {
+ 3466093273143BEB58E4CBBC579B64F6 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC;
- remoteInfo = UMDevice;
+ remoteGlobalIDString = 88810798DA63A2F6611B0970EA276DEC;
+ remoteInfo = "IQKeyboardReturnManager-IQKeyboardReturnManager";
};
- 849BA746108EE0BE0F41CAF99BCF009C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971;
- remoteInfo = UMCommon;
- };
- 991CAE88F0A4725CB8E8F174974E5B98 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
- remoteInfo = "AMapFoundation-NO-IDFA";
- };
- A9B64CB2E1958A4EBD9D7B1E35942161 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC;
- remoteInfo = UMDevice;
- };
- ADE47395DAB29611CE948513B2F0F2E5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
- remoteInfo = "AMapFoundation-NO-IDFA";
- };
- BD91D75C44C68F52A94B116B7D1294F4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
- remoteInfo = "AMapFoundation-NO-IDFA";
- };
- C0AB8415F3749D034999E1F84151D767 /* PBXContainerItemProxy */ = {
+ 3FA7EE33E2A4A9317A1A9BD1271CAD9A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = B44FB02BD2D3FEAD1F36808AD405A543;
remoteInfo = "AMap3DMap-NO-IDFA";
};
- E0029779384156C3352043F0C3AFFE56 /* PBXContainerItemProxy */ = {
+ 48703231ACE2850477BE5A954C22D39D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E;
- remoteInfo = UMAPM;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
};
- F7B6C2F4ACE4C28AB6488EF406B7E9D1 /* PBXContainerItemProxy */ = {
+ 49BBC9B14F79A04BA8DD9B0BB90A9B9C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
+ };
+ 4B1EBB18B5B15E617B246B4FF5DAF0BC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971;
+ remoteInfo = UMCommon;
+ };
+ 4ED0FC63512556305238B4F8A655BFC3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ 5CE52FF97D512708CA7A47A2B3D62E76 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971;
+ remoteInfo = UMCommon;
+ };
+ 604C23F4D8288FC7F99E40CC6B0A5AFB /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC;
+ remoteInfo = UMDevice;
+ };
+ 64DDDAE98CDB07AA875EF2F8785EDD43 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+ remoteInfo = IQKeyboardReturnManager;
+ };
+ 6B5EB24E9DAD48FA4C5EA18A140601A6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+ remoteInfo = IQTextView;
+ };
+ 7554BF75E0EABA51787581741F2C0977 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B247F77A0CD5E19C8187A9BA1EB58C09;
+ remoteInfo = "IQKeyboardToolbar-IQKeyboardToolbar";
+ };
+ 80C7A425A8BEDEEB907E1C0D59EE09CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E;
+ remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift";
+ };
+ 852A1D21D2CE860CC83410BBFD84880C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
+ remoteInfo = "AMapFoundation-NO-IDFA";
+ };
+ 86E020E02CC1A1EB70F0897B32D2077B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+ remoteInfo = IQTextView;
+ };
+ 88A05DB4A06DCD769D9535B118AA4542 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = EEE261386011CDF271BE289F73FF5959;
+ remoteInfo = "IQKeyboardCore-IQKeyboardCore";
+ };
+ 96B3FE193BFA13D2A4F33193086413A0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
+ A68BA12EA1172EA196C307EFD226E3FA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 1DE17B7C77CD95CB67DF1197965B76AB;
remoteInfo = "Pods-suixinkan";
};
+ ACB2B6CE324FAA2F107B41B1B30FD3A3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+ remoteInfo = IQKeyboardToolbarManager;
+ };
+ B1369EF2BD3C2C080B0E2339B47E2F81 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C;
+ remoteInfo = "AMapLocation-NO-IDFA";
+ };
+ B39953252EDD987C1A35C366900690CF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC;
+ remoteInfo = UMDevice;
+ };
+ B93EAD193D88C9A60662E10DBCFCEA88 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ BCC15AB291C526956A6ADA2EB049BB6C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
+ remoteInfo = "AMapFoundation-NO-IDFA";
+ };
+ BD04367E23147103AA5A3FD785ABF923 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ BE77FABD96B18CC818A1B8048B62AD9A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+ remoteInfo = IQKeyboardNotification;
+ };
+ C42BE70475DBB73A4D64287452A8476B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4;
+ remoteInfo = IQKeyboardManagerSwift;
+ };
+ CEBE80C066C9BF2161D89833D0CC119A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
+ D6F6A7863C357AB39376EC52209E2A0D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5;
+ remoteInfo = "AMapSearch-NO-IDFA";
+ };
+ D93021E90DCA27E33FA08E04B32E8653 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
+ remoteInfo = "AMapFoundation-NO-IDFA";
+ };
+ D9CD489745F094398AC7EE56A075E972 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
+ };
+ DC2DD867ABEA019EFC6E98A0B2815AE6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E;
+ remoteInfo = UMAPM;
+ };
+ DD14992E69F497F71BA00CD9DD122987 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+ remoteInfo = IQKeyboardReturnManager;
+ };
+ DFC2204E567402299825907959EB082C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7F18C31A804695333763EEC303E265D7;
+ remoteInfo = "WechatOpenSDK-XCFramework";
+ };
+ E9B4E5C8009A9E93DFFE3687E7A7C298 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
+ ED4A999B5C1FBCC9415B78F1A4FDC18A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4502C7427440BEB17A50C0BF6E638A85;
+ remoteInfo = "IQTextInputViewNotification-IQTextInputViewNotification";
+ };
+ EE4EF75722C69B32AF324E46C1BBA7D1 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+ remoteInfo = IQKeyboardToolbarManager;
+ };
+ F37D3A96D9C3BBF6C882CF3CD02C632D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001;
+ remoteInfo = "AMapFoundation-NO-IDFA";
+ };
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- 03ECB029C3BA6719F3CE27704FE9866A /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; };
- 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; };
- 05E4BFEB8A5EC2DC86095F225B502975 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; };
- 05F51B66A225DC56F48A197D8DE3AB8E /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; };
- 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; };
- 081BB8B4C329A89813BAFEFD92F278DC /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; };
- 0CB65467D9BC6FB4CA43DBDEE8046DC8 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; };
- 0D4EF6D40137F0A4CECF2C4CC617B5BA /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; };
- 0E97FA02BDFE7464E96DDDA67672EAB8 /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; };
- 0F67BAD007D9313441603E8FD0C72BDE /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; };
- 11E7551362FA5BAEED7A7CF2E5A5998B /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; };
- 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; };
- 12C40249116DE0574E7DC16E3A5C4D06 /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; };
- 1733284B424C8D089B1C8E9C6167E533 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; };
+ 01003F931713782781BF6BB014711F27 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; };
+ 01FED2850C91917B5CF595B8834B8F2A /* IQKeyboardToolbar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-prefix.pch"; sourceTree = ""; };
+ 030EAF35766AF14A0C9409424A6C2B82 /* Combine.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Combine.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Combine.framework; sourceTree = DEVELOPER_DIR; };
+ 05DAA96D10BBDD4CD0563EF76883B8CA /* IQKeyboardToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarManager.swift; path = IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift; sourceTree = ""; };
+ 06C25F9B95293799D367CBD0E0B95E77 /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; };
+ 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextInputViewNotification; path = IQTextInputViewNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; };
+ 08CB266E76332AED0E3B48EEB055983F /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; };
+ 0B35E9590B445883D21697E01ACFFF1E /* UIView+IQKeyboardExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionObjc.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift"; sourceTree = ""; };
+ 0B4AC58FF4324A3FA8F73CA4DA10DD58 /* IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQTextInputViewNotification-Info.plist"; sourceTree = ""; };
+ 0BC7D01167CA03F161AF5BC994C741C4 /* WechatOpenSDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = WechatOpenSDK.xcframework; sourceTree = ""; };
+ 0C330EE82C2618812608F6AE8A6E63A9 /* IQKeyboardReturnManager+UITextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextViewDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift"; sourceTree = ""; };
+ 0C8150D39D06CA5117F674365A2D6513 /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; };
+ 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextView; path = IQTextView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E3937675CAA550D5CB90F0343F30691 /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; };
+ 0EBA328CDD2131771C5A3F054677DEB7 /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; sourceTree = ""; };
+ 0F7D7AA57F77A17CD3D74D75AEBA7070 /* IQTextInputViewNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-umbrella.h"; sourceTree = ""; };
+ 103108AC7A027FAA9D881105F432DFED /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; };
+ 103B4566E5B3E8DEF9340A316936E77D /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; };
+ 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; path = IQKeyboardReturnManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 115539E22DDDBEAA2759FD2CEE701673 /* IQKeyboardToolbarManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.release.xcconfig; sourceTree = ""; };
+ 11E57560E05A7E18A4833A108BBF77A7 /* IQKeyboardReturnManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.debug.xcconfig; sourceTree = ""; };
+ 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardNotification-IQKeyboardNotification"; path = IQKeyboardNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 12577E7D396AF4A0D52E8BF9EAB0B178 /* IQKeyboardCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardCore-dummy.m"; sourceTree = ""; };
+ 130EEB4090B9AF897D37B6DE8A064E66 /* WechatOpenSDK-XCFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.release.xcconfig"; sourceTree = ""; };
+ 14A1F49D0B3C6F4A06FE802DFE3C86A5 /* UMDevice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.release.xcconfig; sourceTree = ""; };
+ 155001DC0189CD12099F5DA44FFC98CB /* WechatOpenSDK-XCFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.debug.xcconfig"; sourceTree = ""; };
+ 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardReturnManager; path = IQKeyboardReturnManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 18BB99887E76717DB51BAD581A6B441E /* IQKeyboardManager+ToolbarManagerDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManagerDeprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift"; sourceTree = ""; };
+ 19C8D9FF70E4E67A9CC761929E9C65E8 /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; };
1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkanTests"; path = Pods_suixinkanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 1BABD1E2BA172FF891B45D69723A8FA6 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; };
- 21F64182FA5AB6FB454C619FF610CB14 /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; };
- 21F8229FFC8693946D569FF6D8C1FA3F /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; };
- 24067F4DDEF17AFA8641D4550327134F /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; };
- 258B890CD915D0C02409050126A34A78 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; };
- 267A3DEBF9AF353E463F539354095601 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; };
- 2695372829B2B3DE46736249F9327CB3 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; };
- 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.release.xcconfig; sourceTree = ""; };
- 2B483D35C6A5C6886C8305F8655E02EB /* UMAPM.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMAPM.xcframework; path = UMAPM_2.0.7/UMAPM.xcframework; sourceTree = ""; };
- 2BC8EBA3D7E41F9EA60264E82C2C3D54 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; };
- 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; };
- 2EC3D8175A3DC6341FD9BA09E1108BD1 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; };
- 308336B8D46677C30433D2DCCD115731 /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; };
- 311EEA5B46D1D7FAAA7E30958EBFE969 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; };
- 380659BF8742AC4FF0E4359B7E02FBEC /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; };
- 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
- 38F697EA154D9687F844A0F0C832E889 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; };
- 3A16DCDE527DE0F46DBB2B7A4A10C9FF /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; };
- 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; };
- 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; };
- 3F4A6FE6F5896BC28D894A3C56F4458B /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; };
- 3F6E024A4BC8B4F7C84F62B453336C6B /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; };
- 3F99AF4BEDBB1A46A1B2DDA808C60C8A /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; };
- 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; };
- 45AB9E4A609CD01DF5027D580BD33218 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; };
- 47DAF61B95087ADC814BD2F6DFD04D32 /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; };
- 495C8FA8FA1E743C3D041B5066D249A1 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; };
- 49D1A8B85287979271F3D66B8968FAAD /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; };
- 4F88C9D2A26698191E3F0BAB6E73C1D6 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; };
- 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.release.xcconfig"; sourceTree = ""; };
- 511E223F968C9463398F92B7634AA4C1 /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; };
- 514765B300FD9BCBE77BA16182363311 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; };
- 56845156741368511567C6ED67855FBE /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; };
- 57EF70D81C78649244E4B0F2BD22C385 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; };
- 58447B69191400A703B8F1AA0E907906 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; };
- 5AE4ED04FC4934C3CFE1803544F7E599 /* WechatOpenSDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = WechatOpenSDK.xcframework; sourceTree = ""; };
- 5B9FB578C59C2D6A42E4137C2BF6F3F4 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; };
+ 1C0982FA7F37AF2EF650B5353744211C /* UIView+IQKeyboardExtensionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionDeprecated.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift"; sourceTree = ""; };
+ 1CB599AE97D1806104DE0A97F127E6FB /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; };
+ 1DCD55C5C01982AECFC7B1BE8AD51098 /* UIView+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift"; sourceTree = ""; };
+ 1EC4F8706BDB476E1074145E1FEE2DBF /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; };
+ 2036A3FB465FF366E97BF39DEE669F09 /* IQKeyboardManager+Appearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift"; sourceTree = ""; };
+ 21397BCD20ECAE0D5DC45E00B1022122 /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; };
+ 260A409C8A6E5DE46B3829489949BFA4 /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; };
+ 26446463DDBDB062FC3928B2F4BF9CBC /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; };
+ 2650DFB5183D12166C27899A4BC4610E /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; };
+ 26AA0168FEE4652E795A487F2D628BA0 /* IQKeyboardManager+ActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ActiveConfiguration.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift"; sourceTree = ""; };
+ 2BB0CDECDB237E2314A53B64D3B8695F /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; };
+ 2CE3D2D5C77B484A469AB0BF920206EF /* IQKeyboardToolbarManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Debug.swift"; path = "IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift"; sourceTree = ""; };
+ 2CFE6D95F9C535675CB301C388874D7E /* IQTextInputViewNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextInputViewNotification.modulemap; sourceTree = ""; };
+ 2D1CB2C6953200669BA5206342981582 /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; };
+ 2D50A287B9D0AAB2B6E9854E198DF5DD /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; };
+ 2D5732AE377676B0FE9DD3353BA83883 /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; };
+ 2F4C42E98F4D9427C292F65FE6F0B5C8 /* ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist"; sourceTree = ""; };
+ 30A8A01383C393C5CB8F8FC240A24C39 /* IQKeyboardNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardNotification.debug.xcconfig; sourceTree = ""; };
+ 30C3AD78BD7F4CF62CFCE4A94DE54DED /* UITableView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift"; sourceTree = ""; };
+ 30C5F8B8EB3DD6C77EEE1A267B5CEB7D /* IQKeyboardReturnManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardReturnManager-prefix.pch"; sourceTree = ""; };
+ 3151C16FF6B76C248C269F94E4996F57 /* UMCommon.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMCommon.xcframework; path = UMCommon_7.5.11/UMCommon.xcframework; sourceTree = ""; };
+ 3173CBEC8CF7AA8EA006088941718CD5 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; };
+ 344274B89E7EEEF54409242ACD059475 /* IQKeyboardToolbarManager+Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Action.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift"; sourceTree = ""; };
+ 36D395D9E056DE9587ED95754452991E /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = ""; };
+ 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; };
+ 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; };
+ 3916E4E5989A0F0254EAD32C392B5F5C /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardCore/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 39E2B55991EB064699426C92C7A92A8B /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; };
+ 39FA574A226D652C33CB6D48276F7B58 /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; };
+ 3A2160EF949B7A580D286F038B1A56B5 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 3B39ED3B08A5738A4295207CF9495EEC /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; };
+ 3CFBB99CC351EABA5DE1217CF1B40C3E /* IQKeyboardCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.debug.xcconfig; sourceTree = ""; };
+ 3D078068106693825870F72C096C124A /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; };
+ 3E3AD3EE750AEF229F3095AB516C9100 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; };
+ 3E8D11AD30BB130A5D5F5DD5EEA21C13 /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; };
+ 3F08C2AB03A8CF8FCB8E3F1C3A781476 /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; };
+ 3F5B1FAC4C895D00527AEDA143FBC575 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; };
+ 410B56C1B8326BC9C19B0DB75544B3CA /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; };
+ 410D0EEAD5DDC79E3DC3911CE33BA2CA /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; };
+ 41912F06D7E7D5A38C37B6E577D9D059 /* Pods-suixinkan-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-frameworks.sh"; sourceTree = ""; };
+ 41ADD30512AEB247C434B54400AA1B8E /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; };
+ 41F03B7A2358FDDBF756EDD2638B0980 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = ""; };
+ 45271BD948661C63407D83810E087058 /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; };
+ 45AED264113ACD57ECAF26F0F85FFB62 /* IQTextView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.debug.xcconfig; sourceTree = ""; };
+ 4704657980AE2A1E10A33E609D6B926B /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; };
+ 474B492B560C872CE952C1D51969406A /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardNotification/Classes/IQKeyboardInfo.swift; sourceTree = ""; };
+ 48055AC80B1D94B7F9E2BF87BB984279 /* IQTextView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextView-umbrella.h"; sourceTree = ""; };
+ 485F955AC67F8718BC7E213433D68CAF /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; };
+ 49433A7414A4DAC29B5BF7295ADBC92D /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift; sourceTree = ""; };
+ 49AF7809713DA87B3E840B2C01FFFAE6 /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; };
+ 49E3CA5E36443AE3EFB66EE0A3530956 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Deprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift"; sourceTree = ""; };
+ 4A775B0BB66007F06E41DFE74B3A9929 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; };
+ 4B2ADDFC7774B5BE010DDF66FAAB1D3B /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; };
+ 4B57823CC43E41F28928353470005B2C /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; };
+ 4DA9CE84A9AE0E48E882398B7D78849C /* IQKeyboardNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-prefix.pch"; sourceTree = ""; };
+ 4DB9C28692E9F990C88D2461FF36F728 /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; };
+ 4F9CC787EDE5D230D3BB2F2DA0ABEB99 /* IQTextInputViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfo.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift; sourceTree = ""; };
+ 4FDF616BAC83E63DB1F6D89BD0C25949 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = ""; };
+ 51C2DC792A6DF0C698B5CA877445AD73 /* IQDeepResponderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQDeepResponderContainerView.swift; path = IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift; sourceTree = ""; };
+ 526DA4BEC1A96C86419B2B0A724CEAAC /* UIViewController+ParentContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+ParentContainer.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift"; sourceTree = ""; };
+ 5279670AC68B19C16BC817052738C47C /* IQKeyboardAppearanceManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardAppearanceManager+Internal.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift"; sourceTree = ""; };
+ 530DCF2469E6370042646A66DA07F65B /* UMAPM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.debug.xcconfig; sourceTree = ""; };
+ 538CBFD998EF3722E7689C6296456C1C /* UIView+RespondersObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+RespondersObjc.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift"; sourceTree = ""; };
+ 55417717066654E20173101D0149276F /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; };
+ 568F2B31726426E57A3F36BBBF5F42B8 /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; };
+ 56B3624858B660D9DDBBEB280A080869 /* IQTextInputViewNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.debug.xcconfig; sourceTree = ""; };
+ 56EBDABD8EC0E4FF033038CB98DC0DD8 /* IQTextView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.release.xcconfig; sourceTree = ""; };
+ 57D639F0A4D2DCE8A55EE9F3FB949A93 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; };
+ 586ADA6A1632DBA2224552BFBA22581D /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift; sourceTree = ""; };
+ 59596161CD8354A2C07152FA9E27F084 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; };
+ 59C621AA9DE12990B43EFD34DF01B08B /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; };
+ 5A5D1BE1351215B2227904B08017BC18 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; };
5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkan"; path = Pods_suixinkan.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 5BDBFE9A3501719BF5A45FCF0782CDBE /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; };
- 5D2FAE9F6CE73F35242C57FADF198A4F /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; };
- 607B12309D4BBE0A374F5681BC22567B /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; };
- 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; };
- 632CBA3F863D4B4C036343CBE79395A0 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; };
- 64240DCE9E380E0318667593766AB4D8 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; };
- 64C0BEE472E88B93EB7D366E5B2597E4 /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; };
- 657980EFF8962794190BFF647D3FEF24 /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; };
- 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; };
- 664E58E6DDC2966578A2C9D32D9D8FFD /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; };
- 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; };
- 68FB23F98494515B5F635B2080AC2D74 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; };
- 6A16CCC3A9F4BA44294C343AAA01EC6A /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; };
- 6DDB0F91BAEEA431301574B316329B0D /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; };
- 72424614C718027B387FB239F679271E /* WechatOpenSDK-XCFramework-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "WechatOpenSDK-XCFramework-xcframeworks.sh"; sourceTree = ""; };
- 746BFCBA1ABA7DC28009805E10F58829 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; };
- 75399BCB7E0D56E144717DDCD6C7FBBC /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; };
- 764EBFD12BB5DBE470C3B3EE75778E69 /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; };
- 78B6815DC0004C618630DC5100B63C80 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; };
- 79F61EDF41457CD8F6AC99EEB203BDEF /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; };
- 7A8928E3841166C87F9104F3C7257ED1 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; };
- 7A9B9169FDEDF62E64E2DE22F85610ED /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; };
- 7D7597DC9C40CDD0257013247AFBE4C8 /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; };
- 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; };
- 87983C1BFF90B26765DB26FA52DC8FBE /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; };
- 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; };
- 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; };
- 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; };
- 8D804F47730C24A80564C45691D62159 /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; };
- 8E8D9B985354179A70BB4148A96CB106 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; };
- 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; };
- 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.debug.xcconfig"; sourceTree = ""; };
- 9392453F7B8C8EC1DBC411A28840D283 /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; };
- 9A4789EE651F9A3985C6652F8EF58F6B /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; };
+ 5D7F4C8DBE08B54A8D13ABD8BDF9D13A /* IQTextInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputView.swift; path = IQKeyboardCore/Classes/IQTextInputView.swift; sourceTree = ""; };
+ 5E7C51C9D03E4F23E428C0C1AFFE32A7 /* UIView+ParentObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ParentObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift"; sourceTree = ""; };
+ 5EC51B95CEAEB39AE17EE8C8A1315458 /* IQKeyboardToolbar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbar.modulemap; sourceTree = ""; };
+ 5FA112782CA9F7A1FA52C5A334A9734F /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; };
+ 5FB231080671A8D81B7D69851169AFF4 /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; };
+ 6183432F20DA00F9E0A8AD4AB8569CFF /* IQTextInputViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewNotification.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift; sourceTree = ""; };
+ 61C8B1DA3B268A12F02985D29EFC8C82 /* UIView+ResignObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ResignObjc.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift"; sourceTree = ""; };
+ 63070DE77E76B5B254CA451C68509EF5 /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift; sourceTree = ""; };
+ 6464447070DB8A1E9C56338928A9DC0F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ 647AECC2271497CFBB36311165FC0BF0 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ 648E27D8BEFDF4B6FECE1F3272B70252 /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; };
+ 65502F5FF9DEEAC1D8D36A27E85FEE02 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 66E6C52C14F00CC472AAF5FF2586C0A6 /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; };
+ 675C87643DA15213B2237CB3F10145F9 /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; };
+ 678E22BC596467BFE77D6AC56DE6B506 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; };
+ 68F50E3C54264FA6F8FEC4D7C86F2A8E /* IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbar.swift; path = IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift; sourceTree = ""; };
+ 6A7D9DC50C63535042164A35DFD40EC2 /* IQKeyboardToolbar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-umbrella.h"; sourceTree = ""; };
+ 6AE0AF60D0E6264EA8879C056FEFF333 /* IQTextInputViewNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-prefix.pch"; sourceTree = ""; };
+ 6B27D89D91D9554E7D55DCA8850866D3 /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; };
+ 6B80A312E4595DC570848E3CCAB974AE /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; };
+ 6B8F7D50992F93A9D502BFAD4018B610 /* IQKeyboardToolbarManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-umbrella.h"; sourceTree = ""; };
+ 6B90DE7BD5C01A044C39F72CCC36A2E6 /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; };
+ 6C8B2C7235B11C85311CBBD9ACAD5C21 /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; };
+ 6C958D24E4FE5EFD8C5B81405559A4BD /* IQKeyboardAppearanceManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceManager.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift; sourceTree = ""; };
+ 6D9EBCEF6F3F2A232E2FD51767D24513 /* UIView+Parent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Parent.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift"; sourceTree = ""; };
+ 6DDD0F740279371A970E178D332D97B0 /* IQKeyboardToolbarManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-prefix.pch"; sourceTree = ""; };
+ 6E0C9CBED8099166C28C4A4EE5F3A4DB /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; };
+ 6E14BDA75AF00D9E7A51C5542367D0C5 /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; };
+ 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardCore-IQKeyboardCore"; path = IQKeyboardCore.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 6FED7B503B038DD91ADA3CD3CBB7596A /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; };
+ 7117F9A1DF7F687A834B261182C1EA55 /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; };
+ 7231AA5CB6E0767D9B4DAEC51CA29801 /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; };
+ 72BBF069358CCF73D8E674385813A466 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 7390E83941C265B7AC76FEEBD5F05C25 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; };
+ 73E69C62CB648A1F39A51A68FCE70203 /* UIScrollView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift"; sourceTree = ""; };
+ 754436F7705D79991C66788AEA045C77 /* IQKeyboardToolbar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbar.debug.xcconfig; sourceTree = ""; };
+ 7970E185DCA1CE6D331C00CC66BFEAA3 /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; };
+ 7A7B464DF9B57DFAF21817F1BAA83F12 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; };
+ 7BCBC763937F56378DD43E852B2F5630 /* UMAPM-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMAPM-xcframeworks.sh"; sourceTree = ""; };
+ 7CCC40E939F7246E1F0244955BDFF328 /* IQKeyboardToolbarManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbarManager-dummy.m"; sourceTree = ""; };
+ 7CD5F62CF1C96772886D9C93F472561F /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; };
+ 7EC30B9EBF71A33CFE3B7A50F7A262A1 /* UICollectionView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift"; sourceTree = ""; };
+ 803FEE5356A6FBA7ED0EAAFC5BC123C9 /* IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbar-Info.plist"; sourceTree = ""; };
+ 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; path = IQKeyboardToolbarManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 80ADE748531456ABDDE44B5173787FA4 /* UIView+Responders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Responders.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift"; sourceTree = ""; };
+ 80DCD72F7A8519A9463BFC22D8AD02A4 /* IQKeyboardManager+ToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManager.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift"; sourceTree = ""; };
+ 8211233F52EF3340C23AE2618ECA5236 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; };
+ 821CFE722ABC9FDF53472054DEED7118 /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; };
+ 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextView-IQTextView"; path = IQTextView.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 85D9B67B548F1C9544DCB01D4EB6FE1D /* IQKeyboardConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardConstants.swift; path = IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift; sourceTree = ""; };
+ 861EDB4B4F61692A313FF611C8CF95AF /* IQKeyboardAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceConfiguration.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift; sourceTree = ""; };
+ 8972D89261103F625BBE350DC6A5E5BD /* IQKeyboardReturnManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnManager.swift; path = IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift; sourceTree = ""; };
+ 8999012F56CA3CCE7F5291E17D8E5ADF /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; };
+ 8AC85556DEF7C559A040F57C33A40633 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; };
+ 8B745529877AADD74BC646FB33E8D06D /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; };
+ 8B7EC073F09A1F9D54780D9C77AF25BF /* IQKeyboardToolbarPlaceholderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarPlaceholderConfiguration.swift; path = IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift; sourceTree = ""; };
+ 8BCE0C5C82A85BEE1FB8964A80995A91 /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; };
+ 8C20CA4CA00D852DE4609FBBC631500B /* IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardCore-Info.plist"; sourceTree = ""; };
+ 8CCEBE1D4B4C8B5E5D13F95AB75BA1C1 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; };
+ 8D62245CAF96E6999E0AD7443CEBB060 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; };
+ 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; path = IQKeyboardManagerSwift.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; };
+ 8DC1D17AA22E3F30BEC1992D3A9C677B /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; };
+ 923A5EAEF9B65C7570AA35B60017E644 /* IQKeyboardCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardCore-prefix.pch"; sourceTree = ""; };
+ 93D0847F3C4AEFBCEB0F33321FA38F74 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; };
+ 93FDE424FD40693C3039FAD46BC403D0 /* IQKeyboardReturnManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.release.xcconfig; sourceTree = ""; };
+ 944EAA15B09A4E08CA61331DE749BA33 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; sourceTree = ""; };
+ 95ADDDA73C96A467FAB58645AD894407 /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; };
+ 96C3F195B902C9DB4501E896E1169EE5 /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; };
+ 98C600FCCEF4A91D173BC8EFDC782856 /* IQKeyboardToolbar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbar-dummy.m"; sourceTree = ""; };
+ 98D4A05B914687A10BBD1D8F52BC1D96 /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; };
+ 98FF779CBB45904DCD621D23A2CA7B2E /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; };
+ 99252666C73C321ECC501FF47D66FA88 /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = ""; };
+ 99F6EE572187DA42701B0F5D6C460792 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = "