[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: ltmorphinglabel\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".gitignore",
    "content": "\n# Created by https://www.gitignore.io/api/osx,carthage,swift\n\n### Carthage ###\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n### OSX ###\n*.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\r\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n### Swift ###\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n.build/\n\n# CocoaPods - Refactored to standalone file\n\n# Carthage - Refactored to standalone file\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\n\n# End of https://www.gitignore.io/api/osx,carthage,swift\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules:\n  - todo\n  - force_cast\n  - trailing_whitespace\n  - colon\n  - identifier_name\n  - type_name\n  - comma\n  - closure_parameter_position\nexcluded:\n  - Carthage\n  - Pods\nline_length: 120\nfunction_body_length:\n  - 230\n  - 300\ntype_body_length:\n  - 300\n  - 600\nfile_length:\n  - 600\n  - 800\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\nCopyright © 2026 Lex Tang, https://lex.sh\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\nall copies 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "LTMorphingLabel/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>en</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</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LTMorphingLabel/LTCharacterDiffResult.swift",
    "content": "//\n//  LTCharacterDiffResult.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\npublic enum LTCharacterDiffResult: CustomDebugStringConvertible, Equatable {\n    \n    case same\n    case add\n    case delete\n    case move(offset: Int)\n    case moveAndAdd(offset: Int)\n    case replace\n    \n    public var debugDescription: String {\n        switch self {\n        case .same:\n            return \"The character is unchanged.\"\n        case .add:\n            return \"A new character is ADDED.\"\n        case .delete:\n            return \"The character is DELETED.\"\n        case .move(let offset):\n            return \"The character is MOVED to \\(offset).\"\n        case .moveAndAdd(let offset):\n            return \"The character is MOVED to \\(offset) and a new character is ADDED.\"\n        case .replace:\n            return \"The character is REPLACED with a new character.\"\n        }\n    }\n    \n}\n\npublic func == (lhs: LTCharacterDiffResult, rhs: LTCharacterDiffResult) -> Bool {\n    switch (lhs, rhs) {\n    case (.move(let offset0), .move(let offset1)):\n        return offset0 == offset1\n    \n    case (.moveAndAdd(let offset0), .moveAndAdd(let offset1)):\n        return offset0 == offset1\n    \n    case (.add, .add):\n        return true\n        \n    case (.delete, .delete):\n        return true\n    \n    case (.replace, .replace):\n        return true\n    \n    case (.same, .same):\n        return true\n    \n    default: return false\n    }\n}\n"
  },
  {
    "path": "LTMorphingLabel/LTCharacterLimbo.swift",
    "content": "//\n//  LTCharacterLimbo.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\npublic struct LTCharacterLimbo: CustomDebugStringConvertible {\n    \n    public let char: Character\n    public var rect: CGRect\n    public var alpha: CGFloat\n    public var size: CGFloat\n    public var drawingProgress: CGFloat = 0.0\n    \n    public var debugDescription: String {\n        return \"Character: '\\(char)'\"\n            + \"drawIn (\\(rect.origin.x), \\(rect.origin.y), \"\n            + \"\\(rect.size.width)x\\(rect.size.height) \"\n            + \"with alpha \\(alpha) \"\n            + \"and \\(size)pt font.\"\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTEasing.swift",
    "content": "//\n//  LTEasing.swift\n//  LTMorphingLabelDemo\n//\n//  Created by Lex on 7/1/14.\n//  Copyright (c) 2015 lexrus.com. All rights reserved.\n//\n\nimport Foundation\n\n// http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js\n// t = currentTime\n// b = beginning\n// c = change\n// d = duration\n\npublic struct LTEasing {\n    \n    public static func easeOutQuint(_ t: Float, _ b: Float, _ c: Float, _ d: Float = 1.0) -> Float {\n        return { (f: Float) in\n            return c * (pow(f, 5) + 1.0) + b\n            }(t / d - 1.0)\n    }\n    \n    public static func easeInQuint(_ t: Float, _ b: Float, _ c: Float, _ d: Float = 1.0) -> Float {\n        return { (f: Float) in\n            c * pow(f, 5) + b\n        }(t / d)\n    }\n    \n    public static func easeOutBack(_ t: Float, _ b: Float, _ c: Float, _ d: Float = 1.0) -> Float {\n        let s: Float = 2.70158\n        let t2: Float = t / d - 1.0\n        return Float(c * (t2 * t2 * ((s + 1.0) * t2 + s) + 1.0)) + b\n    }\n    \n    public static func easeOutBounce(_ t: Float, _ b: Float, _ c: Float, _ d: Float = 1.0) -> Float {\n        return { (f: Float) in\n            if f < 1 / 2.75 {\n                return c * 7.5625 * f * f + b\n            } else if f < 2 / 2.75 {\n                let t = f - 1.5 / 2.75\n                return c * (7.5625 * t * t + 0.75) + b\n            } else if f < 2.5 / 2.75 {\n                let t = f - 2.25 / 2.75\n                return c * (7.5625 * t * t + 0.9375) + b\n            } else {\n                let t = f - 2.625 / 2.75\n                return c * (7.5625 * t * t + 0.984375) + b\n            }\n        }(t / d)\n    }\n\n}\n"
  },
  {
    "path": "LTMorphingLabel/LTEmitterView.swift",
    "content": "//\n//  LTEmitterView.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l < r\n  case (nil, _?):\n    return true\n  default:\n    return false\n  }\n}\n\nprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l > r\n  default:\n    return rhs < lhs\n  }\n}\n\npublic struct LTEmitter {\n    \n    let layer: CAEmitterLayer = {\n        let layer = CAEmitterLayer()\n        layer.emitterPosition = CGPoint(x: 10, y: 10)\n        layer.emitterSize = CGSize(width: 10, height: 1)\n        layer.renderMode = .unordered\n        layer.emitterShape = .line\n        return layer\n        }()\n    \n    let cell: CAEmitterCell = {\n        let cell = CAEmitterCell()\n        cell.name = \"sparkle\"\n        cell.birthRate = 150.0\n        cell.velocity = 50.0\n        cell.velocityRange = -80.0\n        cell.lifetime = 0.16\n        cell.lifetimeRange = 0.1\n        cell.emissionLongitude = CGFloat(Double.pi / 2 * 2.0)\n        cell.emissionRange = CGFloat(Double.pi / 2 * 2.0)\n        cell.scale = 0.1\n        cell.yAcceleration = 100\n        cell.scaleSpeed = -0.06\n        cell.scaleRange = 0.1\n        return cell\n        }()\n    \n    public var duration: Float = 0.6\n    \n    init(name: String, particleName: String, duration: Float) {\n        cell.name = name\n        self.duration = duration\n        var image: UIImage?\n        defer {\n            cell.contents = image?.cgImage\n        }\n\n        image = UIImage(named: particleName)\n\n        if image != nil {\n            return\n        }\n        // Load from Framework\n        image = UIImage(\n            named: particleName,\n            in: Bundle(for: LTMorphingLabel.self),\n            compatibleWith: nil)\n    }\n    \n    public func play() {\n        if layer.emitterCells?.count > 0 {\n            return\n        }\n        \n        layer.emitterCells = [cell]\n        let d = DispatchTime.now() + Double(Int64(duration * Float(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)\n        DispatchQueue.main.asyncAfter(deadline: d) { [weak layer] in\n            layer?.birthRate = 0.0\n        }\n    }\n    \n    public func stop() {\n        if nil != layer.superlayer {\n            layer.emitterCells = nil\n            layer.removeFromSuperlayer()\n        }\n    }\n    \n    func update(_ configureClosure: LTEmitterConfigureClosure? = .none) -> LTEmitter {\n        configureClosure?(layer, cell)\n        return self\n    }\n    \n}\n\npublic typealias LTEmitterConfigureClosure = (CAEmitterLayer, CAEmitterCell) -> Void\n\nopen class LTEmitterView: UIView {\n    \n    open lazy var emitters: [String: LTEmitter] = {\n        var _emitters = [String: LTEmitter]()\n        return _emitters\n        }()\n    \n    open func createEmitter(\n        _ name: String,\n        particleName: String,\n        duration: Float,\n        configureClosure: LTEmitterConfigureClosure?\n        ) -> LTEmitter {\n\n            var emitter: LTEmitter\n            if let e = emitters[name] {\n                emitter = e\n            } else {\n                emitter = LTEmitter(\n                    name: name,\n                    particleName: particleName,\n                    duration: duration\n                )\n\n                configureClosure?(emitter.layer, emitter.cell)\n\n                layer.addSublayer(emitter.layer)\n                emitters.updateValue(emitter, forKey: name)\n            }\n            return emitter\n    }\n    \n    open func removeAllEmitters() {\n        emitters.forEach {\n            $0.value.layer.removeFromSuperlayer()\n        }\n        emitters.removeAll(keepingCapacity: false)\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingEffect.swift",
    "content": "//\n//  LTMorphingEffect.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\n@objc public enum LTMorphingEffect\n    : Int\n    , CustomStringConvertible\n    , ExpressibleByIntegerLiteral\n    , ExpressibleByStringLiteral\n    , CaseIterable {\n    \n    public typealias IntegerLiteralType = Int\n    public typealias StringLiteralType = String\n\n    case scale = 0\n    case evaporate\n    case fall\n    case pixelate\n    case sparkle\n    case burn\n    case anvil\n    \n    public static let allValues = [\n        \"Scale\", \"Evaporate\", \"Fall\", \"Pixelate\", \"Sparkle\", \"Burn\", \"Anvil\"\n    ]\n    \n    public var description: String {\n        switch self {\n        case .evaporate:\n            return \"Evaporate\"\n        case .fall:\n            return \"Fall\"\n        case .pixelate:\n            return \"Pixelate\"\n        case .sparkle:\n            return \"Sparkle\"\n        case .burn:\n            return \"Burn\"\n        case .anvil:\n            return \"Anvil\"\n        default:\n            return \"Scale\"\n        }\n    }\n    \n    public init(integerLiteral value: Int) {\n        self = LTMorphingEffect(rawValue: value) ?? .scale\n    }\n    \n    public init(stringLiteral value: String) {\n        self = {\n            switch value {\n            case \"Evaporate\": return .evaporate\n            case \"Fall\": return .fall\n            case \"Pixelate\": return .pixelate\n            case \"Sparkle\": return .sparkle\n            case \"Burn\": return .burn\n            case \"Anvil\": return .anvil\n            default: return .scale\n            }\n        }()\n    }\n\n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Anvil.swift",
    "content": "//\n//  LTMorphingLabel+Anvil.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n\n    @objc\n    func AnvilLoad() {\n        \n        startClosures[\"Anvil\\(LTMorphingPhases.start)\"] = {\n            self.emitterView.removeAllEmitters()\n            \n            guard self.newRects.count > 0 else { return }\n            \n            let centerRect = self.newRects[Int(self.newRects.count / 2)]\n\n            _ = self.emitterView.createEmitter(\n                \"leftSmoke\",\n                particleName: \"Smoke\",\n                duration: 0.6\n                ) { (layer, cell) in\n                    layer.emitterSize = CGSize(width: 1, height: 1)\n                    layer.emitterPosition = CGPoint(\n                        x: centerRect.origin.x,\n                        y: centerRect.origin.y + centerRect.size.height / 1.3)\n                    layer.renderMode = .unordered\n                    cell.emissionLongitude = CGFloat(Double.pi / 2)\n                    cell.scale = self.font.pointSize / 90.0\n                    cell.scaleSpeed = self.font.pointSize / 130\n                    cell.birthRate = 60\n                    cell.velocity = CGFloat(80 + Int(arc4random_uniform(60)))\n                    cell.velocityRange = 100\n                    cell.yAcceleration = -40\n                    cell.xAcceleration = 70\n                    cell.emissionLongitude = CGFloat(-Double.pi / 2)\n                    cell.emissionRange = CGFloat(Double.pi / 4) / 5.0\n                    cell.lifetime = self.morphingDuration * 2.0\n                    cell.spin = 10\n                    cell.alphaSpeed = -0.5 / self.morphingDuration\n            }\n            \n            _ = self.emitterView.createEmitter(\n                \"rightSmoke\",\n                particleName: \"Smoke\",\n                duration: 0.6\n                ) { (layer, cell) in\n                    layer.emitterSize = CGSize(width: 1, height: 1)\n                    layer.emitterPosition = CGPoint(\n                        x: centerRect.origin.x,\n                        y: centerRect.origin.y + centerRect.size.height / 1.3)\n                    layer.renderMode = .unordered\n                    cell.emissionLongitude = CGFloat(Double.pi / 2)\n                    cell.scale = self.font.pointSize / 90.0\n                    cell.scaleSpeed = self.font.pointSize / 130\n                    cell.birthRate = 60\n                    cell.velocity = CGFloat(80 + Int(arc4random_uniform(60)))\n                    cell.velocityRange = 100\n                    cell.yAcceleration = -40\n                    cell.xAcceleration = -70\n                    cell.emissionLongitude = CGFloat(Double.pi / 2)\n                    cell.emissionRange = CGFloat(-Double.pi / 4) / 5.0\n                    cell.lifetime = self.morphingDuration * 2.0\n                    cell.spin = -10\n                    cell.alphaSpeed = -0.5 / self.morphingDuration\n            }\n            \n            _ = self.emitterView.createEmitter(\n                \"leftFragments\",\n                particleName: \"Fragment\",\n                duration: 0.6\n                ) { (layer, cell) in\n                    layer.emitterSize = CGSize(\n                        width: self.font.pointSize,\n                        height: 1\n                    )\n                    layer.emitterPosition = CGPoint(\n                        x: centerRect.origin.x,\n                        y: centerRect.origin.y + centerRect.size.height / 1.3\n                    )\n                    cell.scale = self.font.pointSize / 90.0\n                    cell.scaleSpeed = self.font.pointSize / 40.0\n                    cell.color = self.textColor.cgColor\n                    cell.birthRate = 60\n                    cell.velocity = 350\n                    cell.yAcceleration = 0\n                    cell.xAcceleration = CGFloat(10 * Int(arc4random_uniform(10)))\n                    cell.emissionLongitude = CGFloat(-Double.pi / 2)\n                    cell.emissionRange = CGFloat(Double.pi / 4) / 5.0\n                    cell.alphaSpeed = -2\n                    cell.lifetime = self.morphingDuration\n            }\n            \n            _ = self.emitterView.createEmitter(\n                \"rightFragments\",\n                particleName: \"Fragment\",\n                duration: 0.6\n                ) { (layer, cell) in\n                    layer.emitterSize = CGSize(\n                        width: self.font.pointSize,\n                        height: 1\n                    )\n                    layer.emitterPosition = CGPoint(\n                        x: centerRect.origin.x,\n                        y: centerRect.origin.y + centerRect.size.height / 1.3)\n                    cell.scale = self.font.pointSize / 90.0\n                    cell.scaleSpeed = self.font.pointSize / 40.0\n                    cell.color = self.textColor.cgColor\n                    cell.birthRate = 60\n                    cell.velocity = 350\n                    cell.yAcceleration = 0\n                    cell.xAcceleration = CGFloat(-10 * Int(arc4random_uniform(10)))\n                    cell.emissionLongitude = CGFloat(Double.pi / 2)\n                    cell.emissionRange = CGFloat(-Double.pi / 4) / 5.0\n                    cell.alphaSpeed = -2\n                    cell.lifetime = self.morphingDuration\n            }\n            \n            _ = self.emitterView.createEmitter(\n                \"fragments\",\n                particleName: \"Fragment\",\n                duration: 0.6\n                ) { (layer, cell) in\n                    layer.emitterSize = CGSize(\n                        width: self.font.pointSize,\n                        height: 1\n                    )\n                    layer.emitterPosition = CGPoint(\n                        x: centerRect.origin.x,\n                        y: centerRect.origin.y + centerRect.size.height / 1.3)\n                    cell.scale = self.font.pointSize / 90.0\n                    cell.scaleSpeed = self.font.pointSize / 40.0\n                    cell.color = self.textColor.cgColor\n                    cell.birthRate = 60\n                    cell.velocity = 250\n                    cell.velocityRange = CGFloat(Int(arc4random_uniform(20)) + 30)\n                    cell.yAcceleration = 500\n                    cell.emissionLongitude = 0\n                    cell.emissionRange = CGFloat(Double.pi / 2)\n                    cell.alphaSpeed = -1\n                    cell.lifetime = self.morphingDuration\n            }\n        }\n        \n        progressClosures[\"Anvil\\(LTMorphingPhases.progress)\"] = {\n            (index: Int, progress: Float, isNewChar: Bool) in\n            \n            if !isNewChar {\n                return min(1.0, max(0.0, progress))\n            }\n            \n            let j = Float(sin(Float(index))) * 1.7\n            return min(1.0, max(0.0001, progress + self.morphingCharacterDelay * j))\n            \n        }\n        \n        effectClosures[\"Anvil\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.previousRects[index],\n                alpha: CGFloat(1.0 - progress),\n                size: self.font.pointSize,\n                drawingProgress: 0.0)\n        }\n        \n        effectClosures[\"Anvil\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            var rect = self.newRects[index]\n            \n            if progress < 1.0 {\n                let easingValue = LTEasing.easeOutBounce(progress, 0.0, 1.0)\n                rect.origin.y = CGFloat(Float(rect.origin.y) * easingValue)\n            }\n            \n            if progress > self.morphingDuration * 0.5 {\n                let end = self.morphingDuration * 0.55\n                self.emitterView.createEmitter(\n                    \"fragments\",\n                    particleName: \"Fragment\",\n                    duration: 0.6\n                    ) { (_, _) in }.update { (layer, _) in\n                        if progress > end {\n                            layer.birthRate = 0\n                        }\n                    }.play()\n                self.emitterView.createEmitter(\n                    \"leftFragments\",\n                    particleName: \"Fragment\",\n                    duration: 0.6\n                    ) { (_, _) in }.update {  (layer, _) in\n                        if progress > end {\n                            layer.birthRate = 0\n                        }\n                    }.play()\n                self.emitterView.createEmitter(\n                    \"rightFragments\",\n                    particleName: \"Fragment\",\n                    duration: 0.6\n                    ) { (_, _) in }.update { (layer, _) in\n                        if progress > end {\n                            layer.birthRate = 0\n                        }\n                    }.play()\n            }\n            \n            if progress > self.morphingDuration * 0.63 {\n                let end = self.morphingDuration * 0.7\n                self.emitterView.createEmitter(\n                    \"leftSmoke\",\n                    particleName: \"Smoke\",\n                    duration: 0.6\n                    ) { (_, _) in }.update { (layer, _) in\n                        if progress > end {\n                            layer.birthRate = 0\n                        }\n                    }.play()\n                self.emitterView.createEmitter(\n                    \"rightSmoke\",\n                    particleName: \"Smoke\",\n                    duration: 0.6\n                    ) { (_, _) in }.update { (layer, _) in\n                        if progress > end {\n                            layer.birthRate = 0\n                        }\n                    }.play()\n            }\n                \n            return LTCharacterLimbo(\n                char: char,\n                rect: rect,\n                alpha: CGFloat(self.morphingProgress),\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(progress)\n            )\n        }\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Burn.swift",
    "content": "//\n//  LTMorphingLabel+Burn.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n    \n    fileprivate func burningImageForCharLimbo(\n        _ charLimbo: LTCharacterLimbo,\n        withProgress progress: CGFloat\n        ) -> (UIImage, CGRect) {\n            let maskedHeight = charLimbo.rect.size.height * max(0.01, progress)\n            let maskedSize = CGSize(\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n            UIGraphicsBeginImageContextWithOptions(\n                maskedSize,\n                false,\n                UIScreen.main.scale\n            )\n            let rect = CGRect(\n                x: 0,\n                y: 0,\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n            String(charLimbo.char).draw(in: rect, withAttributes: [\n                .font: self.font as Any,\n                .foregroundColor: self.textColor as Any\n                ])\n            guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else {\n                    return (UIImage() , .zero)\n                }\n        \n            UIGraphicsEndImageContext()\n            let newRect = CGRect(\n                x: charLimbo.rect.origin.x,\n                y: charLimbo.rect.origin.y,\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n        return (newImage, newRect)\n    }\n\n    @objc\n    func BurnLoad() {\n        \n        startClosures[\"Burn\\(LTMorphingPhases.start)\"] = {\n            self.emitterView.removeAllEmitters()\n        }\n        \n        progressClosures[\"Burn\\(LTMorphingPhases.progress)\"] = {\n            index, progress, isNewChar in\n            \n            if !isNewChar {\n                return min(1.0, max(0.0, progress))\n            }\n            \n            let j = Float(sin(Float(index))) * 1.5\n            return min(1.0, max(0.0001, progress + self.morphingCharacterDelay * j))\n            \n        }\n        \n        effectClosures[\"Burn\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.previousRects[index],\n                alpha: CGFloat(1.0 - progress),\n                size: self.font.pointSize,\n                drawingProgress: 0.0\n            )\n        }\n        \n        effectClosures[\"Burn\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            if char != \" \" {\n                let rect = self.newRects[index]\n                let emitterPosition = CGPoint(\n                    x: rect.origin.x + rect.size.width / 2.0,\n                    y: CGFloat(progress) * rect.size.height / 1.2 + rect.origin.y\n                )\n                \n                self.emitterView.createEmitter(\n                    \"c\\(index)\",\n                    particleName: \"Fire\",\n                    duration: self.morphingDuration\n                    ) { (layer, cell) in\n                        layer.emitterSize = CGSize(\n                            width: rect.size.width,\n                            height: 1\n                        )\n                        layer.renderMode = CAEmitterLayerRenderMode.additive\n                        layer.emitterMode = CAEmitterLayerEmitterMode.outline\n                        cell.emissionLongitude = CGFloat(Double.pi / 2)\n                        cell.scale = self.font.pointSize / 160.0\n                        cell.scaleSpeed = self.font.pointSize / 100.0\n                        cell.birthRate = Float(self.font.pointSize)\n                        cell.emissionLongitude = CGFloat(arc4random_uniform(30))\n                        cell.emissionRange = CGFloat(Double.pi / 4)\n                        cell.alphaSpeed = self.morphingDuration * -3.0\n                        cell.yAcceleration = 10\n                        cell.velocity = CGFloat(10 + Int(arc4random_uniform(3)))\n                        cell.velocityRange = 10\n                        cell.spin = 0\n                        cell.spinRange = 0\n                        cell.lifetime = self.morphingDuration / 3.0\n                    }.update { (layer, _) in\n                        layer.emitterPosition = emitterPosition\n                    }.play()\n                \n                self.emitterView.createEmitter(\n                    \"s\\(index)\",\n                    particleName: \"Smoke\",\n                    duration: self.morphingDuration\n                    ) { (layer, cell) in\n                        layer.emitterSize = CGSize(\n                            width: rect.size.width,\n                            height: 10\n                        )\n                        layer.renderMode = CAEmitterLayerRenderMode.additive\n                        layer.emitterMode = CAEmitterLayerEmitterMode.volume\n                        cell.emissionLongitude = CGFloat(Double.pi / 2)\n                        cell.scale = self.font.pointSize / 40.0\n                        cell.scaleSpeed = self.font.pointSize / 100.0\n                        cell.birthRate =\n                            Float(self.font.pointSize)\n                            / Float(arc4random_uniform(10) + 10)\n                        cell.emissionLongitude = 0\n                        cell.emissionRange = CGFloat(Double.pi / 4)\n                        cell.alphaSpeed = self.morphingDuration * -3\n                        cell.yAcceleration = -5\n                        cell.velocity = CGFloat(20 + Int(arc4random_uniform(15)))\n                        cell.velocityRange = 20\n                        cell.spin = CGFloat(Float(arc4random_uniform(30)) / 10.0)\n                        cell.spinRange = 3\n                        cell.lifetime = self.morphingDuration\n                    }.update { (layer, _) in\n                        layer.emitterPosition = emitterPosition\n                    }.play()\n            }\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.newRects[index],\n                alpha: 1.0,\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(progress)\n            )\n        }\n        \n        drawingClosures[\"Burn\\(LTMorphingPhases.draw)\"] = {\n            (charLimbo: LTCharacterLimbo) in\n            \n            if charLimbo.drawingProgress > 0.0 {\n                \n                let (charImage, rect) = self.burningImageForCharLimbo(\n                    charLimbo,\n                    withProgress: charLimbo.drawingProgress\n                )\n                charImage.draw(in: rect)\n                \n                return true\n            }\n            \n            return false\n        }\n        \n        skipFramesClosures[\"Burn\\(LTMorphingPhases.skipFrames)\"] = {\n            return 1\n        }\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Evaporate.swift",
    "content": "//\n//  LTMorphingLabel+Evaporate.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n\n    @objc\n    func EvaporateLoad() {\n        \n        progressClosures[\"Evaporate\\(LTMorphingPhases.progress)\"] = {\n            (index: Int, _, isNewChar: Bool) in\n            let j: Int = Int(round(cos(Double(index)) * 1.2))\n            let delay = isNewChar ? self.morphingCharacterDelay * -1.0 : self.morphingCharacterDelay\n            return min(1.0, max(0.0, self.morphingProgress + delay * Float(j)))\n        }\n        \n        effectClosures[\"Evaporate\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            let newProgress = LTEasing.easeOutQuint(progress, 0.0, 1.0, 1.0)\n            let yOffset: CGFloat = -0.8 * CGFloat(self.font.pointSize) * CGFloat(newProgress)\n            let currentRect = self.previousRects[index].offsetBy(dx: 0, dy: yOffset)\n            let currentAlpha = CGFloat(1.0 - newProgress)\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: currentRect,\n                alpha: currentAlpha,\n                size: self.font.pointSize,\n                drawingProgress: 0.0)\n        }\n        \n        effectClosures[\"Evaporate\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            let newProgress = 1.0 - LTEasing.easeOutQuint(progress, 0.0, 1.0)\n            let yOffset = CGFloat(self.font.pointSize) * CGFloat(newProgress) * 1.2\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.newRects[index].offsetBy(dx: 0, dy: yOffset),\n                alpha: CGFloat(self.morphingProgress),\n                size: self.font.pointSize,\n                drawingProgress: 0.0\n            )\n        }\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Fall.swift",
    "content": "//\n//  LTMorphingLabel+Fall.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n\n    @objc\n    func FallLoad() {\n        \n        progressClosures[\"Fall\\(LTMorphingPhases.progress)\"] = {\n            (index: Int, progress: Float, isNewChar: Bool) in\n            \n            if isNewChar {\n                return min(\n                    1.0,\n                    max(\n                        0.0,\n                        progress\n                            - self.morphingCharacterDelay\n                            * Float(index)\n                            / 1.7\n                    )\n                )\n            }\n            \n            let j: Float = Float(sin(Double(index))) * 1.7\n            return min(1.0, max(0.0001, progress + self.morphingCharacterDelay * Float(j)))\n            \n        }\n        \n        effectClosures[\"Fall\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.previousRects[index],\n                alpha: CGFloat(1.0 - progress),\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(progress))\n        }\n        \n        effectClosures[\"Fall\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            let currentFontSize = CGFloat(\n                LTEasing.easeOutQuint(progress, 0.0, Float(self.font.pointSize))\n            )\n            let yOffset = CGFloat(self.font.pointSize - currentFontSize)\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.newRects[index].offsetBy(dx: 0, dy: yOffset),\n                alpha: CGFloat(self.morphingProgress),\n                size: currentFontSize,\n                drawingProgress: 0.0\n            )\n        }\n        \n        drawingClosures[\"Fall\\(LTMorphingPhases.draw)\"] = {\n            limbo in\n            \n            if limbo.drawingProgress > 0.0 {\n                let context = UIGraphicsGetCurrentContext()\n                var charRect = limbo.rect\n                context!.saveGState()\n                let charCenterX = charRect.origin.x + (charRect.size.width / 2.0)\n                var charBottomY = charRect.origin.y + charRect.size.height - self.font.pointSize / 6\n                var charColor: UIColor = self.textColor\n                \n                // Fall down if drawingProgress is more than 50%\n                if limbo.drawingProgress > 0.5 {\n                    let ease = CGFloat(\n                        LTEasing.easeInQuint(\n                            Float(limbo.drawingProgress - 0.4),\n                            0.0,\n                            1.0,\n                            0.5\n                        )\n                    )\n                    charBottomY += ease * 10.0\n                    let fadeOutAlpha = min(\n                        1.0,\n                        max(\n                            0.0,\n                            limbo.drawingProgress * -2.0 + 2.0 + 0.01\n                        )\n                    )\n                    charColor = self.textColor.withAlphaComponent(fadeOutAlpha)\n                }\n                \n                charRect = CGRect(\n                    x: charRect.size.width / -2.0,\n                    y: charRect.size.height * -1.0 + self.font.pointSize / 6,\n                    width: charRect.size.width,\n                    height: charRect.size.height)\n                context!.translateBy(x: charCenterX, y: charBottomY)\n                \n                let angle = Float(sin(Double(limbo.rect.origin.x)) > 0.5 ? 168 : -168)\n                let rotation = CGFloat(\n                    LTEasing.easeOutBack(\n                        min(\n                            1.0,\n                            Float(limbo.drawingProgress)\n                        ),\n                        0.0,\n                        1.0\n                    ) * angle\n                )\n                context!.rotate(by: rotation * CGFloat(Double.pi) / 180.0)\n                let s = String(limbo.char)\n                let attributes: [NSAttributedString.Key: Any] = [\n                    .font: self.font.withSize(limbo.size),\n                    .foregroundColor: charColor\n                ]\n                s.draw(in: charRect, withAttributes: attributes)\n                context!.restoreGState()\n                \n                return true\n            }\n            \n            return false\n        }\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Pixelate.swift",
    "content": "//\n//  LTMorphingLabel+Pixelate.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n\n    @objc\n    func PixelateLoad() {\n        \n        effectClosures[\"Pixelate\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.previousRects[index],\n                alpha: CGFloat(1.0 - progress),\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(progress))\n        }\n        \n        effectClosures[\"Pixelate\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.newRects[index],\n                alpha: CGFloat(progress),\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(1.0 - progress)\n            )\n        }\n        \n        drawingClosures[\"Pixelate\\(LTMorphingPhases.draw)\"] = {\n            limbo in\n            \n            if limbo.drawingProgress > 0.0 {\n                \n                let charImage = self.pixelateImageForCharLimbo(\n                    limbo,\n                    withBlurRadius: limbo.drawingProgress * 6.0\n                )\n                \n                charImage.draw(in: limbo.rect)\n                \n                return true\n            }\n            \n            return false\n        }\n    }\n    \n    fileprivate func pixelateImageForCharLimbo(\n        _ charLimbo: LTCharacterLimbo,\n        withBlurRadius blurRadius: CGFloat\n        ) -> UIImage {\n            let scale = min(UIScreen.main.scale, 1.0 / blurRadius)\n            UIGraphicsBeginImageContextWithOptions(charLimbo.rect.size, false, scale)\n            let fadeOutAlpha = min(1.0, max(0.0, charLimbo.drawingProgress * -2.0 + 2.0 + 0.01))\n            let rect = CGRect(\n                x: 0,\n                y: 0,\n                width: charLimbo.rect.size.width,\n                height: charLimbo.rect.size.height\n            )\n            String(charLimbo.char).draw(in: rect, withAttributes: [\n                .font: self.font as Any,\n                .foregroundColor: self.textColor.withAlphaComponent(fadeOutAlpha)\n            ])\n            guard let newImage = UIGraphicsGetImageFromCurrentImageContext()\n            else {\n                return UIImage()\n            }\n            UIGraphicsEndImageContext()\n            return newImage\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel+Sparkle.swift",
    "content": "//\n//  LTMorphingLabel+Sparkle.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files \n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport UIKit\n\nextension LTMorphingLabel {\n    \n    fileprivate func maskedImageForCharLimbo(\n        _ charLimbo: LTCharacterLimbo,\n        withProgress progress: CGFloat\n        ) -> (UIImage, CGRect) {\n            let maskedHeight = charLimbo.rect.size.height * max(0.01, progress)\n            let maskedSize = CGSize(\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n            UIGraphicsBeginImageContextWithOptions(\n                maskedSize,\n                false,\n                UIScreen.main.scale\n            )\n            let rect = CGRect(\n                x: 0,\n                y: 0,\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n            String(charLimbo.char).draw(in: rect, withAttributes: [\n                .font: self.font as Any,\n                .foregroundColor: self.textColor as Any\n            ])\n            guard let newImage = UIGraphicsGetImageFromCurrentImageContext() else {\n                return (UIImage(), CGRect.zero)\n            }\n            UIGraphicsEndImageContext()\n            let newRect = CGRect(\n                x: charLimbo.rect.origin.x,\n                y: charLimbo.rect.origin.y,\n                width: charLimbo.rect.size.width,\n                height: maskedHeight\n            )\n            return (newImage, newRect)\n    }\n\n    @objc\n    func SparkleLoad() {\n        \n        startClosures[\"Sparkle\\(LTMorphingPhases.start)\"] = {\n            self.emitterView.removeAllEmitters()\n        }\n        \n        progressClosures[\"Sparkle\\(LTMorphingPhases.progress)\"] = {\n            (index: Int, progress: Float, isNewChar: Bool) in\n            \n            if !isNewChar {\n                return min(1.0, max(0.0, progress))\n            }\n            \n            let j = Float(sin(Float(index))) * 1.5\n            return min(\n                1.0,\n                max(\n                    0.0001,\n                    progress + self.morphingCharacterDelay * j\n                )\n            )\n            \n        }\n        \n        effectClosures[\"Sparkle\\(LTMorphingPhases.disappear)\"] = {\n            char, index, progress in\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: self.previousRects[index],\n                alpha: CGFloat(1.0 - progress),\n                size: self.font.pointSize,\n                drawingProgress: 0.0)\n        }\n        \n        effectClosures[\"Sparkle\\(LTMorphingPhases.appear)\"] = {\n            char, index, progress in\n            \n            if char != \" \" {\n                let rect = self.newRects[index]\n                let emitterPosition = CGPoint(\n                    x: rect.origin.x + rect.size.width / 2.0,\n                    y: CGFloat(progress) * rect.size.height * 0.9 + rect.origin.y\n                )\n\n                self.emitterView.createEmitter(\n                    \"c\\(index)\",\n                    particleName: \"Sparkle\",\n                    duration: self.morphingDuration\n                    ) { (layer, cell) in\n                        layer.emitterSize = CGSize(\n                            width: rect.size.width,\n                            height: 1\n                        )\n                        layer.renderMode = .unordered\n                        cell.emissionLongitude = CGFloat(Double.pi / 2.0)\n                        cell.scale = self.font.pointSize / 300.0\n                        cell.scaleSpeed = self.font.pointSize / 300.0 * -1.5\n                        cell.color = self.textColor.cgColor\n                        cell.birthRate =\n                            Float(self.font.pointSize)\n                            * Float(arc4random_uniform(7) + 3)\n                    }.update { (layer, _) in\n                        layer.emitterPosition = emitterPosition\n                    }.play()\n            }\n\n            return LTCharacterLimbo(\n                char: char,\n                rect: self.newRects[index],\n                alpha: CGFloat(self.morphingProgress),\n                size: self.font.pointSize,\n                drawingProgress: CGFloat(progress)\n            )\n        }\n        \n        drawingClosures[\"Sparkle\\(LTMorphingPhases.draw)\"] = {\n            (charLimbo: LTCharacterLimbo) in\n            \n            if charLimbo.drawingProgress > 0.0 {\n                \n                let (charImage, rect) = self.maskedImageForCharLimbo(\n                    charLimbo,\n                    withProgress: charLimbo.drawingProgress\n                )\n                charImage.draw(in: rect)\n                \n                return true\n            }\n            \n            return false\n        }\n        \n        skipFramesClosures[\"Sparkle\\(LTMorphingPhases.skipFrames)\"] = {\n            return 1\n        }\n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel.h",
    "content": "//\n//  LTMorphingLabel.h\n//  LTMorphingLabel\n//\n//  Created by Lex Tang on 1/8/15.\n//  Copyright (c) 2015 lexrus.com. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for LTMorphingLabel.\nFOUNDATION_EXPORT double LTMorphingLabelVersionNumber;\n\n//! Project version string for LTMorphingLabel.\nFOUNDATION_EXPORT const unsigned char LTMorphingLabelVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <LTMorphingLabel/PublicHeader.h>\n\n\n"
  },
  {
    "path": "LTMorphingLabel/LTMorphingLabel.swift",
    "content": "//\n//  LTMorphingLabel.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\nimport UIKit\nimport QuartzCore\n\nprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l < r\n  case (nil, _?):\n    return true\n  default:\n    return false\n  }\n}\n\nprivate func >= <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l >= r\n  default:\n    return !(lhs < rhs)\n  }\n}\n\nenum LTMorphingPhases: Int {\n    case start, appear, disappear, draw, progress, skipFrames\n}\n\ntypealias LTMorphingStartClosure =\n    () -> Void\n\ntypealias LTMorphingEffectClosure =\n    (Character, _ index: Int, _ progress: Float) -> LTCharacterLimbo\n\ntypealias LTMorphingDrawingClosure =\n    (LTCharacterLimbo) -> Bool\n\ntypealias LTMorphingManipulateProgressClosure =\n    (_ index: Int, _ progress: Float, _ isNewChar: Bool) -> Float\n\ntypealias LTMorphingSkipFramesClosure =\n    () -> Int\n\n@objc public protocol LTMorphingLabelDelegate {\n    @objc optional func morphingDidStart(_ label: LTMorphingLabel)\n    @objc optional func morphingDidComplete(_ label: LTMorphingLabel)\n    @objc optional func morphingOnProgress(_ label: LTMorphingLabel, progress: Float)\n}\n\n// MARK: - LTMorphingLabel\n@IBDesignable open class LTMorphingLabel: UILabel {\n    \n    @IBInspectable open var morphingProgress: Float = 0.0\n    @IBInspectable open var morphingDuration: Float = 0.6\n    @IBInspectable open var morphingCharacterDelay: Float = 0.026\n    @IBInspectable open var morphingEnabled: Bool = true\n\n    @IBOutlet open weak var delegate: LTMorphingLabelDelegate?\n    open var morphingEffect: LTMorphingEffect = .scale\n    \n    var startClosures = [String: LTMorphingStartClosure]()\n    var effectClosures = [String: LTMorphingEffectClosure]()\n    var drawingClosures = [String: LTMorphingDrawingClosure]()\n    var progressClosures = [String: LTMorphingManipulateProgressClosure]()\n    var skipFramesClosures = [String: LTMorphingSkipFramesClosure]()\n    var diffResults: LTStringDiffResult?\n    var previousText = \"\"\n    \n    var currentFrame = 0\n    var totalFrames = 0\n    var totalDelayFrames = 0\n    \n    var totalWidth: Float = 0.0\n    var previousRects = [CGRect]()\n    var newRects = [CGRect]()\n    var charHeight: CGFloat = 0.0\n    var skipFramesCount: Int = 0\n\n    fileprivate var displayLink: CADisplayLink?\n    \n    private var tempRenderMorphingEnabled = true\n    \n    #if TARGET_INTERFACE_BUILDER\n    let presentingInIB = true\n    #else\n    let presentingInIB = false\n    #endif\n    \n    override open var font: UIFont! {\n        get {\n            return super.font ?? UIFont.systemFont(ofSize: 15)\n        }\n        set {\n            super.font = newValue\n            setNeedsLayout()\n        }\n    }\n    \n    override open var text: String? {\n        get {\n            return super.text ?? \"\"\n        }\n        set {\n            guard text != newValue else { return }\n\n            previousText = text ?? \"\"\n            diffResults = previousText.diffWith(newValue)\n            super.text = newValue ?? \"\"\n            \n            morphingProgress = 0.0\n            currentFrame = 0\n            totalFrames = 0\n            \n            tempRenderMorphingEnabled = morphingEnabled\n            setNeedsLayout()\n            \n            if !morphingEnabled {\n                return\n            }\n            \n            if presentingInIB {\n                morphingDuration = 0.01\n                morphingProgress = 0.5\n            } else if previousText != text {\n                start()\n                let closureKey = \"\\(morphingEffect.description)\\(LTMorphingPhases.start)\"\n                if let closure = startClosures[closureKey] {\n                    return closure()\n                }\n                \n                delegate?.morphingDidStart?(self)\n            }\n        }\n    }\n\n    open func start() {\n        guard displayLink == nil else { return }\n        displayLink = CADisplayLink(target: self, selector: #selector(displayFrameTick))\n        displayLink?.add(to: .current, forMode: .common)\n    }\n\n    open func pause() {\n        displayLink?.isPaused = true\n    }\n    \n    open func resume() {\n        displayLink?.isPaused = false\n    }\n    \n    open func finish() {\n        displayLink?.isPaused = false\n    }\n    \n    open func stop() {\n        displayLink?.remove(from: .current, forMode: .common)\n        displayLink?.invalidate()\n        displayLink = nil\n    }\n    \n    open var textAttributes: [NSAttributedString.Key: Any]? {\n        didSet {\n            setNeedsLayout()\n        }\n    }\n    \n    open override func setNeedsLayout() {\n        super.setNeedsLayout()\n        previousRects = rectsOfEachCharacter(previousText, withFont: font)\n        newRects = rectsOfEachCharacter(text ?? \"\", withFont: font)\n    }\n    \n    override open var bounds: CGRect {\n        get {\n            return super.bounds\n        }\n        set {\n            super.bounds = newValue\n            setNeedsLayout()\n        }\n    }\n    \n    override open var frame: CGRect {\n        get {\n            return super.frame\n        }\n        set {\n            super.frame = newValue\n            setNeedsLayout()\n        }\n    }\n\n    deinit {\n        stop()\n    }\n    \n    lazy var emitterView: LTEmitterView = {\n        let emitterView = LTEmitterView(frame: self.bounds)\n        self.addSubview(emitterView)\n        return emitterView\n        }()\n}\n\n// MARK: - Animation extension\nextension LTMorphingLabel {\n\n    public func updateProgress(progress: Float) {\n        guard let displayLink = displayLink else { return }\n\n        if displayLink.duration > 0.0 && totalFrames == 0 {\n            var frameRate = Float(0)\n            if #available(iOS 10.0, tvOS 10.0, *) {\n                var frameInterval = 1\n                if displayLink.preferredFramesPerSecond == 60 {\n                    frameInterval = 1\n                } else if displayLink.preferredFramesPerSecond == 30 {\n                    frameInterval = 2\n                } else {\n                    frameInterval = 1\n                }\n                frameRate = Float(displayLink.duration) / Float(frameInterval)\n            } else {\n                frameRate = Float(displayLink.duration) / Float(displayLink.frameInterval)\n            }\n            totalFrames = Int(ceil(morphingDuration / frameRate))\n            \n            let totalDelay = Float((text!).count) * morphingCharacterDelay\n            totalDelayFrames = Int(ceil(totalDelay / frameRate))\n        }\n        \n        currentFrame = Int(ceil(progress * Float(totalFrames)))\n        \n        if previousText != text && currentFrame < totalFrames + totalDelayFrames + 10 {\n            morphingProgress = progress\n            \n            let closureKey = \"\\(morphingEffect.description)\\(LTMorphingPhases.skipFrames)\"\n            if let closure = skipFramesClosures[closureKey] {\n                skipFramesCount += 1\n                if skipFramesCount > closure() {\n                    skipFramesCount = 0\n                    setNeedsDisplay()\n                }\n            } else {\n                setNeedsDisplay()\n            }\n            \n            if let onProgress = delegate?.morphingOnProgress {\n                onProgress(self, morphingProgress)\n            }\n        } else {\n            stop()\n            \n            delegate?.morphingDidComplete?(self)\n        }\n    }\n    \n    @objc func displayFrameTick() {\n        if totalFrames == 0 {\n            updateProgress(progress: 0)\n        } else {\n            morphingProgress += 1.0 / Float(totalFrames)\n            updateProgress(progress: morphingProgress)\n        }\n    }\n    \n    // Could be enhanced by kerning text:\n    // http://stackoverflow.com/questions/21443625/core-text-calculate-letter-frame-in-ios\n    func rectsOfEachCharacter(_ textToDraw: String, withFont font: UIFont) -> [CGRect] {\n        var charRects = [CGRect]()\n        var leftOffset: CGFloat = 0.0\n        \n        charHeight = \"Leg\".size(withAttributes: [.font: font]).height\n        \n        let topOffset = (bounds.size.height - charHeight) / 2.0\n\n        for char in textToDraw {\n            let charSize = String(char).size(withAttributes: [.font: font])\n            charRects.append(\n                CGRect(\n                    origin: CGPoint(\n                        x: leftOffset,\n                        y: topOffset\n                    ),\n                    size: charSize\n                )\n            )\n            leftOffset += charSize.width\n        }\n        \n        totalWidth = Float(leftOffset)\n        \n        var stringLeftOffSet: CGFloat = 0.0\n        \n        switch textAlignment {\n        case .center:\n            stringLeftOffSet = CGFloat((Float(bounds.size.width) - totalWidth) / 2.0)\n        case .right:\n            stringLeftOffSet = CGFloat(Float(bounds.size.width) - totalWidth)\n        default:\n            ()\n        }\n        \n        var offsetedCharRects = [CGRect]()\n        \n        for r in charRects {\n            offsetedCharRects.append(r.offsetBy(dx: stringLeftOffSet, dy: 0.0))\n        }\n        \n        return offsetedCharRects\n    }\n    \n    func limboOfOriginalCharacter(\n        _ char: Character,\n        index: Int,\n        progress: Float) -> LTCharacterLimbo {\n            \n            var currentRect = previousRects[index]\n            let oriX = Float(currentRect.origin.x)\n            var newX = Float(currentRect.origin.x)\n            let diffResult = diffResults!.0[index]\n            var currentFontSize: CGFloat = font.pointSize\n            var currentAlpha: CGFloat = 1.0\n            \n            switch diffResult {\n                // Move the character that exists in the new text to current position\n            case .same:\n                newX = Float(newRects[index].origin.x)\n                currentRect.origin.x = CGFloat(\n                    LTEasing.easeOutQuint(progress, oriX, newX - oriX)\n                )\n            case .move(let offset):\n                newX = Float(newRects[index + offset].origin.x)\n                currentRect.origin.x = CGFloat(\n                    LTEasing.easeOutQuint(progress, oriX, newX - oriX)\n                )\n            case .moveAndAdd(let offset):\n                newX = Float(newRects[index + offset].origin.x)\n                currentRect.origin.x = CGFloat(\n                    LTEasing.easeOutQuint(progress, oriX, newX - oriX)\n                )\n            default:\n                // Otherwise, remove it\n                \n                // Override morphing effect with closure in extenstions\n                if let closure = effectClosures[\n                    \"\\(morphingEffect.description)\\(LTMorphingPhases.disappear)\"\n                    ] {\n                        return closure(char, index, progress)\n                } else {\n                    // And scale it by default\n                    let fontEase = CGFloat(\n                        LTEasing.easeOutQuint(\n                            progress, 0, Float(font.pointSize)\n                        )\n                    )\n                    // For emojis\n                    currentFontSize = max(0.0001, font.pointSize - fontEase)\n                    currentAlpha = CGFloat(1.0 - progress)\n                    currentRect = previousRects[index].offsetBy(\n                        dx: 0,\n                        dy: CGFloat(font.pointSize - currentFontSize)\n                    )\n                }\n            }\n            \n            return LTCharacterLimbo(\n                char: char,\n                rect: currentRect,\n                alpha: currentAlpha,\n                size: currentFontSize,\n                drawingProgress: 0.0\n            )\n    }\n    \n    func limboOfNewCharacter(\n        _ char: Character,\n        index: Int,\n        progress: Float) -> LTCharacterLimbo {\n            \n            let currentRect = newRects[index]\n            var currentFontSize = CGFloat(\n                LTEasing.easeOutQuint(progress, 0, Float(font.pointSize))\n            )\n            \n            if let closure = effectClosures[\n                \"\\(morphingEffect.description)\\(LTMorphingPhases.appear)\"\n                ] {\n                    return closure(char, index, progress)\n            } else {\n                currentFontSize = CGFloat(\n                    LTEasing.easeOutQuint(progress, 0.0, Float(font.pointSize))\n                )\n                // For emojis\n                currentFontSize = max(0.0001, currentFontSize)\n                \n                let yOffset = CGFloat(font.pointSize - currentFontSize)\n                \n                return LTCharacterLimbo(\n                    char: char,\n                    rect: currentRect.offsetBy(dx: 0, dy: yOffset),\n                    alpha: CGFloat(morphingProgress),\n                    size: currentFontSize,\n                    drawingProgress: 0.0\n                )\n            }\n    }\n    \n    func limboOfCharacters() -> [LTCharacterLimbo] {\n        var limbo = [LTCharacterLimbo]()\n        \n        // Iterate original characters\n        for (i, character) in previousText.enumerated() {\n            var progress: Float = 0.0\n            \n            if let closure = progressClosures[\n                \"\\(morphingEffect.description)\\(LTMorphingPhases.progress)\"\n                ] {\n                    progress = closure(i, morphingProgress, false)\n            } else {\n                progress = min(1.0, max(0.0, morphingProgress + morphingCharacterDelay * Float(i)))\n            }\n            \n            let limboOfCharacter = limboOfOriginalCharacter(character, index: i, progress: progress)\n            limbo.append(limboOfCharacter)\n        }\n        \n        // Add new characters\n        for (i, character) in (text!).enumerated() {\n            if i >= diffResults?.0.count {\n                break\n            }\n            \n            var progress: Float = 0.0\n            \n            if let closure = progressClosures[\n                \"\\(morphingEffect.description)\\(LTMorphingPhases.progress)\"\n                ] {\n                    progress = closure(i, morphingProgress, true)\n            } else {\n                progress = min(1.0, max(0.0, morphingProgress - morphingCharacterDelay * Float(i)))\n            }\n            \n            // Don't draw character that already exists\n            if diffResults?.skipDrawingResults[i] == true {\n                continue\n            }\n            \n            if let diffResult = diffResults?.0[i] {\n                switch diffResult {\n                case .moveAndAdd, .replace, .add, .delete:\n                    let limboOfCharacter = limboOfNewCharacter(\n                        character,\n                        index: i,\n                        progress: progress\n                    )\n                    limbo.append(limboOfCharacter)\n                default:\n                    ()\n                }\n            }\n        }\n        \n        return limbo\n    }\n\n}\n\n// MARK: - Drawing extension\nextension LTMorphingLabel {\n    \n    override open func didMoveToSuperview() {\n        guard nil != superview else {\n            stop()\n            return\n        }\n\n        if let s = text {\n            text = s\n        }\n        \n        // Load all morphing effects\n        for effectName: String in LTMorphingEffect.allValues {\n            let effectFunc = Selector(\"\\(effectName)Load\")\n            if responds(to: effectFunc) {\n                perform(effectFunc)\n            }\n        }\n    }\n    \n    override open func drawText(in rect: CGRect) {\n        if !tempRenderMorphingEnabled || limboOfCharacters().count == 0 {\n            super.drawText(in: rect)\n            return\n        }\n        \n        for charLimbo in limboOfCharacters() {\n            let charRect = charLimbo.rect\n            \n            let willAvoidDefaultDrawing: Bool = {\n                if let closure = drawingClosures[\n                    \"\\(morphingEffect.description)\\(LTMorphingPhases.draw)\"\n                    ] {\n                        return closure($0)\n                }\n                return false\n                }(charLimbo)\n\n            if !willAvoidDefaultDrawing {\n                var attrs: [NSAttributedString.Key: Any] = [\n                    .foregroundColor: textColor.withAlphaComponent(charLimbo.alpha)\n                ]\n\n                attrs[.font] = UIFont(descriptor: font.fontDescriptor, size: charLimbo.size)\n                \n                for (key, value) in textAttributes ?? [:] {\n                    attrs[key] = value\n                }\n                \n                let s = String(charLimbo.char)\n                s.draw(in: charRect, withAttributes: attrs)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "LTMorphingLabel/LTStringDiffResult.swift",
    "content": "//\n//  LTStringDiffResult.swift\n//  https://github.com/lexrus/LTMorphingLabel\n//\n//  The MIT License (MIT)\n//  Copyright (c) 2017 Lex Tang, http://lexrus.com\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a\n//  copy of this software and associated documentation files\n//  (the “Software”), to deal in the Software without restriction,\n//  including without limitation the rights to use, copy, modify, merge,\n//  publish, distribute, sublicense, and/or sell copies of the Software,\n//  and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included\n//  in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\n//  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\npublic typealias LTStringDiffResult = ([LTCharacterDiffResult], skipDrawingResults: [Bool])\n\npublic extension String {\n    \n    func diffWith(_ anotherString: String?) -> LTStringDiffResult {\n        \n        guard let anotherString = anotherString else {\n            let diffResults: [LTCharacterDiffResult] =\n                Array(repeating: .delete, count: self.count)\n            let skipDrawingResults: [Bool] = Array(repeating: false, count: self.count)\n            return (diffResults, skipDrawingResults)\n        }\n        \n        let newChars = anotherString.enumerated()\n        let lhsLength = self.count\n        let rhsLength = anotherString.count\n        var skipIndexes = [Int]()\n        let leftChars = Array(self)\n        \n        let maxLength = max(lhsLength, rhsLength)\n        var diffResults: [LTCharacterDiffResult] = Array(repeating: .add, count: maxLength) \n        var skipDrawingResults: [Bool] = Array(repeating: false, count: maxLength)\n        \n        for i in 0..<maxLength {\n            // If new string is longer than the original one\n            if i > lhsLength - 1 {\n                continue\n            }\n            \n            let leftChar = leftChars[i]\n            \n            // Search left character in the new string\n            var foundCharacterInRhs = false\n            for (j, newChar) in newChars {\n                if skipIndexes.contains(j) || leftChar != newChar {\n                    continue\n                }\n                \n                skipIndexes.append(j)\n                foundCharacterInRhs = true\n                if i == j {\n                    // Character not changed\n                    diffResults[i] = .same\n                } else {\n                    // foundCharacterInRhs and move\n                    let offset = j - i\n                    \n                    if i <= rhsLength - 1 {\n                        // Move to a new index and add a new character to new original place\n                        diffResults[i] = .moveAndAdd(offset: offset)\n                    } else {\n                        diffResults[i] = .move(offset: offset)\n                    }\n                    \n                    skipDrawingResults[j] = true\n                }\n                break\n            }\n            \n            if !foundCharacterInRhs {\n                if i < rhsLength - 1 {\n                    diffResults[i] = .replace\n                } else {\n                    diffResults[i] = .delete\n                }\n            }\n        }\n        \n        return (diffResults, skipDrawingResults)\n        \n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabel/SwiftUI/MorphingText.swift",
    "content": "//\n//  MorphingText.swift\n//  LTMorphingLabel\n//\n//  Created by Lex on 2020/5/10.\n//  Copyright © 2020 lexrus.com. All rights reserved.\n//\n\n#if canImport(SwiftUI)\nimport SwiftUI\n#endif\n\n@available(iOS 13.0.0, *)\npublic struct MorphingText: UIViewRepresentable {\n    public typealias UIViewType = LTMorphingLabel\n    \n    var text: String\n    var morphingEffect: LTMorphingEffect\n    var moprhingEnabled: Bool = true\n    var font: UIFont\n    var textColor: UIColor\n    var textAlignment: NSTextAlignment\n    \n    public init(_ text: String,\n                effect: LTMorphingEffect = .scale,\n                font: UIFont = .systemFont(ofSize: 16),\n                textColor: UIColor = .black,\n                textAlignment: NSTextAlignment = .center\n    ) {\n        self.text = text\n        self.morphingEffect = effect\n        self.font = font\n        self.textColor = textColor\n        self.textAlignment = textAlignment\n    }\n\n    public func makeUIView(context: Context) -> UIViewType {\n        let label = LTMorphingLabel(frame: CGRect(origin: .zero, size: CGSize(width: 200, height: 50)))\n        label.textAlignment = .center\n        label.textColor = UIColor.white\n        return label\n    }\n\n    public func updateUIView(_ uiView: UIViewType, context: Context) {\n        uiView.text = text\n        uiView.font = font\n        uiView.morphingEnabled = moprhingEnabled\n        uiView.morphingEffect = morphingEffect\n        uiView.textColor = textColor\n        uiView.textAlignment = textAlignment\n    }\n}\n\n@available(iOS 13.0.0, *)\nstruct MorphingText_Previews: PreviewProvider {\n    \n    static var previews: some View {\n        PreviewWrapper()\n            .previewDevice(\"iPhone SE\")\n            .environment(\\.colorScheme, .dark)\n    }\n\n    struct PreviewWrapper: View {\n        @State var morphingEnabled = true\n        @State var textIndex: Double = 0\n        @State var effectIndex: Double = 0\n        \n        private var textArray = [\n            \"Supercalifragilisticexpialidocious\",\n            \"Stay hungry, stay foolish.\",\n            \"Love what you do and do what you love.\",\n            \"Apple doesn't do hobbies as a general rule.\",\n            \"iOS\",\n            \"iPhone\",\n            \"iPhone 11\",\n            \"iPhone 11 Pro\",\n            \"iPhone 11 Pro Max\",\n            \"$9995.00\",\n            \"$9996.00\",\n            \"$9997.00\",\n            \"$9998.00\",\n            \"$9999.00\",\n            \"$10000.00\"\n        ]\n        \n        public var body: some View {\n            VStack {\n                Spacer()\n                Text(\"LTMorphingLabel\").font(.largeTitle)\n                Text(\"for SwiftUI\").font(.title)\n                \n                MorphingText(\n                    textArray[Int(round(textIndex))],\n                    effect: LTMorphingEffect.allCases[Int(round(effectIndex))],\n                    font: UIFont.systemFont(ofSize: 20),\n                    textColor: .white\n                )\n                    .frame(maxWidth: 200, maxHeight: 100)\n                \n                Text(\"Effect: \\(LTMorphingEffect.allCases[Int(round(effectIndex))].description)\").font(.title)\n                Slider(value: $effectIndex, in: 0...Double(LTMorphingEffect.allCases.count - 1))\n                \n                Slider(value: $textIndex, in: 0...Double(textArray.count - 1))\n                \n                Toggle(\"MorphingEnabled\", isOn: $morphingEnabled)\n                Spacer()\n            }\n            .padding(20)\n            .foregroundColor(Color.white)\n            .background(Color.black)\n        }\n    }\n}\n"
  },
  {
    "path": "LTMorphingLabel/tvOS-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>en</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</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LTMorphingLabel.podspec",
    "content": "Pod::Spec.new do |s|\n\n  s.name         = \"LTMorphingLabel\"\n  s.version      = \"0.9.3\"\n  s.summary      = \"Graceful morphing effects for UILabel written in Swift.\"\n  s.description  = <<-DESC\n                   A morphing UILabel subclass written in Swift.\n                   The .Scale effect mimicked Apple's QuickType animation of iOS\n                   8 in WWDC 2014. New morphing effects are available as\n                   Swift extensions.\n                   DESC\n  s.homepage     = \"https://github.com/lexrus/LTMorphingLabel\"\n  s.screenshots  = \"https://cloud.githubusercontent.com/assets/219689/3491822/96bf5de6-059d-11e4-9826-a6f82025d1af.gif\",\n                   \"https://cloud.githubusercontent.com/assets/219689/3491838/ffc5aff2-059d-11e4-970c-6e2d7664785a.gif\",\n                   \"https://cloud.githubusercontent.com/assets/219689/3491840/173c2238-059e-11e4-9b33-dcd21edae9e2.gif\",\n                   \"https://cloud.githubusercontent.com/assets/219689/3491845/29bb0f8c-059e-11e4-9ef8-de56bec1baba.gif\",\n                   \"https://cloud.githubusercontent.com/assets/219689/3508789/31e9fafe-0690-11e4-9a76-ba3ef45eb53a.gif\",\n                   \"https://cloud.githubusercontent.com/assets/219689/3594949/815cd3e8-0caa-11e4-9738-278a9c959478.gif\"\n  s.license      = { :type => \"MIT\", :file => \"LICENSE\" }\n  s.author             = { \"Lex Tang\" => \"lexrus@gmail.com\" }\n  s.social_media_url   = \"https://x.com/lexrus\"\n  s.ios.deployment_target = \"9.0\"\n  s.tvos.deployment_target = \"9.0\"\n  s.swift_versions = ['5.3']\n  s.source       = {\n                    :git => \"https://github.com/lexrus/LTMorphingLabel.git\",\n                    :tag => s.version\n                   }\n  s.source_files = \"LTMorphingLabel/*.{h,swift}\", \"LTMorphingLabel/**/*.{swift}\"\n  s.resources    = \"LTMorphingLabel/Particles/*.png\"\n  s.frameworks   = \"UIKit\", \"Foundation\", \"QuartzCore\"\n  s.requires_arc = true\n\nend\n"
  },
  {
    "path": "LTMorphingLabelDemo/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  LTMorphingLabelDemo\n//\n//  Created by Lex on 6/18/14.\n//  Copyright (c) 2015 lexrus.com. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate : UIResponder, UIApplicationDelegate {\n                            \n    var window: UIWindow?\n\n    func application(\n        _ application: UIApplication,\n        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n        ) -> Bool {\n            window!.backgroundColor = UIColor.black\n            window!.makeKeyAndVisible()\n            return true\n    }\n\n}\n"
  },
  {
    "path": "LTMorphingLabelDemo/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LTMorphingLabelDemo/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LTMorphingLabelDemo/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>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>$(PRODUCT_NAME)</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>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSMainNibFile~ipad</key>\n\t<string>LTMorphingLabelDemo-iPad</string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Launch Screen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>LTMorphingLabelDemo</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarStyle</key>\n\t<string>UIStatusBarStyleLightContent</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "LTMorphingLabelDemo/LTDemoViewController.swift",
    "content": "//\n//  LTDemoViewController.swift\n//  LTMorphingLabelDemo\n//\n//  Created by Lex on 6/23/14.\n//  Copyright (c) 2015 lexrus.com. All rights reserved.\n//\n\nimport UIKit\n\nclass LTDemoViewController : UIViewController, LTMorphingLabelDelegate {\n    \n    fileprivate var i = -1\n    fileprivate var textArray = [\n        \"What is design?\",\n        \"Design\", \"Design is not just\", \"what it looks like\", \"and feels like.\",\n        \"Design\", \"is how it works.\", \"- Steve Jobs\",\n        \"Older people\", \"sit down and ask,\", \"'What is it?'\",\n        \"but the boy asks,\", \"'What can I do with it?'.\", \"- Steve Jobs\",\n        \"One more thing...\", \"Swift\", \"Objective-C\", \"iPhone\", \"iPad\", \"Mac Mini\",\n        \"MacBook Pro🔥\", \"Mac Pro⚡️\",\n        \"爱老婆\",\n        \"नमस्ते दुनिया\",\n        \"हिन्दी भाषा\",\n        \"$68.98\",\n        \"$68.99\",\n        \"$69.00\",\n        \"$69.01\"\n    ]\n    fileprivate var text: String {\n        i = i >= textArray.count - 1 ? 0 : i + 1\n        return textArray[i]\n    }\n    \n    @IBOutlet weak var effectSegmentControl: UISegmentedControl!\n    @IBOutlet weak var themeSegmentControl: UISegmentedControl!\n    @IBOutlet fileprivate var label: LTMorphingLabel!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        label.delegate = self\n        \n        [effectSegmentControl, themeSegmentControl].forEach {\n            $0?.setTitleTextAttributes([.foregroundColor : UIColor.white], for: .normal)\n            $0?.setTitleTextAttributes([.foregroundColor : UIColor.white], for: .selected)\n        }\n    }\n    \n    @IBAction func changeText(_ sender: AnyObject) {\n        label.text = text\n        if !autoStart.isOn {\n            label.pause()\n            progressSlider.value = 0\n        }\n    }\n\n    @IBAction func clear(_ sender: Any) {\n        label.text = nil\n    }\n    \n    @IBOutlet weak var autoStart: UISwitch!\n    \n    @IBAction func updateAutoStart(_ sender: Any) {\n        progressSlider.isHidden = autoStart.isOn\n        if autoStart.isOn {\n            label.resume()\n        } else {\n            changeText(NSObject())\n        }\n    }\n    \n    @IBOutlet weak var progressSlider: UISlider!\n    \n    @IBAction func updateProgress(_ sender: Any) {\n        label.morphingProgress = progressSlider.value / 100\n        label.setNeedsDisplay()\n    }\n    \n    @IBAction func segmentChanged(_ sender: UISegmentedControl) {\n        let seg = sender\n        if let effect = LTMorphingEffect(rawValue: seg.selectedSegmentIndex) {\n            label.morphingEffect = effect\n            changeText(sender)\n        }\n    }\n\n    @IBAction func toggleLight(_ sender: UISegmentedControl) {\n        let isNight = Bool(sender.selectedSegmentIndex == 0)\n        view.backgroundColor = isNight ? UIColor.black : UIColor.white\n        label.textColor = isNight ? UIColor.white : UIColor.black\n    }\n    \n    @IBAction func changeFontSize(_ sender: UISlider) {\n        label.font = UIFont(descriptor: label.font.fontDescriptor, size: CGFloat(sender.value))\n        label.text = label.text\n    }\n}\n\nextension LTDemoViewController {\n    \n    func morphingDidStart(_ label: LTMorphingLabel) {\n        \n    }\n    \n    func morphingDidComplete(_ label: LTMorphingLabel) {\n        \n    }\n    \n    func morphingOnProgress(_ label: LTMorphingLabel, progress: Float) {\n        \n    }\n    \n}\n"
  },
  {
    "path": "LTMorphingLabelDemo/LTMorphingLabelDemo.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17156\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"IAM-hL-9eW\">\n    <device id=\"retina4_7\" orientation=\"landscape\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17125\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--LTMorphingLabel Demo-->\n        <scene sceneID=\"vlG-gG-Crg\">\n            <objects>\n                <viewController id=\"3ei-2r-m0A\" customClass=\"LTDemoViewController\" customModule=\"Morphing\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"D5d-Wo-IoW\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"667\" height=\"375\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <segmentedControl opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"top\" segmentControlStyle=\"plain\" selectedSegmentIndex=\"0\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rE7-Va-JH8\">\n                                <rect key=\"frame\" x=\"20\" y=\"275\" width=\"627\" height=\"29\"/>\n                                <color key=\"backgroundColor\" red=\"0.73333333329999995\" green=\"0.0019310983707021894\" blue=\"0.56318024254760291\" alpha=\"0.69539221938775508\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"28\" id=\"fIE-hM-Ab0\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"28\" id=\"vaZ-df-xh8\"/>\n                                </constraints>\n                                <segments>\n                                    <segment title=\"Scale\"/>\n                                    <segment title=\"Evaporate\"/>\n                                    <segment title=\"Fall\"/>\n                                    <segment title=\"Pixelate\"/>\n                                    <segment title=\"Sparkle\"/>\n                                    <segment title=\"Burn\"/>\n                                    <segment title=\"Anvil\"/>\n                                </segments>\n                                <color key=\"selectedSegmentTintColor\" red=\"0.73333333329999995\" green=\"0.0039215686269999999\" blue=\"0.56470588239999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                <connections>\n                                    <action selector=\"segmentChanged:\" destination=\"3ei-2r-m0A\" eventType=\"valueChanged\" id=\"rRV-iJ-mWz\"/>\n                                </connections>\n                            </segmentedControl>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3VJ-mH-2Xe\">\n                                <rect key=\"frame\" x=\"20\" y=\"52\" width=\"627\" height=\"203\"/>\n                                <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Light\" family=\"Helvetica Neue\" pointSize=\"19\"/>\n                                <state key=\"normal\">\n                                    <color key=\"titleColor\" red=\"0.73750000000000004\" green=\"0.0\" blue=\"0.56877266069999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"changeText:\" destination=\"3ei-2r-m0A\" eventType=\"touchUpInside\" id=\"wca-7v-rZP\"/>\n                                </connections>\n                            </button>\n                            <segmentedControl opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"top\" segmentControlStyle=\"plain\" selectedSegmentIndex=\"0\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ucn-av-UN6\">\n                                <rect key=\"frame\" x=\"20\" y=\"325\" width=\"120\" height=\"29\"/>\n                                <color key=\"backgroundColor\" red=\"0.73333333329999995\" green=\"0.0019310983710000001\" blue=\"0.56318024249999998\" alpha=\"0.69539221939999996\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"120\" id=\"9pE-1U-E4A\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"28\" id=\"TLk-pB-ubA\"/>\n                                </constraints>\n                                <segments>\n                                    <segment title=\"Night\"/>\n                                    <segment title=\"Day\"/>\n                                </segments>\n                                <color key=\"selectedSegmentTintColor\" red=\"0.73333333329999995\" green=\"0.0039215686269999999\" blue=\"0.56470588239999997\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"displayP3\"/>\n                                <connections>\n                                    <action selector=\"toggleLight:\" destination=\"3ei-2r-m0A\" eventType=\"valueChanged\" id=\"SHB-V1-FQz\"/>\n                                </connections>\n                            </segmentedControl>\n                            <slider opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" value=\"26\" minValue=\"9\" maxValue=\"42\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EOd-vo-0jD\">\n                                <rect key=\"frame\" x=\"168\" y=\"323\" width=\"477\" height=\"31\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"30\" id=\"uft-oC-aVu\"/>\n                                </constraints>\n                                <color key=\"maximumTrackTintColor\" red=\"0.30549782390000002\" green=\"0.0\" blue=\"0.2343322595\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <color key=\"thumbTintColor\" red=\"0.73414486649999999\" green=\"0.003415785264\" blue=\"0.56606709960000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <connections>\n                                    <action selector=\"changeFontSize:\" destination=\"3ei-2r-m0A\" eventType=\"valueChanged\" id=\"RPG-Ij-VXw\"/>\n                                </connections>\n                            </slider>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"I'm LTMorphingLabel. Tap Me Please.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fqc-dc-WVn\" customClass=\"LTMorphingLabel\" customModule=\"MorphingLabel\">\n                                <rect key=\"frame\" x=\"20\" y=\"52\" width=\"627\" height=\"203\"/>\n                                <accessibility key=\"accessibilityConfiguration\" identifier=\"morphingLabel\" label=\"morphingLabel\"/>\n                                <fontDescription key=\"fontDescription\" name=\"HelveticaNeue-Light\" family=\"Helvetica Neue\" pointSize=\"26\"/>\n                                <color key=\"textColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                                <size key=\"shadowOffset\" width=\"0.0\" height=\"3\"/>\n                            </label>\n                            <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lO7-Hn-KaX\">\n                                <rect key=\"frame\" x=\"594\" y=\"224\" width=\"51\" height=\"31\"/>\n                                <color key=\"onTintColor\" red=\"0.61243192365132471\" green=\"0.0\" blue=\"0.46976621517848066\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <color key=\"thumbTintColor\" red=\"0.73414486649999999\" green=\"0.003415785264\" blue=\"0.56606709960000001\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <connections>\n                                    <action selector=\"updateAutoStart:\" destination=\"3ei-2r-m0A\" eventType=\"valueChanged\" id=\"uct-K6-Dxl\"/>\n                                </connections>\n                            </switch>\n                            <slider hidden=\"YES\" opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" minValue=\"0.0\" maxValue=\"170\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SYv-GM-ZcQ\">\n                                <rect key=\"frame\" x=\"18\" y=\"224.5\" width=\"559\" height=\"31\"/>\n                                <color key=\"maximumTrackTintColor\" red=\"0.30549782391039204\" green=\"0.0\" blue=\"0.23433225954000511\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <color key=\"thumbTintColor\" red=\"0.73414486646652222\" green=\"0.003415785264223814\" blue=\"0.56606709957122803\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <connections>\n                                    <action selector=\"updateProgress:\" destination=\"3ei-2r-m0A\" eventType=\"valueChanged\" id=\"Wq3-xc-LMd\"/>\n                                </connections>\n                            </slider>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"upB-mu-6Xz\"/>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <color key=\"tintColor\" red=\"0.73750000000000004\" green=\"0.0\" blue=\"0.56877266069999999\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"EOd-vo-0jD\" firstAttribute=\"top\" secondItem=\"rE7-Va-JH8\" secondAttribute=\"bottom\" constant=\"20\" id=\"7ro-9X-VKm\"/>\n                            <constraint firstItem=\"SYv-GM-ZcQ\" firstAttribute=\"leading\" secondItem=\"upB-mu-6Xz\" secondAttribute=\"leading\" constant=\"20\" id=\"DbV-iG-EcM\"/>\n                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"EOd-vo-0jD\" secondAttribute=\"trailing\" constant=\"4\" id=\"DrY-mw-8sU\"/>\n                            <constraint firstItem=\"fqc-dc-WVn\" firstAttribute=\"leading\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"leadingMargin\" id=\"FRI-HA-iwA\"/>\n                            <constraint firstItem=\"rE7-Va-JH8\" firstAttribute=\"top\" secondItem=\"3VJ-mH-2Xe\" secondAttribute=\"bottom\" constant=\"20\" id=\"FbJ-XZ-R2b\"/>\n                            <constraint firstItem=\"fqc-dc-WVn\" firstAttribute=\"top\" secondItem=\"upB-mu-6Xz\" secondAttribute=\"top\" constant=\"20\" id=\"JLl-ED-669\"/>\n                            <constraint firstItem=\"SYv-GM-ZcQ\" firstAttribute=\"centerY\" secondItem=\"lO7-Hn-KaX\" secondAttribute=\"centerY\" id=\"SSM-o6-i6w\"/>\n                            <constraint firstItem=\"EOd-vo-0jD\" firstAttribute=\"leading\" secondItem=\"Ucn-av-UN6\" secondAttribute=\"trailing\" constant=\"30\" id=\"TpR-XE-wc6\"/>\n                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"rE7-Va-JH8\" secondAttribute=\"trailing\" id=\"URl-uL-VkH\"/>\n                            <constraint firstItem=\"rE7-Va-JH8\" firstAttribute=\"leading\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"leadingMargin\" id=\"Uv1-gH-Yw5\"/>\n                            <constraint firstItem=\"Ucn-av-UN6\" firstAttribute=\"leading\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"leadingMargin\" id=\"ato-cL-hIr\"/>\n                            <constraint firstItem=\"lO7-Hn-KaX\" firstAttribute=\"leading\" secondItem=\"SYv-GM-ZcQ\" secondAttribute=\"trailing\" constant=\"19\" id=\"cYN-Mq-FvX\"/>\n                            <constraint firstItem=\"3VJ-mH-2Xe\" firstAttribute=\"leading\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"leadingMargin\" id=\"d9f-iq-G1D\"/>\n                            <constraint firstItem=\"rE7-Va-JH8\" firstAttribute=\"top\" secondItem=\"lO7-Hn-KaX\" secondAttribute=\"bottom\" constant=\"20\" id=\"dov-c6-FLk\"/>\n                            <constraint firstItem=\"3VJ-mH-2Xe\" firstAttribute=\"top\" secondItem=\"upB-mu-6Xz\" secondAttribute=\"top\" constant=\"20\" id=\"ev9-ly-VWf\"/>\n                            <constraint firstItem=\"upB-mu-6Xz\" firstAttribute=\"bottom\" secondItem=\"Ucn-av-UN6\" secondAttribute=\"bottom\" constant=\"22\" id=\"fFq-dK-A0i\"/>\n                            <constraint firstItem=\"upB-mu-6Xz\" firstAttribute=\"bottom\" secondItem=\"EOd-vo-0jD\" secondAttribute=\"bottom\" constant=\"22\" id=\"grd-XJ-WqJ\"/>\n                            <constraint firstItem=\"fqc-dc-WVn\" firstAttribute=\"trailing\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"trailingMargin\" id=\"izu-ll-ljE\"/>\n                            <constraint firstItem=\"rE7-Va-JH8\" firstAttribute=\"top\" secondItem=\"fqc-dc-WVn\" secondAttribute=\"bottom\" constant=\"20\" id=\"k9Z-OZ-VrU\"/>\n                            <constraint firstItem=\"3VJ-mH-2Xe\" firstAttribute=\"trailing\" secondItem=\"D5d-Wo-IoW\" secondAttribute=\"trailingMargin\" id=\"o8d-0t-cq2\"/>\n                            <constraint firstItem=\"upB-mu-6Xz\" firstAttribute=\"trailing\" secondItem=\"lO7-Hn-KaX\" secondAttribute=\"trailing\" constant=\"24\" id=\"oPt-lM-mnb\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"LTMorphingLabel Demo\" id=\"A7j-8h-CTu\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Clear\" id=\"Bsc-Fz-3C2\">\n                            <color key=\"tintColor\" red=\"1\" green=\"0.0\" blue=\"0.78291556679999996\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                            <connections>\n                                <action selector=\"clear:\" destination=\"3ei-2r-m0A\" id=\"JHT-bA-GcN\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <simulatedNavigationBarMetrics key=\"simulatedTopBarMetrics\" barStyle=\"black\" prompted=\"NO\"/>\n                    <connections>\n                        <outlet property=\"autoStart\" destination=\"lO7-Hn-KaX\" id=\"6UG-Ps-ekd\"/>\n                        <outlet property=\"effectSegmentControl\" destination=\"rE7-Va-JH8\" id=\"7jF-P0-vfe\"/>\n                        <outlet property=\"label\" destination=\"fqc-dc-WVn\" id=\"glJ-ku-ziP\"/>\n                        <outlet property=\"progressSlider\" destination=\"SYv-GM-ZcQ\" id=\"Qhe-p3-cbZ\"/>\n                        <outlet property=\"themeSegmentControl\" destination=\"Ucn-av-UN6\" id=\"n1V-0F-lBM\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"EOt-ne-B2F\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1850.824587706147\" y=\"72.799999999999997\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"BST-oi-p39\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"IAM-hL-9eW\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" id=\"Cel-o5-IrA\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" barStyle=\"black\" translucent=\"NO\" largeTitles=\"YES\" id=\"V1l-3x-LRf\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"667\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <color key=\"tintColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <color key=\"barTintColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                        <textAttributes key=\"titleTextAttributes\">\n                            <color key=\"textColor\" red=\"1\" green=\"0.00019225223670915614\" blue=\"0.803035042899366\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        </textAttributes>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"3ei-2r-m0A\" kind=\"relationship\" relationship=\"rootViewController\" id=\"Pr8-Cq-f6N\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vcq-7b-9Jx\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1851\" y=\"-700\"/>\n        </scene>\n    </scenes>\n    <designables>\n        <designable name=\"fqc-dc-WVn\">\n            <size key=\"intrinsicContentSize\" width=\"420\" height=\"31\"/>\n        </designable>\n    </designables>\n</document>\n"
  },
  {
    "path": "LTMorphingLabelDemo/Launch Screen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"16096\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"  Copyright © 2016 lexrus.com. All rights reserved.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"obG-Y5-kRd\">\n                                <rect key=\"frame\" x=\"20\" y=\"855\" width=\"374\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.12908115671641796\" green=\"0.12908115671641796\" blue=\"0.12908115671641796\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"LTMorphingLabelDemo\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GJd-Yh-RWb\">\n                                <rect key=\"frame\" x=\"20\" y=\"278\" width=\"374\" height=\"43\"/>\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                                <color key=\"textColor\" red=\"0.11456389925373134\" green=\"0.11456389925373134\" blue=\"0.11456389925373134\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"centerX\" id=\"5cz-MP-9tL\"/>\n                            <constraint firstAttribute=\"centerX\" secondItem=\"GJd-Yh-RWb\" secondAttribute=\"centerX\" id=\"Q3B-4B-g5h\"/>\n                            <constraint firstItem=\"obG-Y5-kRd\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"SfN-ll-jLj\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"bottom\" constant=\"20\" id=\"Y44-ml-fuU\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"moa-c2-u7t\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"leading\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"x7j-FC-K8j\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "LTMorphingLabelDemo.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tD701040D2516F5E500DB98F7 /* MorphingText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D764373D2467A01A0037C36B /* MorphingText.swift */; platformFilter = maccatalyst; };\n\t\tD720D06B1A5E91CB00747465 /* LTEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC911962511C0006FA88 /* LTEasing.swift */; };\n\t\tD720D06C1A5E91CB00747465 /* LTStringDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7633A2C195965A00009D084 /* LTStringDiffResult.swift */; };\n\t\tD720D06D1A5E91CB00747465 /* LTMorphingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AD98E19517430009A2ACD /* LTMorphingLabel.swift */; };\n\t\tD720D06E1A5E91CB00747465 /* LTMorphingLabel+Evaporate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC93196256720006FA88 /* LTMorphingLabel+Evaporate.swift */; };\n\t\tD720D06F1A5E91CB00747465 /* LTMorphingLabel+Fall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC97196280860006FA88 /* LTMorphingLabel+Fall.swift */; };\n\t\tD720D0701A5E91CB00747465 /* LTMorphingLabel+Pixelate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7558D391962AB3000DCF592 /* LTMorphingLabel+Pixelate.swift */; };\n\t\tD720D0711A5E91CB00747465 /* LTMorphingLabel+Sparkle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EC5FD5196692E8004E7076 /* LTMorphingLabel+Sparkle.swift */; };\n\t\tD720D0721A5E91CB00747465 /* LTMorphingLabel+Burn.swift in Sources */ = {isa = PBXBuildFile; fileRef = D757C30C1974243400A34565 /* LTMorphingLabel+Burn.swift */; };\n\t\tD720D0731A5E91CB00747465 /* LTMorphingLabel+Anvil.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C98F381975265C00902C5C /* LTMorphingLabel+Anvil.swift */; };\n\t\tD720D0741A5E923100747465 /* LTEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC911962511C0006FA88 /* LTEasing.swift */; };\n\t\tD720D0751A5E923100747465 /* LTStringDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7633A2C195965A00009D084 /* LTStringDiffResult.swift */; };\n\t\tD720D0761A5E923100747465 /* LTMorphingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AD98E19517430009A2ACD /* LTMorphingLabel.swift */; };\n\t\tD720D0771A5E923100747465 /* LTMorphingLabel+Evaporate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC93196256720006FA88 /* LTMorphingLabel+Evaporate.swift */; };\n\t\tD720D0781A5E923100747465 /* LTMorphingLabel+Fall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC97196280860006FA88 /* LTMorphingLabel+Fall.swift */; };\n\t\tD720D0791A5E923100747465 /* LTMorphingLabel+Pixelate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7558D391962AB3000DCF592 /* LTMorphingLabel+Pixelate.swift */; };\n\t\tD720D07A1A5E923100747465 /* LTMorphingLabel+Sparkle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EC5FD5196692E8004E7076 /* LTMorphingLabel+Sparkle.swift */; };\n\t\tD720D07B1A5E923100747465 /* LTMorphingLabel+Burn.swift in Sources */ = {isa = PBXBuildFile; fileRef = D757C30C1974243400A34565 /* LTMorphingLabel+Burn.swift */; };\n\t\tD720D07C1A5E923100747465 /* LTMorphingLabel+Anvil.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C98F381975265C00902C5C /* LTMorphingLabel+Anvil.swift */; };\n\t\tD720D07D1A5E923800747465 /* Fire.png in Resources */ = {isa = PBXBuildFile; fileRef = D757C31619742B1D00A34565 /* Fire.png */; };\n\t\tD720D07E1A5E923800747465 /* Sparkle.png in Resources */ = {isa = PBXBuildFile; fileRef = D723B2CB196A3FD100B1BBE8 /* Sparkle.png */; };\n\t\tD720D07F1A5E923800747465 /* Smoke.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3619750F6900902C5C /* Smoke.png */; };\n\t\tD720D0801A5E923800747465 /* Fragment.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3A1975298000902C5C /* Fragment.png */; };\n\t\tD72A94E01F7CAF8B007E5157 /* MorphingLabel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */; };\n\t\tD72A94E11F7CAFA5007E5157 /* MorphingLabel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */; };\n\t\tD73C19FA1AC2824100C1A824 /* MorphingLabel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */; };\n\t\tD73DFD021F4DB5CC00F84122 /* LTCharacterLimbo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F061AB5612C00D46A0E /* LTCharacterLimbo.swift */; };\n\t\tD73DFD031F4DB5CC00F84122 /* LTEasing.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC911962511C0006FA88 /* LTEasing.swift */; };\n\t\tD73DFD041F4DB5CC00F84122 /* LTStringDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7633A2C195965A00009D084 /* LTStringDiffResult.swift */; };\n\t\tD73DFD051F4DB5CC00F84122 /* LTMorphingEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F031AB5608000D46A0E /* LTMorphingEffect.swift */; };\n\t\tD73DFD061F4DB5CC00F84122 /* LTMorphingLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AD98E19517430009A2ACD /* LTMorphingLabel.swift */; };\n\t\tD73DFD071F4DB5CC00F84122 /* LTCharacterDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D797F6F81D2E992200531960 /* LTCharacterDiffResult.swift */; };\n\t\tD73DFD081F4DB5CC00F84122 /* LTMorphingLabel+Evaporate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC93196256720006FA88 /* LTMorphingLabel+Evaporate.swift */; };\n\t\tD73DFD091F4DB5CC00F84122 /* LTMorphingLabel+Fall.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7AFEC97196280860006FA88 /* LTMorphingLabel+Fall.swift */; };\n\t\tD73DFD0A1F4DB5CC00F84122 /* LTMorphingLabel+Pixelate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7558D391962AB3000DCF592 /* LTMorphingLabel+Pixelate.swift */; };\n\t\tD73DFD0B1F4DB5CC00F84122 /* LTMorphingLabel+Sparkle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EC5FD5196692E8004E7076 /* LTMorphingLabel+Sparkle.swift */; };\n\t\tD73DFD0C1F4DB5CC00F84122 /* LTMorphingLabel+Burn.swift in Sources */ = {isa = PBXBuildFile; fileRef = D757C30C1974243400A34565 /* LTMorphingLabel+Burn.swift */; };\n\t\tD73DFD0D1F4DB5CC00F84122 /* LTMorphingLabel+Anvil.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C98F381975265C00902C5C /* LTMorphingLabel+Anvil.swift */; };\n\t\tD73DFD0E1F4DB5CC00F84122 /* LTEmitterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F091AB561A400D46A0E /* LTEmitterView.swift */; };\n\t\tD73DFD111F4DB5CC00F84122 /* LTMorphingLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = D7D4B0231A5E87D50087F83D /* LTMorphingLabel.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD73DFD131F4DB5CC00F84122 /* Fire.png in Resources */ = {isa = PBXBuildFile; fileRef = D757C31619742B1D00A34565 /* Fire.png */; };\n\t\tD73DFD141F4DB5CC00F84122 /* Sparkle.png in Resources */ = {isa = PBXBuildFile; fileRef = D723B2CB196A3FD100B1BBE8 /* Sparkle.png */; };\n\t\tD73DFD151F4DB5CC00F84122 /* Smoke.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3619750F6900902C5C /* Smoke.png */; };\n\t\tD73DFD161F4DB5CC00F84122 /* Fragment.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3A1975298000902C5C /* Fragment.png */; };\n\t\tD73DFD231F5056A700F84122 /* LTMorphingLabelUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D73DFD221F5056A700F84122 /* LTMorphingLabelUITests.swift */; };\n\t\tD74AD974195171E7009A2ACD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AD973195171E7009A2ACD /* AppDelegate.swift */; };\n\t\tD74AD976195171E7009A2ACD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D74AD975195171E7009A2ACD /* Images.xcassets */; };\n\t\tD74AD98D195173B5009A2ACD /* LTMorphingLabelDemo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D74AD98C195173B5009A2ACD /* LTMorphingLabelDemo.storyboard */; };\n\t\tD7633A2B195812020009D084 /* LTDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7633A2A195812020009D084 /* LTDemoViewController.swift */; };\n\t\tD7934DCB1A63AF1100AE04CE /* LTMorphingLabelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7934DCA1A63AF1100AE04CE /* LTMorphingLabelTests.swift */; };\n\t\tD797F6F91D2E992200531960 /* LTCharacterDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D797F6F81D2E992200531960 /* LTCharacterDiffResult.swift */; };\n\t\tD797F6FA1D2EA47A00531960 /* LTCharacterDiffResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = D797F6F81D2E992200531960 /* LTCharacterDiffResult.swift */; };\n\t\tD7D4B0241A5E87D50087F83D /* LTMorphingLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = D7D4B0231A5E87D50087F83D /* LTMorphingLabel.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD7D4B0381A5E87D50087F83D /* MorphingLabel.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\tD7D4B03F1A5E8F6E0087F83D /* Fire.png in Resources */ = {isa = PBXBuildFile; fileRef = D757C31619742B1D00A34565 /* Fire.png */; };\n\t\tD7D4B0401A5E8F6E0087F83D /* Sparkle.png in Resources */ = {isa = PBXBuildFile; fileRef = D723B2CB196A3FD100B1BBE8 /* Sparkle.png */; };\n\t\tD7D4B0411A5E8F6E0087F83D /* Smoke.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3619750F6900902C5C /* Smoke.png */; };\n\t\tD7D4B0421A5E8F6E0087F83D /* Fragment.png in Resources */ = {isa = PBXBuildFile; fileRef = D7C98F3A1975298000902C5C /* Fragment.png */; };\n\t\tD7E537321B8CADF6008EF6D1 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D7E537311B8CADF6008EF6D1 /* Launch Screen.storyboard */; };\n\t\tD7EF4F041AB5608000D46A0E /* LTMorphingEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F031AB5608000D46A0E /* LTMorphingEffect.swift */; };\n\t\tD7EF4F051AB5610200D46A0E /* LTMorphingEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F031AB5608000D46A0E /* LTMorphingEffect.swift */; };\n\t\tD7EF4F071AB5612C00D46A0E /* LTCharacterLimbo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F061AB5612C00D46A0E /* LTCharacterLimbo.swift */; };\n\t\tD7EF4F081AB5612C00D46A0E /* LTCharacterLimbo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F061AB5612C00D46A0E /* LTCharacterLimbo.swift */; };\n\t\tD7EF4F0A1AB561A400D46A0E /* LTEmitterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F091AB561A400D46A0E /* LTEmitterView.swift */; };\n\t\tD7EF4F0B1AB561A400D46A0E /* LTEmitterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EF4F091AB561A400D46A0E /* LTEmitterView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tD72A94DD1F7CAF6D007E5157 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D74AD966195171E7009A2ACD /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D7D4B01E1A5E87D50087F83D;\n\t\t\tremoteInfo = LTMorphingLabel;\n\t\t};\n\t\tD72A94E21F7CAFAA007E5157 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D74AD966195171E7009A2ACD /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D7D4B01E1A5E87D50087F83D;\n\t\t\tremoteInfo = LTMorphingLabel;\n\t\t};\n\t\tD73C19F81AC2823900C1A824 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D74AD966195171E7009A2ACD /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D7D4B01E1A5E87D50087F83D;\n\t\t\tremoteInfo = LTMorphingLabel;\n\t\t};\n\t\tD73C19FB1AC28DAA00C1A824 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D74AD966195171E7009A2ACD /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D74AD96D195171E7009A2ACD;\n\t\t\tremoteInfo = LTMorphingLabelDemo;\n\t\t};\n\t\tD73DFD251F5056A700F84122 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D74AD966195171E7009A2ACD /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D74AD96D195171E7009A2ACD;\n\t\t\tremoteInfo = LTMorphingLabelDemo;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tD7D4B0371A5E87D50087F83D /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tD7D4B0381A5E87D50087F83D /* MorphingLabel.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\tD723B2CB196A3FD100B1BBE8 /* Sparkle.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Sparkle.png; sourceTree = \"<group>\"; };\n\t\tD72CE5F420863C9D005BBDEF /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = \"<group>\"; };\n\t\tD73DFD1A1F4DB5CC00F84122 /* MorphingLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MorphingLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD73DFD1B1F4DB5CC00F84122 /* tvOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = \"tvOS-Info.plist\"; path = \"/Users/lex/git/LTMorphingLabel/LTMorphingLabel/tvOS-Info.plist\"; sourceTree = \"<absolute>\"; };\n\t\tD73DFD201F5056A700F84122 /* LTMorphingLabelUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LTMorphingLabelUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD73DFD221F5056A700F84122 /* LTMorphingLabelUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LTMorphingLabelUITests.swift; sourceTree = \"<group>\"; };\n\t\tD73DFD241F5056A700F84122 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD74AD96E195171E7009A2ACD /* Morphing.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Morphing.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD74AD972195171E7009A2ACD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD74AD973195171E7009A2ACD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tD74AD975195171E7009A2ACD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\tD74AD98C195173B5009A2ACD /* LTMorphingLabelDemo.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LTMorphingLabelDemo.storyboard; sourceTree = \"<group>\"; };\n\t\tD74AD98E19517430009A2ACD /* LTMorphingLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTMorphingLabel.swift; sourceTree = \"<group>\"; };\n\t\tD7558D391962AB3000DCF592 /* LTMorphingLabel+Pixelate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Pixelate.swift\"; sourceTree = \"<group>\"; };\n\t\tD757C30C1974243400A34565 /* LTMorphingLabel+Burn.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Burn.swift\"; sourceTree = \"<group>\"; };\n\t\tD757C31619742B1D00A34565 /* Fire.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Fire.png; sourceTree = \"<group>\"; };\n\t\tD7633A2A195812020009D084 /* LTDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTDemoViewController.swift; sourceTree = \"<group>\"; };\n\t\tD7633A2C195965A00009D084 /* LTStringDiffResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTStringDiffResult.swift; sourceTree = \"<group>\"; };\n\t\tD764373D2467A01A0037C36B /* MorphingText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MorphingText.swift; sourceTree = \"<group>\"; };\n\t\tD7934DC61A63AF1100AE04CE /* LTMorphingLabelTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LTMorphingLabelTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD7934DC91A63AF1100AE04CE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD7934DCA1A63AF1100AE04CE /* LTMorphingLabelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LTMorphingLabelTests.swift; sourceTree = \"<group>\"; };\n\t\tD797F6F81D2E992200531960 /* LTCharacterDiffResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTCharacterDiffResult.swift; sourceTree = \"<group>\"; };\n\t\tD7AA544125170E1100299291 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = \"<group>\"; };\n\t\tD7AFEC911962511C0006FA88 /* LTEasing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTEasing.swift; sourceTree = \"<group>\"; };\n\t\tD7AFEC93196256720006FA88 /* LTMorphingLabel+Evaporate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Evaporate.swift\"; sourceTree = \"<group>\"; };\n\t\tD7AFEC97196280860006FA88 /* LTMorphingLabel+Fall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Fall.swift\"; sourceTree = \"<group>\"; };\n\t\tD7C98F3619750F6900902C5C /* Smoke.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Smoke.png; sourceTree = \"<group>\"; };\n\t\tD7C98F381975265C00902C5C /* LTMorphingLabel+Anvil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Anvil.swift\"; sourceTree = \"<group>\"; };\n\t\tD7C98F3A1975298000902C5C /* Fragment.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Fragment.png; sourceTree = \"<group>\"; };\n\t\tD7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MorphingLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD7D4B0221A5E87D50087F83D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD7D4B0231A5E87D50087F83D /* LTMorphingLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LTMorphingLabel.h; sourceTree = \"<group>\"; };\n\t\tD7E537311B8CADF6008EF6D1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = \"Launch Screen.storyboard\"; sourceTree = \"<group>\"; };\n\t\tD7EC5FD5196692E8004E7076 /* LTMorphingLabel+Sparkle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"LTMorphingLabel+Sparkle.swift\"; sourceTree = \"<group>\"; };\n\t\tD7EF4F031AB5608000D46A0E /* LTMorphingEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTMorphingEffect.swift; sourceTree = \"<group>\"; };\n\t\tD7EF4F061AB5612C00D46A0E /* LTCharacterLimbo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTCharacterLimbo.swift; sourceTree = \"<group>\"; };\n\t\tD7EF4F091AB561A400D46A0E /* LTEmitterView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LTEmitterView.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD73DFD0F1F4DB5CC00F84122 /* 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\tD73DFD1D1F5056A700F84122 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD72A94E11F7CAFA5007E5157 /* MorphingLabel.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD74AD96B195171E7009A2ACD /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD72A94E01F7CAF8B007E5157 /* MorphingLabel.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7934DC31A63AF1100AE04CE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD73C19FA1AC2824100C1A824 /* MorphingLabel.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7D4B01B1A5E87D50087F83D /* 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/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tD70FB1FB19685C3300EF9B84 /* Particles */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD757C31619742B1D00A34565 /* Fire.png */,\n\t\t\t\tD723B2CB196A3FD100B1BBE8 /* Sparkle.png */,\n\t\t\t\tD7C98F3619750F6900902C5C /* Smoke.png */,\n\t\t\t\tD7C98F3A1975298000902C5C /* Fragment.png */,\n\t\t\t);\n\t\t\tpath = Particles;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD72A94DF1F7CAF8B007E5157 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD73DFD211F5056A700F84122 /* LTMorphingLabelUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD73DFD221F5056A700F84122 /* LTMorphingLabelUITests.swift */,\n\t\t\t\tD73DFD241F5056A700F84122 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = LTMorphingLabelUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD74AD965195171E7009A2ACD = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7AA544125170E1100299291 /* Package.swift */,\n\t\t\t\tD72CE5F420863C9D005BBDEF /* README.md */,\n\t\t\t\tD74AD98B19517201009A2ACD /* LTMorphingLabel */,\n\t\t\t\tD74AD970195171E7009A2ACD /* LTMorphingLabelDemo */,\n\t\t\t\tD7D4B0201A5E87D50087F83D /* LTMorphingLabel */,\n\t\t\t\tD7934DC71A63AF1100AE04CE /* LTMorphingLabelTests */,\n\t\t\t\tD73DFD211F5056A700F84122 /* LTMorphingLabelUITests */,\n\t\t\t\tD74AD96F195171E7009A2ACD /* Products */,\n\t\t\t\tD72A94DF1F7CAF8B007E5157 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD74AD96F195171E7009A2ACD /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD74AD96E195171E7009A2ACD /* Morphing.app */,\n\t\t\t\tD7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */,\n\t\t\t\tD7934DC61A63AF1100AE04CE /* LTMorphingLabelTests.xctest */,\n\t\t\t\tD73DFD1A1F4DB5CC00F84122 /* MorphingLabel.framework */,\n\t\t\t\tD73DFD201F5056A700F84122 /* LTMorphingLabelUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD74AD970195171E7009A2ACD /* LTMorphingLabelDemo */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7E537311B8CADF6008EF6D1 /* Launch Screen.storyboard */,\n\t\t\t\tD74AD973195171E7009A2ACD /* AppDelegate.swift */,\n\t\t\t\tD74AD975195171E7009A2ACD /* Images.xcassets */,\n\t\t\t\tD74AD971195171E7009A2ACD /* Supporting Files */,\n\t\t\t\tD74AD98C195173B5009A2ACD /* LTMorphingLabelDemo.storyboard */,\n\t\t\t\tD7633A2A195812020009D084 /* LTDemoViewController.swift */,\n\t\t\t);\n\t\t\tpath = LTMorphingLabelDemo;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD74AD971195171E7009A2ACD /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD74AD972195171E7009A2ACD /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD74AD98B19517201009A2ACD /* LTMorphingLabel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7AFEC911962511C0006FA88 /* LTEasing.swift */,\n\t\t\t\tD797F6F81D2E992200531960 /* LTCharacterDiffResult.swift */,\n\t\t\t\tD7633A2C195965A00009D084 /* LTStringDiffResult.swift */,\n\t\t\t\tD7EF4F061AB5612C00D46A0E /* LTCharacterLimbo.swift */,\n\t\t\t\tD7EF4F031AB5608000D46A0E /* LTMorphingEffect.swift */,\n\t\t\t\tD7EF4F091AB561A400D46A0E /* LTEmitterView.swift */,\n\t\t\t\tD74AD98E19517430009A2ACD /* LTMorphingLabel.swift */,\n\t\t\t\tD7AFEC93196256720006FA88 /* LTMorphingLabel+Evaporate.swift */,\n\t\t\t\tD7AFEC97196280860006FA88 /* LTMorphingLabel+Fall.swift */,\n\t\t\t\tD7558D391962AB3000DCF592 /* LTMorphingLabel+Pixelate.swift */,\n\t\t\t\tD7EC5FD5196692E8004E7076 /* LTMorphingLabel+Sparkle.swift */,\n\t\t\t\tD757C30C1974243400A34565 /* LTMorphingLabel+Burn.swift */,\n\t\t\t\tD7C98F381975265C00902C5C /* LTMorphingLabel+Anvil.swift */,\n\t\t\t\tD70FB1FB19685C3300EF9B84 /* Particles */,\n\t\t\t\tD7868570246848E100D4C46F /* SwiftUI */,\n\t\t\t);\n\t\t\tpath = LTMorphingLabel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD7868570246848E100D4C46F /* SwiftUI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD764373D2467A01A0037C36B /* MorphingText.swift */,\n\t\t\t);\n\t\t\tpath = SwiftUI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD7934DC71A63AF1100AE04CE /* LTMorphingLabelTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7934DCA1A63AF1100AE04CE /* LTMorphingLabelTests.swift */,\n\t\t\t\tD7934DC81A63AF1100AE04CE /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = LTMorphingLabelTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD7934DC81A63AF1100AE04CE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7934DC91A63AF1100AE04CE /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD7D4B0201A5E87D50087F83D /* LTMorphingLabel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7D4B0231A5E87D50087F83D /* LTMorphingLabel.h */,\n\t\t\t\tD7D4B0211A5E87D50087F83D /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = LTMorphingLabel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD7D4B0211A5E87D50087F83D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD7D4B0221A5E87D50087F83D /* Info.plist */,\n\t\t\t\tD73DFD1B1F4DB5CC00F84122 /* tvOS-Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tD73DFD101F4DB5CC00F84122 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD73DFD111F4DB5CC00F84122 /* LTMorphingLabel.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7D4B01C1A5E87D50087F83D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD7D4B0241A5E87D50087F83D /* LTMorphingLabel.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\tD73DFD001F4DB5CC00F84122 /* MorphingLabel_tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D73DFD171F4DB5CC00F84122 /* Build configuration list for PBXNativeTarget \"MorphingLabel_tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD73DFD011F4DB5CC00F84122 /* Sources */,\n\t\t\t\tD73DFD0F1F4DB5CC00F84122 /* Frameworks */,\n\t\t\t\tD73DFD101F4DB5CC00F84122 /* Headers */,\n\t\t\t\tD73DFD121F4DB5CC00F84122 /* 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 = MorphingLabel_tvOS;\n\t\t\tproductName = LTMorphingLabel;\n\t\t\tproductReference = D73DFD1A1F4DB5CC00F84122 /* MorphingLabel.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tD73DFD1F1F5056A700F84122 /* LTMorphingLabelUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D73DFD291F5056A700F84122 /* Build configuration list for PBXNativeTarget \"LTMorphingLabelUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD73DFD1C1F5056A700F84122 /* Sources */,\n\t\t\t\tD73DFD1D1F5056A700F84122 /* Frameworks */,\n\t\t\t\tD73DFD1E1F5056A700F84122 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD73DFD261F5056A700F84122 /* PBXTargetDependency */,\n\t\t\t\tD72A94E31F7CAFAA007E5157 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = LTMorphingLabelUITests;\n\t\t\tproductName = LTMorphingLabelUITests;\n\t\t\tproductReference = D73DFD201F5056A700F84122 /* LTMorphingLabelUITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n\t\tD74AD96D195171E7009A2ACD /* LTMorphingLabelDemo */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D74AD985195171E7009A2ACD /* Build configuration list for PBXNativeTarget \"LTMorphingLabelDemo\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD74AD96A195171E7009A2ACD /* Sources */,\n\t\t\t\tD74AD96B195171E7009A2ACD /* Frameworks */,\n\t\t\t\tD74AD96C195171E7009A2ACD /* Resources */,\n\t\t\t\tD7D4B0371A5E87D50087F83D /* Embed Frameworks */,\n\t\t\t\tD7E30A621C28449F00A708CF /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD72A94DE1F7CAF6D007E5157 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = LTMorphingLabelDemo;\n\t\t\tproductName = LTMorphingLabelDemo;\n\t\t\tproductReference = D74AD96E195171E7009A2ACD /* Morphing.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tD7934DC51A63AF1100AE04CE /* LTMorphingLabelTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D7934DD11A63AF1100AE04CE /* Build configuration list for PBXNativeTarget \"LTMorphingLabelTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD7934DC21A63AF1100AE04CE /* Sources */,\n\t\t\t\tD7934DC31A63AF1100AE04CE /* Frameworks */,\n\t\t\t\tD7934DC41A63AF1100AE04CE /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD73C19F91AC2823900C1A824 /* PBXTargetDependency */,\n\t\t\t\tD73C19FC1AC28DAA00C1A824 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = LTMorphingLabelTests;\n\t\t\tproductName = LTMorphingLabelTests;\n\t\t\tproductReference = D7934DC61A63AF1100AE04CE /* LTMorphingLabelTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tD7D4B01E1A5E87D50087F83D /* MorphingLabel */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D7D4B03D1A5E87D50087F83D /* Build configuration list for PBXNativeTarget \"MorphingLabel\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD7D4B01A1A5E87D50087F83D /* Sources */,\n\t\t\t\tD7D4B01B1A5E87D50087F83D /* Frameworks */,\n\t\t\t\tD7D4B01C1A5E87D50087F83D /* Headers */,\n\t\t\t\tD7D4B01D1A5E87D50087F83D /* 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 = MorphingLabel;\n\t\t\tproductName = LTMorphingLabel;\n\t\t\tproductReference = D7D4B01F1A5E87D50087F83D /* MorphingLabel.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD74AD966195171E7009A2ACD /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0830;\n\t\t\t\tLastUpgradeCheck = 1240;\n\t\t\t\tORGANIZATIONNAME = lexrus.com;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD73DFD1F1F5056A700F84122 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.3.3;\n\t\t\t\t\t\tDevelopmentTeam = 5SKD83S59G;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = D74AD96D195171E7009A2ACD;\n\t\t\t\t\t};\n\t\t\t\t\tD74AD96D195171E7009A2ACD = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.0;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\tD7934DC51A63AF1100AE04CE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t\tTestTargetID = D74AD96D195171E7009A2ACD;\n\t\t\t\t\t};\n\t\t\t\t\tD7D4B01E1A5E87D50087F83D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.1.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D74AD969195171E7009A2ACD /* Build configuration list for PBXProject \"LTMorphingLabelDemo\" */;\n\t\t\tcompatibilityVersion = \"Xcode 6.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = D74AD965195171E7009A2ACD;\n\t\t\tproductRefGroup = D74AD96F195171E7009A2ACD /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD74AD96D195171E7009A2ACD /* LTMorphingLabelDemo */,\n\t\t\t\tD7D4B01E1A5E87D50087F83D /* MorphingLabel */,\n\t\t\t\tD7934DC51A63AF1100AE04CE /* LTMorphingLabelTests */,\n\t\t\t\tD73DFD001F4DB5CC00F84122 /* MorphingLabel_tvOS */,\n\t\t\t\tD73DFD1F1F5056A700F84122 /* LTMorphingLabelUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD73DFD121F4DB5CC00F84122 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD73DFD131F4DB5CC00F84122 /* Fire.png in Resources */,\n\t\t\t\tD73DFD141F4DB5CC00F84122 /* Sparkle.png in Resources */,\n\t\t\t\tD73DFD151F4DB5CC00F84122 /* Smoke.png in Resources */,\n\t\t\t\tD73DFD161F4DB5CC00F84122 /* Fragment.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD73DFD1E1F5056A700F84122 /* 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\tD74AD96C195171E7009A2ACD /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD720D07D1A5E923800747465 /* Fire.png in Resources */,\n\t\t\t\tD720D07E1A5E923800747465 /* Sparkle.png in Resources */,\n\t\t\t\tD720D07F1A5E923800747465 /* Smoke.png in Resources */,\n\t\t\t\tD720D0801A5E923800747465 /* Fragment.png in Resources */,\n\t\t\t\tD74AD98D195173B5009A2ACD /* LTMorphingLabelDemo.storyboard in Resources */,\n\t\t\t\tD74AD976195171E7009A2ACD /* Images.xcassets in Resources */,\n\t\t\t\tD7E537321B8CADF6008EF6D1 /* Launch Screen.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7934DC41A63AF1100AE04CE /* 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\tD7D4B01D1A5E87D50087F83D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD7D4B03F1A5E8F6E0087F83D /* Fire.png in Resources */,\n\t\t\t\tD7D4B0401A5E8F6E0087F83D /* Sparkle.png in Resources */,\n\t\t\t\tD7D4B0411A5E8F6E0087F83D /* Smoke.png in Resources */,\n\t\t\t\tD7D4B0421A5E8F6E0087F83D /* Fragment.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tD7E30A621C28449F00A708CF /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"if which swiftlint >/dev/null; then\\nswiftlint\\nelse\\necho \\\"SwiftLint does not exist, download from https://github.com/realm/SwiftLint\\\"\\nfi\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD73DFD011F4DB5CC00F84122 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD73DFD021F4DB5CC00F84122 /* LTCharacterLimbo.swift in Sources */,\n\t\t\t\tD73DFD031F4DB5CC00F84122 /* LTEasing.swift in Sources */,\n\t\t\t\tD73DFD041F4DB5CC00F84122 /* LTStringDiffResult.swift in Sources */,\n\t\t\t\tD73DFD051F4DB5CC00F84122 /* LTMorphingEffect.swift in Sources */,\n\t\t\t\tD73DFD061F4DB5CC00F84122 /* LTMorphingLabel.swift in Sources */,\n\t\t\t\tD73DFD071F4DB5CC00F84122 /* LTCharacterDiffResult.swift in Sources */,\n\t\t\t\tD73DFD081F4DB5CC00F84122 /* LTMorphingLabel+Evaporate.swift in Sources */,\n\t\t\t\tD73DFD091F4DB5CC00F84122 /* LTMorphingLabel+Fall.swift in Sources */,\n\t\t\t\tD73DFD0A1F4DB5CC00F84122 /* LTMorphingLabel+Pixelate.swift in Sources */,\n\t\t\t\tD73DFD0B1F4DB5CC00F84122 /* LTMorphingLabel+Sparkle.swift in Sources */,\n\t\t\t\tD73DFD0C1F4DB5CC00F84122 /* LTMorphingLabel+Burn.swift in Sources */,\n\t\t\t\tD73DFD0D1F4DB5CC00F84122 /* LTMorphingLabel+Anvil.swift in Sources */,\n\t\t\t\tD73DFD0E1F4DB5CC00F84122 /* LTEmitterView.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD73DFD1C1F5056A700F84122 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD73DFD231F5056A700F84122 /* LTMorphingLabelUITests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD74AD96A195171E7009A2ACD /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD720D0741A5E923100747465 /* LTEasing.swift in Sources */,\n\t\t\t\tD7EF4F071AB5612C00D46A0E /* LTCharacterLimbo.swift in Sources */,\n\t\t\t\tD720D0751A5E923100747465 /* LTStringDiffResult.swift in Sources */,\n\t\t\t\tD7EF4F051AB5610200D46A0E /* LTMorphingEffect.swift in Sources */,\n\t\t\t\tD720D0761A5E923100747465 /* LTMorphingLabel.swift in Sources */,\n\t\t\t\tD720D0771A5E923100747465 /* LTMorphingLabel+Evaporate.swift in Sources */,\n\t\t\t\tD720D0781A5E923100747465 /* LTMorphingLabel+Fall.swift in Sources */,\n\t\t\t\tD720D0791A5E923100747465 /* LTMorphingLabel+Pixelate.swift in Sources */,\n\t\t\t\tD720D07A1A5E923100747465 /* LTMorphingLabel+Sparkle.swift in Sources */,\n\t\t\t\tD720D07B1A5E923100747465 /* LTMorphingLabel+Burn.swift in Sources */,\n\t\t\t\tD720D07C1A5E923100747465 /* LTMorphingLabel+Anvil.swift in Sources */,\n\t\t\t\tD7EF4F0A1AB561A400D46A0E /* LTEmitterView.swift in Sources */,\n\t\t\t\tD74AD974195171E7009A2ACD /* AppDelegate.swift in Sources */,\n\t\t\t\tD797F6FA1D2EA47A00531960 /* LTCharacterDiffResult.swift in Sources */,\n\t\t\t\tD7633A2B195812020009D084 /* LTDemoViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7934DC21A63AF1100AE04CE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD7934DCB1A63AF1100AE04CE /* LTMorphingLabelTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD7D4B01A1A5E87D50087F83D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD701040D2516F5E500DB98F7 /* MorphingText.swift in Sources */,\n\t\t\t\tD7EF4F081AB5612C00D46A0E /* LTCharacterLimbo.swift in Sources */,\n\t\t\t\tD720D06B1A5E91CB00747465 /* LTEasing.swift in Sources */,\n\t\t\t\tD720D06C1A5E91CB00747465 /* LTStringDiffResult.swift in Sources */,\n\t\t\t\tD7EF4F041AB5608000D46A0E /* LTMorphingEffect.swift in Sources */,\n\t\t\t\tD720D06D1A5E91CB00747465 /* LTMorphingLabel.swift in Sources */,\n\t\t\t\tD797F6F91D2E992200531960 /* LTCharacterDiffResult.swift in Sources */,\n\t\t\t\tD720D06E1A5E91CB00747465 /* LTMorphingLabel+Evaporate.swift in Sources */,\n\t\t\t\tD720D06F1A5E91CB00747465 /* LTMorphingLabel+Fall.swift in Sources */,\n\t\t\t\tD720D0701A5E91CB00747465 /* LTMorphingLabel+Pixelate.swift in Sources */,\n\t\t\t\tD720D0711A5E91CB00747465 /* LTMorphingLabel+Sparkle.swift in Sources */,\n\t\t\t\tD720D0721A5E91CB00747465 /* LTMorphingLabel+Burn.swift in Sources */,\n\t\t\t\tD720D0731A5E91CB00747465 /* LTMorphingLabel+Anvil.swift in Sources */,\n\t\t\t\tD7EF4F0B1AB561A400D46A0E /* LTEmitterView.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\tD72A94DE1F7CAF6D007E5157 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D7D4B01E1A5E87D50087F83D /* MorphingLabel */;\n\t\t\ttargetProxy = D72A94DD1F7CAF6D007E5157 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD72A94E31F7CAFAA007E5157 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D7D4B01E1A5E87D50087F83D /* MorphingLabel */;\n\t\t\ttargetProxy = D72A94E21F7CAFAA007E5157 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD73C19F91AC2823900C1A824 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D7D4B01E1A5E87D50087F83D /* MorphingLabel */;\n\t\t\ttargetProxy = D73C19F81AC2823900C1A824 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD73C19FC1AC28DAA00C1A824 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D74AD96D195171E7009A2ACD /* LTMorphingLabelDemo */;\n\t\t\ttargetProxy = D73C19FB1AC28DAA00C1A824 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD73DFD261F5056A700F84122 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D74AD96D195171E7009A2ACD /* LTMorphingLabelDemo */;\n\t\t\ttargetProxy = D73DFD251F5056A700F84122 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD73DFD181F4DB5CC00F84122 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\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\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\tINFOPLIST_FILE = \"$(SRCROOT)/LTMorphingLabel/tvOS-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\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\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabel;\n\t\t\t\tPRODUCT_NAME = MorphingLabel;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2,3\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\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\tD73DFD191F4DB5CC00F84122 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\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 = \"$(SRCROOT)/LTMorphingLabel/tvOS-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\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\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabel;\n\t\t\t\tPRODUCT_NAME = MorphingLabel;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2,3\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\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\tD73DFD271F5056A700F84122 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 5SKD83S59G;\n\t\t\t\tINFOPLIST_FILE = LTMorphingLabelUITests/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\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.LexTang.LTMorphingLabelUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tTEST_TARGET_NAME = LTMorphingLabelDemo;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD73DFD281F5056A700F84122 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 5SKD83S59G;\n\t\t\t\tINFOPLIST_FILE = LTMorphingLabelUITests/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\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.LexTang.LTMorphingLabelUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_TARGET_NAME = LTMorphingLabelDemo;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD74AD983195171E7009A2ACD /* 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_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\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_SYMBOLS_PRIVATE_EXTERN = NO;\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.0;\n\t\t\t\tMETAL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD74AD984195171E7009A2ACD /* 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_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\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_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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\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 = gnu99;\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.0;\n\t\t\t\tMETAL_ENABLE_DEBUG_INFO = NO;\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\tSWIFT_VERSION = 5.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD74AD986195171E7009A2ACD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = 5SKD83S59G;\n\t\t\t\tINFOPLIST_FILE = LTMorphingLabelDemo/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\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);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabelDemo;\n\t\t\t\tPRODUCT_NAME = Morphing;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSWIFT_INCLUDE_PATHS = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD74AD987195171E7009A2ACD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = 5SKD83S59G;\n\t\t\t\tINFOPLIST_FILE = LTMorphingLabelDemo/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\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);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabelDemo;\n\t\t\t\tPRODUCT_NAME = Morphing;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tSWIFT_INCLUDE_PATHS = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD7934DCF1A63AF1100AE04CE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\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\tINFOPLIST_FILE = LTMorphingLabelTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.LexTang.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/LTMorphingLabelDemo.app/LTMorphingLabelDemo\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD7934DD01A63AF1100AE04CE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tINFOPLIST_FILE = LTMorphingLabelTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"@executable_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.LexTang.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/LTMorphingLabelDemo.app/LTMorphingLabelDemo\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD7D4B0391A5E87D50087F83D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\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\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\tINFOPLIST_FILE = LTMorphingLabel/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\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\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabel;\n\t\t\t\tPRODUCT_NAME = MorphingLabel;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\t\"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]\" = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\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\tD7D4B03A1A5E87D50087F83D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\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 = LTMorphingLabel/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\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\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = sh.lex.LTMorphingLabel;\n\t\t\t\tPRODUCT_NAME = MorphingLabel;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\t\"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]\" = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\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/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD73DFD171F4DB5CC00F84122 /* Build configuration list for PBXNativeTarget \"MorphingLabel_tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD73DFD181F4DB5CC00F84122 /* Debug */,\n\t\t\t\tD73DFD191F4DB5CC00F84122 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD73DFD291F5056A700F84122 /* Build configuration list for PBXNativeTarget \"LTMorphingLabelUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD73DFD271F5056A700F84122 /* Debug */,\n\t\t\t\tD73DFD281F5056A700F84122 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD74AD969195171E7009A2ACD /* Build configuration list for PBXProject \"LTMorphingLabelDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD74AD983195171E7009A2ACD /* Debug */,\n\t\t\t\tD74AD984195171E7009A2ACD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD74AD985195171E7009A2ACD /* Build configuration list for PBXNativeTarget \"LTMorphingLabelDemo\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD74AD986195171E7009A2ACD /* Debug */,\n\t\t\t\tD74AD987195171E7009A2ACD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD7934DD11A63AF1100AE04CE /* Build configuration list for PBXNativeTarget \"LTMorphingLabelTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD7934DCF1A63AF1100AE04CE /* Debug */,\n\t\t\t\tD7934DD01A63AF1100AE04CE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD7D4B03D1A5E87D50087F83D /* Build configuration list for PBXNativeTarget \"MorphingLabel\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD7D4B0391A5E87D50087F83D /* Debug */,\n\t\t\t\tD7D4B03A1A5E87D50087F83D /* 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 = D74AD966195171E7009A2ACD /* Project object */;\n}\n"
  },
  {
    "path": "LTMorphingLabelDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/lex/git/LTMorphingLabel/LTMorphingLabelDemo.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "LTMorphingLabelDemo.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": "LTMorphingLabelDemo.xcodeproj/xcshareddata/xcschemes/LTMorphingLabelDemo.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D74AD96D195171E7009A2ACD\"\n               BuildableName = \"Morphing.app\"\n               BlueprintName = \"LTMorphingLabelDemo\"\n               ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D74AD96D195171E7009A2ACD\"\n            BuildableName = \"Morphing.app\"\n            BlueprintName = \"LTMorphingLabelDemo\"\n            ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D7934DC51A63AF1100AE04CE\"\n               BuildableName = \"LTMorphingLabelTests.xctest\"\n               BlueprintName = \"LTMorphingLabelTests\"\n               ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D73DFD1F1F5056A700F84122\"\n               BuildableName = \"LTMorphingLabelUITests.xctest\"\n               BlueprintName = \"LTMorphingLabelUITests\"\n               ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D74AD96D195171E7009A2ACD\"\n            BuildableName = \"Morphing.app\"\n            BlueprintName = \"LTMorphingLabelDemo\"\n            ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D74AD96D195171E7009A2ACD\"\n            BuildableName = \"Morphing.app\"\n            BlueprintName = \"LTMorphingLabelDemo\"\n            ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "LTMorphingLabelDemo.xcodeproj/xcshareddata/xcschemes/MorphingLabel.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D7D4B01E1A5E87D50087F83D\"\n               BuildableName = \"MorphingLabel.framework\"\n               BlueprintName = \"MorphingLabel\"\n               ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D7D4B01E1A5E87D50087F83D\"\n            BuildableName = \"MorphingLabel.framework\"\n            BlueprintName = \"MorphingLabel\"\n            ReferencedContainer = \"container:LTMorphingLabelDemo.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "LTMorphingLabelTests/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>en</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>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LTMorphingLabelTests/LTMorphingLabelTests.swift",
    "content": "//\n//  LTMorphingLabelTests.swift\n//  LTMorphingLabelTests\n//\n//  Created by Lex Tang on 1/12/15.\n//  Copyright (c) 2015 lexrus.com. All rights reserved.\n//\n\nimport XCTest\nimport MorphingLabel\n\nclass LTMorphingLabelTests : XCTestCase {\n    \n    func testStringDiff1() {\n        let diffResults = \"he\".diffWith(\"hello\")\n        XCTAssert(\n            diffResults.0[0] == .same,\n            \"First character isn't changed.\"\n        )\n        XCTAssert(diffResults.0[2] == .add, \"Third character is added.\")\n    }\n    \n    func testStringDiff2() {\n        let diffResults = \"news\".diffWith(\"westen\")\n        if case .moveAndAdd(let offset) = diffResults.0[0] {\n            XCTAssert(\n                offset == 5,\n                \"n is moved right for 5 steps, not \\(offset).\"\n            )\n        } else {\n            XCTFail(\"Failed to move and add.\")\n        }\n        \n        if case .moveAndAdd(let offset) = diffResults.0[2] {\n            XCTAssert(\n                offset == -2,\n                \"w is moved left for 2 steps, not \\(offset).\"\n            )\n        } else {\n            XCTFail(\"Failed to move and add.\")\n        }\n        \n        XCTAssert(diffResults.0[4] == .add, \"2nd e is added.\")\n        XCTAssert(diffResults.1[5], \"The last n was moved in.\")\n    }\n    \n    func testStringDiff3() {\n        let diffResults = \"Enchanté\".diffWith(\"Swifter\")\n        \n        XCTAssert(diffResults.0[4] == .replace, \"a is deleted.\")\n    }\n    \n    func testStringDiff4() {\n        let diffResults = \"wo\".diffWith(\"ox\")\n        XCTAssert(diffResults.0[0] == .replace, \"w is replaced.\")\n        XCTAssert(\n            diffResults.0[1] == .moveAndAdd(offset: -1),\n            \"o is moved and add a new character.\"\n        )\n    }\n    \n    func testStringDiff5() {\n        let diffResults = \"Objective-C\".diffWith(\"iPhone\")\n        XCTAssert(diffResults.0[0] == .replace, \"w is replaced.\")\n        XCTAssert(\n            diffResults.0[3] == .moveAndAdd(offset: 2),\n            \"e is moved and add a new character.\"\n        )\n        XCTAssert(diffResults.0[8] == .delete, \"2nd e is deleted.\")\n    }\n    \n    func testStringDiff6() {\n        let diffResults = \"wow\".diffWith(\"newwow\")\n        XCTAssert(diffResults.0[2] == .moveAndAdd(offset: 1), \"2nd. w is moved.\")\n    }\n    \n    func testEmojiDiff7() {\n        let diffResults = \"1️⃣2️⃣3️⃣\".diffWith(\"3️⃣1️⃣2️⃣\")\n        XCTAssert(diffResults.0[0] == .moveAndAdd(offset: 1), \"1st. 1 is moved.\")\n    }\n    \n    func testEmptyDiff8() {\n        let diffResults0 = \"\".diffWith(\"hello\")\n        XCTAssert(diffResults0.0[0] == .add, \"Every characters must be added.\")\n        let diffResults1 = \"\".diffWith(\"\")\n        XCTAssert(diffResults1.0.count == 0, \"Must be empty.\")\n        let diffResults2 = \"Hello\".diffWith(\"\")\n        XCTAssert(diffResults2.0[0] == .delete, \"Must be empty.\")\n    }\n\n    func testLongDiffPerformance() {\n        measure {\n            let lhs =\n                \"Design is not just what it looks like and feels like.\"\n                + \"Design is how it works.\"\n            let rhs =\n                \"Innovation distinguishes between a leader and a follower.\"\n            _ = lhs.diffWith(rhs)\n        }\n    }\n\n}\n"
  },
  {
    "path": "LTMorphingLabelUITests/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>en</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": "LTMorphingLabelUITests/LTMorphingLabelUITests.swift",
    "content": "//\n//  LTMorphingLabelUITests.swift\n//  LTMorphingLabelUITests\n//\n//  Created by Lex on 25/08/2017.\n//  Copyright © 2017 lexrus.com. All rights reserved.\n//\n\nimport XCTest\nimport MorphingLabel\n\nclass LTMorphingLabelUITests: XCTestCase {\n        \n    override func setUp() {\n        super.setUp()\n\n        continueAfterFailure = false\n        XCUIApplication().launch()\n    }\n    \n    override func tearDown() {\n        super.tearDown()\n    }\n\n    func testMonkeyTest() {\n        let app = XCUIApplication()\n        app.buttons[\"Evaporate\"].tap()\n\n        app.buttons[\"Fall\"].tap()\n        \n        let morphinglabelStaticText = XCUIApplication().staticTexts[\"morphingLabel\"]\n        for _ in 0...20 {\n            morphinglabelStaticText.tap()\n        }\n    }\n    \n    func testNilText() {\n        let app = XCUIApplication()\n        app.buttons[\"Clear\"].tap()\n\n        let label = app.staticTexts[\"morphingLabel\"]\n\n        guard label.exists else {\n            XCTFail(\"must have a morphingLabel with accessibilityIdentifier 'morphingLabel'\")\n            return\n        }\n\n        app.buttons[\"Scale\"].tap()\n    }\n    \n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.3\nimport PackageDescription\n\nlet package = Package(\n    name: \"MorphingLabel\",\n    products: [\n        .library(name: \"MorphingLabel\", targets: [\"MorphingLabel\"]),\n        .library(name: \"MorphingLabelDynamic\", type: .dynamic, targets: [\"MorphingLabel\"]),\n        .library(name: \"MorphinglabelXCFramework\", targets: [\"LTMorphingLabel\"])\n    ],\n    targets: [\n        .target(\n            name: \"MorphingLabel\",\n            exclude: [\n                \"Info.plist\",\n                \"tvOS-Info.plist\"\n            ],\n            resources: [\n                .process(\"Particles\")\n            ]\n        ),\n        .binaryTarget(\n            name: \"LTMorphingLabel\",\n            url: \"https://github.com/lexrus/LTMorphingLabel/releases/download/0.9.3/LTMorphingLabel.xcframework.zip\",\n            checksum: \"28a0ed8b7df12c763d45b7dde2aa41fd843984b79e6fbd3750f2fc1a6c247a13\"\n        )\n    ]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# LTMorphingLabel\n\n![Language](https://img.shields.io/badge/language-Swift%205-orange.svg)\n[![CocoaPods](https://img.shields.io/cocoapods/v/LTMorphingLabel.svg?style=flat)](https://github.com/lexrus/LTMorphingLabel)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio)\n![License](https://img.shields.io/github/license/lexrus/LTMorphingLabel.svg?style=flat)\n\nA morphing UILabel subclass written in Swift, originally designed to mimic [Apple's QuickType animation in iOS 8 at WWDC 2014](https://youtu.be/w87fOAG8fjk?t=3451).\n\n## Table of Contents\n\n- [Available Effects](#available-effects)\n  - [.scale](#scale-default)\n  - [.evaporate](#evaporate)\n  - [.fall](#fall)\n  - [.pixelate](#pixelate)\n  - [.sparkle](#sparkle)\n  - [.burn](#burn)\n- [Usage](#usage)\n  - [UIKit](#uikit)\n  - [SwiftUI](#swiftui)\n- [Requirements](#requirements)\n- [Installation](#installation)\n  - [Swift Package Manager](#swift-package-manager)\n  - [CocoaPods](#cocoapods)\n  - [Carthage](#carthage)\n  - [XCFramework](#xcframework)\n  - [Accio](#accio)\n- [Unit Testing](#unit-testing)\n- [Apps Using `LTMorphingLabel`](#apps-using-ltmorphinglabel)\n- [Third-Party Ports](#third-party-ports)\n  - [Android](#android)\n  - [React Native](#react-native)\n- [License](#license)\n\n## Available Effects\n\n#### .scale (_default_)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3491822/96bf5de6-059d-11e4-9826-a6f82025d1af.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel\"/>\n\n#### [.evaporate](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BEvaporate.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3491838/ffc5aff2-059d-11e4-970c-6e2d7664785a.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Evaporate\"/>\n\n#### [.fall](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BFall.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3491840/173c2238-059e-11e4-9b33-dcd21edae9e2.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Fall\"/>\n\n#### [.pixelate](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BPixelate.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3491845/29bb0f8c-059e-11e4-9ef8-de56bec1baba.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Pixelate\"/>\n\n#### [.sparkle](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BSparkle.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3508789/31e9fafe-0690-11e4-9a76-ba3ef45eb53a.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Sparkle\"/>\n\n> `.sparkle` is built on top of `QuartzCore.CAEmitterLayer`. There is also a SpriteKit-powered version [here](https://github.com/lexrus/LTMorphingLabel/blob/spritekit-sparkle/LTMorphingLabel/LTMorphingLabel%2BSparkle.swift).\n\n#### [.burn](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BBurn.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3582586/4fb8c52e-0bfe-11e4-9b6f-f070f7f3ab55.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Burn\"/>\n\n#### [.anvil](https://github.com/lexrus/LTMorphingLabel/blob/master/LTMorphingLabel/LTMorphingLabel%2BAnvil.swift)\n\n<img src=\"https://cloud.githubusercontent.com/assets/219689/3594949/815cd3e8-0caa-11e4-9738-278a9c959478.gif\" width=\"300\" height=\"70\" alt=\"LTMorphingLabel-Anvil\"/>\n\n## Usage\n\n### UIKit\n\nSince `LTMorphingLabel` is a drop-in replacement, you can use it like any `UILabel` by setting its text property, yielding the default effect (`.scale`):\n\n```swift\nvar exampleLabel = LTMorphingLabel()\nexampleLabel.text = \"This is a test\"\n```\n\n![UIKitExample1](https://github.com/jonathanwuki/LTMorphingLabel/assets/11484046/bba7138e-1ef8-4714-8792-f34349434761)\n\nAlternatively, it can be used interactively:\n\n```swift\nvar exampleLabel = LTMorphingLabel()\nexampleLabel.text = \"This is a test\"\nexampleLabel.pause()\n\n// Call .updateProgress(progress: Float) for interactive animation\n// Note: In this case, animation will stop at 45% and will not complete\n//       unless called later with 100 as the `progress` float value.\nexampleLabel.updateProgress(progress: 45.0)\n```\n\nThe effect can be changed by setting the `morphingEffect` property:\n\n```swift\nvar exampleLabel = LTMorphingLabel()\nexampleLabel.text = \"This is a test\"\nexampleLabel.morphingEffect = .burn\n```\n\n![UIKitExample2](https://github.com/jonathanwuki/LTMorphingLabel/assets/11484046/13ab83a6-7f1f-4aac-b0eb-d6172773a671)\n\n### SwiftUI\n\nTo use `LTMorphingLabel` in SwiftUI, simply declare it and set its text, `effect`, `font`, and `textColor` properties:\n\n```swift\npublic var body: some View {\n    VStack {\n        MorphingText(\n            \"This is a test\",\n            font: UIFont.systemFont(ofSize: 20),\n            textColor: .black,\n            textAlignment: .center\n        )\n        .frame(maxWidth: 200, maxHeight: 100)\n    }\n}\n```\n\nSimilar to its use in UIKit, you can also specify the morphing effect manually (if you do not want to use the default `.scale` effect):\n\n```swift\npublic var body: some View {\n    VStack {\n        MorphingText(\n            \"This is a test\",\n            effect: .burn, // Specify an alternative morphing effect with this line\n            font: UIFont.systemFont(ofSize: 20),\n            textColor: .black,\n            textAlignment: .center\n        )\n        .frame(maxWidth: 200, maxHeight: 100)\n    }\n}\n```\n\n![LTMorphingLabelSwiftUI](https://user-images.githubusercontent.com/219689/81505494-2c528c80-9322-11ea-9bdb-b208dd38a5e6.png)\n\n## Requirements\n\n- Xcode 12+\n- iOS 9.0+ (note that SwiftUI requires iOS 13+)\n\n## Installation\n\n### [Swift Package Manager](https://swift.org/package-manager/)\n\nSimply add this library to your package manifest or follow instructions on adding a package dependency [using Xcode here](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app).\n\n```swift\n.package(\n    url: \"https://github.com/lexrus/LTMorphingLabel.git\",\n    .branch(\"master\")\n)\n```\n\n### [CocoaPods](http://cocoapods.org)\n\nAdd `pod 'LTMorphingLabel'` to your Podfile or follow instructions to add dependencies [here](https://guides.cocoapods.org/using/using-cocoapods.html).\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\nAdd `github \"lexrus/LTMorphingLabel\"` to your Cartfile or follow instructions on adding frameworks [here](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application).\n\n### [XCFramework](https://developer.apple.com/videos/play/wwdc2019/416/)\n\nA pre-compiled `xcframework` file is available on the [Releases](https://github.com/lexrus/LTMorphingLabel/releases) page.\n\n### [Accio](https://github.com/JamitLabs/Accio)\n\n1. Add this library to your package manifest (see [Swift Package Manager](#swift-package-manager))\n\n2. Update your target dependencies to include `LTMorphingLabel`:\n\n```swift\n.target(\n    name: \"App\",\n    dependencies: [\n        \"LTMorphingLabel\",\n    ]\n),\n```\n\n3. Run `accio update`.\n\n## Unit Testing\n\nClone the repo by running `git clone https://github.com/lexrus/LTMorphingLabel.git`, then open the project with Xcode and press Cmd + U (or, in the menu bar, click Product > Build for > Testing).\n\n## Apps Using `LTMorphingLabel`\n\n- [Idea](https://itunes.apple.com/app/id1286758943) by [Igor Matyushkin](https://github.com/igormatyushkin014)\n- [Speedo[kilo]meter](https://itunes.apple.com/it/app/speedo-kilo-meter/id1228840413?mt=8) by [Alberto Pasca](http://www.albertopasca.it/whiletrue)\n- [The Met Challenge](https://itunes.apple.com/us/app/the-met-challenge/id917662781) by [@lazerwalker](https://github.com/lazerwalker)\n- [Uther](https://github.com/callmewhy/Uther) by [@callmewhy](https://github.com/callmewhy)\n- [Reax](https://itunes.apple.com/us/app/reax-witness-2016-here.-now./id1076183758?ls=1&mt=8) by Reax Inc\n- [Puzzpic](https://itunes.apple.com/us/app/puzzpic/id1092871121) by [Moath Othman](http://moathothman.com)\n- [Drops](http://languagedrops.com) by [Mark Aron Szulyovszky](https://github.com/itchingpixels)\n- [Setgraph Workout Log](https://itunes.apple.com/us/app/setgraph-workout-log/id1209781676?mt=8) by [Arturo Lee](https://github.com/ArturoLee)\n- [Nihon](https://itunes.apple.com/app/id1315486029) by [KyXu](https://github.com/OpenMarshall)\n- [Lightsync](https://itunes.apple.com/app/id1463390406?mt=8&ct=ghltml) by [Marcel Braun](https://github.com/thatmarcel)\n- [Find](https://apps.apple.com/app/find-command-f-for-camera/id1506500202) by [A. Zheng](https://github.com/aheze)\n\n## Third-Party Ports\n\n### Android\n\nThe Android port of this library is available [here](https://github.com/hanks-zyh/HTextView).\n\n### React Native\n\nThe React Native port of this library is available [here](https://github.com/prscX/react-native-morphing-text).\n\n## License\n\nThis code is distributed under the terms and conditions of the MIT license.\n"
  },
  {
    "path": "build_xcframework.sh",
    "content": "#!/bin/bash\n\nPROJECT_FILE=\"LTMorphingLabelDemo.xcodeproj\"\nSCHEME=\"MorphingLabel\"\nBUILD_FOLDER=\"Build/MorphingLabel\"\n\nmkdir -p Build\n\n# iOS Simulator\nxcodebuild archive -project \"$PROJECT_FILE\" -scheme \"$SCHEME\" -configuration Release \\\n\t-archivePath \"$BUILD_FOLDER/Simulator\" \\\n\t-sdk iphonesimulator \\\n\tSKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES\n\n# iOS\nxcodebuild archive -project \"$PROJECT_FILE\" -scheme \"$SCHEME\" -configuration Release \\\n\t-archivePath \"$BUILD_FOLDER/iOS\" \\\n\t-sdk iphoneos \\\n\tSKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES\n\n# tvOS\nxcodebuild archive -project \"$PROJECT_FILE\" -scheme \"$SCHEME\" -configuration Release \\\n\t-archivePath \"$BUILD_FOLDER/tvOS\" \\\n\t-sdk appletvos \\\n\tSKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES\n\n# tvOS Simulator\nxcodebuild archive -project \"$PROJECT_FILE\" -scheme \"$SCHEME\" -configuration Release \\\n\t-archivePath \"$BUILD_FOLDER/tvOSSimulator\" \\\n\t-sdk appletvsimulator \\\n\tSKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES\n\n# XCFramework\nxcodebuild -create-xcframework \\\n\t-framework \"$BUILD_FOLDER/iOS.xcarchive/Products/Library/Frameworks/MorphingLabel.framework\" \\\n\t-framework \"$BUILD_FOLDER/tvOS.xcarchive/Products/Library/Frameworks/MorphingLabel.framework\" \\\n\t-framework \"$BUILD_FOLDER/Simulator.xcarchive/Products/Library/Frameworks/MorphingLabel.framework\" \\\n\t-framework \"$BUILD_FOLDER/tvOSSimulator.xcarchive/Products/Library/Frameworks/MorphingLabel.framework\" \\\n\t-output Build/LTMorphingLabel.xcframework\n\ncd Build\n\n# Compress\nzip -vry LTMorphingLabel.xcframework.zip LTMorphingLabel.xcframework/ -x \"*.DS_Store\"\n\n# Checksum for Package.swift\nswift package compute-checksum LTMorphingLabel.xcframework.zip\n\n# Open in Finder\nopen ./\n"
  }
]