[
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Vaibhav Bhasin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "OTPFieldView/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0.1</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "OTPFieldView/OTPFieldView.h",
    "content": "//\n//  OTPFieldView.h\n//  OTPFieldView\n//\n//  Created by Vaibhav Bhasin on 10/09/19.\n//  Copyright © 2019 Vaibhav Bhasin. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for OTPFieldView.\nFOUNDATION_EXPORT double OTPFieldViewVersionNumber;\n\n//! Project version string for OTPFieldView.\nFOUNDATION_EXPORT const unsigned char OTPFieldViewVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <OTPFieldView/PublicHeader.h>\n\n\n"
  },
  {
    "path": "OTPFieldView/OTPFieldView.swift",
    "content": "//\n//  OTPFieldView.swift\n//  OTPFieldView\n//\n//  Created by Vaibhav Bhasin on 10/09/19.\n//  Copyright © 2019 Vaibhav Bhasin. All rights reserved.\n//\n\n//    MIT License\n//\n//    Copyright (c) 2019 Vaibhav Bhasin\n//\n//    Permission is hereby granted, free of charge, to any person obtaining a copy\n//    of this software and associated documentation files (the \"Software\"), to deal\n//    in the Software without restriction, including without limitation the rights\n//    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//    copies of the Software, and to permit persons to whom the Software is\n//    furnished to do so, subject to the following conditions:\n//\n//    The above copyright notice and this permission notice shall be included in all\n//    copies or substantial portions of the Software.\n//\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n//    SOFTWARE.\n\nimport UIKit\n\n@objc public protocol OTPFieldViewDelegate: class {\n    \n    func shouldBecomeFirstResponderForOTP(otpTextFieldIndex index: Int) -> Bool\n    func enteredOTP(otp: String)\n    func hasEnteredAllOTP(hasEnteredAll: Bool) -> Bool\n}\n\n@objc public enum DisplayType: Int {\n    case circular\n    case roundedCorner\n    case square\n    case diamond\n    case underlinedBottom\n}\n\n/// Different input type for OTP fields.\n@objc public enum KeyboardType: Int {\n    case numeric\n    case alphabet\n    case alphaNumeric\n}\n\n@objc public class OTPFieldView: UIView {\n    \n    /// Different display type for text fields.\n    \n    \n    public var displayType: DisplayType = .circular\n    public var fieldsCount: Int = 4\n    public var otpInputType: KeyboardType = .numeric\n    public var fieldFont: UIFont = UIFont.systemFont(ofSize: 20)\n    public var secureEntry: Bool = false\n    public var hideEnteredText: Bool = false\n    public var requireCursor: Bool = true\n    public var cursorColor: UIColor = UIColor.blue\n    public var fieldSize: CGFloat = 60\n    public var separatorSpace: CGFloat = 16\n    public var fieldBorderWidth: CGFloat = 1\n    public var shouldAllowIntermediateEditing: Bool = true\n    public var defaultBackgroundColor: UIColor = UIColor.clear\n    public var filledBackgroundColor: UIColor = UIColor.clear\n    public var defaultBorderColor: UIColor = UIColor.gray\n    public var filledBorderColor: UIColor = UIColor.clear\n    public var errorBorderColor: UIColor?\n    \n    public weak var delegate: OTPFieldViewDelegate?\n    \n    fileprivate var secureEntryData = [String]()\n    \n    override public func awakeFromNib() {\n        super.awakeFromNib()\n    }\n    \n    public func initializeUI() {\n        layer.masksToBounds = true\n        layoutIfNeeded()\n        \n        initializeOTPFields()\n        \n        layoutIfNeeded()\n        \n        // Forcefully try to make first otp field as first responder\n        (viewWithTag(1) as? OTPTextField)?.becomeFirstResponder()\n    }\n    \n    fileprivate func initializeOTPFields() {\n        secureEntryData.removeAll()\n        \n        for index in stride(from: 0, to: fieldsCount, by: 1) {\n            let oldOtpField = viewWithTag(index + 1) as? OTPTextField\n            oldOtpField?.removeFromSuperview()\n            \n            let otpField = getOTPField(forIndex: index)\n            addSubview(otpField)\n            \n            secureEntryData.append(\"\")\n        }\n    }\n    \n    fileprivate func getOTPField(forIndex index: Int) -> OTPTextField {\n        let hasOddNumberOfFields = (fieldsCount % 2 == 1)\n        var fieldFrame = CGRect(x: 0, y: 0, width: fieldSize, height: fieldSize)\n        \n        if hasOddNumberOfFields {\n            // Calculate from middle each fields x and y values so as to align the entire view in center\n            fieldFrame.origin.x = bounds.size.width / 2 - (CGFloat(fieldsCount / 2 - index) * (fieldSize + separatorSpace) + fieldSize / 2)\n        }\n        else {\n            // Calculate from middle each fields x and y values so as to align the entire view in center\n            fieldFrame.origin.x = bounds.size.width / 2 - (CGFloat(fieldsCount / 2 - index) * fieldSize + CGFloat(fieldsCount / 2 - index - 1) * separatorSpace + separatorSpace / 2)\n        }\n        \n        fieldFrame.origin.y = (bounds.size.height - fieldSize) / 2\n        \n        let otpField = OTPTextField(frame: fieldFrame)\n        otpField.delegate = self\n        otpField.tag = index + 1\n        otpField.font = fieldFont\n        \n        // Set input type for OTP fields\n        switch otpInputType {\n        case .numeric:\n            otpField.keyboardType = .numberPad\n        case .alphabet:\n            otpField.keyboardType = .alphabet\n        case .alphaNumeric:\n            otpField.keyboardType = .namePhonePad\n        }\n        \n        // Set the border values if needed\n        otpField.otpBorderColor = defaultBorderColor\n        otpField.otpBorderWidth = fieldBorderWidth\n        \n        if requireCursor {\n            otpField.tintColor = cursorColor\n        }\n        else {\n            otpField.tintColor = UIColor.clear\n        }\n        \n        // Set the default background color when text not set\n        otpField.backgroundColor = defaultBackgroundColor\n        \n        // Finally create the fields\n        otpField.initalizeUI(forFieldType: displayType)\n        \n        return otpField\n    }\n    \n    fileprivate func isPreviousFieldsEntered(forTextField textField: UITextField) -> Bool {\n        var isTextFilled = true\n        var nextOTPField: UITextField?\n        \n        // If intermediate editing is not allowed, then check for last filled field in forward direction.\n        if !shouldAllowIntermediateEditing {\n            for index in stride(from: 1, to: fieldsCount + 1, by: 1) {\n                let tempNextOTPField = viewWithTag(index) as? UITextField\n                \n                if let tempNextOTPFieldText = tempNextOTPField?.text, tempNextOTPFieldText.isEmpty {\n                    nextOTPField = tempNextOTPField\n                    \n                    break\n                }\n            }\n            \n            if let nextOTPField = nextOTPField {\n                isTextFilled = (nextOTPField == textField || (textField.tag) == (nextOTPField.tag - 1))\n            }\n        }\n        \n        return isTextFilled\n    }\n    \n    // Helper function to get the OTP String entered\n    fileprivate func calculateEnteredOTPSTring(isDeleted: Bool) {\n        if isDeleted {\n            _ = delegate?.hasEnteredAllOTP(hasEnteredAll: false)\n            \n            // Set the default enteres state for otp entry\n            for index in stride(from: 0, to: fieldsCount, by: 1) {\n                var otpField = viewWithTag(index + 1) as? OTPTextField\n                \n                if otpField == nil {\n                    otpField = getOTPField(forIndex: index)\n                }\n                \n                let fieldBackgroundColor = (otpField?.text ?? \"\").isEmpty ? defaultBackgroundColor : filledBackgroundColor\n                let fieldBorderColor = (otpField?.text ?? \"\").isEmpty ? defaultBorderColor : filledBorderColor\n                \n                if displayType == .diamond || displayType == .underlinedBottom {\n                    otpField?.shapeLayer.fillColor = fieldBackgroundColor.cgColor\n                    otpField?.shapeLayer.strokeColor = fieldBorderColor.cgColor\n                } else {\n                    otpField?.backgroundColor = fieldBackgroundColor\n                    otpField?.layer.borderColor = fieldBorderColor.cgColor\n                }\n            }\n        }\n        else {\n            var enteredOTPString = \"\"\n            \n            // Check for entered OTP\n            for index in stride(from: 0, to: secureEntryData.count, by: 1) {\n                if !secureEntryData[index].isEmpty {\n                    enteredOTPString.append(secureEntryData[index])\n                }\n            }\n            \n            if enteredOTPString.count == fieldsCount {\n                delegate?.enteredOTP(otp: enteredOTPString)\n                \n                // Check if all OTP fields have been filled or not. Based on that call the 2 delegate methods.\n                let isValid = delegate?.hasEnteredAllOTP(hasEnteredAll: (enteredOTPString.count == fieldsCount)) ?? false\n                \n                // Set the error state for invalid otp entry\n                for index in stride(from: 0, to: fieldsCount, by: 1) {\n                    var otpField = viewWithTag(index + 1) as? OTPTextField\n                    \n                    if otpField == nil {\n                        otpField = getOTPField(forIndex: index)\n                    }\n                    \n                    if !isValid {\n                        // Set error border color if set, if not, set default border color\n                        otpField?.layer.borderColor = (errorBorderColor ?? filledBorderColor).cgColor\n                    }\n                    else {\n                        otpField?.layer.borderColor = filledBorderColor.cgColor\n                    }\n                }\n            }\n        }\n    }\n    \n}\n\nextension OTPFieldView: UITextFieldDelegate {\n    public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {\n        let shouldBeginEditing = delegate?.shouldBecomeFirstResponderForOTP(otpTextFieldIndex: (textField.tag - 1)) ?? true\n        if shouldBeginEditing {\n            return isPreviousFieldsEntered(forTextField: textField)\n        }\n        \n        return shouldBeginEditing\n    }\n    \n    public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n        let replacedText = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? \"\"\n        \n        // Check since only alphabet keyboard is not available in iOS\n        if !replacedText.isEmpty && otpInputType == .alphabet && replacedText.rangeOfCharacter(from: .letters) == nil {\n            return false\n        }\n        \n        if replacedText.count >= 1 {\n            // If field has a text already, then replace the text and move to next field if present\n            secureEntryData[textField.tag - 1] = string\n            \n            if hideEnteredText {\n                textField.text = \" \"\n            }\n            else {\n                if secureEntry {\n                    textField.text = \"•\"\n                }\n                else {\n                    textField.text = string\n                }\n            }\n            \n            if displayType == .diamond || displayType == .underlinedBottom {\n                (textField as! OTPTextField).shapeLayer.fillColor = filledBackgroundColor.cgColor\n                (textField as! OTPTextField).shapeLayer.strokeColor = filledBorderColor.cgColor\n            }\n            else {\n                textField.backgroundColor = filledBackgroundColor\n                textField.layer.borderColor = filledBorderColor.cgColor\n            }\n            \n            let nextOTPField = viewWithTag(textField.tag + 1)\n            \n            if let nextOTPField = nextOTPField {\n                nextOTPField.becomeFirstResponder()\n            }\n            else {\n                textField.resignFirstResponder()\n            }\n            \n            // Get the entered string\n            calculateEnteredOTPSTring(isDeleted: false)\n        }\n        else {\n            let currentText = textField.text ?? \"\"\n            \n            if textField.tag > 1 && currentText.isEmpty {\n                if let prevOTPField = viewWithTag(textField.tag - 1) as? UITextField {\n                    deleteText(in: prevOTPField)\n                }\n            } else {\n                deleteText(in: textField)\n                \n                if textField.tag > 1 {\n                    if let prevOTPField = viewWithTag(textField.tag - 1) as? UITextField {\n                        prevOTPField.becomeFirstResponder()\n                    }\n                }\n            }\n        }\n        \n        return false\n    }\n    \n    private func deleteText(in textField: UITextField) {\n        // If deleting the text, then move to previous text field if present\n        secureEntryData[textField.tag - 1] = \"\"\n        textField.text = \"\"\n        \n        if displayType == .diamond || displayType == .underlinedBottom {\n            (textField as! OTPTextField).shapeLayer.fillColor = defaultBackgroundColor.cgColor\n            (textField as! OTPTextField).shapeLayer.strokeColor = defaultBorderColor.cgColor\n        } else {\n            textField.backgroundColor = defaultBackgroundColor\n            textField.layer.borderColor = defaultBorderColor.cgColor\n        }\n        \n        textField.becomeFirstResponder()\n        \n        // Get the entered string\n        calculateEnteredOTPSTring(isDeleted: true)\n    }\n}\n"
  },
  {
    "path": "OTPFieldView/OTPTextField.swift",
    "content": "//\n//  OTPTextField.swift\n//  OTPFieldView\n//\n//  Created by Vaibhav Bhasin on 10/09/19.\n//  Copyright © 2019 Vaibhav Bhasin. All rights reserved.\n//\n\n//    MIT License\n//\n//    Copyright (c) 2019 Vaibhav Bhasin\n//\n//    Permission is hereby granted, free of charge, to any person obtaining a copy\n//    of this software and associated documentation files (the \"Software\"), to deal\n//    in the Software without restriction, including without limitation the rights\n//    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//    copies of the Software, and to permit persons to whom the Software is\n//    furnished to do so, subject to the following conditions:\n//\n//    The above copyright notice and this permission notice shall be included in all\n//    copies or substantial portions of the Software.\n//\n//    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n//    SOFTWARE.\n\nimport UIKit\n\n\n@objc class OTPTextField: UITextField {\n    /// Border color info for field\n    public var otpBorderColor: UIColor = UIColor.black\n    \n    /// Border width info for field\n    public var otpBorderWidth: CGFloat = 2\n    \n    public var shapeLayer: CAShapeLayer!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n    \n    public func initalizeUI(forFieldType type: DisplayType) {\n        switch type {\n        case .circular:\n            layer.cornerRadius = bounds.size.width / 2\n            break\n        case .roundedCorner:\n            layer.cornerRadius = 4\n            break\n        case .square:\n            layer.cornerRadius = 0\n            break\n        case .diamond:\n            addDiamondMask()\n            break\n        case .underlinedBottom:\n            addBottomView()\n            break\n        }\n        \n        // Basic UI setup\n        if type != .diamond && type != .underlinedBottom {\n            layer.borderColor = otpBorderColor.cgColor\n            layer.borderWidth = otpBorderWidth\n        }\n        \n        autocorrectionType = .no\n        textAlignment = .center\n        if #available(iOS 12.0, *) {\n            textContentType = .oneTimeCode\n        }\n    }\n    \n    override func deleteBackward() {\n        super.deleteBackward()\n        \n        _ = delegate?.textField?(self, shouldChangeCharactersIn: NSMakeRange(0, 0), replacementString: \"\")\n    }\n    \n    // Helper function to create diamond view\n    fileprivate func addDiamondMask() {\n        let path = UIBezierPath()\n        path.move(to: CGPoint(x: bounds.size.width / 2.0, y: 0))\n        path.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height / 2.0))\n        path.addLine(to: CGPoint(x: bounds.size.width / 2.0, y: bounds.size.height))\n        path.addLine(to: CGPoint(x: 0, y: bounds.size.height / 2.0))\n        path.close()\n        \n        let maskLayer = CAShapeLayer()\n        maskLayer.path = path.cgPath\n        \n        layer.mask = maskLayer\n        \n        shapeLayer = CAShapeLayer()\n        shapeLayer.path = path.cgPath\n        shapeLayer.lineWidth = otpBorderWidth\n        shapeLayer.fillColor = backgroundColor?.cgColor\n        shapeLayer.strokeColor = otpBorderColor.cgColor\n        \n        layer.addSublayer(shapeLayer)\n    }\n    \n    // Helper function to create a underlined bottom view\n    fileprivate func addBottomView() {\n        let path = UIBezierPath()\n        path.move(to: CGPoint(x: 0, y: bounds.size.height))\n        path.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height))\n        path.close()\n        \n        shapeLayer = CAShapeLayer()\n        shapeLayer.path = path.cgPath\n        shapeLayer.lineWidth = otpBorderWidth\n        shapeLayer.fillColor = backgroundColor?.cgColor\n        shapeLayer.strokeColor = otpBorderColor.cgColor\n        \n        layer.addSublayer(shapeLayer)\n    }\n}\n"
  },
  {
    "path": "OTPFieldView.podspec",
    "content": "Pod::Spec.new do |spec|\n\n  spec.name         = \"OTPFieldView\"\n  spec.version      = \"1.0.1\"\n  spec.summary      = \"A CocoaPods library for One Time Password View written in Swift\"\n\n  spec.description  = <<-DESC\n  This library helps you create One-Time-Password view for iOS Applications\n                   DESC\n\n  spec.homepage     = \"https://github.com/Root-vb/OTPFieldView\"\n  spec.license      = { :type => \"MIT\", :file => \"LICENSE\" }\n  spec.author             = { \"Vaibhav Bhasin\" => \"vaibhavbhasin15@gmail.com\" }\n  \n  spec.ios.deployment_target = \"10.3\"\n  spec.swift_version = \"5.0\"  \n  \n  spec.source       = { :git => \"https://github.com/Root-vb/OTPFieldView.git\", :tag => \"#{spec.version}\" }\n  spec.source_files  = \"OTPFieldView/**/*.{h,m,swift}\"\n\nend\n"
  },
  {
    "path": "OTPFieldView.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t13EDE57623278D8700B45FF6 /* OTPFieldView.h in Headers */ = {isa = PBXBuildFile; fileRef = 13EDE57423278D8700B45FF6 /* OTPFieldView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t13EDE57D23278DC400B45FF6 /* OTPFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EDE57C23278DC400B45FF6 /* OTPFieldView.swift */; };\n\t\t13EDE57F23278E9A00B45FF6 /* OTPTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EDE57E23278E9A00B45FF6 /* OTPTextField.swift */; };\n\t\t13EDE5872327A8C400B45FF6 /* OTPFieldViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13EDE5862327A8C400B45FF6 /* OTPFieldViewTests.swift */; };\n\t\t13EDE5892327A8C400B45FF6 /* OTPFieldView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13EDE57123278D8700B45FF6 /* OTPFieldView.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t13EDE58A2327A8C400B45FF6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 13EDE56823278D8700B45FF6 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13EDE57023278D8700B45FF6;\n\t\t\tremoteInfo = OTPFieldView;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t13EDE57123278D8700B45FF6 /* OTPFieldView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OTPFieldView.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13EDE57423278D8700B45FF6 /* OTPFieldView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OTPFieldView.h; sourceTree = \"<group>\"; };\n\t\t13EDE57523278D8700B45FF6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t13EDE57C23278DC400B45FF6 /* OTPFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPFieldView.swift; sourceTree = \"<group>\"; };\n\t\t13EDE57E23278E9A00B45FF6 /* OTPTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPTextField.swift; sourceTree = \"<group>\"; };\n\t\t13EDE5842327A8C400B45FF6 /* OTPFieldViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OTPFieldViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13EDE5862327A8C400B45FF6 /* OTPFieldViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPFieldViewTests.swift; sourceTree = \"<group>\"; };\n\t\t13EDE5882327A8C400B45FF6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t13EDE56E23278D8700B45FF6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13EDE5812327A8C400B45FF6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13EDE5892327A8C400B45FF6 /* OTPFieldView.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t13EDE56723278D8700B45FF6 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13EDE57323278D8700B45FF6 /* OTPFieldView */,\n\t\t\t\t13EDE5852327A8C400B45FF6 /* OTPFieldViewTests */,\n\t\t\t\t13EDE57223278D8700B45FF6 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13EDE57223278D8700B45FF6 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13EDE57123278D8700B45FF6 /* OTPFieldView.framework */,\n\t\t\t\t13EDE5842327A8C400B45FF6 /* OTPFieldViewTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13EDE57323278D8700B45FF6 /* OTPFieldView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13EDE57423278D8700B45FF6 /* OTPFieldView.h */,\n\t\t\t\t13EDE57523278D8700B45FF6 /* Info.plist */,\n\t\t\t\t13EDE57C23278DC400B45FF6 /* OTPFieldView.swift */,\n\t\t\t\t13EDE57E23278E9A00B45FF6 /* OTPTextField.swift */,\n\t\t\t);\n\t\t\tpath = OTPFieldView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13EDE5852327A8C400B45FF6 /* OTPFieldViewTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13EDE5862327A8C400B45FF6 /* OTPFieldViewTests.swift */,\n\t\t\t\t13EDE5882327A8C400B45FF6 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = OTPFieldViewTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t13EDE56C23278D8700B45FF6 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13EDE57623278D8700B45FF6 /* OTPFieldView.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t13EDE57023278D8700B45FF6 /* OTPFieldView */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13EDE57923278D8700B45FF6 /* Build configuration list for PBXNativeTarget \"OTPFieldView\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13EDE56C23278D8700B45FF6 /* Headers */,\n\t\t\t\t13EDE56D23278D8700B45FF6 /* Sources */,\n\t\t\t\t13EDE56E23278D8700B45FF6 /* Frameworks */,\n\t\t\t\t13EDE56F23278D8700B45FF6 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = OTPFieldView;\n\t\t\tproductName = OTPFieldView;\n\t\t\tproductReference = 13EDE57123278D8700B45FF6 /* OTPFieldView.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t13EDE5832327A8C400B45FF6 /* OTPFieldViewTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13EDE58C2327A8C400B45FF6 /* Build configuration list for PBXNativeTarget \"OTPFieldViewTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13EDE5802327A8C400B45FF6 /* Sources */,\n\t\t\t\t13EDE5812327A8C400B45FF6 /* Frameworks */,\n\t\t\t\t13EDE5822327A8C400B45FF6 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t13EDE58B2327A8C400B45FF6 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = OTPFieldViewTests;\n\t\t\tproductName = OTPFieldViewTests;\n\t\t\tproductReference = 13EDE5842327A8C400B45FF6 /* OTPFieldViewTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t13EDE56823278D8700B45FF6 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1030;\n\t\t\t\tLastUpgradeCheck = 1030;\n\t\t\t\tORGANIZATIONNAME = \"Vaibhav Bhasin\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t13EDE57023278D8700B45FF6 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.3;\n\t\t\t\t\t\tLastSwiftMigration = 1030;\n\t\t\t\t\t};\n\t\t\t\t\t13EDE5832327A8C400B45FF6 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.3;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 13EDE56B23278D8700B45FF6 /* Build configuration list for PBXProject \"OTPFieldView\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 13EDE56723278D8700B45FF6;\n\t\t\tproductRefGroup = 13EDE57223278D8700B45FF6 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13EDE57023278D8700B45FF6 /* OTPFieldView */,\n\t\t\t\t13EDE5832327A8C400B45FF6 /* OTPFieldViewTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t13EDE56F23278D8700B45FF6 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13EDE5822327A8C400B45FF6 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t13EDE56D23278D8700B45FF6 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13EDE57D23278DC400B45FF6 /* OTPFieldView.swift in Sources */,\n\t\t\t\t13EDE57F23278E9A00B45FF6 /* OTPTextField.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13EDE5802327A8C400B45FF6 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13EDE5872327A8C400B45FF6 /* OTPFieldViewTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t13EDE58B2327A8C400B45FF6 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13EDE57023278D8700B45FF6 /* OTPFieldView */;\n\t\t\ttargetProxy = 13EDE58A2327A8C400B45FF6 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t13EDE57723278D8700B45FF6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13EDE57823278D8700B45FF6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13EDE57A23278D8700B45FF6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 7X5CB8QV9R;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = OTPFieldView/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Vaibhav.OTPFieldView;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13EDE57B23278D8700B45FF6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = 7X5CB8QV9R;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = OTPFieldView/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.3;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Vaibhav.OTPFieldView;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13EDE58D2327A8C400B45FF6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 7X5CB8QV9R;\n\t\t\t\tINFOPLIST_FILE = OTPFieldViewTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Vaibhav.OTPFieldViewTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13EDE58E2327A8C400B45FF6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 7X5CB8QV9R;\n\t\t\t\tINFOPLIST_FILE = OTPFieldViewTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Vaibhav.OTPFieldViewTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t13EDE56B23278D8700B45FF6 /* Build configuration list for PBXProject \"OTPFieldView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13EDE57723278D8700B45FF6 /* Debug */,\n\t\t\t\t13EDE57823278D8700B45FF6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13EDE57923278D8700B45FF6 /* Build configuration list for PBXNativeTarget \"OTPFieldView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13EDE57A23278D8700B45FF6 /* Debug */,\n\t\t\t\t13EDE57B23278D8700B45FF6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13EDE58C2327A8C400B45FF6 /* Build configuration list for PBXNativeTarget \"OTPFieldViewTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13EDE58D2327A8C400B45FF6 /* Debug */,\n\t\t\t\t13EDE58E2327A8C400B45FF6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 13EDE56823278D8700B45FF6 /* Project object */;\n}\n"
  },
  {
    "path": "OTPFieldView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:OTPFieldView.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "OTPFieldView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "OTPFieldView.xcodeproj/xcuserdata/vaibhavbhasin.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>OTPFieldView.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t\t<key>OTPFieldViewTests.xcscheme_^#shared#^_</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>1</integer>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "OTPFieldViewTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "OTPFieldViewTests/OTPFieldViewTests.swift",
    "content": "//\n//  OTPFieldViewTests.swift\n//  OTPFieldViewTests\n//\n//  Created by Vaibhav Bhasin on 10/09/19.\n//  Copyright © 2019 Vaibhav Bhasin. All rights reserved.\n//\n\nimport XCTest\n\nclass OTPFieldViewTests: XCTestCase {\n\n    override func setUp() {\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n\n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n    }\n\n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n\n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n\n}\n"
  },
  {
    "path": "README.md",
    "content": "# OTPFieldView\nOne Time Password View for iOS. Built in Swift 5\n\n<p align=\"left\">\n<a href=\"https://developer.apple.com/swift\"><img src=\"https://img.shields.io/badge/Swift_5-compatible-4BC51D.svg?style=flat\" alt=\"Swift 5 compatible\" /></a>\n<img src=\"https://img.shields.io/badge/platform-iOS-blue.svg?style=flat\" alt=\"Platform iOS\" />\n<a href=\"https://raw.githubusercontent.com/maxsokolov/tablekit/master/LICENSE\"><img src=\"http://img.shields.io/badge/license-MIT-blue.svg?style=flat\" alt=\"License: MIT\" /></a>\n</p>\n\n### Preview\n\n![demo](Screenshots/IMG_0198.PNG)\n![demo](Screenshots/IMG_0199.PNG)\n![demo](Screenshots/IMG_0200.PNG)\n![demo](Screenshots/IMG_0201.PNG)\n![demo](Screenshots/IMG_0202.PNG)\n\n## Installation\n\n### CocoaPods\n\nAdd the following line to your Podfile:\n\n```ruby\npod 'OTPFieldView'\n```\n\nThen run the following in the same directory as your Podfile:\n```ruby\npod install\n```\n\n## Usage\n\n### Code\n```swift\n@IBOutlet var otpTextFieldView: OTPFieldView!\n\nfunc setupOtpView(){\n        self.otpTextFieldView.fieldsCount = 5\n        self.otpTextFieldView.fieldBorderWidth = 2\n        self.otpTextFieldView.defaultBorderColor = UIColor.black\n        self.otpTextFieldView.filledBorderColor = UIColor.green\n        self.otpTextFieldView.cursorColor = UIColor.red\n        self.otpTextFieldView.displayType = .underlinedBottom\n        self.otpTextFieldView.fieldSize = 40\n        self.otpTextFieldView.separatorSpace = 8\n        self.otpTextFieldView.shouldAllowIntermediateEditing = false\n        self.otpTextFieldView.delegate = self\n        self.otpTextFieldView.initializeUI()\n    }\n```\nThe `becomeFirstResponderAtIndex` property sets the pinField at the specified index as the first responder.\nThe `isContentTypeOneTimeCode` property sets the contentType of the first pinField to `.oneTimeCode` to leverage the iOS 12 feature where the passcode is directly fetched from the messages. \n\n#### Styles\n```swift\nenum DisplayType: Int {\n    case circular\n    case roundedCorner\n    case square\n    case diamond\n    case underlinedBottom\n}\n```\n\n### Delegate Methods\n\n```swift\nextension OtpViewController: OTPFieldViewDelegate {\n    func hasEnteredAllOTP(hasEnteredAll hasEntered: Bool) -> Bool {\n        print(\"Has entered all OTP? \\(hasEntered)\")\n        return false\n    }\n    \n    func shouldBecomeFirstResponderForOTP(otpTextFieldIndex index: Int) -> Bool {\n        return true\n    }\n    \n    func enteredOTP(otp otpString: String) {\n        print(\"OTPString: \\(otpString)\")\n    }\n}\n```\n\n- **hasEnteredAllOTP()**: Returns true when all text Fields are full.\n- **shouldBecomeFirstResponderForOTP()**: Show keyboard automatically.\n- **enteredOTP()**: Get entered pin.\n\n### Properties\n\n- **.displayType**: Display type for Text Field.\n- **.fieldsCount**: Length of OTP.\n- **.otpInputType**: Input type for Text Field : numeric, alphabet, alphaNumeric.\n\n- **.fieldFont**: Font for Text Field.\n- **.secureEntry**: Shows • instead of text.\n- **.hideEnteredText**: Hides the text.\n- **.requireCursor**: Shows/Hides cursor.\n- **.cursorColor**: Color for Cursor.\n- **.fieldSize**: Size of Text Field.\n- **.separatorSpace**: Space between Text Fields.\n- **.fieldBorderWidth**: Border width for Text Fields.\n- **.shouldAllowIntermediateEditing**: Allow to edit from middle.\n- **.defaultBackgroundColor**: Empty text field background color.\n- **.filledBackgroundColor**: Filled text field background color.\n- **.defaultBorderColor**: Empty text field border color.\n- **.filledBorderColor**: Filled text field border color.\n- **.errorBorderColor**: Error text field border color.\n- **.delegate**: delegate.\n\n## License\n\nOTPFieldView is available under the MIT license. See LICENSE for details.\n"
  }
]