diff --git a/GIGA.xcodeproj/project.pbxproj b/GIGA.xcodeproj/project.pbxproj index 0b7848d..7f1808f 100644 --- a/GIGA.xcodeproj/project.pbxproj +++ b/GIGA.xcodeproj/project.pbxproj @@ -32,7 +32,6 @@ 8340BFAF213E739D008F22E4 /* GiGaNoNetWorkView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8340BFAE213E739D008F22E4 /* GiGaNoNetWorkView.m */; }; 834127212152AEFB001DDB36 /* GIGaMaskTimeUseRecordVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 834127202152AEFB001DDB36 /* GIGaMaskTimeUseRecordVC.m */; }; 8342D9FD2131150200D16B1D /* 4481.wav in Resources */ = {isa = PBXBuildFile; fileRef = 8342D9FC2131150200D16B1D /* 4481.wav */; }; - 8342FD7A2150C51100D141F4 /* GIGaFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8342FD792150C51100D141F4 /* GIGaFileManager.m */; }; 8342FD7D2150F94600D141F4 /* AppVerionDescriptionVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 8342FD7C2150F94600D141F4 /* AppVerionDescriptionVC.m */; }; 8342FD822150FA1500D141F4 /* AppVersionDescCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8342FD802150FA1500D141F4 /* AppVersionDescCell.m */; }; 8342FD832150FA1500D141F4 /* AppVersionDescCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8342FD812150FA1500D141F4 /* AppVersionDescCell.xib */; }; @@ -92,6 +91,24 @@ 836EE5D42136454500F0ABB2 /* RegistGetSMSCodeRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D32136454500F0ABB2 /* RegistGetSMSCodeRequest.m */; }; 836EE5D7213645E300F0ABB2 /* GiGaBaseAPiRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D6213645E300F0ABB2 /* GiGaBaseAPiRequest.m */; }; 836EE5DA2136716100F0ABB2 /* NSTimer+Convenience.m in Sources */ = {isa = PBXBuildFile; fileRef = 836EE5D82136716000F0ABB2 /* NSTimer+Convenience.m */; }; + 8376B81A2154816800AB79F8 /* SHareTestImageVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8182154816800AB79F8 /* SHareTestImageVC.m */; }; + 8376B81B2154816800AB79F8 /* SHareTestImageVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B8192154816800AB79F8 /* SHareTestImageVC.xib */; }; + 8376B81E2154897700AB79F8 /* GIGaUserFileHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B81D2154897700AB79F8 /* GIGaUserFileHelper.m */; }; + 8376B8202154913E00AB79F8 /* city.json in Resources */ = {isa = PBXBuildFile; fileRef = 8376B81F2154913E00AB79F8 /* city.json */; }; + 8376B8232154927300AB79F8 /* GIGaMaskShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8222154927300AB79F8 /* GIGaMaskShareViewController.m */; }; + 8376B8282154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8262154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.m */; }; + 8376B8292154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B8272154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.xib */; }; + 8376B82D2154A35100AB79F8 /* MaskTimeTimeViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B82B2154A35100AB79F8 /* MaskTimeTimeViewCell.m */; }; + 8376B82E2154A35100AB79F8 /* MaskTimeTimeViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B82C2154A35100AB79F8 /* MaskTimeTimeViewCell.xib */; }; + 8376B8322154A39200AB79F8 /* MaskTimeEndActionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8302154A39200AB79F8 /* MaskTimeEndActionViewCell.m */; }; + 8376B8332154A39200AB79F8 /* MaskTimeEndActionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B8312154A39200AB79F8 /* MaskTimeEndActionViewCell.xib */; }; + 8376B8362154C74300AB79F8 /* ShareViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8352154C74300AB79F8 /* ShareViewController.m */; }; + 8376B83B2154CE8C00AB79F8 /* MaskTimeShareViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8392154CE8C00AB79F8 /* MaskTimeShareViewCell.m */; }; + 8376B83C2154CE8C00AB79F8 /* MaskTimeShareViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B83A2154CE8C00AB79F8 /* MaskTimeShareViewCell.xib */; }; + 8376B8402154CEB200AB79F8 /* MaskShareTimeMidViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B83E2154CEB200AB79F8 /* MaskShareTimeMidViewCell.m */; }; + 8376B8412154CEB200AB79F8 /* MaskShareTimeMidViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B83F2154CEB200AB79F8 /* MaskShareTimeMidViewCell.xib */; }; + 8376B8452154CEC800AB79F8 /* MaskShareBoootomViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8376B8432154CEC800AB79F8 /* MaskShareBoootomViewCell.m */; }; + 8376B8462154CEC800AB79F8 /* MaskShareBoootomViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8376B8442154CEC800AB79F8 /* MaskShareBoootomViewCell.xib */; }; 83773FBC214769230014EE4C /* ExercisesModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 83773FBB214769230014EE4C /* ExercisesModel.m */; }; 83773FBF214791E10014EE4C /* GIGaQuestionSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 83773FBE214791E10014EE4C /* GIGaQuestionSlider.m */; }; 83773FC221479FED0014EE4C /* UIColor+HexColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 83773FC121479FED0014EE4C /* UIColor+HexColor.m */; }; @@ -121,7 +138,6 @@ 8384F0EB21533542002C19F0 /* MaskResultMinViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8384F0EA21533542002C19F0 /* MaskResultMinViewCell.m */; }; 8384F0EE2153355A002C19F0 /* MaskResultShareViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8384F0ED2153355A002C19F0 /* MaskResultShareViewCell.m */; }; 8384F0F121538146002C19F0 /* MaskResultCandView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8384F0F021538146002C19F0 /* MaskResultCandView.m */; }; - 8384F0F52153A9C3002C19F0 /* city.json in Resources */ = {isa = PBXBuildFile; fileRef = 8384F0F42153A9C3002C19F0 /* city.json */; }; 838500DC2137F3F7003514A3 /* GiGaAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 838500DB2137F3F7003514A3 /* GiGaAttributedLabel.m */; }; 838762D3214B9D120039D241 /* GIGaUserInfoAvatorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 838762D1214B9D120039D241 /* GIGaUserInfoAvatorCell.m */; }; 838762D4214B9D120039D241 /* GIGaUserInfoAvatorCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 838762D2214B9D120039D241 /* GIGaUserInfoAvatorCell.xib */; }; @@ -241,8 +257,6 @@ 8341271F2152AEFB001DDB36 /* GIGaMaskTimeUseRecordVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaMaskTimeUseRecordVC.h; sourceTree = ""; }; 834127202152AEFB001DDB36 /* GIGaMaskTimeUseRecordVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GIGaMaskTimeUseRecordVC.m; sourceTree = ""; }; 8342D9FC2131150200D16B1D /* 4481.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = 4481.wav; sourceTree = ""; }; - 8342FD782150C51100D141F4 /* GIGaFileManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaFileManager.h; sourceTree = ""; }; - 8342FD792150C51100D141F4 /* GIGaFileManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GIGaFileManager.m; sourceTree = ""; }; 8342FD7B2150F94600D141F4 /* AppVerionDescriptionVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppVerionDescriptionVC.h; sourceTree = ""; }; 8342FD7C2150F94600D141F4 /* AppVerionDescriptionVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppVerionDescriptionVC.m; sourceTree = ""; }; 8342FD7F2150FA1500D141F4 /* AppVersionDescCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppVersionDescCell.h; sourceTree = ""; }; @@ -345,6 +359,35 @@ 836EE5D6213645E300F0ABB2 /* GiGaBaseAPiRequest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaBaseAPiRequest.m; sourceTree = ""; }; 836EE5D82136716000F0ABB2 /* NSTimer+Convenience.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+Convenience.m"; sourceTree = ""; }; 836EE5D92136716000F0ABB2 /* NSTimer+Convenience.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+Convenience.h"; sourceTree = ""; }; + 8376B8172154816800AB79F8 /* SHareTestImageVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SHareTestImageVC.h; sourceTree = ""; }; + 8376B8182154816800AB79F8 /* SHareTestImageVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SHareTestImageVC.m; sourceTree = ""; }; + 8376B8192154816800AB79F8 /* SHareTestImageVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SHareTestImageVC.xib; sourceTree = ""; }; + 8376B81C2154897700AB79F8 /* GIGaUserFileHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaUserFileHelper.h; sourceTree = ""; }; + 8376B81D2154897700AB79F8 /* GIGaUserFileHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GIGaUserFileHelper.m; sourceTree = ""; }; + 8376B81F2154913E00AB79F8 /* city.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = city.json; sourceTree = ""; }; + 8376B8212154927300AB79F8 /* GIGaMaskShareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaMaskShareViewController.h; sourceTree = ""; }; + 8376B8222154927300AB79F8 /* GIGaMaskShareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GIGaMaskShareViewController.m; sourceTree = ""; }; + 8376B8252154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MaskTimeEndViewImgaeCell.h; path = GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.h; sourceTree = SOURCE_ROOT; }; + 8376B8262154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MaskTimeEndViewImgaeCell.m; path = GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.m; sourceTree = SOURCE_ROOT; }; + 8376B8272154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MaskTimeEndViewImgaeCell.xib; path = GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.xib; sourceTree = SOURCE_ROOT; }; + 8376B82A2154A35100AB79F8 /* MaskTimeTimeViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskTimeTimeViewCell.h; sourceTree = ""; }; + 8376B82B2154A35100AB79F8 /* MaskTimeTimeViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskTimeTimeViewCell.m; sourceTree = ""; }; + 8376B82C2154A35100AB79F8 /* MaskTimeTimeViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MaskTimeTimeViewCell.xib; sourceTree = ""; }; + 8376B82F2154A39200AB79F8 /* MaskTimeEndActionViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskTimeEndActionViewCell.h; sourceTree = ""; }; + 8376B8302154A39200AB79F8 /* MaskTimeEndActionViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskTimeEndActionViewCell.m; sourceTree = ""; }; + 8376B8312154A39200AB79F8 /* MaskTimeEndActionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MaskTimeEndActionViewCell.xib; sourceTree = ""; }; + 8376B8342154C74300AB79F8 /* ShareViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShareViewController.h; sourceTree = ""; }; + 8376B8352154C74300AB79F8 /* ShareViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShareViewController.m; sourceTree = ""; }; + 8376B8382154CE8C00AB79F8 /* MaskTimeShareViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskTimeShareViewCell.h; sourceTree = ""; }; + 8376B8392154CE8C00AB79F8 /* MaskTimeShareViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskTimeShareViewCell.m; sourceTree = ""; }; + 8376B83A2154CE8C00AB79F8 /* MaskTimeShareViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MaskTimeShareViewCell.xib; sourceTree = ""; }; + 8376B83D2154CEB200AB79F8 /* MaskShareTimeMidViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskShareTimeMidViewCell.h; sourceTree = ""; }; + 8376B83E2154CEB200AB79F8 /* MaskShareTimeMidViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskShareTimeMidViewCell.m; sourceTree = ""; }; + 8376B83F2154CEB200AB79F8 /* MaskShareTimeMidViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MaskShareTimeMidViewCell.xib; sourceTree = ""; }; + 8376B8422154CEC800AB79F8 /* MaskShareBoootomViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskShareBoootomViewCell.h; sourceTree = ""; }; + 8376B8432154CEC800AB79F8 /* MaskShareBoootomViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskShareBoootomViewCell.m; sourceTree = ""; }; + 8376B8442154CEC800AB79F8 /* MaskShareBoootomViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MaskShareBoootomViewCell.xib; sourceTree = ""; }; + 8376B87C2154F0B100AB79F8 /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 83773FBA214769230014EE4C /* ExercisesModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExercisesModel.h; sourceTree = ""; }; 83773FBB214769230014EE4C /* ExercisesModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExercisesModel.m; sourceTree = ""; }; 83773FBD214791E10014EE4C /* GIGaQuestionSlider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaQuestionSlider.h; sourceTree = ""; }; @@ -400,7 +443,6 @@ 8384F0ED2153355A002C19F0 /* MaskResultShareViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskResultShareViewCell.m; sourceTree = ""; }; 8384F0EF21538146002C19F0 /* MaskResultCandView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MaskResultCandView.h; sourceTree = ""; }; 8384F0F021538146002C19F0 /* MaskResultCandView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MaskResultCandView.m; sourceTree = ""; }; - 8384F0F42153A9C3002C19F0 /* city.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = city.json; sourceTree = ""; }; 838500DA2137F3F7003514A3 /* GiGaAttributedLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiGaAttributedLabel.h; sourceTree = ""; }; 838500DB2137F3F7003514A3 /* GiGaAttributedLabel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiGaAttributedLabel.m; sourceTree = ""; }; 838762D0214B9D120039D241 /* GIGaUserInfoAvatorCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GIGaUserInfoAvatorCell.h; sourceTree = ""; }; @@ -515,6 +557,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 8361B41721217DA000238FEB /* Foundation.framework in Frameworks */, 8357ADD52123F5EC000816F2 /* libsqlite3.tbd in Frameworks */, 8361B42321217DFF00238FEB /* libresolv.tbd in Frameworks */, 8361B42121217DF000238FEB /* UserNotifications.framework in Frameworks */, @@ -522,7 +565,6 @@ 8361B41D21217DCD00238FEB /* libz.tbd in Frameworks */, 8361B41B21217DBA00238FEB /* Security.framework in Frameworks */, 8361B41921217DAD00238FEB /* UIKit.framework in Frameworks */, - 8361B41721217DA000238FEB /* Foundation.framework in Frameworks */, 8361B41521217D9200238FEB /* CoreGraphics.framework in Frameworks */, 8361B41321217D7E00238FEB /* SystemConfiguration.framework in Frameworks */, 8361B41121217CA100238FEB /* CoreTelephony.framework in Frameworks */, @@ -582,7 +624,7 @@ 833DE8E02150169F009D4329 /* JYAddressPicker */ = { isa = PBXGroup; children = ( - 8384F0F42153A9C3002C19F0 /* city.json */, + 8376B81F2154913E00AB79F8 /* city.json */, 833DE8E12150169F009D4329 /* JYAddressPicker.h */, 833DE8E32150169F009D4329 /* JYAddressPicker.m */, ); @@ -681,6 +723,10 @@ 83346AD6212C18F50054D597 /* GiGaAppGaurdVC.m */, 839290072134F4C40077D2E8 /* GiGaFlingCommitVC.h */, 839290082134F4C40077D2E8 /* GiGaFlingCommitVC.m */, + 8376B8212154927300AB79F8 /* GIGaMaskShareViewController.h */, + 8376B8222154927300AB79F8 /* GIGaMaskShareViewController.m */, + 8376B8342154C74300AB79F8 /* ShareViewController.h */, + 8376B8352154C74300AB79F8 /* ShareViewController.m */, ); path = Controller; sourceTree = ""; @@ -697,6 +743,8 @@ 8354B3832121BB00004F448F /* View */ = { isa = PBXGroup; children = ( + 8376B8372154CE5B00AB79F8 /* MaskSharesViews */, + 8376B82421549FEB00AB79F8 /* MaskTimeShareCells */, 8392900B2134F9F80077D2E8 /* GiGaCommentView.h */, 8392900A2134F9F80077D2E8 /* GiGaCommentView.m */, 83A2270A212A97ED00B3E75C /* MaskViewBootomWaringView.h */, @@ -716,8 +764,8 @@ 8357ADC82123BFCA000816F2 /* GiGaUserManager.m */, 8357ADD62124027D000816F2 /* GiGaUserDefault.h */, 8357ADD72124027D000816F2 /* GiGaUserDefault.m */, - 8342FD782150C51100D141F4 /* GIGaFileManager.h */, - 8342FD792150C51100D141F4 /* GIGaFileManager.m */, + 8376B81C2154897700AB79F8 /* GIGaUserFileHelper.h */, + 8376B81D2154897700AB79F8 /* GIGaUserFileHelper.m */, ); path = GiGaUserDB; sourceTree = ""; @@ -1013,6 +1061,38 @@ path = APi; sourceTree = ""; }; + 8376B82421549FEB00AB79F8 /* MaskTimeShareCells */ = { + isa = PBXGroup; + children = ( + 8376B8252154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.h */, + 8376B8262154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.m */, + 8376B8272154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.xib */, + 8376B82A2154A35100AB79F8 /* MaskTimeTimeViewCell.h */, + 8376B82B2154A35100AB79F8 /* MaskTimeTimeViewCell.m */, + 8376B82C2154A35100AB79F8 /* MaskTimeTimeViewCell.xib */, + 8376B82F2154A39200AB79F8 /* MaskTimeEndActionViewCell.h */, + 8376B8302154A39200AB79F8 /* MaskTimeEndActionViewCell.m */, + 8376B8312154A39200AB79F8 /* MaskTimeEndActionViewCell.xib */, + ); + path = MaskTimeShareCells; + sourceTree = ""; + }; + 8376B8372154CE5B00AB79F8 /* MaskSharesViews */ = { + isa = PBXGroup; + children = ( + 8376B8382154CE8C00AB79F8 /* MaskTimeShareViewCell.h */, + 8376B8392154CE8C00AB79F8 /* MaskTimeShareViewCell.m */, + 8376B83A2154CE8C00AB79F8 /* MaskTimeShareViewCell.xib */, + 8376B83D2154CEB200AB79F8 /* MaskShareTimeMidViewCell.h */, + 8376B83E2154CEB200AB79F8 /* MaskShareTimeMidViewCell.m */, + 8376B83F2154CEB200AB79F8 /* MaskShareTimeMidViewCell.xib */, + 8376B8422154CEC800AB79F8 /* MaskShareBoootomViewCell.h */, + 8376B8432154CEC800AB79F8 /* MaskShareBoootomViewCell.m */, + 8376B8442154CEC800AB79F8 /* MaskShareBoootomViewCell.xib */, + ); + path = MaskSharesViews; + sourceTree = ""; + }; 83835B9D212E4335001480F2 /* MessageCenter */ = { isa = PBXGroup; children = ( @@ -1077,6 +1157,9 @@ 83835BC2212E677C001480F2 /* GiGaQuestionVC.m */, 8384643F214A4BFF00F12B33 /* MaskTestResultVC.h */, 83846440214A4BFF00F12B33 /* MaskTestResultVC.m */, + 8376B8172154816800AB79F8 /* SHareTestImageVC.h */, + 8376B8182154816800AB79F8 /* SHareTestImageVC.m */, + 8376B8192154816800AB79F8 /* SHareTestImageVC.xib */, ); path = Controller; sourceTree = ""; @@ -1334,6 +1417,7 @@ F3264CFCC2F2D369DC49BD1A /* Frameworks */ = { isa = PBXGroup; children = ( + 8376B87C2154F0B100AB79F8 /* JSONModel.framework */, 8357ADD42123F5EC000816F2 /* libsqlite3.tbd */, 8361B42221217DFF00238FEB /* libresolv.tbd */, 8361B42021217DF000238FEB /* UserNotifications.framework */, @@ -1462,32 +1546,39 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8376B8292154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.xib in Resources */, 83346AC6212BBC8C0054D597 /* GiGaRegistViewController.xib in Resources */, 8351474C21523B7400B25A88 /* GIGaUserChangeMobleCell.xib in Resources */, + 8376B83C2154CE8C00AB79F8 /* MaskTimeShareViewCell.xib in Resources */, 838762DE214B9F140039D241 /* GIGaUserWeChatViewCell.xib in Resources */, 83BFAE6D213CD0E3004EF801 /* GiGaMineInfoViewCell.xib in Resources */, + 8376B81B2154816800AB79F8 /* SHareTestImageVC.xib in Resources */, + 8376B82E2154A35100AB79F8 /* MaskTimeTimeViewCell.xib in Resources */, 8361B3D6212155C300238FEB /* LaunchScreen.storyboard in Resources */, 838762E3214B9F580039D241 /* GiGaUserSexViewCell.xib in Resources */, 838388DA2130046D00D14C53 /* emojizone.mp4 in Resources */, 83A22720212AC8C100B3E75C /* GiGaUserLoginVC.xib in Resources */, 838762D4214B9D120039D241 /* GIGaUserInfoAvatorCell.xib in Resources */, 838388C4212F934400D14C53 /* pomodoSound.m4a in Resources */, + 8376B8462154CEC800AB79F8 /* MaskShareBoootomViewCell.xib in Resources */, 83BFAE78213CDE91004EF801 /* GiGaSettingsViewCell.xib in Resources */, 83346AC1212BB50A0054D597 /* PassWordResetVC.xib in Resources */, 83BDC0592147B89900E74E0D /* GiGaAnswerViewCell.xib in Resources */, 8351473D215215C500B25A88 /* GiGAUserInfoCell.xib in Resources */, 83346AD1212BF5B70054D597 /* useragreement.html in Resources */, + 8376B8332154A39200AB79F8 /* MaskTimeEndActionViewCell.xib in Resources */, 838762D9214B9EF80039D241 /* GIGaUserIDViewCell.xib in Resources */, 838762E8214B9FA60039D241 /* GIGaUserCityViewCell.xib in Resources */, 8342FD8B2151095100D141F4 /* AppVersionLogoCell.xib in Resources */, - 8384F0F52153A9C3002C19F0 /* city.json in Resources */, 83BFAE68213CCF10004EF801 /* GiGaMineUserViewCell.xib in Resources */, + 8376B8202154913E00AB79F8 /* city.json in Resources */, 8351474221521C2A00B25A88 /* GIGaChangePassVC.xib in Resources */, 8340BFA9213E65CA008F22E4 /* GIGACommonLocalizabe.strings in Resources */, 83835BA8212E4748001480F2 /* MAssaageCenterCell.xib in Resources */, 8361B3D3212155C300238FEB /* Assets.xcassets in Resources */, 8340BFA6213E6514008F22E4 /* Localizable.strings in Resources */, 8361B3D1212155C200238FEB /* Main.storyboard in Resources */, + 8376B8412154CEB200AB79F8 /* MaskShareTimeMidViewCell.xib in Resources */, 8340BFAB213E665D008F22E4 /* GIGAUserLocalizable.strings in Resources */, 8342D9FD2131150200D16B1D /* 4481.wav in Resources */, 83835BB0212E4FCD001480F2 /* MessageListViewCell.xib in Resources */, @@ -1544,6 +1635,7 @@ "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework", "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework", + "${BUILT_PRODUCTS_DIR}/LBXScan/LBXScan.framework", "${BUILT_PRODUCTS_DIR}/LKDBHelper/LKDBHelper.framework", "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework", "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework", @@ -1564,6 +1656,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManager.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JSONModel.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LBXScan.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LKDBHelper.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MBProgressHUD.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework", @@ -1597,6 +1690,7 @@ 8351474B21523B7400B25A88 /* GIGaUserChangeMobleCell.m in Sources */, 8349585C212511040064DB6C /* AppDelegate+ThirdParty.m in Sources */, 83048481214F489000603CE7 /* GiGaUserJobViewCell.m in Sources */, + 8376B83B2154CE8C00AB79F8 /* MaskTimeShareViewCell.m in Sources */, 83BFAE73213CDB58004EF801 /* GiSysSettingsVC.m in Sources */, 838762D8214B9EF80039D241 /* GIGaUserIDViewCell.m in Sources */, 838500DC2137F3F7003514A3 /* GiGaAttributedLabel.m in Sources */, @@ -1609,6 +1703,7 @@ 8361B3CE212155C200238FEB /* ViewController.m in Sources */, 8361B4382121847600238FEB /* UINavigationBar+Custom.m in Sources */, 83BFAE6C213CD0E3004EF801 /* GiGaMineInfoViewCell.m in Sources */, + 8376B8402154CEB200AB79F8 /* MaskShareTimeMidViewCell.m in Sources */, 8390116B214E20B2004CA790 /* LYSDateContentView.m in Sources */, 83BC8A872148BE8A00820437 /* NYPopover.m in Sources */, 83048486214FACE700603CE7 /* JobMaskButton.m in Sources */, @@ -1652,8 +1747,10 @@ 838388D3212FB7D700D14C53 /* JXTAlertController.m in Sources */, 833DA7762122A62000A5C614 /* GiGaMaskTaskViewController.m in Sources */, 836EE5D7213645E300F0ABB2 /* GiGaBaseAPiRequest.m in Sources */, + 8376B8232154927300AB79F8 /* GIGaMaskShareViewController.m in Sources */, 83773FBC214769230014EE4C /* ExercisesModel.m in Sources */, 8384F0EE2153355A002C19F0 /* MaskResultShareViewCell.m in Sources */, + 8376B8452154CEC800AB79F8 /* MaskShareBoootomViewCell.m in Sources */, 83835BD0212E8B9C001480F2 /* GiGaQuestionModel.m in Sources */, 83835BAF212E4FCD001480F2 /* MessageListViewCell.m in Sources */, 8361B3D9212155C300238FEB /* main.m in Sources */, @@ -1666,7 +1763,9 @@ 83835BBC212E60E5001480F2 /* MessageDetailViewController.m in Sources */, 83835BCD212E856A001480F2 /* NSString+MD5.m in Sources */, 8340BFA2213E60DD008F22E4 /* GIGAMBHUDHelper.m in Sources */, + 8376B8322154A39200AB79F8 /* MaskTimeEndActionViewCell.m in Sources */, 8345C13621414D3B00051717 /* NSString+Unicode.m in Sources */, + 8376B81A2154816800AB79F8 /* SHareTestImageVC.m in Sources */, 83835BC7212E7BBF001480F2 /* GiGaNavTitileView.m in Sources */, 8361B4322121832800238FEB /* GiGaBaseViewController.m in Sources */, 8338F6B92142504E00B4780B /* LXCustomSwith.m in Sources */, @@ -1680,12 +1779,14 @@ 83835BB9212E51B0001480F2 /* GiGaSystemViewController.m in Sources */, 8361B40421215E0C00238FEB /* LXCountTimer.m in Sources */, 8357ADC52123BEBD000816F2 /* GiGaUser.m in Sources */, + 8376B82D2154A35100AB79F8 /* MaskTimeTimeViewCell.m in Sources */, 83BFAE67213CCF10004EF801 /* GiGaMineUserViewCell.m in Sources */, 8392900C2134F9F80077D2E8 /* GiGaCommentView.m in Sources */, 839290062134F4240077D2E8 /* LXDanMuManager.m in Sources */, + 8376B81E2154897700AB79F8 /* GIGaUserFileHelper.m in Sources */, + 8376B8362154C74300AB79F8 /* ShareViewController.m in Sources */, 833DE8E52150169F009D4329 /* JYAddressPicker.m in Sources */, 834127212152AEFB001DDB36 /* GIGaMaskTimeUseRecordVC.m in Sources */, - 8342FD7A2150C51100D141F4 /* GIGaFileManager.m in Sources */, 83901171214E20B2004CA790 /* LYSDatePickerLabel.m in Sources */, 838762E2214B9F580039D241 /* GiGaUserSexViewCell.m in Sources */, 839290052134F4240077D2E8 /* LXDanMuTrackView.m in Sources */, @@ -1693,6 +1794,7 @@ 83901170214E20B2004CA790 /* LYSDateHeaderViewController.m in Sources */, 835060A5212D3536007E6220 /* AppDelegate+GiGaConfig.m in Sources */, 835147312151E4EF00B25A88 /* GIGaAboutUsVC.m in Sources */, + 8376B8282154A0A200AB79F8 /* MaskTimeEndViewImgaeCell.m in Sources */, 83901174214E20B2004CA790 /* LYSDateIndicatorViewController.m in Sources */, 83E40B2B21218B6F008149C4 /* GiGaExercisesViewController.m in Sources */, 8390117B214E20B2004CA790 /* LYSDatePickerHeaderView.m in Sources */, @@ -1902,6 +2004,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/GIGA/Common/libs/ZbarSDK/ZBarSDK", + ); PRODUCT_BUNDLE_IDENTIFIER = com.gigamask.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -1932,6 +2038,10 @@ "$(inherited)", "@executable_path/Frameworks", ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/GIGA/Common/libs/ZbarSDK/ZBarSDK", + ); PRODUCT_BUNDLE_IDENTIFIER = com.gigamask.ios; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; diff --git a/GIGA.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist b/GIGA.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist index 26805d5..1206115 100644 --- a/GIGA.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/GIGA.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ GIGA.xcscheme orderHint - 18 + 19 diff --git a/GIGA/Assets.xcassets/login/app_logo.imageset/Contents.json b/GIGA/Assets.xcassets/login/app_logo.imageset/Contents.json new file mode 100644 index 0000000..dcc2bef --- /dev/null +++ b/GIGA/Assets.xcassets/login/app_logo.imageset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "app_logo@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/login/app_logo.imageset/app_logo@2x.png b/GIGA/Assets.xcassets/login/app_logo.imageset/app_logo@2x.png new file mode 100644 index 0000000..19d5296 Binary files /dev/null and b/GIGA/Assets.xcassets/login/app_logo.imageset/app_logo@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/Contents.json new file mode 100644 index 0000000..a867299 --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "masktie_clock@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/masktie_clock@2x.png b/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/masktie_clock@2x.png new file mode 100644 index 0000000..d473799 Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/masktie_clock.imageset/masktie_clock@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/result_line.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_line.imageset/Contents.json index 9ae9e9f..edeac80 100644 --- a/GIGA/Assets.xcassets/maskTime/result_line.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_line.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_line@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_logo.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_logo.imageset/Contents.json index 0dee066..02e19c3 100644 --- a/GIGA/Assets.xcassets/maskTime/result_logo.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_logo.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_logo@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_moon.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_moon.imageset/Contents.json index aeef984..ed16b25 100644 --- a/GIGA/Assets.xcassets/maskTime/result_moon.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_moon.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_moon@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_oillider.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_oillider.imageset/Contents.json index 42ed186..8bce4ae 100644 --- a/GIGA/Assets.xcassets/maskTime/result_oillider.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_oillider.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_oillider@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_percent.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_percent.imageset/Contents.json index 514757d..7ca4284 100644 --- a/GIGA/Assets.xcassets/maskTime/result_percent.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_percent.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_percent@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_push.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_push.imageset/Contents.json index 16c14cb..87a09f4 100644 --- a/GIGA/Assets.xcassets/maskTime/result_push.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_push.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_push@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_time.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_time.imageset/Contents.json index c51aa56..7169bf6 100644 --- a/GIGA/Assets.xcassets/maskTime/result_time.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_time.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_time@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_water.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_water.imageset/Contents.json index 53dfc60..85160df 100644 --- a/GIGA/Assets.xcassets/maskTime/result_water.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_water.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_water@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_waterlider.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_waterlider.imageset/Contents.json index b37bf8b..82a1790 100644 --- a/GIGA/Assets.xcassets/maskTime/result_waterlider.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_waterlider.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_waterlider@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_wmz.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_wmz.imageset/Contents.json index f0d53d8..b73139a 100644 --- a/GIGA/Assets.xcassets/maskTime/result_wmz.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_wmz.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_wmz@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_wmzzz.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_wmzzz.imageset/Contents.json index 9955341..77783ec 100644 --- a/GIGA/Assets.xcassets/maskTime/result_wmzzz.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_wmzzz.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_wmzzz@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/result_ylwmz.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/result_ylwmz.imageset/Contents.json index 18c5613..987856f 100644 --- a/GIGA/Assets.xcassets/maskTime/result_ylwmz.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/result_ylwmz.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "result_ylwmz@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/resultback_one.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/resultback_one.imageset/Contents.json index e612747..07d3c0a 100644 --- a/GIGA/Assets.xcassets/maskTime/resultback_one.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/resultback_one.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "resultback_one@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/resultback_three.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/resultback_three.imageset/Contents.json index 08a8cbd..46b77ee 100644 --- a/GIGA/Assets.xcassets/maskTime/resultback_three.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/resultback_three.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "resultback_three@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/resultback_two.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/resultback_two.imageset/Contents.json index aed0781..3f0e593 100644 --- a/GIGA/Assets.xcassets/maskTime/resultback_two.imageset/Contents.json +++ b/GIGA/Assets.xcassets/maskTime/resultback_two.imageset/Contents.json @@ -1,9 +1,17 @@ { "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, { "idiom" : "universal", "filename" : "resultback_two@2x.png", "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/GIGA/Assets.xcassets/maskTime/share_logo.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/share_logo.imageset/Contents.json new file mode 100644 index 0000000..49584dd --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/share_logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "share_logo@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/share_logo.imageset/share_logo@2x.png b/GIGA/Assets.xcassets/maskTime/share_logo.imageset/share_logo@2x.png new file mode 100644 index 0000000..4066b2a Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/share_logo.imageset/share_logo@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/share_one.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/share_one.imageset/Contents.json new file mode 100644 index 0000000..569fca9 --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/share_one.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "share_one@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/share_one.imageset/share_one@2x.png b/GIGA/Assets.xcassets/maskTime/share_one.imageset/share_one@2x.png new file mode 100644 index 0000000..324a5da Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/share_one.imageset/share_one@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/share_two.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/share_two.imageset/Contents.json new file mode 100644 index 0000000..e8ace5c --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/share_two.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "share_two@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/share_two.imageset/share_two@2x.png b/GIGA/Assets.xcassets/maskTime/share_two.imageset/share_two@2x.png new file mode 100644 index 0000000..4ba6cfd Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/share_two.imageset/share_two@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/Contents.json new file mode 100644 index 0000000..a5534be --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sharebg_1@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/sharebg_1@2x.png b/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/sharebg_1@2x.png new file mode 100644 index 0000000..b9e29fb Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/sharebg_1.imageset/sharebg_1@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/Contents.json new file mode 100644 index 0000000..15b634b --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sharebg_2@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/sharebg_2@2x.png b/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/sharebg_2@2x.png new file mode 100644 index 0000000..6ad283b Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/sharebg_2.imageset/sharebg_2@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/Contents.json new file mode 100644 index 0000000..2430e4f --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sharebg_3@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/sharebg_3@2x.png b/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/sharebg_3@2x.png new file mode 100644 index 0000000..0720398 Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/sharebg_3.imageset/sharebg_3@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/Contents.json new file mode 100644 index 0000000..a8060a9 --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sharebg_4@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/sharebg_4@2x.png b/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/sharebg_4@2x.png new file mode 100644 index 0000000..67e9d6e Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/sharebg_4.imageset/sharebg_4@2x.png differ diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/Contents.json b/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/Contents.json new file mode 100644 index 0000000..76d076f --- /dev/null +++ b/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sharebg_5@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/sharebg_5@2x.png b/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/sharebg_5@2x.png new file mode 100644 index 0000000..8773c55 Binary files /dev/null and b/GIGA/Assets.xcassets/maskTime/sharebg_5.imageset/sharebg_5@2x.png differ diff --git a/GIGA/Common/GiGaFileManager/GiGaFileNanager.h b/GIGA/Common/GiGaFileManager/GiGaFileNanager.h index d41418c..3009b1c 100644 --- a/GIGA/Common/GiGaFileManager/GiGaFileNanager.h +++ b/GIGA/Common/GiGaFileManager/GiGaFileNanager.h @@ -16,5 +16,6 @@ -(void)removeItemAtPath:(NSString *)filePath; - (void)saveAdImageWithUrl:(NSString *)imageUrl imageName:(NSString *)imageName success:(void (^)(void))success failure:(void (^)(NSError *err))failure; +-(void)saveImaeToAlBum:(UIImage *)image; @end diff --git a/GIGA/Common/GiGaFileManager/GiGaFileNanager.m b/GIGA/Common/GiGaFileManager/GiGaFileNanager.m index b079a35..5e3988f 100644 --- a/GIGA/Common/GiGaFileManager/GiGaFileNanager.m +++ b/GIGA/Common/GiGaFileManager/GiGaFileNanager.m @@ -64,5 +64,27 @@ } }); } +-(void)saveImaeToAlBum:(UIImage *)image{ + if (image != nil) { + UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); + } +} + +- (void)image: (UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { + + NSString *msg = nil ; + + if(error != NULL){ + + msg = @"保存图片失败" ; + + }else{ + + msg = @"保存图片成功,可到相册查看" ; + + } + [[UIApplication sharedApplication].keyWindow makeToast:msg duration:1.6 position:CSToastPositionCenter]; + +} @end diff --git a/GIGA/Common/GiGaUserDB/GIGaFileManager.h b/GIGA/Common/GiGaUserDB/GIGaUserFileHelper.h similarity index 74% rename from GIGA/Common/GiGaUserDB/GIGaFileManager.h rename to GIGA/Common/GiGaUserDB/GIGaUserFileHelper.h index 0cf42c5..e08e9d3 100644 --- a/GIGA/Common/GiGaUserDB/GIGaFileManager.h +++ b/GIGA/Common/GiGaUserDB/GIGaUserFileHelper.h @@ -1,18 +1,20 @@ // -// GIGaFileManager.h +// GIGaUserFileHelper.h // GIGA // -// Created by lianxiang on 2018/9/18. +// Created by lianxiang on 2018/9/21. // Copyright © 2018年 com.giga.ios. All rights reserved. // #import -@interface GIGaFileManager : NSObject +@interface GIGaUserFileHelper : NSObject + +(void)savaUserAvatorWith:(NSString *)userId image:(UIImage *)image; +(UIImage *)getUserAvatorWith:(NSString *)userId; + (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size; + (UIImage *)thumbnailWithImageWithoutScale:(UIImage *)image size:(CGSize)asize; - + + @end diff --git a/GIGA/Common/GiGaUserDB/GIGaFileManager.m b/GIGA/Common/GiGaUserDB/GIGaUserFileHelper.m similarity index 95% rename from GIGA/Common/GiGaUserDB/GIGaFileManager.m rename to GIGA/Common/GiGaUserDB/GIGaUserFileHelper.m index e064675..0650dbd 100644 --- a/GIGA/Common/GiGaUserDB/GIGaFileManager.m +++ b/GIGA/Common/GiGaUserDB/GIGaUserFileHelper.m @@ -1,16 +1,14 @@ - // -// GIGaFileManager.m +// GIGaUserFileHelper.m // GIGA // -// Created by lianxiang on 2018/9/18. +// Created by lianxiang on 2018/9/21. // Copyright © 2018年 com.giga.ios. All rights reserved. // -#import "GIGaFileManager.h" - -@implementation GIGaFileManager +#import "GIGaUserFileHelper.h" +@implementation GIGaUserFileHelper +(void)savaUserAvatorWith:(NSString *)userId image:(UIImage *)image{ if (!userId) { GILog(@"userID nil !!!"); @@ -83,5 +81,4 @@ return newimage; } - @end diff --git a/GIGA/GIGA.pch b/GIGA/GIGA.pch index 97befa4..e7f218e 100644 --- a/GIGA/GIGA.pch +++ b/GIGA/GIGA.pch @@ -11,15 +11,22 @@ // Include any system framework and library headers here that should be included in all compilation units. // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. -#import "GIGA.h" +#ifdef __OBJC__ #import "AFNetworking.h" #import +#import +#import + +#endif + +#import "GIGA.h" +//#import "AFNetworking.h" +//#import #import "UIView+Toast.h" #import "JXTAlertManagerHeader.h" #import "Masonry.h" #import "GiGaHelper.h" -#import -#import + #import "MobClickList.h" #import "TTTAttributedLabel.h" #import "GiGaUserManager.h" diff --git a/GIGA/Info.plist b/GIGA/Info.plist index af1c123..2312099 100644 --- a/GIGA/Info.plist +++ b/GIGA/Info.plist @@ -2,6 +2,8 @@ + NSPhotoLibraryAddUsageDescription + 保存图片到相册 BuglyAppIDString 8f49773330 CFBundleDevelopmentRegion diff --git a/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.h b/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.h new file mode 100644 index 0000000..9b1cde2 --- /dev/null +++ b/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.h @@ -0,0 +1,13 @@ +// +// GIGaMaskShareViewController.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GiGaBaseViewController.h" + +@interface GIGaMaskShareViewController : GiGaBaseViewController + +@end diff --git a/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.m b/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.m new file mode 100644 index 0000000..efc2ca8 --- /dev/null +++ b/GIGA/Modules/Mask/Controller/GIGaMaskShareViewController.m @@ -0,0 +1,113 @@ +// +// GIGaMaskShareViewController.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GIGaMaskShareViewController.h" +#import "MaskTimeEndViewImgaeCell.h" +#import "MaskTimeTimeViewCell.h" +#import "MaskTimeEndActionViewCell.h" +#import "ShareViewController.h" + +@interface GIGaMaskShareViewController () + +@end + +@implementation GIGaMaskShareViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + [self addNavTitile:@"面膜时间"]; + [self.view addSubview:self.tableView]; + self.tableView.delegate = self; + self.tableView.dataSource = self; + self.tableView.backgroundColor = [UIColor whiteColor]; + self.tableView.separatorStyle = UITableViewCellSelectionStyleNone; + self.tableView.sectionFooterHeight = 0; + self.tableView.estimatedSectionFooterHeight= 0; + self.tableView.estimatedSectionHeaderHeight = 0; + //self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, 30)]; + self.tableView.frame = CGRectMake(0,0,KMainW, self.view.frame.size.height); + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + return 3; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ + return 1; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ + if (indexPath.section == 0) { + MaskTimeEndViewImgaeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskTimeEndViewImgaeCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskTimeEndViewImgaeCell" owner:self options:nil] lastObject]; + + } + return cell; + }else if (indexPath.section == 1){ + MaskTimeTimeViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskTimeTimeViewCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskTimeTimeViewCell" owner:self options:nil] lastObject]; + + } + return cell; + + }else if (indexPath.section == 2){ + MaskTimeEndActionViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskTimeEndActionViewCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskTimeEndActionViewCell" owner:self options:nil] lastObject]; + + } + [cell.changeBackBtn addTarget:self action:@selector(changeBackBtnAction) forControlEvents:UIControlEventTouchUpInside]; + [cell.shareBtn addTarget:self action:@selector(shareBtnAction) forControlEvents:UIControlEventTouchUpInside]; + return cell; + } + + return nil; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ + if (indexPath.section == 0) { + return 285; + }else if (indexPath.section == 1){ + return 205; + } + + return 90; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ + return 0.1; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section + +{ return 0.1; + +} + +#pragma mark changeBackBtnAction +-(void)changeBackBtnAction{ + +} + +#pragma mark share +-(void)shareBtnAction{ + + ShareViewController *share = [[ShareViewController alloc] init]; + [self presentViewController:share animated:NO completion:nil]; + +} + +@end diff --git a/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m b/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m index 02d28d0..daef913 100644 --- a/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m +++ b/GIGA/Modules/Mask/Controller/GiGaMaskTaskViewController.m @@ -32,6 +32,7 @@ #import "GiGaUserManager.h" #import "GiGaBaseAPiRequest.h" #import "MaskTestResultVC.h" +#import "GIGaMaskShareViewController.h" @interface GiGaMaskTaskViewController () @@ -488,18 +489,20 @@ #pragma mark 开始测试 -(void)testBtnAcion:(UIButton *)btn{ - NSDictionary *dic = @{ - @"dryness":@"0.41", - @"drynessPercent":@"41%", - @"mask":@"", - @"minute":@"19", - @"oiliness":@"0.59", - @"oilinessPercent":@"59%" - }; - MaskTestResult *model =[[MaskTestResult alloc] initWithDictionary:dic error:nil]; - MaskTestResultVC *resultVC = [[MaskTestResultVC alloc] init]; - resultVC.model = model; - [self.navigationController pushViewController:resultVC animated:YES]; +// NSDictionary *dic = @{ +// @"dryness":@"0.41", +// @"drynessPercent":@"41%", +// @"mask":@"", +// @"minute":@"19", +// @"oiliness":@"0.59", +// @"oilinessPercent":@"59%" +// }; +// MaskTestResult *model =[[MaskTestResult alloc] initWithDictionary:dic error:nil]; +// MaskTestResultVC *resultVC = [[MaskTestResultVC alloc] init]; +// resultVC.model = model; +// [self.navigationController pushViewController:resultVC animated:YES]; + + [self showAlertGoShareMaskTime]; return; GiGaQuestionVC *questionVC = [[GiGaQuestionVC alloc] init]; @@ -696,4 +699,23 @@ } +#pragma mark 去分享 + +-(void)showAlertGoShareMaskTime{ + + [self jxt_showAlertWithTitle:@"面膜时间" message:@"去分享我的面膜时间" appearanceProcess:^(JXTAlertController * _Nonnull alertMaker) { + alertMaker.addActionCancelTitle(@"下次"); + alertMaker.addActionDefaultTitle(@"去分享"); + } actionsBlock:^(NSInteger buttonIndex, UIAlertAction * _Nonnull action, JXTAlertController * _Nonnull alertSelf) { + + if (buttonIndex == 1) { + + GIGaMaskShareViewController *shareVC = [[GIGaMaskShareViewController alloc] init]; + [self.navigationController pushViewController:shareVC animated:YES];; + + } + }]; +} + + @end diff --git a/GIGA/Modules/Mask/Controller/ShareViewController.h b/GIGA/Modules/Mask/Controller/ShareViewController.h new file mode 100644 index 0000000..55343fc --- /dev/null +++ b/GIGA/Modules/Mask/Controller/ShareViewController.h @@ -0,0 +1,13 @@ +// +// ShareViewController.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GiGaBaseViewController.h" + +@interface ShareViewController : GiGaBaseViewController + +@end diff --git a/GIGA/Modules/Mask/Controller/ShareViewController.m b/GIGA/Modules/Mask/Controller/ShareViewController.m new file mode 100644 index 0000000..21db49f --- /dev/null +++ b/GIGA/Modules/Mask/Controller/ShareViewController.m @@ -0,0 +1,163 @@ +// +// ShareViewController.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "ShareViewController.h" +#import "MaskTimeShareViewCell.h" +#import "MaskShareTimeMidViewCell.h" +#import "MaskShareBoootomViewCell.h" + + +@interface ShareViewController () +@property(nonatomic,strong) UITableView *tab; +@property(nonatomic,strong) UIImageView *backimageview ; +@property(nonatomic) int curentImageIndex ; + + +@end + +@implementation ShareViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + _curentImageIndex = 0; + UIImageView *backimageview = [[UIImageView alloc] init]; + backimageview.frame = CGRectMake(0, 0,self.view.frame.size.width, self.view.frame.size.height); + backimageview.userInteractionEnabled = YES; + backimageview.image = [UIImage imageNamed:@"sharebg_1"]; +// self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"sharebg_1"]]; + self.backimageview = backimageview; + [self.view addSubview:backimageview]; + [self creatTabUI]; + UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + backBtn.frame = CGRectMake(20,44, 40, 40); + [backBtn setImage:[UIImage imageNamed:@"btn_moment_back"] forState:UIControlStateNormal]; + backBtn.backgroundColor = [UIColor redColor]; + [backBtn addTarget:self action:@selector(backBtnAction) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:backBtn]; + [self.view insertSubview:backimageview atIndex:0]; + + [self creatBtns]; + +} + +-(void)creatTabUI{ + self.tab = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; + self.tab.separatorStyle = UITableViewCellSelectionStyleNone; + self.tab.delegate = self; + self.tab.dataSource = self; + self.tab.backgroundColor = [UIColor clearColor]; + [self.view addSubview:self.tab]; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ + return 3; +} +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ + if (indexPath.row == 0) { + MaskTimeShareViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskTimeShareViewCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskTimeShareViewCell" owner:self options:nil] lastObject]; + + } + return cell; + }else if (indexPath.row == 1){ + MaskShareTimeMidViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskShareTimeMidViewCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskShareTimeMidViewCell" owner:self options:nil] lastObject]; + + } + return cell; + } + else if (indexPath.row == 2){ + MaskShareBoootomViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MaskShareBoootomViewCell"]; + if (!cell) { + cell = [[[NSBundle mainBundle] loadNibNamed:@"MaskShareBoootomViewCell" owner:self options:nil] lastObject]; + + } + return cell; + } + + return nil; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ + if (indexPath.row == 0) { + return 295; + }else if (indexPath.row ==1){ + return 205; + } + return 158; +} + +-(void)backBtnAction{ + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +-(void)creatBtns{ + + UIButton *changeBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + changeBtn.backgroundColor = GIGARGB(181, 14, 14, 0.6); + NSAttributedString *titl = [GiGaHelper stringWithText:@"更换背景" textColor:[UIColor whiteColor] textFont:GIGA_TEXTFONTBOLD(18) leterSpace:0]; + [changeBtn setAttributedTitle:titl forState:UIControlStateNormal]; + [changeBtn addTarget:self action:@selector(changeAction) forControlEvents:UIControlEventTouchUpInside]; + changeBtn.layer.masksToBounds = YES; + changeBtn.layer.cornerRadius = 4; + [self.view addSubview:changeBtn]; + [changeBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(120, 40)); + make.bottom.mas_equalTo(self.view.mas_bottom).mas_offset(-45); + make.centerX.mas_equalTo(self.view.mas_centerX).offset(-72); + + }]; + + UIButton *shareBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + shareBtn.backgroundColor = GIGARGB(181, 14, 14, 0.6); + NSAttributedString *titl2 = [GiGaHelper stringWithText:@"分享" textColor:[UIColor whiteColor] textFont:GIGA_TEXTFONTBOLD(18) leterSpace:0]; + [shareBtn setAttributedTitle:titl2 forState:UIControlStateNormal]; + [shareBtn addTarget:self action:@selector(shareBtnAction) forControlEvents:UIControlEventTouchUpInside]; + shareBtn.layer.masksToBounds = YES; + shareBtn.layer.cornerRadius = 4; + + [self.view addSubview:shareBtn]; + [shareBtn mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(120, 40)); + make.bottom.mas_equalTo(self.view.mas_bottom).mas_offset(-45); + make.centerX.mas_equalTo(self.view.mas_centerX).offset(72); + + }]; + +} + +-(void)changeAction{ + + _curentImageIndex ++; + if (_curentImageIndex == 4) { + _curentImageIndex = 0; + } + NSArray *images = @[@"sharebg_2",@"sharebg_3",@"sharebg_4",@"sharebg_5",@"sharebg_1"]; + + [self.backimageview setImage:[UIImage imageNamed: images[_curentImageIndex]]]; + +} + +-(void)shareBtnAction{ + + +} + +@end diff --git a/GIGA/Modules/Mask/Exercises/Controller/MaskTestResultVC.m b/GIGA/Modules/Mask/Exercises/Controller/MaskTestResultVC.m index 4f739d3..783de2e 100644 --- a/GIGA/Modules/Mask/Exercises/Controller/MaskTestResultVC.m +++ b/GIGA/Modules/Mask/Exercises/Controller/MaskTestResultVC.m @@ -10,6 +10,9 @@ #import "MaskResultMinViewCell.h" #import "MaskResultPercentCell.h" #import "MaskResultShareViewCell.h" +#import "SHareTestImageVC.h" +#import "GiGaFileNanager.h" + @interface MaskTestResultVC () @@ -30,7 +33,8 @@ self.tableView.sectionFooterHeight = 0; self.tableView.estimatedSectionFooterHeight= 0; self.tableView.estimatedSectionHeaderHeight = 0; - self.tableView.frame = CGRectMake(0,0, KMainW, self.view.bounds.size.height - SAFE_NAV_HEIGHT); + //self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,self.view.frame.size.width, 30)]; + self.tableView.frame = CGRectMake(0,0,KMainW, self.view.frame.size.height); [self.tableView registerClass:[MaskResultPercentCell class] forCellReuseIdentifier:@"MaskResultPercentCell"]; [self.tableView registerClass:[MaskResultMinViewCell class] forCellReuseIdentifier:@"MaskResultMinViewCell"]; [self.tableView registerClass:[MaskResultShareViewCell class] forCellReuseIdentifier:@"MaskResultShareViewCell"]; @@ -71,7 +75,7 @@ if (!cell) { cell = [[MaskResultShareViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];; } - + [cell.shareBtn addTarget:self action:@selector(shareBtnAciton) forControlEvents:UIControlEventTouchUpInside]; [cell kidTitle:self.model.mask]; return cell; @@ -96,6 +100,42 @@ } +-(void)shareBtnAciton{ + + UIImage *image = [self saveLongImage:self.tableView]; +// SHareTestImageVC *imagevc = [[SHareTestImageVC alloc] init]; +// imagevc.image = image; + //[self.navigationController pushViewController:imagevc animated:YES]; + +} + +- (UIImage *)saveLongImage:(UITableView *)table { + + UIImage* image = nil; + // 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了,调整清晰度。 + + UIGraphicsBeginImageContextWithOptions(table.contentSize, YES, [UIScreen mainScreen].scale); + + CGPoint savedContentOffset = table.contentOffset; + CGRect savedFrame = table.frame; + table.contentOffset = CGPointZero; + table.frame = CGRectMake(0, 0, table.contentSize.width, table.contentSize.height); + + [table.layer renderInContext: UIGraphicsGetCurrentContext()]; + + image = UIGraphicsGetImageFromCurrentImageContext(); + + table.contentOffset = savedContentOffset; + + table.frame = savedFrame; + + UIGraphicsEndImageContext(); + [[GiGaFileNanager shareInstance] saveImaeToAlBum:image]; + + return image; + + +} - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; diff --git a/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.h b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.h new file mode 100644 index 0000000..5a3b85b --- /dev/null +++ b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.h @@ -0,0 +1,14 @@ +// +// SHareTestImageVC.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "GiGaBaseViewController.h" + +@interface SHareTestImageVC : GiGaBaseViewController +@property (nonatomic,strong) UIImage *image ; + +@end diff --git a/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.m b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.m new file mode 100644 index 0000000..9119cd5 --- /dev/null +++ b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.m @@ -0,0 +1,43 @@ +// +// SHareTestImageVC.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "SHareTestImageVC.h" + +@interface SHareTestImageVC () + +@end + +@implementation SHareTestImageVC + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. + UIImageView *ima = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)]; + ima.contentMode = UIViewContentModeScaleAspectFit; + + ima.image = self.image; + [self.view addSubview:ima]; + +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.xib b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.xib new file mode 100644 index 0000000..1d9f256 --- /dev/null +++ b/GIGA/Modules/Mask/Exercises/Controller/SHareTestImageVC.xib @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/Exercises/View/MaskResultViews/MaskResultPercentCell.m b/GIGA/Modules/Mask/Exercises/View/MaskResultViews/MaskResultPercentCell.m index d718a12..907456e 100644 --- a/GIGA/Modules/Mask/Exercises/View/MaskResultViews/MaskResultPercentCell.m +++ b/GIGA/Modules/Mask/Exercises/View/MaskResultViews/MaskResultPercentCell.m @@ -201,7 +201,6 @@ self.displayLink = nil; self.oilLabe.text = model.oilinessPercent; self.waterlabe.text = model.drynessPercent; - }]; diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.h b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.h new file mode 100644 index 0000000..688e1a3 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.h @@ -0,0 +1,15 @@ +// +// MaskShareBoootomViewCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskShareBoootomViewCell : UITableViewCell + +@property (weak, nonatomic) IBOutlet UIImageView *codeImageVIew; + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.m b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.m new file mode 100644 index 0000000..e5a5337 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.m @@ -0,0 +1,30 @@ +// +// MaskShareBoootomViewCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskShareBoootomViewCell.h" +#import "ZXingWrapper.h" + + +@implementation MaskShareBoootomViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.backgroundColor = [UIColor clearColor]; + UIImage *imag = [ZXingWrapper createCodeWithString:@"app_logo" size:CGSizeMake(85, 85) CodeFomart:kBarcodeFormatQRCode]; + self.codeImageVIew.image = imag; + +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.xib b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.xib new file mode 100644 index 0000000..a33c57c --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareBoootomViewCell.xib @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.h b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.h new file mode 100644 index 0000000..3d2d005 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.h @@ -0,0 +1,18 @@ +// +// MaskShareTimeMidViewCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskShareTimeMidViewCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UIView *timeBackVIew; +@property (weak, nonatomic) IBOutlet UIImageView *userIcon; +@property (weak, nonatomic) IBOutlet UILabel *timeLabe; +@property (weak, nonatomic) IBOutlet UILabel *percetLabe; +@property (weak, nonatomic) IBOutlet UILabel *totalLabe; + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.m b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.m new file mode 100644 index 0000000..30d4a17 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.m @@ -0,0 +1,31 @@ +// +// MaskShareTimeMidViewCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskShareTimeMidViewCell.h" + +@implementation MaskShareTimeMidViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.backgroundColor = [UIColor clearColor]; + + self.timeBackVIew.layer.masksToBounds= NO; + self.timeBackVIew.layer.cornerRadius =10; + self.timeBackVIew.layer.shadowOffset = CGSizeMake(2,1); + self.timeBackVIew.layer.shadowColor = GIGARGB(91, 91, 91, 0.6).CGColor; + self.timeBackVIew.layer.shadowOpacity = 0.8; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.xib b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.xib new file mode 100644 index 0000000..7832fd1 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskShareTimeMidViewCell.xib @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.h b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.h new file mode 100644 index 0000000..0b4a10c --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.h @@ -0,0 +1,13 @@ +// +// MaskTimeShareViewCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskTimeShareViewCell : UITableViewCell + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.m b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.m new file mode 100644 index 0000000..3a3d049 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.m @@ -0,0 +1,25 @@ +// +// MaskTimeShareViewCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskTimeShareViewCell.h" + +@implementation MaskTimeShareViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.backgroundColor = [UIColor clearColor]; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.xib b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.xib new file mode 100644 index 0000000..278d6fc --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskSharesViews/MaskTimeShareViewCell.xib @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.h b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.h new file mode 100644 index 0000000..eff976c --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.h @@ -0,0 +1,19 @@ +// +// MaskTimeEndViewImgaeCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskTimeEndViewImgaeCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UIView *holdbackView; +@property (weak, nonatomic) IBOutlet UIView *whiteBackView; +@property (weak, nonatomic) IBOutlet UIImageView *holdImagView; +@property (weak, nonatomic) IBOutlet UILabel *minuteLab; +@property (weak, nonatomic) IBOutlet UILabel *timeLable; +@property (weak, nonatomic) IBOutlet UIView *barholdView; + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.m b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.m new file mode 100644 index 0000000..d0e8463 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.m @@ -0,0 +1,43 @@ +// +// MaskTimeEndViewImgaeCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskTimeEndViewImgaeCell.h" + +@implementation MaskTimeEndViewImgaeCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.holdbackView.layer.masksToBounds = NO; + self.holdbackView.layer.cornerRadius = 10; + self.holdbackView.layer.shadowOffset = CGSizeMake(0, 0); + self.holdbackView.layer.shadowColor = [UIColor blackColor].CGColor; + self.holdbackView.layer.shadowOpacity = 0.6; + + self.whiteBackView.layer.masksToBounds= NO; + self.whiteBackView.layer.cornerRadius = 8; + self.whiteBackView.layer.shadowOffset = CGSizeMake(0, 0); + self.whiteBackView.layer.shadowColor = [UIColor blackColor].CGColor; + self.whiteBackView.layer.shadowOpacity = 0.6; + + self.barholdView.layer.masksToBounds= NO; + self.barholdView.layer.cornerRadius =4; + self.barholdView.layer.shadowOffset = CGSizeMake(0, 0); + self.barholdView.layer.shadowColor = [UIColor blackColor].CGColor; + self.barholdView.layer.shadowOpacity = 0.6; + + [self bringSubviewToFront:self.barholdView]; +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.xib b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.xib new file mode 100644 index 0000000..69ec66e --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeEndViewImgaeCell.xib @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.h b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.h new file mode 100644 index 0000000..35a6be1 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.h @@ -0,0 +1,15 @@ +// +// MaskTimeEndActionViewCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskTimeEndActionViewCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UIButton *changeBackBtn; +@property (weak, nonatomic) IBOutlet UIButton *shareBtn; + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.m b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.m new file mode 100644 index 0000000..1fff8a1 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.m @@ -0,0 +1,29 @@ +// +// MaskTimeEndActionViewCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskTimeEndActionViewCell.h" + +@implementation MaskTimeEndActionViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.changeBackBtn.layer.masksToBounds = YES; + self.changeBackBtn.layer.cornerRadius = 4; + self.shareBtn.layer.masksToBounds = YES; + self.shareBtn.layer.cornerRadius = 4; + +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.xib b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.xib new file mode 100644 index 0000000..60f46c4 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeEndActionViewCell.xib @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.h b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.h new file mode 100644 index 0000000..1d270ed --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.h @@ -0,0 +1,17 @@ +// +// MaskTimeTimeViewCell.h +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import + +@interface MaskTimeTimeViewCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UIView *timeholdBack; +@property (weak, nonatomic) IBOutlet UILabel *timeLabe; +@property (weak, nonatomic) IBOutlet UILabel *percentLabe; +@property (weak, nonatomic) IBOutlet UILabel *totalTime; + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.m b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.m new file mode 100644 index 0000000..e77ae15 --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.m @@ -0,0 +1,31 @@ +// +// MaskTimeTimeViewCell.m +// GIGA +// +// Created by lianxiang on 2018/9/21. +// Copyright © 2018年 com.giga.ios. All rights reserved. +// + +#import "MaskTimeTimeViewCell.h" + +@implementation MaskTimeTimeViewCell + +- (void)awakeFromNib { + [super awakeFromNib]; + // Initialization code + self.timeholdBack.layer.masksToBounds= NO; + self.timeholdBack.layer.cornerRadius =10; + self.timeholdBack.layer.shadowOffset = CGSizeMake(0,0); + self.timeholdBack.layer.shadowColor = GIGARGB(233, 226, 226, 1).CGColor; + self.timeholdBack.layer.shadowOpacity = 1; + //self.timeholdBack.layer.shadowRadius = 6; + +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git a/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.xib b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.xib new file mode 100644 index 0000000..ec5e96c --- /dev/null +++ b/GIGA/Modules/Mask/View/MaskTimeShareCells/MaskTimeTimeViewCell.xib @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GIGA/Modules/Me/Controller/GiGaUserViewController.m b/GIGA/Modules/Me/Controller/GiGaUserViewController.m index 36a052e..694fff3 100644 --- a/GIGA/Modules/Me/Controller/GiGaUserViewController.m +++ b/GIGA/Modules/Me/Controller/GiGaUserViewController.m @@ -19,7 +19,7 @@ #import "GiGaBaseAPiRequest.h" #import "GiGaUserJobViewCell.h" #import -#import "GIGaFileManager.h" +#import "GIGaUserFileHelper.h" #import "GiGaUserDefault.h" #import "GiGaNetManager.h" #import "GiGaServerConfig.h" @@ -470,9 +470,9 @@ ; UIImage*img=[info objectForKey:UIImagePickerControllerEditedImage]; - UIImage *samall = [GIGaFileManager thumbnailWithImageWithoutScale:img size:CGSizeMake(300, 300)]; + UIImage *samall = [GIGaUserFileHelper thumbnailWithImageWithoutScale:img size:CGSizeMake(300, 300)]; NSString *userid = [GiGaUserDefault getCurentUserId]; - [GIGaFileManager savaUserAvatorWith:userid image:samall]; + [GIGaUserFileHelper savaUserAvatorWith:userid image:samall]; GIGaUserInfoAvatorCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; cell.userAvator.image = samall; [self uploadImage:samall]; diff --git a/Podfile b/Podfile index 34c37bf..c499461 100644 --- a/Podfile +++ b/Podfile @@ -26,6 +26,8 @@ target 'GIGA' do pod 'UMCAnalytics' pod 'UMCSecurityPlugins' pod 'Socket.IO-Client-Swift', '~> 13.3.0' + pod 'LBXScan/LBXZXing','~> 2.3' + end diff --git a/Podfile.lock b/Podfile.lock index 1bed932..e4f4295 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -23,6 +23,9 @@ PODS: - JPush (3.1.0): - JCore (~> 1.2.0) - JSONModel (1.7.0) + - LBXScan/LBXZXing (2.3): + - LBXScan/Types (~> 2.2) + - LBXScan/Types (2.3) - LKDBHelper (2.5.1): - LKDBHelper/standard (= 2.5.1) - LKDBHelper/standard (2.5.1): @@ -60,6 +63,7 @@ DEPENDENCIES: - IQKeyboardManager - JPush - JSONModel + - LBXScan/LBXZXing (~> 2.3) - LKDBHelper - Masonry (~> 1.0.0) - MBProgressHUD (~> 0.9.2) @@ -86,6 +90,7 @@ SPEC REPOS: - JCore - JPush - JSONModel + - LBXScan - LKDBHelper - Masonry - MBProgressHUD @@ -112,6 +117,7 @@ SPEC CHECKSUMS: JCore: 467b5b56bd367c548f88ee1b5794d94ee07ab319 JPush: 5921e25ad13e0386351079217b009f2039084eac JSONModel: 840bc0fcffb24b8454d2c026bf26fea454b8e98d + LBXScan: e51449f0832d1fe17da632af0d22adeb3cfa3543 LKDBHelper: 9a276ba51f2e16263d46a9517e16cc9b03472664 Masonry: 7c429b56da9d4ee0bbb3ed77a5ea710d6a5df39e MBProgressHUD: 1569cf7ace17a8bac47aabfbb8580a49690386d1 @@ -130,6 +136,6 @@ SPEC CHECKSUMS: WechatOpenSDK: 676feec516a11173eafd1fe64b10d27babf28701 YTKKeyValueStore: 4d002941540dd5108fa23009b71e0f2f937f7a0f -PODFILE CHECKSUM: 4b1cd3dab10b2ff5d5f5d0c7305d55507309ffdf +PODFILE CHECKSUM: 04731726bf2b2bb62e9d693c6becf4b53e05bcc6 COCOAPODS: 1.5.0 diff --git a/Pods/LBXScan/LBXScan/LBXScanTypes.h b/Pods/LBXScan/LBXScan/LBXScanTypes.h new file mode 100644 index 0000000..32a460f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXScanTypes.h @@ -0,0 +1,37 @@ +// +// +// +// github:https://github.com/MxABC/LBXScan +// Created by lbxia on 15/3/4. +// Copyright (c) 2015年 lbxia. All rights reserved. +// + + +@import UIKit; +@import Foundation; + + + + + +@interface LBXScanResult : NSObject + + +- (instancetype)initWithScanString:(NSString*)str imgScan:(UIImage*)img barCodeType:(NSString*)type; + +/** + @brief 条码字符串 + */ +@property (nonatomic, copy) NSString* strScanned; +/** + @brief 扫码图像 + */ +@property (nonatomic, strong) UIImage* imgScanned; +/** + @brief 扫码码的类型,AVMetadataObjectType 如AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code等 + 如果使用ZXing扫码,返回类型也已经转换成对应的AVMetadataObjectType + */ +@property (nonatomic, copy) NSString* strBarCodeType; + +@end + diff --git a/Pods/LBXScan/LBXScan/LBXScanTypes.m b/Pods/LBXScan/LBXScan/LBXScanTypes.m new file mode 100644 index 0000000..2760fc6 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXScanTypes.m @@ -0,0 +1,21 @@ + + + +#import "LBXScanTypes.h" + +@implementation LBXScanResult + +- (instancetype)initWithScanString:(NSString*)str imgScan:(UIImage*)img barCodeType:(NSString*)type +{ + if (self = [super init]) { + + self.strScanned = str; + self.imgScanned = img; + self.strBarCodeType = type; + } + + return self; +} + +@end + diff --git a/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.h b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.h new file mode 100755 index 0000000..7094660 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.h @@ -0,0 +1,70 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +//#import "ZXResult.h" +#import "LBXZXCaptureDelegate.h" + +@protocol LBXZXCaptureDelegate, ZXReader; +@class ZXDecodeHints; + +@interface LBXZXCapture : NSObject + +@property (nonatomic, assign) int camera; +@property (nonatomic, strong) AVCaptureDevice *captureDevice; +@property (nonatomic, copy) NSString *captureToFilename; +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) AVCaptureFocusMode focusMode; +@property (nonatomic, strong) ZXDecodeHints *hints; +@property (nonatomic, assign) CGImageRef lastScannedImage; +@property (nonatomic, assign) BOOL invert; +@property (nonatomic, strong, readonly) CALayer *layer; +@property (nonatomic, assign) BOOL mirror; +@property (nonatomic, strong, readonly) AVCaptureVideoDataOutput *output; +@property (nonatomic, strong) id reader; +@property (nonatomic, assign) CGFloat rotation; +@property (nonatomic, assign, readonly) BOOL running; +@property (nonatomic, assign) CGRect scanRect; +@property (nonatomic, copy) NSString *sessionPreset; +@property (nonatomic, assign) BOOL torch; +@property (nonatomic, assign) CGAffineTransform transform; + +- (int)back; +- (int)front; +- (BOOL)hasBack; +- (BOOL)hasFront; +- (BOOL)hasTorch; + +- (void)setTorch:(BOOL)torch; + +- (void)changeTorch; + +- (CALayer *)binary; +- (void)setBinary:(BOOL)on_off; + +- (CALayer *)luminance; +- (void)setLuminance:(BOOL)on_off; + +- (void)hard_stop; +- (void)order_skip; +- (void)start; +- (void)stop; + + +//+ (ZXResult *)regocnizeImage:(UIImage*)image; + + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.m b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.m new file mode 100755 index 0000000..d7a9aa5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCapture.m @@ -0,0 +1,620 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "ZXBinaryBitmap.h" +#import "LBXZXCapture.h" +#import "ZXCaptureDelegate.h" +#import "ZXCGImageLuminanceSource.h" +#import "ZXDecodeHints.h" +#import "ZXHybridBinarizer.h" +#import "ZXReader.h" +#import "ZXResult.h" + +@interface LBXZXCapture () + +@property (nonatomic, strong) CALayer *binaryLayer; +@property (nonatomic, assign) BOOL cameraIsReady; +@property (nonatomic, assign) int captureDeviceIndex; +@property (nonatomic, strong) dispatch_queue_t captureQueue; +@property (nonatomic, assign) BOOL hardStop; +@property (nonatomic, strong) AVCaptureDeviceInput *input; +@property (nonatomic, strong) AVCaptureVideoPreviewLayer *layer; +@property (nonatomic, strong) CALayer *luminanceLayer; +@property (nonatomic, assign) int orderInSkip; +@property (nonatomic, assign) int orderOutSkip; +@property (nonatomic, assign) BOOL onScreen; +@property (nonatomic, strong) AVCaptureVideoDataOutput *output; +@property (nonatomic, assign) BOOL running; +@property (nonatomic, strong) AVCaptureSession *session; + +@end + +@implementation LBXZXCapture + +- (LBXZXCapture *)init { + if (self = [super init]) { + _captureDeviceIndex = -1; + _captureQueue = dispatch_queue_create("com.zxing.captureQueue", NULL); + _focusMode = AVCaptureFocusModeContinuousAutoFocus; + _hardStop = NO; + _hints = [ZXDecodeHints hints]; + _lastScannedImage = NULL; + _onScreen = NO; + _orderInSkip = 0; + _orderOutSkip = 0; + + if (NSClassFromString(@"ZXMultiFormatReader")) { + _reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)]; + } + + _rotation = 0.0f; + _running = NO; + _sessionPreset = AVCaptureSessionPresetHigh; + _transform = CGAffineTransformIdentity; + _scanRect = CGRectZero; + } + + return self; +} + +- (void)dealloc { + if (_lastScannedImage) { + CGImageRelease(_lastScannedImage); + } + + if (_session && _session.inputs) { + for(AVCaptureInput *input in _session.inputs) { + [_session removeInput:input]; + } + + [self.layer removeFromSuperlayer]; + } + + if (_session && _session.outputs) { + for(AVCaptureOutput *output in _session.outputs) { + [_session removeOutput:output]; + } + } +} + +#pragma mark - Property Getters + +- (CALayer *)layer { + AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)_layer; + if (!_layer) { + layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; + layer.affineTransform = self.transform; + layer.delegate = self; + layer.videoGravity = AVLayerVideoGravityResizeAspect; + layer.videoGravity = AVLayerVideoGravityResizeAspectFill; + + _layer = layer; + } + return layer; +} + +- (AVCaptureVideoDataOutput *)output { + if (!_output) { + _output = [[AVCaptureVideoDataOutput alloc] init]; + [_output setVideoSettings:@{ + (NSString *)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA] + }]; + [_output setAlwaysDiscardsLateVideoFrames:YES]; + [_output setSampleBufferDelegate:self queue:_captureQueue]; + + [self.session addOutput:_output]; + } + + return _output; +} + +#pragma mark - Property Setters + +- (void)setCamera:(int)camera { + if (_camera != camera) { + _camera = camera; + self.captureDeviceIndex = -1; + self.captureDevice = nil; + [self replaceInput]; + } +} + +- (void)setDelegate:(id)delegate { + _delegate = delegate; + +// if (delegate) { +// self.hardStop = NO; +// } +// [self startStop]; +} + +- (void)setFocusMode:(AVCaptureFocusMode)focusMode { + if ([self.input.device isFocusModeSupported:focusMode] && self.input.device.focusMode != focusMode) { + _focusMode = focusMode; + + [self.input.device lockForConfiguration:nil]; + self.input.device.focusMode = focusMode; + [self.input.device unlockForConfiguration]; + } +} + +- (void)setLastScannedImage:(CGImageRef)lastScannedImage { + if (_lastScannedImage) { + CGImageRelease(_lastScannedImage); + } + + if (lastScannedImage) { + CGImageRetain(lastScannedImage); + } + + _lastScannedImage = lastScannedImage; +} + +- (void)setMirror:(BOOL)mirror { + if (_mirror != mirror) { + _mirror = mirror; + if (self.layer) { + CGAffineTransform transform = self.transform; + transform.a = - transform.a; + self.transform = transform; + [self.layer setAffineTransform:self.transform]; + } + } +} + +- (void)setTorch:(BOOL)torch { + _torch = torch; + + [self.input.device lockForConfiguration:nil]; + self.input.device.torchMode = self.torch ? AVCaptureTorchModeOn : AVCaptureTorchModeOff; + [self.input.device unlockForConfiguration]; +} + +- (void)changeTorch +{ + AVCaptureTorchMode torch = self.input.device.torchMode; + + switch (self.input.device.torchMode) { + case AVCaptureTorchModeAuto: + break; + case AVCaptureTorchModeOff: + torch = AVCaptureTorchModeOn; + break; + case AVCaptureTorchModeOn: + torch = AVCaptureTorchModeOff; + break; + default: + break; + } + + + [self.input.device lockForConfiguration:nil]; + self.input.device.torchMode = torch; + [self.input.device unlockForConfiguration]; +} + + +- (void)setTransform:(CGAffineTransform)transform { + _transform = transform; + [self.layer setAffineTransform:transform]; +} + +#pragma mark - Back, Front, Torch + +- (int)back { + return 1; +} + +- (int)front { + return 0; +} + +- (BOOL)hasFront { + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + return [devices count] > 1; +} + +- (BOOL)hasBack { + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + return [devices count] > 0; +} + +- (BOOL)hasTorch { + if ([self device]) { + return [self device].hasTorch; + } else { + return NO; + } +} + +#pragma mark - Binary + +- (CALayer *)binary { + return self.binaryLayer; +} + +- (void)setBinary:(BOOL)on { + if (on && !self.binaryLayer) { + self.binaryLayer = [CALayer layer]; + } else if (!on && self.binaryLayer) { + self.binaryLayer = nil; + } +} + +#pragma mark - Luminance + +- (CALayer *)luminance { + return self.luminanceLayer; +} + +- (void)setLuminance:(BOOL)on { + if (on && !self.luminanceLayer) { + self.luminanceLayer = [CALayer layer]; + } else if (!on && self.luminanceLayer) { + self.luminanceLayer = nil; + } +} + +#pragma mark - Start, Stop + +- (void)hard_stop { + self.hardStop = YES; + + if (self.running) { + [self stop]; + } +} + +- (void)order_skip { + self.orderInSkip = 1; + self.orderOutSkip = 1; +} + +- (void)start { + + if (self.running) { + return; + } + + if (self.hardStop) { + return; + } + + if (self.delegate || self.luminanceLayer || self.binaryLayer) { + (void)[self output]; + } + + if (!self.session.running) { + static int i = 0; + if (++i == -2) { + abort(); + } + + [self.session startRunning]; + } + self.running = YES; +} + +- (void)stop +{ + if (!self.running) { + return; + } + + if (self.session.running) { + // [self.layer removeFromSuperlayer]; + [self.session stopRunning]; + } + self.running = NO; +} + + + +#pragma mark - CAAction + +- (id)actionForLayer:(CALayer *)_layer forKey:(NSString *)event { + [CATransaction setValue:[NSNumber numberWithFloat:0.0f] forKey:kCATransactionAnimationDuration]; + + if ([event isEqualToString:kCAOnOrderIn] || [event isEqualToString:kCAOnOrderOut]) { + return self; + } + + return nil; +} + +- (void)runActionForKey:(NSString *)key object:(id)anObject arguments:(NSDictionary *)dict { + if ([key isEqualToString:kCAOnOrderIn]) { + if (self.orderInSkip) { + self.orderInSkip--; + return; + } + + self.onScreen = YES; +// [self startStop]; + } else if ([key isEqualToString:kCAOnOrderOut]) { + if (self.orderOutSkip) { + self.orderOutSkip--; + return; + } + + self.onScreen = NO; +// [self startStop]; + } +} + +#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate + +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection { + + + @autoreleasepool { + if (!self.cameraIsReady) { + self.cameraIsReady = YES; + if ([self.delegate respondsToSelector:@selector(captureCameraIsReady:)]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate LBXCaptureCameraIsReady:self]; + }); + } + } + + if (!self.captureToFilename && !self.luminanceLayer && !self.binaryLayer && !self.delegate) { + return; + } + + CVImageBufferRef videoFrame = CMSampleBufferGetImageBuffer(sampleBuffer); + + CGImageRef videoFrameImage = [ZXCGImageLuminanceSource createImageFromBuffer:videoFrame]; + CGImageRef rotatedImage = [self createRotatedImage:videoFrameImage degrees:self.rotation]; + CGImageRelease(videoFrameImage); + + // If scanRect is set, crop the current image to include only the desired rect + if (!CGRectIsEmpty(self.scanRect)) { + CGImageRef croppedImage = CGImageCreateWithImageInRect(rotatedImage, self.scanRect); + CFRelease(rotatedImage); + rotatedImage = croppedImage; + } + + self.lastScannedImage = rotatedImage; + + if (self.captureToFilename) { + NSURL *url = [NSURL fileURLWithPath:self.captureToFilename]; + CGImageDestinationRef dest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil); + CGImageDestinationAddImage(dest, rotatedImage, nil); + CGImageDestinationFinalize(dest); + CFRelease(dest); + self.captureToFilename = nil; + } + + ZXCGImageLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:rotatedImage]; + CGImageRelease(rotatedImage); + + if (self.luminanceLayer) { + CGImageRef image = source.image; + CGImageRetain(image); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ + self.luminanceLayer.contents = (__bridge id)image; + CGImageRelease(image); + }); + } + + + if (self.binaryLayer || self.delegate) + { + ZXHybridBinarizer *binarizer = [[ZXHybridBinarizer alloc] initWithSource:self.invert ? [source invert] : source]; + + if (self.binaryLayer) + { + CGImageRef image = [binarizer createImage]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ + self.binaryLayer.contents = (__bridge id)image; + CGImageRelease(image); + }); + + } + + if (self.delegate) + { + static NSInteger sampleBufferNums = 0; + + sampleBufferNums++; + + if (sampleBufferNums != 2) { + return; + } + + NSLog(@"sampleBufferNums"); + sampleBufferNums = 0; + + ZXBinaryBitmap *bitmap = [[ZXBinaryBitmap alloc] initWithBinarizer:binarizer]; + + NSError *error; + ZXResult *result = [self.reader decode:bitmap hints:self.hints error:&error]; + if (result) { +// CGImageRef iOffscreen = CGBitmapContextCreateImage(context); + UIImage* image = [UIImage imageWithCGImage: _lastScannedImage]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate captureResult:self result:result scanImage:image]; + }); + } + } + } + } +} + +//+ (ZXResult *)regocnizeImage:(UIImage*)image +//{ +// ZXCGImageLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:image.CGImage]; +// +// ZXHybridBinarizer *binarizer = [[ZXHybridBinarizer alloc] initWithSource: source]; +// +// ZXBinaryBitmap *bitmap = [[ZXBinaryBitmap alloc] initWithBinarizer:binarizer]; +// +// NSError *error; +// +// id reader; +// +// if (NSClassFromString(@"ZXMultiFormatReader")) { +// reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)]; +// } +// +// ZXDecodeHints *_hints = [ZXDecodeHints hints]; +// ZXResult *result = [reader decode:bitmap hints:_hints error:&error]; +// +// return result; +//} + + +#pragma mark - Private + +// Adapted from http://blog.coriolis.ch/2009/09/04/arbitrary-rotation-of-a-cgimage/ and https://github.com/JanX2/CreateRotateWriteCGImage +- (CGImageRef)createRotatedImage:(CGImageRef)original degrees:(float)degrees CF_RETURNS_RETAINED { + if (degrees == 0.0f) { + CGImageRetain(original); + return original; + } else { + double radians = degrees * M_PI / 180; + +#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR + radians = -1 * radians; +#endif + + size_t _width = CGImageGetWidth(original); + size_t _height = CGImageGetHeight(original); + + CGRect imgRect = CGRectMake(0, 0, _width, _height); + CGAffineTransform __transform = CGAffineTransformMakeRotation(radians); + CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, __transform); + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, + rotatedRect.size.width, + rotatedRect.size.height, + CGImageGetBitsPerComponent(original), + 0, + colorSpace, + kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst); + CGContextSetAllowsAntialiasing(context, FALSE); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + CGColorSpaceRelease(colorSpace); + + CGContextTranslateCTM(context, + +(rotatedRect.size.width/2), + +(rotatedRect.size.height/2)); + CGContextRotateCTM(context, radians); + + CGContextDrawImage(context, CGRectMake(-imgRect.size.width/2, + -imgRect.size.height/2, + imgRect.size.width, + imgRect.size.height), + original); + + CGImageRef rotatedImage = CGBitmapContextCreateImage(context); + CFRelease(context); + + return rotatedImage; + } +} + +- (AVCaptureDevice *)device { + if (self.captureDevice) { + return self.captureDevice; + } + + AVCaptureDevice *zxd = nil; + + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + + if ([devices count] > 0) { + if (self.captureDeviceIndex == -1) { + AVCaptureDevicePosition position = AVCaptureDevicePositionBack; + if (self.camera == self.front) { + position = AVCaptureDevicePositionFront; + } + + for (unsigned int i = 0; i < [devices count]; ++i) { + AVCaptureDevice *dev = [devices objectAtIndex:i]; + if (dev.position == position) { + self.captureDeviceIndex = i; + zxd = dev; + break; + } + } + } + + if (!zxd && self.captureDeviceIndex != -1) { + zxd = [devices objectAtIndex:self.captureDeviceIndex]; + } + } + + if (!zxd) { + zxd = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + } + + self.captureDevice = zxd; + + return zxd; +} + +- (void)replaceInput { + [self.session beginConfiguration]; + + if (self.session && self.input) { + [self.session removeInput:self.input]; + self.input = nil; + } + + AVCaptureDevice *zxd = [self device]; + + if (zxd) { + self.input = [AVCaptureDeviceInput deviceInputWithDevice:zxd error:nil]; + self.focusMode = self.focusMode; + } + + if (self.input) { + self.session.sessionPreset = self.sessionPreset; + [self.session addInput:self.input]; + } + + [self.session commitConfiguration]; +} + +- (AVCaptureSession *)session { + if (!_session) { + _session = [[AVCaptureSession alloc] init]; + [self replaceInput]; + } + + return _session; +} + +- (void)startStop { + if ((!self.running && (self.delegate || self.onScreen)) || + (!self.output && + (self.delegate || + (self.onScreen && (self.luminanceLayer || self.binaryLayer))))) { + [self start]; + } + + if (self.running && !self.delegate && !self.onScreen) { + [self stop]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCaptureDelegate.h b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCaptureDelegate.h new file mode 100755 index 0000000..db66882 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/LBXZXCaptureDelegate.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class LBXZXCapture; +@class ZXResult; + +@protocol LBXZXCaptureDelegate + +- (void)captureResult:(LBXZXCapture *)capture result:(ZXResult *)result scanImage:(UIImage*)img; + +@optional +- (void)LBXCaptureSize:(LBXZXCapture *)capture + width:(NSNumber *)width + height:(NSNumber *)height; + +- (void)LBXCaptureCameraIsReady:(LBXZXCapture *)capture; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.h new file mode 100644 index 0000000..d5f47ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.h @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXDecodeHints; + +/** + * ZXMultiFormatReader is a convenience class and the main entry point into the library for most uses. + * By default it attempts to decode all barcode formats that the library supports. Optionally, you + * can provide a hints object to request different behavior, for example only decoding QR codes. + */ +@interface ZXMultiFormatReader : NSObject + +@property (nonatomic, strong) ZXDecodeHints *hints; + ++ (id)reader; + +/** + * Decode an image using the state set up by calling setHints() previously. Continuous scan + * clients will get a large speed increase by using this instead of decode(). + * + * @param image The pixel data to decode + * @return The contents of the image or nil if any errors occurred + */ +- (ZXResult *)decodeWithState:(ZXBinaryBitmap *)image error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.m new file mode 100644 index 0000000..c3961aa --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.m @@ -0,0 +1,164 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecReader.h" +#import "ZXBinaryBitmap.h" +#import "ZXDataMatrixReader.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXMaxiCodeReader.h" +#import "ZXMultiFormatOneDReader.h" +#import "ZXMultiFormatReader.h" +#import "ZXPDF417Reader.h" +#import "ZXQRCodeReader.h" +#import "ZXResult.h" + +@interface ZXMultiFormatReader () + +@property (nonatomic, strong, readonly) NSMutableArray *readers; + +@end + +@implementation ZXMultiFormatReader + +- (id)init { + if (self = [super init]) { + _readers = [NSMutableArray array]; + } + + return self; +} + ++ (id)reader { + return [[ZXMultiFormatReader alloc] init]; +} + +/** + * This version of decode honors the intent of Reader.decode(BinaryBitmap) in that it + * passes null as a hint to the decoders. However, that makes it inefficient to call repeatedly. + * Use setHints() followed by decodeWithState() for continuous scan applications. + * + * @param image The pixel data to decode + * @return The contents of the image or nil if any errors occurred + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + self.hints = nil; + return [self decodeInternal:image error:error]; +} + +/** + * Decode an image using the hints provided. Does not honor existing state. + * + * @param image The pixel data to decode + * @param hints The hints to use, clearing the previous state. + * @return The contents of the image or nil if any errors occurred + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + self.hints = hints; + return [self decodeInternal:image error:error]; +} + +- (ZXResult *)decodeWithState:(ZXBinaryBitmap *)image error:(NSError **)error { + if (self.readers == nil) { + self.hints = nil; + } + return [self decodeInternal:image error:error]; +} + +/** + * This method adds state to the MultiFormatReader. By setting the hints once, subsequent calls + * to decodeWithState(image) can reuse the same set of readers without reallocating memory. This + * is important for performance in continuous scan clients. + * + * @param hints The set of hints to use for subsequent calls to decode(image) + */ +- (void)setHints:(ZXDecodeHints *)hints { + _hints = hints; + + BOOL tryHarder = hints != nil && hints.tryHarder; + [self.readers removeAllObjects]; + if (hints != nil) { + BOOL addZXOneDReader = [hints containsFormat:kBarcodeFormatUPCA] || + [hints containsFormat:kBarcodeFormatUPCE] || + [hints containsFormat:kBarcodeFormatEan13] || + [hints containsFormat:kBarcodeFormatEan8] || + [hints containsFormat:kBarcodeFormatCodabar] || + [hints containsFormat:kBarcodeFormatCode39] || + [hints containsFormat:kBarcodeFormatCode93] || + [hints containsFormat:kBarcodeFormatCode128] || + [hints containsFormat:kBarcodeFormatITF] || + [hints containsFormat:kBarcodeFormatRSS14] || + [hints containsFormat:kBarcodeFormatRSSExpanded]; + if (addZXOneDReader && !tryHarder) { + [self.readers addObject:[[ZXMultiFormatOneDReader alloc] initWithHints:hints]]; + } + if ([hints containsFormat:kBarcodeFormatQRCode]) { + [self.readers addObject:[[ZXQRCodeReader alloc] init]]; + } + if ([hints containsFormat:kBarcodeFormatDataMatrix]) { + [self.readers addObject:[[ZXDataMatrixReader alloc] init]]; + } + if ([hints containsFormat:kBarcodeFormatAztec]) { + [self.readers addObject:[[ZXAztecReader alloc] init]]; + } + if ([hints containsFormat:kBarcodeFormatPDF417]) { + [self.readers addObject:[[ZXPDF417Reader alloc] init]]; + } + if ([hints containsFormat:kBarcodeFormatMaxiCode]) { + [self.readers addObject:[[ZXMaxiCodeReader alloc] init]]; + } + if (addZXOneDReader && tryHarder) { + [self.readers addObject:[[ZXMultiFormatOneDReader alloc] initWithHints:hints]]; + } + } + if ([self.readers count] == 0) { + if (!tryHarder) { + [self.readers addObject:[[ZXMultiFormatOneDReader alloc] initWithHints:hints]]; + } + [self.readers addObject:[[ZXQRCodeReader alloc] init]]; + [self.readers addObject:[[ZXDataMatrixReader alloc] init]]; + [self.readers addObject:[[ZXAztecReader alloc] init]]; + [self.readers addObject:[[ZXPDF417Reader alloc] init]]; + [self.readers addObject:[[ZXMaxiCodeReader alloc] init]]; + if (tryHarder) { + [self.readers addObject:[[ZXMultiFormatOneDReader alloc] initWithHints:hints]]; + } + } +} + +- (void)reset { + if (self.readers != nil) { + for (id reader in self.readers) { + [reader reset]; + } + } +} + +- (ZXResult *)decodeInternal:(ZXBinaryBitmap *)image error:(NSError **)error { + if (self.readers != nil) { + for (id reader in self.readers) { + ZXResult *result = [reader decode:image hints:self.hints error:nil]; + if (result) { + return result; + } + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.h new file mode 100644 index 0000000..356d922 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +/** + * This is a factory class which finds the appropriate Writer subclass for the BarcodeFormat + * requested and encodes the barcode with the supplied contents. + */ +@interface ZXMultiFormatWriter : NSObject + ++ (id)writer; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.m new file mode 100644 index 0000000..6a9f056 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.m @@ -0,0 +1,96 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecWriter.h" +#import "ZXBitMatrix.h" +#import "ZXCodaBarWriter.h" +#import "ZXCode39Writer.h" +#import "ZXCode128Writer.h" +#import "ZXDataMatrixWriter.h" +#import "ZXEAN8Writer.h" +#import "ZXEAN13Writer.h" +#import "ZXErrors.h" +#import "ZXITFWriter.h" +#import "ZXMultiFormatWriter.h" +#import "ZXPDF417Writer.h" +#import "ZXQRCodeWriter.h" +#import "ZXUPCAWriter.h" + +@implementation ZXMultiFormatWriter + ++ (id)writer { + return [[ZXMultiFormatWriter alloc] init]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + id writer; + switch (format) { + case kBarcodeFormatEan8: + writer = [[ZXEAN8Writer alloc] init]; + break; + + case kBarcodeFormatEan13: + writer = [[ZXEAN13Writer alloc] init]; + break; + + case kBarcodeFormatUPCA: + writer = [[ZXUPCAWriter alloc] init]; + break; + + case kBarcodeFormatQRCode: + writer = [[ZXQRCodeWriter alloc] init]; + break; + + case kBarcodeFormatCode39: + writer = [[ZXCode39Writer alloc] init]; + break; + + case kBarcodeFormatCode128: + writer = [[ZXCode128Writer alloc] init]; + break; + + case kBarcodeFormatITF: + writer = [[ZXITFWriter alloc] init]; + break; + + case kBarcodeFormatPDF417: + writer = [[ZXPDF417Writer alloc] init]; + break; + + case kBarcodeFormatCodabar: + writer = [[ZXCodaBarWriter alloc] init]; + break; + + case kBarcodeFormatDataMatrix: + writer = [[ZXDataMatrixWriter alloc] init]; + break; + + case kBarcodeFormatAztec: + writer = [[ZXAztecWriter alloc] init]; + break; + + default: + if (error) *error = [NSError errorWithDomain:ZXErrorDomain code:ZXWriterError userInfo:@{NSLocalizedDescriptionKey: @"No encoder available for format"}]; + return nil; + } + return [writer encode:contents format:format width:width height:height hints:hints error:error]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXingObjC.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXingObjC.h new file mode 100644 index 0000000..92c5699 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/ZXingObjC.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef _ZXINGOBJC_ + +#define _ZXINGOBJC_ + +#import "ZXingObjCAztec.h" +#import "ZXingObjCCore.h" +#import "ZXingObjCDataMatrix.h" +#import "ZXingObjCMaxiCode.h" +#import "ZXingObjCOneD.h" +#import "ZXingObjCQRCode.h" +#import "ZXingObjCPDF417.h" + +#import "ZXMultiFormatReader.h" +#import "ZXMultiFormatWriter.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.h new file mode 100644 index 0000000..d938c94 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDetectorResult.h" + +@interface ZXAztecDetectorResult : ZXDetectorResult + +@property (nonatomic, assign, readonly, getter = isCompact) BOOL compact; +@property (nonatomic, assign, readonly) int nbDatablocks; +@property (nonatomic, assign, readonly) int nbLayers; + +- (id)initWithBits:(ZXBitMatrix *)bits + points:(NSArray *)points + compact:(BOOL)compact + nbDatablocks:(int)nbDatablocks + nbLayers:(int)nbLayers; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.m new file mode 100644 index 0000000..9dd270e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.m @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecDetectorResult.h" + +@implementation ZXAztecDetectorResult + +- (id)initWithBits:(ZXBitMatrix *)bits + points:(NSArray *)points + compact:(BOOL)compact + nbDatablocks:(int)nbDatablocks + nbLayers:(int)nbLayers { + if (self = [super initWithBits:bits points:points]) { + _compact = compact; + _nbDatablocks = nbDatablocks; + _nbLayers = nbLayers; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.h new file mode 100644 index 0000000..55a95d2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXBinaryBitmap, ZXDecodeHints, ZXResult; + +/** + * This implementation can detect and decode Aztec codes in an image. + */ +@interface ZXAztecReader : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.m new file mode 100644 index 0000000..adf8fd2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.m @@ -0,0 +1,89 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecDecoder.h" +#import "ZXAztecDetector.h" +#import "ZXAztecDetectorResult.h" +#import "ZXAztecReader.h" +#import "ZXBinaryBitmap.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXReader.h" +#import "ZXResult.h" +#import "ZXResultPointCallback.h" + +@implementation ZXAztecReader + +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + + ZXAztecDetector *detector = [[ZXAztecDetector alloc] initWithImage:matrix]; + NSArray *points = nil; + ZXDecoderResult *decoderResult = nil; + + ZXAztecDetectorResult *detectorResult = [detector detectWithMirror:NO error:error]; + if (detectorResult) { + points = detectorResult.points; + decoderResult = [[[ZXAztecDecoder alloc] init] decode:detectorResult error:error]; + } + + if (decoderResult == nil) { + detectorResult = [detector detectWithMirror:YES error:nil]; + points = detectorResult.points; + if (detectorResult) { + decoderResult = [[[ZXAztecDecoder alloc] init] decode:detectorResult error:nil]; + } + } + + if (!decoderResult) { + return nil; + } + + if (hints != nil) { + id rpcb = hints.resultPointCallback; + if (rpcb != nil) { + for (ZXResultPoint *p in points) { + [rpcb foundPossibleResultPoint:p]; + } + } + } + + ZXResult *result = [ZXResult resultWithText:decoderResult.text rawBytes:decoderResult.rawBytes resultPoints:points format:kBarcodeFormatAztec]; + + NSMutableArray *byteSegments = decoderResult.byteSegments; + if (byteSegments != nil) { + [result putMetadata:kResultMetadataTypeByteSegments value:byteSegments]; + } + NSString *ecLevel = decoderResult.ecLevel; + if (ecLevel != nil) { + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:ecLevel]; + } + + return result; +} + +- (void)reset { + // do nothing +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.h new file mode 100644 index 0000000..cd032e2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +@interface ZXAztecWriter : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.m new file mode 100644 index 0000000..f2d7327 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.m @@ -0,0 +1,89 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecCode.h" +#import "ZXAztecEncoder.h" +#import "ZXAztecWriter.h" +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXEncodeHints.h" + +const NSStringEncoding ZX_AZTEC_DEFAULT_ENCODING = NSISOLatin1StringEncoding; + +@implementation ZXAztecWriter + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + NSStringEncoding encoding = hints.encoding; + NSNumber *eccPercent = hints.errorCorrectionPercent; + NSNumber *layers = hints.aztecLayers; + + return [self encode:contents + format:format + width:width + height:height + encoding:encoding == 0 ? ZX_AZTEC_DEFAULT_ENCODING : encoding + eccPercent:eccPercent == nil ? ZX_AZTEC_DEFAULT_EC_PERCENT : [eccPercent intValue] + layers:layers == nil ? ZX_AZTEC_DEFAULT_LAYERS : [layers intValue]]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width + height:(int)height encoding:(NSStringEncoding)encoding eccPercent:(int)eccPercent layers:(int)layers { + if (format != kBarcodeFormatAztec) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Can only encode kBarcodeFormatAztec (%d), but got %d", kBarcodeFormatAztec, format] + userInfo:nil]; + } + + NSData *data = [contents dataUsingEncoding:encoding]; + ZXByteArray *bytes = [[ZXByteArray alloc] initWithLength:(unsigned int)[data length]]; + memcpy(bytes.array, [data bytes], bytes.length * sizeof(int8_t)); + ZXAztecCode *aztec = [ZXAztecEncoder encode:bytes minECCPercent:eccPercent userSpecifiedLayers:layers]; + return [self renderResult:aztec width:width height:height]; +} + +- (ZXBitMatrix *)renderResult:(ZXAztecCode *)aztec width:(int)width height:(int)height { + ZXBitMatrix *input = aztec.matrix; + if (!input) { + return nil; + } + + int inputWidth = input.width; + int inputHeight = input.height; + int outputWidth = MAX(width, inputWidth); + int outputHeight = MAX(height, inputHeight); + + int multiple = MIN(outputWidth / inputWidth, outputHeight / inputHeight); + int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; + int topPadding = (outputHeight - (inputHeight * multiple)) / 2; + + ZXBitMatrix *output = [[ZXBitMatrix alloc] initWithWidth:outputWidth height:outputHeight]; + + for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { + // Write the contents of this row of the barcode + for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { + if ([input getX:inputX y:inputY]) { + [output setRegionAtLeft:outputX top:outputY width:multiple height:multiple]; + } + } + } + return output; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXingObjCAztec.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXingObjCAztec.h new file mode 100644 index 0000000..14edb28 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/ZXingObjCAztec.h @@ -0,0 +1,32 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXingObjCCore.h" + +#ifndef _ZXINGOBJC_AZTEC_ + +#define _ZXINGOBJC_AZTEC_ + +#import "ZXAztecCode.h" +#import "ZXAztecDecoder.h" +#import "ZXAztecDetector.h" +#import "ZXAztecDetectorResult.h" +#import "ZXAztecEncoder.h" +#import "ZXAztecHighLevelEncoder.h" +#import "ZXAztecReader.h" +#import "ZXAztecWriter.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.h new file mode 100644 index 0000000..491f1c9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXAztecDetectorResult, ZXBoolArray, ZXDecoderResult; + +/** + * The main class which implements Aztec Code decoding -- as opposed to locating and extracting + * the Aztec Code from an image. + */ +@interface ZXAztecDecoder : NSObject + +- (ZXDecoderResult *)decode:(ZXAztecDetectorResult *)detectorResult error:(NSError **)error; + +// This method is used for testing the high-level encoder ++ (NSString *)highLevelDecode:(ZXBoolArray *)correctedBits; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.m new file mode 100644 index 0000000..f38a6a6 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.m @@ -0,0 +1,351 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecDecoder.h" +#import "ZXAztecDetectorResult.h" +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXReedSolomonDecoder.h" + +typedef enum { + ZXAztecTableUpper = 0, + ZXAztecTableLower, + ZXAztecTableMixed, + ZXAztecTableDigit, + ZXAztecTablePunct, + ZXAztecTableBinary +} ZXAztecTable; + +static NSString *ZX_AZTEC_UPPER_TABLE[] = { + @"CTRL_PS", @" ", @"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", + @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", @"CTRL_LL", @"CTRL_ML", @"CTRL_DL", @"CTRL_BS" +}; + +static NSString *ZX_AZTEC_LOWER_TABLE[] = { + @"CTRL_PS", @" ", @"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j", @"k", @"l", @"m", @"n", @"o", @"p", + @"q", @"r", @"s", @"t", @"u", @"v", @"w", @"x", @"y", @"z", @"CTRL_US", @"CTRL_ML", @"CTRL_DL", @"CTRL_BS" +}; + +static NSString *ZX_AZTEC_MIXED_TABLE[] = { + @"CTRL_PS", @" ", @"\1", @"\2", @"\3", @"\4", @"\5", @"\6", @"\7", @"\b", @"\t", @"\n", + @"\13", @"\f", @"\r", @"\33", @"\34", @"\35", @"\36", @"\37", @"@", @"\\", @"^", @"_", + @"`", @"|", @"~", @"\177", @"CTRL_LL", @"CTRL_UL", @"CTRL_PL", @"CTRL_BS" +}; + +static NSString *ZX_AZTEC_PUNCT_TABLE[] = { + @"", @"\r", @"\r\n", @". ", @", ", @": ", @"!", @"\"", @"#", @"$", @"%", @"&", @"'", @"(", @")", + @"*", @"+", @",", @"-", @".", @"/", @":", @";", @"<", @"=", @">", @"?", @"[", @"]", @"{", @"}", @"CTRL_UL" +}; + +static NSString *ZX_AZTEC_DIGIT_TABLE[] = { + @"CTRL_PS", @" ", @"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @",", @".", @"CTRL_UL", @"CTRL_US" +}; + +@interface ZXAztecDecoder () + +@property (nonatomic, strong) ZXAztecDetectorResult *ddata; + +@end + +@implementation ZXAztecDecoder + +- (ZXDecoderResult *)decode:(ZXAztecDetectorResult *)detectorResult error:(NSError **)error { + self.ddata = detectorResult; + ZXBitMatrix *matrix = [detectorResult bits]; + ZXBoolArray *rawbits = [self extractBits:matrix]; + if (!rawbits) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + ZXBoolArray *correctedBits = [self correctBits:rawbits error:error]; + if (!correctedBits) { + return nil; + } + + NSString *result = [[self class] encodedData:correctedBits]; + return [[ZXDecoderResult alloc] initWithRawBytes:nil text:result byteSegments:nil ecLevel:nil]; +} + ++ (NSString *)highLevelDecode:(ZXBoolArray *)correctedBits { + return [self encodedData:correctedBits]; +} + +/** + * Gets the string encoded in the aztec code bits + * + * @return the decoded string + */ ++ (NSString *)encodedData:(ZXBoolArray *)correctedBits { + int endIndex = (int)correctedBits.length; + ZXAztecTable latchTable = ZXAztecTableUpper; // table most recently latched to + ZXAztecTable shiftTable = ZXAztecTableUpper; // table to use for the next read + NSMutableString *result = [NSMutableString stringWithCapacity:20]; + int index = 0; + while (index < endIndex) { + if (shiftTable == ZXAztecTableBinary) { + if (endIndex - index < 5) { + break; + } + int length = [self readCode:correctedBits startIndex:index length:5]; + index += 5; + if (length == 0) { + if (endIndex - index < 11) { + break; + } + + length = [self readCode:correctedBits startIndex:index length:11] + 31; + index += 11; + } + for (int charCount = 0; charCount < length; charCount++) { + if (endIndex - index < 8) { + index = endIndex; // Force outer loop to exit + break; + } + + int code = [self readCode:correctedBits startIndex:index length:8]; + [result appendFormat:@"%C", (unichar)code]; + index += 8; + } + // Go back to whatever mode we had been in + shiftTable = latchTable; + } else { + int size = shiftTable == ZXAztecTableDigit ? 4 : 5; + if (endIndex - index < size) { + break; + } + int code = [self readCode:correctedBits startIndex:index length:size]; + index += size; + NSString *str = [self character:shiftTable code:code]; + if ([str hasPrefix:@"CTRL_"]) { + // Table changes + shiftTable = [self table:[str characterAtIndex:5]]; + if ([str characterAtIndex:6] == 'L') { + latchTable = shiftTable; + } + } else { + [result appendString:str]; + // Go back to whatever mode we had been in + shiftTable = latchTable; + } + } + } + return [NSString stringWithString:result]; +} + +/** + * gets the table corresponding to the char passed + */ ++ (ZXAztecTable)table:(unichar)t { + switch (t) { + case 'L': + return ZXAztecTableLower; + case 'P': + return ZXAztecTablePunct; + case 'M': + return ZXAztecTableMixed; + case 'D': + return ZXAztecTableDigit; + case 'B': + return ZXAztecTableBinary; + case 'U': + default: + return ZXAztecTableUpper; + } +} + +/** + * Gets the character (or string) corresponding to the passed code in the given table + * + * @param table the table used + * @param code the code of the character + */ ++ (NSString *)character:(ZXAztecTable)table code:(int)code { + switch (table) { + case ZXAztecTableUpper: + return ZX_AZTEC_UPPER_TABLE[code]; + case ZXAztecTableLower: + return ZX_AZTEC_LOWER_TABLE[code]; + case ZXAztecTableMixed: + return ZX_AZTEC_MIXED_TABLE[code]; + case ZXAztecTablePunct: + return ZX_AZTEC_PUNCT_TABLE[code]; + case ZXAztecTableDigit: + return ZX_AZTEC_DIGIT_TABLE[code]; + default: + // Should not reach here. + @throw [NSException exceptionWithName:@"IllegalStateException" reason:@"Bad table" userInfo:nil]; + } +} + +/** + *

Performs RS error correction on an array of bits.

+ * + * @return the number of corrected bits, or 0 if the input contains too many errors + */ +- (ZXBoolArray *)correctBits:(ZXBoolArray *)rawbits error:(NSError **)error { + ZXGenericGF *gf; + int codewordSize; + + if ([self.ddata nbLayers] <= 2) { + codewordSize = 6; + gf = [ZXGenericGF AztecData6]; + } else if ([self.ddata nbLayers] <= 8) { + codewordSize = 8; + gf = [ZXGenericGF AztecData8]; + } else if ([self.ddata nbLayers] <= 22) { + codewordSize = 10; + gf = [ZXGenericGF AztecData10]; + } else { + codewordSize = 12; + gf = [ZXGenericGF AztecData12]; + } + + int numDataCodewords = [self.ddata nbDatablocks]; + int numCodewords = rawbits.length / codewordSize; + if (numCodewords < numDataCodewords) { + if (error) *error = ZXFormatErrorInstance(); + return 0; + } + int offset = rawbits.length % codewordSize; + int numECCodewords = numCodewords - numDataCodewords; + + ZXIntArray *dataWords = [[ZXIntArray alloc] initWithLength:numCodewords]; + for (int i = 0; i < numCodewords; i++, offset += codewordSize) { + dataWords.array[i] = [[self class] readCode:rawbits startIndex:offset length:codewordSize]; + } + + ZXReedSolomonDecoder *rsDecoder = [[ZXReedSolomonDecoder alloc] initWithField:gf]; + NSError *decodeError = nil; + if (![rsDecoder decode:dataWords twoS:numECCodewords error:&decodeError]) { + if (decodeError.code == ZXReedSolomonError) { + if (error) *error = ZXFormatErrorInstance(); + } else { + if (error) *error = decodeError; + } + return 0; + } + + // Now perform the unstuffing operation. + // First, count how many bits are going to be thrown out as stuffing + int mask = (1 << codewordSize) - 1; + int stuffedBits = 0; + for (int i = 0; i < numDataCodewords; i++) { + int32_t dataWord = dataWords.array[i]; + if (dataWord == 0 || dataWord == mask) { + if (error) *error = ZXFormatErrorInstance(); + return 0; + } else if (dataWord == 1 || dataWord == mask - 1) { + stuffedBits++; + } + } + + // Now, actually unpack the bits and remove the stuffing + ZXBoolArray *correctedBits = [[ZXBoolArray alloc] initWithLength:numDataCodewords * codewordSize - stuffedBits]; + int index = 0; + for (int i = 0; i < numDataCodewords; i++) { + int dataWord = dataWords.array[i]; + if (dataWord == 1 || dataWord == mask - 1) { + // next codewordSize-1 bits are all zeros or all ones + memset(correctedBits.array + index * sizeof(BOOL), dataWord > 1, codewordSize - 1); + index += codewordSize - 1; + } else { + for (int bit = codewordSize - 1; bit >= 0; --bit) { + correctedBits.array[index++] = (dataWord & (1 << bit)) != 0; + } + } + } + return correctedBits; +} + +/** + * Gets the array of bits from an Aztec Code matrix + * + * @return the size of the array of bits + */ +- (ZXBoolArray *)extractBits:(ZXBitMatrix *)matrix { + BOOL compact = self.ddata.isCompact; + int layers = self.ddata.nbLayers; + int baseMatrixSize = compact ? 11 + layers * 4 : 14 + layers * 4; // not including alignment lines + ZXIntArray *alignmentMap = [[ZXIntArray alloc] initWithLength:baseMatrixSize]; + ZXBoolArray *rawbits = [[ZXBoolArray alloc] initWithLength:[self totalBitsInLayer:layers compact:compact]]; + + if (compact) { + for (int i = 0; i < alignmentMap.length; i++) { + alignmentMap.array[i] = i; + } + } else { + int matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); + int origCenter = baseMatrixSize / 2; + int center = matrixSize / 2; + for (int i = 0; i < origCenter; i++) { + int newOffset = i + i / 15; + alignmentMap.array[origCenter - i - 1] = (int32_t)(center - newOffset - 1); + alignmentMap.array[origCenter + i] = (int32_t)(center + newOffset + 1); + } + } + for (int i = 0, rowOffset = 0; i < layers; i++) { + int rowSize = compact ? (layers - i) * 4 + 9 : (layers - i) * 4 + 12; + // The top-left most point of this layer is (not including alignment lines) + int low = i * 2; + // The bottom-right most point of this layer is (not including alignment lines) + int high = baseMatrixSize - 1 - low; + // We pull bits from the two 2 x rowSize columns and two rowSize x 2 rows + for (int j = 0; j < rowSize; j++) { + int columnOffset = j * 2; + for (int k = 0; k < 2; k++) { + // left column + rawbits.array[rowOffset + columnOffset + k] = + [matrix getX:alignmentMap.array[low + k] y:alignmentMap.array[low + j]]; + // bottom row + rawbits.array[rowOffset + 2 * rowSize + columnOffset + k] = + [matrix getX:alignmentMap.array[low + j] y:alignmentMap.array[high - k]]; + // right column + rawbits.array[rowOffset + 4 * rowSize + columnOffset + k] = + [matrix getX:alignmentMap.array[high - k] y:alignmentMap.array[high - j]]; + // top row + rawbits.array[rowOffset + 6 * rowSize + columnOffset + k] = + [matrix getX:alignmentMap.array[high - j] y:alignmentMap.array[low + k]]; + } + } + rowOffset += rowSize * 8; + } + return rawbits; +} + +/** + * Reads a code of given length and at given index in an array of bits + */ ++ (int)readCode:(ZXBoolArray *)rawbits startIndex:(int)startIndex length:(int)length { + int res = 0; + for (int i = startIndex; i < startIndex + length; i++) { + res <<= 1; + if (rawbits.array[i]) { + res |= 0x01; + } + } + return res; +} + +- (int)totalBitsInLayer:(int)layers compact:(BOOL)compact { + return ((compact ? 88 : 112) + 16 * layers) * layers; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.h new file mode 100644 index 0000000..31aad24 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXAztecPoint : NSObject + +@property (nonatomic, assign, readonly) int x; +@property (nonatomic, assign, readonly) int y; + +- (id)initWithX:(int)x y:(int)y; + +@end + +@class ZXAztecDetectorResult, ZXBitMatrix; + +/** + * Encapsulates logic that can detect an Aztec Code in an image, even if the Aztec Code + * is rotated or skewed, or partially obscured. + */ +@interface ZXAztecDetector : NSObject + +- (id)initWithImage:(ZXBitMatrix *)image; + +- (ZXAztecDetectorResult *)detectWithError:(NSError **)error; + +/** + * Detects an Aztec Code in an image. + * + * @return ZXAztecDetectorResult encapsulating results of detecting an Aztec Code, or nil if no Aztec Code can be found + */ +- (ZXAztecDetectorResult *)detectWithMirror:(BOOL)isMirror error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.m new file mode 100644 index 0000000..30c13fd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.m @@ -0,0 +1,619 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecDetector.h" +#import "ZXAztecDetectorResult.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXGridSampler.h" +#import "ZXIntArray.h" +#import "ZXMathUtils.h" +#import "ZXReedSolomonDecoder.h" +#import "ZXResultPoint.h" +#import "ZXWhiteRectangleDetector.h" + +@implementation ZXAztecPoint + +- (id)initWithX:(int)x y:(int)y { + if (self = [super init]) { + _x = x; + _y = y; + } + return self; +} + +- (ZXResultPoint *)toResultPoint { + return [[ZXResultPoint alloc] initWithX:self.x y:self.y]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%d %d>", self.x, self.y]; +} + +@end + +@interface ZXAztecDetector () + +@property (nonatomic, assign, getter = isCompact) BOOL compact; +@property (nonatomic, strong) ZXBitMatrix *image; +@property (nonatomic, assign) int nbCenterLayers; +@property (nonatomic, assign) int nbDataBlocks; +@property (nonatomic, assign) int nbLayers; +@property (nonatomic, assign) int shift; + +@end + +@implementation ZXAztecDetector + +- (id)initWithImage:(ZXBitMatrix *)image { + if (self = [super init]) { + _image = image; + } + return self; +} + +- (ZXAztecDetectorResult *)detectWithError:(NSError **)error { + return [self detectWithMirror:NO error:error]; +} + +- (ZXAztecDetectorResult *)detectWithMirror:(BOOL)isMirror error:(NSError **)error { + // 1. Get the center of the aztec matrix + ZXAztecPoint *pCenter = [self matrixCenter]; + if (!pCenter) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // 2. Get the center points of the four diagonal points just outside the bull's eye + // [topRight, bottomRight, bottomLeft, topLeft] + NSMutableArray *bullsEyeCorners = [self bullsEyeCorners:pCenter]; + if (!bullsEyeCorners) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if (isMirror) { + ZXResultPoint *temp = bullsEyeCorners[0]; + bullsEyeCorners[0] = bullsEyeCorners[2]; + bullsEyeCorners[2] = temp; + } + + // 3. Get the size of the matrix and other parameters from the bull's eye + if (![self extractParameters:bullsEyeCorners]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // 4. Sample the grid + ZXBitMatrix *bits = [self sampleGrid:self.image + topLeft:bullsEyeCorners[self.shift % 4] + topRight:bullsEyeCorners[(self.shift + 1) % 4] + bottomRight:bullsEyeCorners[(self.shift + 2) % 4] + bottomLeft:bullsEyeCorners[(self.shift + 3) % 4]]; + if (!bits) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // 5. Get the corners of the matrix. + NSArray *corners = [self matrixCornerPoints:bullsEyeCorners]; + if (!corners) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + return [[ZXAztecDetectorResult alloc] initWithBits:bits + points:corners + compact:self.compact + nbDatablocks:self.nbDataBlocks + nbLayers:self.nbLayers]; +} + + +/** + * Extracts the number of data layers and data blocks from the layer around the bull's eye + */ +- (BOOL)extractParameters:(NSArray *)bullsEyeCorners { + ZXResultPoint *p0 = bullsEyeCorners[0]; + ZXResultPoint *p1 = bullsEyeCorners[1]; + ZXResultPoint *p2 = bullsEyeCorners[2]; + ZXResultPoint *p3 = bullsEyeCorners[3]; + + if (![self isValid:p0] || ![self isValid:p1] || + ![self isValid:p2] || ![self isValid:p3]) { + return NO; + } + int length = 2 * self.nbCenterLayers; + // Get the bits around the bull's eye + int sides[] = { + [self sampleLine:p0 p2:p1 size:length], // Right side + [self sampleLine:p1 p2:p2 size:length], // Bottom + [self sampleLine:p2 p2:p3 size:length], // Left side + [self sampleLine:p3 p2:p0 size:length] // Top + }; + + // bullsEyeCorners[shift] is the corner of the bulls'eye that has three + // orientation marks. + // sides[shift] is the row/column that goes from the corner with three + // orientation marks to the corner with two. + int shift = [self rotationForSides:sides length:length]; + if (shift == -1) { + return NO; + } + self.shift = shift; + + // Flatten the parameter bits into a single 28- or 40-bit long + long parameterData = 0; + for (int i = 0; i < 4; i++) { + int side = sides[(self.shift + i) % 4]; + if (self.isCompact) { + // Each side of the form ..XXXXXXX. where Xs are parameter data + parameterData <<= 7; + parameterData += (side >> 1) & 0x7F; + } else { + // Each side of the form ..XXXXX.XXXXX. where Xs are parameter data + parameterData <<= 10; + parameterData += ((side >> 2) & (0x1f << 5)) + ((side >> 1) & 0x1F); + } + } + + // Corrects parameter data using RS. Returns just the data portion + // without the error correction. + int correctedData = [self correctedParameterData:parameterData compact:self.isCompact]; + if (correctedData == -1) { + return NO; + } + + if (self.isCompact) { + // 8 bits: 2 bits layers and 6 bits data blocks + self.nbLayers = (correctedData >> 6) + 1; + self.nbDataBlocks = (correctedData & 0x3F) + 1; + } else { + // 16 bits: 5 bits layers and 11 bits data blocks + self.nbLayers = (correctedData >> 11) + 1; + self.nbDataBlocks = (correctedData & 0x7FF) + 1; + } + + return YES; +} + +int expectedCornerBits[] = { + 0xee0, // 07340 XXX .XX X.. ... + 0x1dc, // 00734 ... XXX .XX X.. + 0x83b, // 04073 X.. ... XXX .XX + 0x707, // 03407 .XX X.. ... XXX +}; + +int bitCount(uint32_t i) { + i = i - ((i >> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >> 2) & 0x33333333); + return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; +} + +- (int)rotationForSides:(const int[])sides length:(int)length { + // In a normal pattern, we expect to See + // ** .* D A + // * * + // + // . * + // .. .. C B + // + // Grab the 3 bits from each of the sides the form the locator pattern and concatenate + // into a 12-bit integer. Start with the bit at A + int cornerBits = 0; + for (int i = 0; i < 4; i++) { + int side = sides[i]; + // XX......X where X's are orientation marks + int t = ((side >> (length - 2)) << 1) + (side & 1); + cornerBits = (cornerBits << 3) + t; + } + // Mov the bottom bit to the top, so that the three bits of the locator pattern at A are + // together. cornerBits is now: + // 3 orientation bits at A || 3 orientation bits at B || ... || 3 orientation bits at D + cornerBits = ((cornerBits & 1) << 11) + (cornerBits >> 1); + // The result shift indicates which element of BullsEyeCorners[] goes into the top-left + // corner. Since the four rotation values have a Hamming distance of 8, we + // can easily tolerate two errors. + for (int shift = 0; shift < 4; shift++) { + if (bitCount(cornerBits ^ expectedCornerBits[shift]) <= 2) { + return shift; + } + } + return -1; +} + +/** + * Corrects the parameter bits using Reed-Solomon algorithm. + * + * @param parameterData parameter bits + * @param compact true if this is a compact Aztec code + * @return -1 if the array contains too many errors + */ +- (int)correctedParameterData:(long)parameterData compact:(BOOL)compact { + int numCodewords; + int numDataCodewords; + + if (compact) { + numCodewords = 7; + numDataCodewords = 2; + } else { + numCodewords = 10; + numDataCodewords = 4; + } + + int numECCodewords = numCodewords - numDataCodewords; + ZXIntArray *parameterWords = [[ZXIntArray alloc] initWithLength:numCodewords]; + for (int i = numCodewords - 1; i >= 0; --i) { + parameterWords.array[i] = (int32_t) parameterData & 0xF; + parameterData >>= 4; + } + + ZXReedSolomonDecoder *rsDecoder = [[ZXReedSolomonDecoder alloc] initWithField:[ZXGenericGF AztecParam]]; + if (![rsDecoder decode:parameterWords twoS:numECCodewords error:nil]) { + return NO; + } + // Toss the error correction. Just return the data as an integer + int result = 0; + for (int i = 0; i < numDataCodewords; i++) { + result = (result << 4) + parameterWords.array[i]; + } + return result; +} + +/** + * Finds the corners of a bull-eye centered on the passed point. + * This returns the centers of the diagonal points just outside the bull's eye + * Returns [topRight, bottomRight, bottomLeft, topLeft] + * + * @param pCenter Center point + * @return The corners of the bull-eye, or nil if no valid bull-eye can be found + */ +- (NSMutableArray *)bullsEyeCorners:(ZXAztecPoint *)pCenter { + ZXAztecPoint *pina = pCenter; + ZXAztecPoint *pinb = pCenter; + ZXAztecPoint *pinc = pCenter; + ZXAztecPoint *pind = pCenter; + + BOOL color = YES; + + for (self.nbCenterLayers = 1; self.nbCenterLayers < 9; self.nbCenterLayers++) { + ZXAztecPoint *pouta = [self firstDifferent:pina color:color dx:1 dy:-1]; + ZXAztecPoint *poutb = [self firstDifferent:pinb color:color dx:1 dy:1]; + ZXAztecPoint *poutc = [self firstDifferent:pinc color:color dx:-1 dy:1]; + ZXAztecPoint *poutd = [self firstDifferent:pind color:color dx:-1 dy:-1]; + + //d a + // + //c b + + if (self.nbCenterLayers > 2) { + float q = [self distance:poutd b:pouta] * self.nbCenterLayers / ([self distance:pind b:pina] * (self.nbCenterLayers + 2)); + if (q < 0.75 || q > 1.25 || ![self isWhiteOrBlackRectangle:pouta p2:poutb p3:poutc p4:poutd]) { + break; + } + } + + pina = pouta; + pinb = poutb; + pinc = poutc; + pind = poutd; + + color = !color; + } + + if (self.nbCenterLayers != 5 && self.nbCenterLayers != 7) { + return nil; + } + + self.compact = self.nbCenterLayers == 5; + + // Expand the square by .5 pixel in each direction so that we're on the border + // between the white square and the black square + ZXResultPoint *pinax = [[ZXResultPoint alloc] initWithX:pina.x + 0.5f y:pina.y - 0.5f]; + ZXResultPoint *pinbx = [[ZXResultPoint alloc] initWithX:pinb.x + 0.5f y:pinb.y + 0.5f]; + ZXResultPoint *pincx = [[ZXResultPoint alloc] initWithX:pinc.x - 0.5f y:pinc.y + 0.5f]; + ZXResultPoint *pindx = [[ZXResultPoint alloc] initWithX:pind.x - 0.5f y:pind.y - 0.5f]; + + // Expand the square so that its corners are the centers of the points + // just outside the bull's eye. + return [[self expandSquare:@[pinax, pinbx, pincx, pindx] + oldSide:2 * self.nbCenterLayers - 3 + newSide:2 * self.nbCenterLayers] mutableCopy]; +} + +/** + * Finds a candidate center point of an Aztec code from an image + */ +- (ZXAztecPoint *)matrixCenter { + ZXResultPoint *pointA; + ZXResultPoint *pointB; + ZXResultPoint *pointC; + ZXResultPoint *pointD; + + ZXWhiteRectangleDetector *detector = [[ZXWhiteRectangleDetector alloc] initWithImage:self.image error:nil]; + NSArray *cornerPoints = [detector detectWithError:nil]; + + if (cornerPoints) { + pointA = cornerPoints[0]; + pointB = cornerPoints[1]; + pointC = cornerPoints[2]; + pointD = cornerPoints[3]; + } else { + // This exception can be in case the initial rectangle is white + // In that case, surely in the bull's eye, we try to expand the rectangle. + int cx = self.image.width / 2; + int cy = self.image.height / 2; + pointA = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx + 7 y:cy - 7] color:NO dx:1 dy:-1] toResultPoint]; + pointB = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx + 7 y:cy + 7] color:NO dx:1 dy:1] toResultPoint]; + pointC = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx - 7 y:cy + 7] color:NO dx:-1 dy:1] toResultPoint]; + pointD = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx - 7 y:cy - 7] color:NO dx:-1 dy:-1] toResultPoint]; + } + + //Compute the center of the rectangle + int cx = [ZXMathUtils round:([pointA x] + [pointD x] + [pointB x] + [pointC x]) / 4.0f]; + int cy = [ZXMathUtils round:([pointA y] + [pointD y] + [pointB y] + [pointC y]) / 4.0f]; + + // Redetermine the white rectangle starting from previously computed center. + // This will ensure that we end up with a white rectangle in center bull's eye + // in order to compute a more accurate center. + detector = [[ZXWhiteRectangleDetector alloc] initWithImage:self.image initSize:15 x:cx y:cy error:nil]; + cornerPoints = [detector detectWithError:nil]; + + if (cornerPoints) { + pointA = cornerPoints[0]; + pointB = cornerPoints[1]; + pointC = cornerPoints[2]; + pointD = cornerPoints[3]; + } else { + // This exception can be in case the initial rectangle is white + // In that case we try to expand the rectangle. + pointA = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx + 7 y:cy - 7] color:NO dx:1 dy:-1] toResultPoint]; + pointB = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx + 7 y:cy + 7] color:NO dx:1 dy:1] toResultPoint]; + pointC = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx - 7 y:cy + 7] color:NO dx:-1 dy:1] toResultPoint]; + pointD = [[self firstDifferent:[[ZXAztecPoint alloc] initWithX:cx - 7 y:cy - 7] color:NO dx:-1 dy:-1] toResultPoint]; + } + + cx = [ZXMathUtils round:([pointA x] + [pointD x] + [pointB x] + [pointC x]) / 4]; + cy = [ZXMathUtils round:([pointA y] + [pointD y] + [pointB y] + [pointC y]) / 4]; + + // Recompute the center of the rectangle + return [[ZXAztecPoint alloc] initWithX:cx y:cy]; +} + +/** + * Gets the Aztec code corners from the bull's eye corners and the parameters. + * + * @param bullsEyeCorners the array of bull's eye corners + * @return the array of aztec code corners, or nil if the corner points do not fit in the image + */ +- (NSArray *)matrixCornerPoints:(NSArray *)bullsEyeCorners { + return [self expandSquare:bullsEyeCorners oldSide:2 * self.nbCenterLayers newSide:[self dimension]]; +} + +/** + * Creates a BitMatrix by sampling the provided image. + * topLeft, topRight, bottomRight, and bottomLeft are the centers of the squares on the + * diagonal just outside the bull's eye. + */ +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)anImage + topLeft:(ZXResultPoint *)topLeft + topRight:(ZXResultPoint *)topRight + bottomRight:(ZXResultPoint *)bottomRight + bottomLeft:(ZXResultPoint *)bottomLeft { + ZXGridSampler *sampler = [ZXGridSampler instance]; + int dimension = [self dimension]; + + float low = dimension / 2.0f - self.nbCenterLayers; + float high = dimension / 2.0f + self.nbCenterLayers; + + return [sampler sampleGrid:anImage + dimensionX:dimension + dimensionY:dimension + p1ToX:low p1ToY:low // topleft + p2ToX:high p2ToY:low // topright + p3ToX:high p3ToY:high // bottomright + p4ToX:low p4ToY:high // bottomleft + p1FromX:topLeft.x p1FromY:topLeft.y + p2FromX:topRight.x p2FromY:topRight.y + p3FromX:bottomRight.x p3FromY:bottomRight.y + p4FromX:bottomLeft.x p4FromY:bottomLeft.y + error:nil]; +} + +/** + * Samples a line. + * + * @param p1 start point (inclusive) + * @param p2 end point (exclusive) + * @param size number of bits + * @return the array of bits as an int (first bit is high-order bit of result) + */ +- (int)sampleLine:(ZXResultPoint *)p1 p2:(ZXResultPoint *)p2 size:(int)size { + int result = 0; + + float d = [self resultDistance:p1 b:p2]; + float moduleSize = d / size; + float px = p1.x; + float py = p1.y; + float dx = moduleSize * (p2.x - p1.x) / d; + float dy = moduleSize * (p2.y - p1.y) / d; + for (int i = 0; i < size; i++) { + if ([self.image getX:[ZXMathUtils round:px + i * dx] y:[ZXMathUtils round:py + i * dy]]) { + result |= 1 << (size - i - 1); + } + } + + return result; +} + +/** + * @return true if the border of the rectangle passed in parameter is compound of white points only + * or black points only + */ +- (BOOL)isWhiteOrBlackRectangle:(ZXAztecPoint *)p1 p2:(ZXAztecPoint *)p2 p3:(ZXAztecPoint *)p3 p4:(ZXAztecPoint *)p4 { + int corr = 3; + + p1 = [[ZXAztecPoint alloc] initWithX:p1.x - corr y:p1.y + corr]; + p2 = [[ZXAztecPoint alloc] initWithX:p2.x - corr y:p2.y - corr]; + p3 = [[ZXAztecPoint alloc] initWithX:p3.x + corr y:p3.y - corr]; + p4 = [[ZXAztecPoint alloc] initWithX:p4.x + corr y:p4.y + corr]; + + int cInit = [self color:p4 p2:p1]; + + if (cInit == 0) { + return NO; + } + + int c = [self color:p1 p2:p2]; + + if (c != cInit) { + return NO; + } + + c = [self color:p2 p2:p3]; + + if (c != cInit) { + return NO; + } + + c = [self color:p3 p2:p4]; + + return c == cInit; +} + +/** + * Gets the color of a segment + * + * @return 1 if segment more than 90% black, -1 if segment is more than 90% white, 0 else + */ +- (int)color:(ZXAztecPoint *)p1 p2:(ZXAztecPoint *)p2 { + float d = [self distance:p1 b:p2]; + float dx = (p2.x - p1.x) / d; + float dy = (p2.y - p1.y) / d; + int error = 0; + + float px = p1.x; + float py = p1.y; + + BOOL colorModel = [self.image getX:p1.x y:p1.y]; + + for (int i = 0; i < d; i++) { + px += dx; + py += dy; + if ([self.image getX:[ZXMathUtils round:px] y:[ZXMathUtils round:py]] != colorModel) { + error++; + } + } + + float errRatio = (float)error / d; + + if (errRatio > 0.1f && errRatio < 0.9f) { + return 0; + } + + return (errRatio <= 0.1f) == colorModel ? 1 : -1; +} + +/** + * Gets the coordinate of the first point with a different color in the given direction + */ +- (ZXAztecPoint *)firstDifferent:(ZXAztecPoint *)init color:(BOOL)color dx:(int)dx dy:(int)dy { + int x = init.x + dx; + int y = init.y + dy; + + while ([self isValidX:x y:y] && [self.image getX:x y:y] == color) { + x += dx; + y += dy; + } + + x -= dx; + y -= dy; + + while ([self isValidX:x y:y] && [self.image getX:x y:y] == color) { + x += dx; + } + x -= dx; + + while ([self isValidX:x y:y] && [self.image getX:x y:y] == color) { + y += dy; + } + y -= dy; + + return [[ZXAztecPoint alloc] initWithX:x y:y]; +} + +/** + * Expand the square represented by the corner points by pushing out equally in all directions + * + * @param cornerPoints the corners of the square, which has the bull's eye at its center + * @param oldSide the original length of the side of the square in the target bit matrix + * @param newSide the new length of the size of the square in the target bit matrix + * @return the corners of the expanded square + */ +- (NSArray *)expandSquare:(NSArray *)cornerPoints oldSide:(float)oldSide newSide:(float)newSide { + ZXResultPoint *cornerPoints0 = (ZXResultPoint *)cornerPoints[0]; + ZXResultPoint *cornerPoints1 = (ZXResultPoint *)cornerPoints[1]; + ZXResultPoint *cornerPoints2 = (ZXResultPoint *)cornerPoints[2]; + ZXResultPoint *cornerPoints3 = (ZXResultPoint *)cornerPoints[3]; + + float ratio = newSide / (2 * oldSide); + float dx = cornerPoints0.x - cornerPoints2.x; + float dy = cornerPoints0.y - cornerPoints2.y; + float centerx = (cornerPoints0.x + cornerPoints2.x) / 2.0f; + float centery = (cornerPoints0.y + cornerPoints2.y) / 2.0f; + + ZXResultPoint *result0 = [[ZXResultPoint alloc] initWithX:centerx + ratio * dx y:centery + ratio * dy]; + ZXResultPoint *result2 = [[ZXResultPoint alloc] initWithX:centerx - ratio * dx y:centery - ratio * dy]; + + dx = cornerPoints1.x - cornerPoints3.x; + dy = cornerPoints1.y - cornerPoints3.y; + centerx = (cornerPoints1.x + cornerPoints3.x) / 2.0f; + centery = (cornerPoints1.y + cornerPoints3.y) / 2.0f; + ZXResultPoint *result1 = [[ZXResultPoint alloc] initWithX:centerx + ratio * dx y:centery + ratio * dy]; + ZXResultPoint *result3 = [[ZXResultPoint alloc] initWithX:centerx - ratio * dx y:centery - ratio * dy]; + + return @[result0, result1, result2, result3]; +} + +- (BOOL)isValidX:(int)x y:(int)y { + return x >= 0 && x < self.image.width && y > 0 && y < self.image.height; +} + +- (BOOL)isValid:(ZXResultPoint *)point { + int x = [ZXMathUtils round:point.x]; + int y = [ZXMathUtils round:point.y]; + return [self isValidX:x y:y]; +} + +- (float)distance:(ZXAztecPoint *)a b:(ZXAztecPoint *)b { + return [ZXMathUtils distance:a.x aY:a.y bX:b.x bY:b.y]; +} + +- (float)resultDistance:(ZXResultPoint *)a b:(ZXResultPoint *)b { + return [ZXMathUtils distance:a.x aY:a.y bX:b.x bY:b.y]; +} + +- (int)dimension { + if (self.compact) { + return 4 * self.nbLayers + 11; + } + if (self.nbLayers <= 4) { + return 4 * self.nbLayers + 15; + } + return 4 * self.nbLayers + 2 * ((self.nbLayers-4)/8 + 1) + 15; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.h new file mode 100644 index 0000000..9bf4095 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.h @@ -0,0 +1,23 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecToken.h" + +@interface ZXAztecBinaryShiftToken : ZXAztecToken + +- (id)initWithPrevious:(ZXAztecToken *)previous binaryShiftStart:(int)binaryShiftStart binaryShiftByteCount:(int)binaryShiftByteCount; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.m new file mode 100644 index 0000000..2ca14ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.m @@ -0,0 +1,59 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecBinaryShiftToken.h" +#import "ZXBitArray.h" +#import "ZXByteArray.h" + +@interface ZXAztecBinaryShiftToken () + +@property (nonatomic, assign, readonly) int16_t binaryShiftStart; +@property (nonatomic, assign, readonly) int16_t binaryShiftByteCount; + +@end + +@implementation ZXAztecBinaryShiftToken + +- (id)initWithPrevious:(ZXAztecToken *)previous binaryShiftStart:(int)binaryShiftStart binaryShiftByteCount:(int)binaryShiftByteCount { + if (self = [super initWithPrevious:previous]) { + _binaryShiftStart = (int16_t) binaryShiftStart; + _binaryShiftByteCount = (int16_t) binaryShiftByteCount; + } + + return self; +} + +- (void)appendTo:(ZXBitArray *)bitArray text:(ZXByteArray *)text { + for (int i = 0; i < self.binaryShiftByteCount; i++) { + if (i == 0 || (i == 31 && self.binaryShiftByteCount <= 62)) { + // We need a header before the first character, and before + // character 31 when the total byte code is <= 62 + [bitArray appendBits:31 numBits:5]; // BINARY_SHIFT + if (self.binaryShiftByteCount > 62) { + [bitArray appendBits:self.binaryShiftByteCount - 31 numBits:16]; + } else if (i == 0) { + // 1 <= binaryShiftByteCode <= 62 + [bitArray appendBits:MIN(self.binaryShiftByteCount, 31) numBits:5]; + } else { + // 32 <= binaryShiftCount <= 62 and i == 31 + [bitArray appendBits:self.binaryShiftByteCount - 31 numBits:5]; + } + } + [bitArray appendBits:text.array[self.binaryShiftStart + i] numBits:8]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.h new file mode 100644 index 0000000..41a086e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.h @@ -0,0 +1,49 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix; + +/** + * Aztec 2D code representation + */ +@interface ZXAztecCode : NSObject + +/** + * Number of data codewords + */ +@property (nonatomic, assign) int codeWords; + +/** + * Compact or full symbol indicator + */ +@property (nonatomic, assign, getter = isCompact) BOOL compact; + +/** + * Number of levels + */ +@property (nonatomic, assign) int layers; + +/** + * The symbol image + */ +@property (nonatomic, strong) ZXBitMatrix *matrix; + +/** + * Size in pixels (width and height) + */ +@property (nonatomic, assign) int size; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.m new file mode 100644 index 0000000..c7054d5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.m @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecCode.h" + +@implementation ZXAztecCode + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.h new file mode 100644 index 0000000..549ffdd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.h @@ -0,0 +1,48 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern const int ZX_AZTEC_DEFAULT_EC_PERCENT; +extern const int ZX_AZTEC_DEFAULT_LAYERS; + +@class ZXAztecCode, ZXBitArray, ZXByteArray, ZXGenericGF; + +/** + * Generates Aztec 2D barcodes. + */ +@interface ZXAztecEncoder : NSObject + +/** + * Encodes the given binary content as an Aztec symbol + * + * @param data input data string + * @return Aztec symbol matrix with metadata + */ ++ (ZXAztecCode *)encode:(ZXByteArray *)data; + +/** + * Encodes the given binary content as an Aztec symbol + * + * @param data input data string + * @param minECCPercent minimal percentage of error check words (According to ISO/IEC 24778:2008, + * a minimum of 23% + 3 words is recommended) + * @param userSpecifiedLayers if non-zero, a user-specified value for the number of layers + * @return Aztec symbol matrix with metadata + */ ++ (ZXAztecCode *)encode:(ZXByteArray *)data + minECCPercent:(int)minECCPercent + userSpecifiedLayers:(int)userSpecifiedLayers; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.m new file mode 100644 index 0000000..ef0c0e9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.m @@ -0,0 +1,335 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecCode.h" +#import "ZXAztecEncoder.h" +#import "ZXAztecHighLevelEncoder.h" +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXReedSolomonEncoder.h" + +const int ZX_AZTEC_DEFAULT_EC_PERCENT = 33; // default minimal percentage of error check words +const int ZX_AZTEC_DEFAULT_LAYERS = 0; +const int ZX_AZTEC_MAX_NB_BITS = 32; +const int ZX_AZTEC_MAX_NB_BITS_COMPACT = 4; + +const int ZX_AZTEC_WORD_SIZE[] = { + 4, 6, 6, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12 +}; + +@implementation ZXAztecEncoder + ++ (ZXAztecCode *)encode:(ZXByteArray *)data { + return [self encode:data minECCPercent:ZX_AZTEC_DEFAULT_EC_PERCENT userSpecifiedLayers:ZX_AZTEC_DEFAULT_LAYERS]; +} + ++ (ZXAztecCode *)encode:(ZXByteArray *)data minECCPercent:(int)minECCPercent userSpecifiedLayers:(int)userSpecifiedLayers { + // High-level encode + ZXBitArray *bits = [[[ZXAztecHighLevelEncoder alloc] initWithText:data] encode]; + + // stuff bits and choose symbol size + int eccBits = bits.size * minECCPercent / 100 + 11; + int totalSizeBits = bits.size + eccBits; + BOOL compact; + int layers; + int totalBitsInLayer; + int wordSize = ZX_AZTEC_WORD_SIZE[0]; + ZXBitArray *stuffedBits; + if (userSpecifiedLayers != ZX_AZTEC_DEFAULT_LAYERS) { + compact = userSpecifiedLayers < 0; + layers = abs(userSpecifiedLayers); + if (layers > (compact ? ZX_AZTEC_MAX_NB_BITS_COMPACT : ZX_AZTEC_MAX_NB_BITS)) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:[NSString stringWithFormat:@"Illegal value %d for layers", userSpecifiedLayers] + userInfo:nil]; + } + totalBitsInLayer = [self totalBitsInLayer:layers compact:compact]; + wordSize = ZX_AZTEC_WORD_SIZE[layers]; + int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); + stuffedBits = [self stuffBits:bits wordSize:wordSize]; + if (stuffedBits.size + eccBits > usableBitsInLayers) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"Data too large for user specified layer" + userInfo:nil]; + } + if (compact && stuffedBits.size > wordSize * 64) { + // Compact format only allows 64 data words, though C4 can hold more words than that + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"Data too large for user specified layer" + userInfo:nil]; + } + } else { + // We look at the possible table sizes in the order Compact1, Compact2, Compact3, + // Compact4, Normal4,... Normal(i) for i < 4 isn't typically used since Compact(i+1) + // is the same size, but has more data. + for (int i = 0; ; i++) { + if (i > ZX_AZTEC_MAX_NB_BITS) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"Data too large for an Aztec code" + userInfo:nil]; + } + compact = i <= 3; + layers = compact ? i + 1 : i; + totalBitsInLayer = [self totalBitsInLayer:layers compact:compact]; + if (totalSizeBits > totalBitsInLayer) { + continue; + } + // [Re]stuff the bits if this is the first opportunity, or if the + // wordSize has changed + if (wordSize != ZX_AZTEC_WORD_SIZE[layers]) { + wordSize = ZX_AZTEC_WORD_SIZE[layers]; + stuffedBits = [self stuffBits:bits wordSize:wordSize]; + } + int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize); + if (compact && stuffedBits.size > wordSize * 64) { + // Compact format only allows 64 data words, though C4 can hold more words than that + continue; + } + if (stuffedBits.size + eccBits <= usableBitsInLayers) { + break; + } + } + } + ZXBitArray *messageBits = [self generateCheckWords:stuffedBits totalBits:totalBitsInLayer wordSize:wordSize]; + + // generate check words + int messageSizeInWords = stuffedBits.size / wordSize; + ZXBitArray *modeMessage = [self generateModeMessageCompact:compact layers:layers messageSizeInWords:messageSizeInWords]; + + // allocate symbol + int baseMatrixSize = compact ? 11 + layers * 4 : 14 + layers * 4; // not including alignment lines + int alignmentMap[baseMatrixSize]; + memset(alignmentMap, 0, baseMatrixSize * sizeof(int)); + int matrixSize; + if (compact) { + // no alignment marks in compact mode, alignmentMap is a no-op + matrixSize = baseMatrixSize; + for (int i = 0; i < baseMatrixSize; i++) { + alignmentMap[i] = i; + } + } else { + matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15); + int origCenter = baseMatrixSize / 2; + int center = matrixSize / 2; + for (int i = 0; i < origCenter; i++) { + int newOffset = i + i / 15; + alignmentMap[origCenter - i - 1] = center - newOffset - 1; + alignmentMap[origCenter + i] = center + newOffset + 1; + } + } + ZXBitMatrix *matrix = [[ZXBitMatrix alloc] initWithDimension:matrixSize]; + + // draw data bits + for (int i = 0, rowOffset = 0; i < layers; i++) { + int rowSize = compact ? (layers - i) * 4 + 9 : (layers - i) * 4 + 12; + for (int j = 0; j < rowSize; j++) { + int columnOffset = j * 2; + for (int k = 0; k < 2; k++) { + if ([messageBits get:rowOffset + columnOffset + k]) { + [matrix setX:alignmentMap[i * 2 + k] y:alignmentMap[i * 2 + j]]; + } + if ([messageBits get:rowOffset + rowSize * 2 + columnOffset + k]) { + [matrix setX:alignmentMap[i * 2 + j] y:alignmentMap[baseMatrixSize - 1 - i * 2 - k]]; + } + if ([messageBits get:rowOffset + rowSize * 4 + columnOffset + k]) { + [matrix setX:alignmentMap[baseMatrixSize - 1 - i * 2 - k] y:alignmentMap[baseMatrixSize - 1 - i * 2 - j]]; + } + if ([messageBits get:rowOffset + rowSize * 6 + columnOffset + k]) { + [matrix setX:alignmentMap[baseMatrixSize - 1 - i * 2 - j] y:alignmentMap[i * 2 + k]]; + } + } + } + rowOffset += rowSize * 8; + } + + // draw mode message + [self drawModeMessage:matrix compact:compact matrixSize:matrixSize modeMessage:modeMessage]; + + // draw alignment marks + if (compact) { + [self drawBullsEye:matrix center:matrixSize / 2 size:5]; + } else { + [self drawBullsEye:matrix center:matrixSize / 2 size:7]; + for (int i = 0, j = 0; i < baseMatrixSize / 2 - 1; i += 15, j += 16) { + for (int k = (matrixSize / 2) & 1; k < matrixSize; k += 2) { + [matrix setX:matrixSize / 2 - j y:k]; + [matrix setX:matrixSize / 2 + j y:k]; + [matrix setX:k y:matrixSize / 2 - j]; + [matrix setX:k y:matrixSize / 2 + j]; + } + } + } + + ZXAztecCode *aztec = [[ZXAztecCode alloc] init]; + aztec.compact = compact; + aztec.size = matrixSize; + aztec.layers = layers; + aztec.codeWords = messageSizeInWords; + aztec.matrix = matrix; + return aztec; +} + ++ (void)drawBullsEye:(ZXBitMatrix *)matrix center:(int)center size:(int)size { + for (int i = 0; i < size; i += 2) { + for (int j = center - i; j <= center + i; j++) { + [matrix setX:j y:center - i]; + [matrix setX:j y:center + i]; + [matrix setX:center - i y:j]; + [matrix setX:center + i y:j]; + } + } + [matrix setX:center - size y:center - size]; + [matrix setX:center - size + 1 y:center - size]; + [matrix setX:center - size y:center - size + 1]; + [matrix setX:center + size y:center - size]; + [matrix setX:center + size y:center - size + 1]; + [matrix setX:center + size y:center + size - 1]; +} + ++ (ZXBitArray *)generateModeMessageCompact:(BOOL)compact layers:(int)layers messageSizeInWords:(int)messageSizeInWords { + ZXBitArray *modeMessage = [[ZXBitArray alloc] init]; + if (compact) { + [modeMessage appendBits:layers - 1 numBits:2]; + [modeMessage appendBits:messageSizeInWords - 1 numBits:6]; + modeMessage = [self generateCheckWords:modeMessage totalBits:28 wordSize:4]; + } else { + [modeMessage appendBits:layers - 1 numBits:5]; + [modeMessage appendBits:messageSizeInWords - 1 numBits:11]; + modeMessage = [self generateCheckWords:modeMessage totalBits:40 wordSize:4]; + } + return modeMessage; +} + ++ (void)drawModeMessage:(ZXBitMatrix *)matrix compact:(BOOL)compact matrixSize:(int)matrixSize modeMessage:(ZXBitArray *)modeMessage { + int center = matrixSize / 2; + if (compact) { + for (int i = 0; i < 7; i++) { + int offset = center - 3 + i; + if ([modeMessage get:i]) { + [matrix setX:offset y:center - 5]; + } + if ([modeMessage get:i + 7]) { + [matrix setX:center + 5 y:offset]; + } + if ([modeMessage get:20 - i]) { + [matrix setX:offset y:center + 5]; + } + if ([modeMessage get:27 - i]) { + [matrix setX:center - 5 y:offset]; + } + } + } else { + for (int i = 0; i < 10; i++) { + int offset = center - 5 + i + i / 5; + if ([modeMessage get:i]) { + [matrix setX:offset y:center - 7]; + } + if ([modeMessage get:i + 10]) { + [matrix setX:center + 7 y:offset]; + } + if ([modeMessage get:29 - i]) { + [matrix setX:offset y:center + 7]; + } + if ([modeMessage get:39 - i]) { + [matrix setX:center - 7 y:offset]; + } + } + } +} + ++ (ZXBitArray *)generateCheckWords:(ZXBitArray *)bitArray totalBits:(int)totalBits wordSize:(int)wordSize { + // bitArray is guaranteed to be a multiple of the wordSize, so no padding needed + int messageSizeInWords = bitArray.size / wordSize; + ZXReedSolomonEncoder *rs = [[ZXReedSolomonEncoder alloc] initWithField:[self getGF:wordSize]]; + int totalWords = totalBits / wordSize; + + ZXIntArray *messageWords = [self bitsToWords:bitArray wordSize:wordSize totalWords:totalWords]; + [rs encode:messageWords ecBytes:totalWords - messageSizeInWords]; + int startPad = totalBits % wordSize; + ZXBitArray *messageBits = [[ZXBitArray alloc] init]; + [messageBits appendBits:0 numBits:startPad]; + for (int i = 0; i < totalWords; i++) { + [messageBits appendBits:messageWords.array[i] numBits:wordSize]; + } + return messageBits; +} + ++ (ZXIntArray *)bitsToWords:(ZXBitArray *)stuffedBits wordSize:(int)wordSize totalWords:(int)totalWords { + ZXIntArray *message = [[ZXIntArray alloc] initWithLength:totalWords]; + int i; + int n; + for (i = 0, n = stuffedBits.size / wordSize; i < n; i++) { + int32_t value = 0; + for (int j = 0; j < wordSize; j++) { + value |= [stuffedBits get:i * wordSize + j] ? (1 << (wordSize - j - 1)) : 0; + } + message.array[i] = value; + } + return message; +} + ++ (ZXGenericGF *)getGF:(int)wordSize { + switch (wordSize) { + case 4: + return [ZXGenericGF AztecParam]; + case 6: + return [ZXGenericGF AztecData6]; + case 8: + return [ZXGenericGF AztecData8]; + case 10: + return [ZXGenericGF AztecData10]; + case 12: + return [ZXGenericGF AztecData12]; + default: + return nil; + } +} + ++ (ZXBitArray *)stuffBits:(ZXBitArray *)bits wordSize:(int)wordSize { + ZXBitArray *arrayOut = [[ZXBitArray alloc] init]; + + int n = bits.size; + int mask = (1 << wordSize) - 2; + for (int i = 0; i < n; i += wordSize) { + int word = 0; + for (int j = 0; j < wordSize; j++) { + if (i + j >= n || [bits get:i + j]) { + word |= 1 << (wordSize - 1 - j); + } + } + if ((word & mask) == mask) { + [arrayOut appendBits:word & mask numBits:wordSize]; + i--; + } else if ((word & mask) == 0) { + [arrayOut appendBits:word | 1 numBits:wordSize]; + i--; + } else { + [arrayOut appendBits:word numBits:wordSize]; + } + } + + return arrayOut; +} + ++ (int)totalBitsInLayer:(int)layers compact:(BOOL)compact { + return ((compact ? 88 : 112) + 16 * layers) * layers; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.h new file mode 100644 index 0000000..9355b86 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.h @@ -0,0 +1,50 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern NSArray *ZX_AZTEC_MODE_NAMES; + +extern const int ZX_AZTEC_MODE_UPPER; +extern const int ZX_AZTEC_MODE_LOWER; +extern const int ZX_AZTEC_MODE_DIGIT; +extern const int ZX_AZTEC_MODE_MIXED; +extern const int ZX_AZTEC_MODE_PUNCT; + +extern const int ZX_AZTEC_LATCH_TABLE[][5]; + +#define ZX_AZTEC_SHIFT_TABLE_SIZE 6 +extern int ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_SHIFT_TABLE_SIZE][ZX_AZTEC_SHIFT_TABLE_SIZE]; + +@class ZXBitArray, ZXByteArray; + +/** + * This produces nearly optimal encodings of text into the first-level of + * encoding used by Aztec code. + * + * It uses a dynamic algorithm. For each prefix of the string, it determines + * a set of encodings that could lead to this prefix. We repeatedly add a + * character and generate a new set of optimal encodings until we have read + * through the entire input. + */ +@interface ZXAztecHighLevelEncoder : NSObject + +- (id)initWithText:(ZXByteArray *)text; + +/** + * Convert the text represented by this High Level Encoder into a BitArray. + */ +- (ZXBitArray *)encode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.m new file mode 100644 index 0000000..119ff81 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.m @@ -0,0 +1,294 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecHighLevelEncoder.h" +#import "ZXAztecState.h" +#import "ZXByteArray.h" + +NSArray *ZX_AZTEC_MODE_NAMES = nil; + +const int ZX_AZTEC_MODE_UPPER = 0; // 5 bits +const int ZX_AZTEC_MODE_LOWER = 1; // 5 bits +const int ZX_AZTEC_MODE_DIGIT = 2; // 4 bits +const int ZX_AZTEC_MODE_MIXED = 3; // 5 bits +const int ZX_AZTEC_MODE_PUNCT = 4; // 5 bits + +// The Latch Table shows, for each pair of Modes, the optimal method for +// getting from one mode to another. In the worst possible case, this can +// be up to 14 bits. In the best possible case, we are already there! +// The high half-word of each entry gives the number of bits. +// The low half-word of each entry are the actual bits necessary to change +const int ZX_AZTEC_LATCH_TABLE[][5] = { + { + 0, + (5 << 16) + 28, // UPPER -> LOWER + (5 << 16) + 30, // UPPER -> DIGIT + (5 << 16) + 29, // UPPER -> MIXED + (10 << 16) + (29 << 5) + 30, // UPPER -> MIXED -> PUNCT + }, + { + (9 << 16) + (30 << 4) + 14, // LOWER -> DIGIT -> UPPER + 0, + (5 << 16) + 30, // LOWER -> DIGIT + (5 << 16) + 29, // LOWER -> MIXED + (10 << 16) + (29 << 5) + 30, // LOWER -> MIXED -> PUNCT + }, + { + (4 << 16) + 14, // DIGIT -> UPPER + (9 << 16) + (14 << 5) + 28, // DIGIT -> UPPER -> LOWER + 0, + (9 << 16) + (14 << 5) + 29, // DIGIT -> UPPER -> MIXED + (14 << 16) + (14 << 10) + (29 << 5) + 30, + // DIGIT -> UPPER -> MIXED -> PUNCT + }, + { + (5 << 16) + 29, // MIXED -> UPPER + (5 << 16) + 28, // MIXED -> LOWER + (10 << 16) + (29 << 5) + 30, // MIXED -> UPPER -> DIGIT + 0, + (5 << 16) + 30, // MIXED -> PUNCT + }, + { + (5 << 16) + 31, // PUNCT -> UPPER + (10 << 16) + (31 << 5) + 28, // PUNCT -> UPPER -> LOWER + (10 << 16) + (31 << 5) + 30, // PUNCT -> UPPER -> DIGIT + (10 << 16) + (31 << 5) + 29, // PUNCT -> UPPER -> MIXED + 0, + }, +}; + +// A reverse mapping from [mode][char] to the encoding for that character +// in that mode. An entry of 0 indicates no mapping exists. +const int ZX_AZTEC_CHAR_MAP_HEIGHT = 5; +const int ZX_AZTEC_CHAR_MAP_WIDTH = 256; +static int ZX_AZTEC_CHAR_MAP[ZX_AZTEC_CHAR_MAP_HEIGHT][ZX_AZTEC_CHAR_MAP_WIDTH]; + +// A map showing the available shift codes. (The shifts to BINARY are not +// shown +int ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_SHIFT_TABLE_SIZE][ZX_AZTEC_SHIFT_TABLE_SIZE]; + +@interface ZXAztecHighLevelEncoder () + +@property (nonatomic, assign, readonly) ZXByteArray *text; + +@end + +@implementation ZXAztecHighLevelEncoder + ++ (void)load { + ZX_AZTEC_MODE_NAMES = @[@"UPPER", @"LOWER", @"DIGIT", @"MIXED", @"PUNCT"]; + + memset(ZX_AZTEC_CHAR_MAP, 0, ZX_AZTEC_CHAR_MAP_HEIGHT * ZX_AZTEC_CHAR_MAP_WIDTH * sizeof(int)); + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_UPPER][' '] = 1; + for (int c = 'A'; c <= 'Z'; c++) { + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_UPPER][c] = c - 'A' + 2; + } + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_LOWER][' '] = 1; + for (int c = 'a'; c <= 'z'; c++) { + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_LOWER][c] = c - 'a' + 2; + } + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_DIGIT][' '] = 1; + for (int c = '0'; c <= '9'; c++) { + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_DIGIT][c] = c - '0' + 2; + } + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_DIGIT][','] = 12; + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_DIGIT]['.'] = 13; + + const int mixedTable[] = { + '\0', ' ', '\1', '\2', '\3', '\4', '\5', '\6', '\7', '\b', '\t', '\n', + '\13', '\f', '\r', '\33', '\34', '\35', '\36', '\37', '@', '\\', '^', + '_', '`', '|', '~', '\177' + }; + for (int i = 0; i < sizeof(mixedTable) / sizeof(int); i++) { + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_MIXED][mixedTable[i]] = i; + } + + const int punctTable[] = { + '\0', '\r', '\0', '\0', '\0', '\0', '!', '\'', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', + '[', ']', '{', '}' + }; + for (int i = 0; i < sizeof(punctTable) / sizeof(int); i++) { + if (punctTable[i] > 0) { + ZX_AZTEC_CHAR_MAP[ZX_AZTEC_MODE_PUNCT][punctTable[i]] = i; + } + } + + memset(ZX_AZTEC_SHIFT_TABLE, -1, ZX_AZTEC_SHIFT_TABLE_SIZE * ZX_AZTEC_SHIFT_TABLE_SIZE * sizeof(int)); + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_UPPER][ZX_AZTEC_MODE_PUNCT] = 0; + + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_LOWER][ZX_AZTEC_MODE_PUNCT] = 0; + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_LOWER][ZX_AZTEC_MODE_UPPER] = 28; + + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_MIXED][ZX_AZTEC_MODE_PUNCT] = 0; + + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_DIGIT][ZX_AZTEC_MODE_PUNCT] = 0; + ZX_AZTEC_SHIFT_TABLE[ZX_AZTEC_MODE_DIGIT][ZX_AZTEC_MODE_UPPER] = 15; +} + +- (id)initWithText:(ZXByteArray *)text { + if (self = [super init]) { + _text = text; + } + + return self; +} + +- (ZXBitArray *)encode { + NSArray *states = @[[ZXAztecState initialState]]; + for (int index = 0; index < self.text.length; index++) { + int pairCode; + int nextChar = index + 1 < self.text.length ? self.text.array[index + 1] : 0; + switch (self.text.array[index]) { + case '\r': + pairCode = nextChar == '\n' ? 2 : 0; + break; + case '.' : + pairCode = nextChar == ' ' ? 3 : 0; + break; + case ',' : + pairCode = nextChar == ' ' ? 4 : 0; + break; + case ':' : + pairCode = nextChar == ' ' ? 5 : 0; + break; + default: + pairCode = 0; + } + if (pairCode > 0) { + // We have one of the four special PUNCT pairs. Treat them specially. + // Get a new set of states for the two new characters. + states = [self updateStateListForPair:states index:index pairCode:pairCode]; + index++; + } else { + // Get a new set of states for the new character. + states = [self updateStateListForChar:states index:index]; + } + } + // We are left with a set of states. Find the shortest one. + ZXAztecState *minState = [[states sortedArrayUsingComparator:^NSComparisonResult(ZXAztecState *a, ZXAztecState *b) { + return a.bitCount - b.bitCount; + }] firstObject]; + // Convert it to a bit array, and return. + return [minState toBitArray:self.text]; +} + +// We update a set of states for a new character by updating each state +// for the new character, merging the results, and then removing the +// non-optimal states. +- (NSArray *)updateStateListForChar:(NSArray *)states index:(int)index { + NSMutableArray *result = [NSMutableArray array]; + for (ZXAztecState *state in states) { + [self updateStateForChar:state index:index result:result]; + } + return [self simplifyStates:result]; +} + +// Return a set of states that represent the possible ways of updating this +// state for the next character. The resulting set of states are added to +// the "result" list. +- (void)updateStateForChar:(ZXAztecState *)state index:(int)index result:(NSMutableArray *)result { + unichar ch = (unichar) (self.text.array[index] & 0xFF); + BOOL charInCurrentTable = ZX_AZTEC_CHAR_MAP[state.mode][ch] > 0; + ZXAztecState *stateNoBinary = nil; + for (int mode = 0; mode <= ZX_AZTEC_MODE_PUNCT; mode++) { + int charInMode = ZX_AZTEC_CHAR_MAP[mode][ch]; + if (charInMode > 0) { + if (!stateNoBinary) { + // Only create stateNoBinary the first time it's required. + stateNoBinary = [state endBinaryShift:index]; + } + // Try generating the character by latching to its mode + if (!charInCurrentTable || mode == state.mode || mode == ZX_AZTEC_MODE_DIGIT) { + // If the character is in the current table, we don't want to latch to + // any other mode except possibly digit (which uses only 4 bits). Any + // other latch would be equally successful *after* this character, and + // so wouldn't save any bits. + ZXAztecState *latch_state = [stateNoBinary latchAndAppend:mode value:charInMode]; + [result addObject:latch_state]; + } + // Try generating the character by switching to its mode. + if (!charInCurrentTable && ZX_AZTEC_SHIFT_TABLE[state.mode][mode] >= 0) { + // It never makes sense to temporarily shift to another mode if the + // character exists in the current mode. That can never save bits. + ZXAztecState *shift_state = [stateNoBinary shiftAndAppend:mode value:charInMode]; + [result addObject:shift_state]; + } + } + } + if (state.binaryShiftByteCount > 0 || ZX_AZTEC_CHAR_MAP[state.mode][ch] == 0) { + // It's never worthwhile to go into binary shift mode if you're not already + // in binary shift mode, and the character exists in your current mode. + // That can never save bits over just outputting the char in the current mode. + ZXAztecState *binaryState = [state addBinaryShiftChar:index]; + [result addObject:binaryState]; + } +} + +- (NSArray *)updateStateListForPair:(NSArray *)states index:(int)index pairCode:(int)pairCode { + NSMutableArray *result = [NSMutableArray array]; + for (ZXAztecState *state in states) { + [self updateStateForPair:state index:index pairCode:pairCode result:result]; + } + return [self simplifyStates:result]; +} + +- (void)updateStateForPair:(ZXAztecState *)state index:(int)index pairCode:(int)pairCode result:(NSMutableArray *)result { + ZXAztecState *stateNoBinary = [state endBinaryShift:index]; + // Possibility 1. Latch to ZX_AZTEC_MODE_PUNCT, and then append this code + [result addObject:[stateNoBinary latchAndAppend:ZX_AZTEC_MODE_PUNCT value:pairCode]]; + if (state.mode != ZX_AZTEC_MODE_PUNCT) { + // Possibility 2. Shift to ZX_AZTEC_MODE_PUNCT, and then append this code. + // Every state except ZX_AZTEC_MODE_PUNCT (handled above) can shift + [result addObject:[stateNoBinary shiftAndAppend:ZX_AZTEC_MODE_PUNCT value:pairCode]]; + } + if (pairCode == 3 || pairCode == 4) { + // both characters are in DIGITS. Sometimes better to just add two digits + ZXAztecState *digit_state = [[stateNoBinary + latchAndAppend:ZX_AZTEC_MODE_DIGIT value:16 - pairCode] // period or comma in DIGIT + latchAndAppend:ZX_AZTEC_MODE_DIGIT value:1]; // space in DIGIT + [result addObject:digit_state]; + } + if (state.binaryShiftByteCount > 0) { + // It only makes sense to do the characters as binary if we're already + // in binary mode. + ZXAztecState *binaryState = [[state addBinaryShiftChar:index] addBinaryShiftChar:index + 1]; + [result addObject:binaryState]; + } +} + +- (NSArray *)simplifyStates:(NSArray *)states { + NSMutableArray *result = [NSMutableArray array]; + for (ZXAztecState *newState in states) { + BOOL add = YES; + NSArray *resultCopy = [NSArray arrayWithArray:result]; + for (ZXAztecState *oldState in resultCopy) { + if ([oldState isBetterThanOrEqualTo:newState]) { + add = NO; + break; + } + if ([newState isBetterThanOrEqualTo:oldState]) { + [result removeObject:oldState]; + } + } + if (add) { + [result addObject:newState]; + } + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.h new file mode 100644 index 0000000..ab9ac11 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.h @@ -0,0 +1,23 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecToken.h" + +@interface ZXAztecSimpleToken : ZXAztecToken + +- (id)initWithPrevious:(ZXAztecToken *)previous value:(int)value bitCount:(int)bitCount; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.m new file mode 100644 index 0000000..d22e3ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.m @@ -0,0 +1,55 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecSimpleToken.h" +#import "ZXBitArray.h" + +@interface ZXAztecSimpleToken () + +// For normal words, indicates value and bitCount +@property (nonatomic, assign, readonly) int16_t value; +@property (nonatomic, assign, readonly) int16_t bitCount; + +@end + +@implementation ZXAztecSimpleToken + +- (id)initWithPrevious:(ZXAztecToken *)previous value:(int)value bitCount:(int)bitCount { + if (self = [super initWithPrevious:previous]) { + _value = (int16_t)value; + _bitCount = (int16_t)bitCount; + } + + return self; +} + +- (void)appendTo:(ZXBitArray *)bitArray text:(ZXByteArray *)text { + [bitArray appendBits:self.value numBits:self.bitCount]; +} + +- (NSString *)description { + int value = self.value & ((1 << self.bitCount) - 1); + value |= 1 << self.bitCount; + + NSMutableString *str = [NSMutableString string]; + for (int i = value | (1 << self.bitCount); i > 0; i >>= 1) { + [str insertString:((i & 1) ? @"1" : @"0") atIndex:0]; + } + + return [NSString stringWithFormat:@"<%@>", [str substringFromIndex:1]]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.h new file mode 100644 index 0000000..36eb6e0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.h @@ -0,0 +1,49 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXAztecToken, ZXBitArray, ZXByteArray; + +/** + * State represents all information about a sequence necessary to generate the current output. + * Note that a state is immutable. + */ +@interface ZXAztecState : NSObject + +// The current mode of the encoding (or the mode to which we'll return if +// we're in Binary Shift mode. +@property (nonatomic, assign, readonly) int mode; + +// The list of tokens that we output. If we are in Binary Shift mode, this +// token list does *not* yet included the token for those bytes +@property (nonatomic, strong, readonly) ZXAztecToken *token; + +// If non-zero, the number of most recent bytes that should be output +// in Binary Shift mode. +@property (nonatomic, assign, readonly) int binaryShiftByteCount; + +// The total number of bits generated (including Binary Shift). +@property (nonatomic, assign, readonly) int bitCount; + +- (id)initWithToken:(ZXAztecToken *)token mode:(int)mode binaryBytes:(int)binaryBytes bitCount:(int)bitCount; ++ (ZXAztecState *)initialState; +- (ZXAztecState *)latchAndAppend:(int)mode value:(int)value; +- (ZXAztecState *)shiftAndAppend:(int)mode value:(int)value; +- (ZXAztecState *)addBinaryShiftChar:(int)index; +- (ZXAztecState *)endBinaryShift:(int)index; +- (BOOL)isBetterThanOrEqualTo:(ZXAztecState *)other; +- (ZXBitArray *)toBitArray:(ZXByteArray *)text; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.m new file mode 100644 index 0000000..4a7ad50 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.m @@ -0,0 +1,132 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecHighLevelEncoder.h" +#import "ZXAztecState.h" +#import "ZXAztecToken.h" +#import "ZXBitArray.h" +#import "ZXByteArray.h" + +@implementation ZXAztecState + +- (id)initWithToken:(ZXAztecToken *)token mode:(int)mode binaryBytes:(int)binaryBytes bitCount:(int)bitCount { + if (self = [super init]) { + _token = token; + _mode = mode; + _binaryShiftByteCount = binaryBytes; + _bitCount = bitCount; + } + + return self; +} + ++ (ZXAztecState *)initialState { + return [[ZXAztecState alloc] initWithToken:[ZXAztecToken empty] mode:ZX_AZTEC_MODE_UPPER binaryBytes:0 bitCount:0]; +} + +// Create a new state representing this state with a latch to a (not +// necessary different) mode, and then a code. +- (ZXAztecState *)latchAndAppend:(int)mode value:(int)value { + int bitCount = self.bitCount; + ZXAztecToken *token = self.token; + if (mode != self.mode) { + int latch = ZX_AZTEC_LATCH_TABLE[self.mode][mode]; + token = [token add:latch & 0xFFFF bitCount:latch >> 16]; + bitCount += latch >> 16; + } + int latchModeBitCount = mode == ZX_AZTEC_MODE_DIGIT ? 4 : 5; + token = [token add:value bitCount:latchModeBitCount]; + return [[ZXAztecState alloc] initWithToken:token mode:mode binaryBytes:0 bitCount:bitCount + latchModeBitCount]; +} + +// Create a new state representing this state, with a temporary shift +// to a different mode to output a single value. +- (ZXAztecState *)shiftAndAppend:(int)mode value:(int)value { + //assert binaryShiftByteCount == 0 && this.mode != mode; + ZXAztecToken *token = self.token; + int thisModeBitCount = self.mode == ZX_AZTEC_MODE_DIGIT ? 4 : 5; + // Shifts exist only to UPPER and PUNCT, both with tokens size 5. + token = [token add:ZX_AZTEC_SHIFT_TABLE[self.mode][mode] bitCount:thisModeBitCount]; + token = [token add:value bitCount:5]; + return [[ZXAztecState alloc] initWithToken:token mode:self.mode binaryBytes:0 bitCount:self.bitCount + thisModeBitCount + 5]; +} + +// Create a new state representing this state, but an additional character +// output in Binary Shift mode. +- (ZXAztecState *)addBinaryShiftChar:(int)index { + ZXAztecToken *token = self.token; + int mode = self.mode; + int bitCount = self.bitCount; + if (self.mode == ZX_AZTEC_MODE_PUNCT || self.mode == ZX_AZTEC_MODE_DIGIT) { + int latch = ZX_AZTEC_LATCH_TABLE[mode][ZX_AZTEC_MODE_UPPER]; + token = [token add:latch & 0xFFFF bitCount:latch >> 16]; + bitCount += latch >> 16; + mode = ZX_AZTEC_MODE_UPPER; + } + int deltaBitCount = + (self.binaryShiftByteCount == 0 || self.binaryShiftByteCount == 31) ? 18 : + (self.binaryShiftByteCount == 62) ? 9 : 8; + ZXAztecState *result = [[ZXAztecState alloc] initWithToken:token mode:mode binaryBytes:self.binaryShiftByteCount + 1 bitCount:bitCount + deltaBitCount]; + if (result.binaryShiftByteCount == 2047 + 31) { + // The string is as long as it's allowed to be. We should end it. + result = [result endBinaryShift:index + 1]; + } + return result; +} + +// Create the state identical to this one, but we are no longer in +// Binary Shift mode. +- (ZXAztecState *)endBinaryShift:(int)index { + if (self.binaryShiftByteCount == 0) { + return self; + } + ZXAztecToken *token = self.token; + token = [token addBinaryShift:index - self.binaryShiftByteCount byteCount:self.binaryShiftByteCount]; + return [[ZXAztecState alloc] initWithToken:token mode:self.mode binaryBytes:0 bitCount:self.bitCount]; +} + +// Returns true if "this" state is better (or equal) to be in than "that" +// state under all possible circumstances. +- (BOOL)isBetterThanOrEqualTo:(ZXAztecState *)other { + int mySize = self.bitCount + (ZX_AZTEC_LATCH_TABLE[self.mode][other.mode] >> 16); + if (other.binaryShiftByteCount > 0 && + (self.binaryShiftByteCount == 0 || self.binaryShiftByteCount > other.binaryShiftByteCount)) { + mySize += 10; // Cost of entering Binary Shift mode. + } + return mySize <= other.bitCount; +} + +- (ZXBitArray *)toBitArray:(ZXByteArray *)text { + // Reverse the tokens, so that they are in the order that they should + // be output + NSMutableArray *symbols = [NSMutableArray array]; + for (ZXAztecToken *token = [self endBinaryShift:text.length].token; token != nil; token = token.previous) { + [symbols insertObject:token atIndex:0]; + } + ZXBitArray *bitArray = [[ZXBitArray alloc] init]; + // Add each token to the result. + for (ZXAztecToken *symbol in symbols) { + [symbol appendTo:bitArray text:text]; + } + return bitArray; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@ bits=%d bytes=%d", ZX_AZTEC_MODE_NAMES[self.mode], + self.bitCount, self.binaryShiftByteCount]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.h new file mode 100644 index 0000000..a95ff32 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.h @@ -0,0 +1,29 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXByteArray; + +@interface ZXAztecToken : NSObject + +@property (nonatomic, strong, readonly) ZXAztecToken *previous; + +- (id)initWithPrevious:(ZXAztecToken *)previous; ++ (ZXAztecToken *)empty; +- (ZXAztecToken *)add:(int)value bitCount:(int)bitCount; +- (ZXAztecToken *)addBinaryShift:(int)start byteCount:(int)byteCount; +- (void)appendTo:(ZXBitArray *)bitArray text:(ZXByteArray *)text; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.m new file mode 100644 index 0000000..5e1d810 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.m @@ -0,0 +1,51 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAztecBinaryShiftToken.h" +#import "ZXAztecSimpleToken.h" +#import "ZXAztecToken.h" +#import "ZXBitArray.h" + +@implementation ZXAztecToken + +- (id)initWithPrevious:(ZXAztecToken *)previous { + if (self = [super init]) { + _previous = previous; + } + + return self; +} + ++ (ZXAztecToken *)empty { + return [[ZXAztecSimpleToken alloc] initWithPrevious:nil value:0 bitCount:0]; +} + +- (ZXAztecToken *)add:(int)value bitCount:(int)bitCount { + return [[ZXAztecSimpleToken alloc] initWithPrevious:self value:value bitCount:bitCount]; +} + +- (ZXAztecToken *)addBinaryShift:(int)start byteCount:(int)byteCount { +// int bitCount = (byteCount * 8) + (byteCount <= 31 ? 10 : byteCount <= 62 ? 20 : 21); + return [[ZXAztecBinaryShiftToken alloc] initWithPrevious:self binaryShiftStart:start binaryShiftByteCount:byteCount]; +} + +- (void)appendTo:(ZXBitArray *)bitArray text:(ZXByteArray *)text { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.h new file mode 100644 index 0000000..cfee4fb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.h @@ -0,0 +1,57 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "ZXLuminanceSource.h" + +@class ZXImage; + +@interface ZXCGImageLuminanceSource : ZXLuminanceSource + ++ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer CF_RETURNS_RETAINED; ++ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer + left:(size_t)left + top:(size_t)top + width:(size_t)width + height:(size_t)height CF_RETURNS_RETAINED; + +- (id)initWithZXImage:(ZXImage *)image + left:(size_t)left + top:(size_t)top + width:(size_t)width + height:(size_t)height; + +- (id)initWithZXImage:(ZXImage *)image; + +- (id)initWithCGImage:(CGImageRef)image + left:(size_t)left + top:(size_t)top + width:(size_t)width + height:(size_t)height; + +- (id)initWithCGImage:(CGImageRef)image; + +- (id)initWithBuffer:(CVPixelBufferRef)buffer + left:(size_t)left + top:(size_t)top + width:(size_t)width + height:(size_t)height; + +- (id)initWithBuffer:(CVPixelBufferRef)buffer; + +- (CGImageRef)image; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.m new file mode 100644 index 0000000..2f65e9a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.m @@ -0,0 +1,308 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "ZXByteArray.h" +#import "ZXCGImageLuminanceSource.h" +#import "ZXImage.h" + +@interface ZXCGImageLuminanceSource () + +@property (nonatomic, assign, readonly) CGImageRef image; +@property (nonatomic, assign, readonly) int8_t *data; +@property (nonatomic, assign, readonly) size_t left; +@property (nonatomic, assign, readonly) size_t top; + +@end + +@implementation ZXCGImageLuminanceSource + ++ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer CF_RETURNS_RETAINED { + return [self createImageFromBuffer:buffer + left:0 + top:0 + width:CVPixelBufferGetWidth(buffer) + height:CVPixelBufferGetHeight(buffer)]; +} + ++ (CGImageRef)createImageFromBuffer:(CVImageBufferRef)buffer + left:(size_t)left + top:(size_t)top + width:(size_t)width + height:(size_t)height CF_RETURNS_RETAINED { + size_t bytesPerRow = CVPixelBufferGetBytesPerRow(buffer); + size_t dataWidth = CVPixelBufferGetWidth(buffer); + size_t dataHeight = CVPixelBufferGetHeight(buffer); + + if (left + width > dataWidth || + top + height > dataHeight) { + [NSException raise:NSInvalidArgumentException format:@"Crop rectangle does not fit within image data."]; + } + + size_t newBytesPerRow = ((width*4+0xf)>>4)<<4; + + CVPixelBufferLockBaseAddress(buffer,0); + + int8_t *baseAddress = (int8_t *)CVPixelBufferGetBaseAddress(buffer); + + size_t size = newBytesPerRow*height; + int8_t *bytes = (int8_t *)malloc(size * sizeof(int8_t)); + if (newBytesPerRow == bytesPerRow) { + memcpy(bytes, baseAddress+top*bytesPerRow, size * sizeof(int8_t)); + } else { + for (int y=0; y= self.height) { + [NSException raise:NSInvalidArgumentException format:@"Requested row is outside the image: %d", y]; + } + + if (!row || row.length < self.width) { + row = [[ZXByteArray alloc] initWithLength:self.width]; + } + int offset = y * self.width; + memcpy(row.array, self.data + offset, self.width * sizeof(int8_t)); + return row; +} + +- (ZXByteArray *)matrix { + int area = self.width * self.height; + + ZXByteArray *matrix = [[ZXByteArray alloc] initWithLength:area]; + memcpy(matrix.array, self.data, area * sizeof(int8_t)); + return matrix; +} + +- (void)initializeWithImage:(CGImageRef)cgimage left:(size_t)left top:(size_t)top width:(size_t)width height:(size_t)height { + _data = 0; + _image = CGImageRetain(cgimage); + _left = left; + _top = top; + size_t sourceWidth = CGImageGetWidth(cgimage); + size_t sourceHeight = CGImageGetHeight(cgimage); + size_t selfWidth = self.width; + size_t selfHeight= self.height; + + if (left + selfWidth > sourceWidth || + top + selfHeight > sourceHeight) { + [NSException raise:NSInvalidArgumentException format:@"Crop rectangle does not fit within image data."]; + } + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, selfWidth, selfHeight, 8, selfWidth * 4, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); + CGColorSpaceRelease(colorSpace); + + CGContextSetAllowsAntialiasing(context, FALSE); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + + if (top || left) { + CGContextClipToRect(context, CGRectMake(0, 0, selfWidth, selfHeight)); + } + + CGContextDrawImage(context, CGRectMake(-left, -top, selfWidth, selfHeight), self.image); + + uint32_t *pixelData = CGBitmapContextGetData(context); + + _data = (int8_t *)malloc(selfWidth * selfHeight * sizeof(int8_t)); + + dispatch_apply(selfHeight, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^(size_t idx) { + size_t stripe_start = idx * selfWidth; + size_t stripe_stop = stripe_start + selfWidth; + + for (size_t i = stripe_start; i < stripe_stop; i++) { + uint32_t rgbPixelIn = pixelData[i]; + uint32_t rgbPixelOut = 0; + + uint32_t red = (rgbPixelIn >> 24) & 0xFF; + uint32_t green = (rgbPixelIn >> 16) & 0xFF; + uint32_t blue = (rgbPixelIn >> 8) & 0xFF; + uint32_t alpha = (rgbPixelIn & 0xFF); + + // ImageIO premultiplies all PNGs, so we have to "un-premultiply them": + // http://code.google.com/p/cocos2d-iphone/issues/detail?id=697#c26 + if (alpha != 0xFF) { + red = red > 0 ? ((red << 20) / (alpha << 2)) >> 10 : 0; + green = green > 0 ? ((green << 20) / (alpha << 2)) >> 10 : 0; + blue = blue > 0 ? ((blue << 20) / (alpha << 2)) >> 10 : 0; + } + + if (red == green && green == blue) { + rgbPixelOut = red; + } else { + rgbPixelOut = (306 * red + + 601 * green + + 117 * blue + + (0x200)) >> 10; // 0x200 = 1<<9, half an lsb of the result to force rounding + } + + if (rgbPixelOut > 255) { + rgbPixelOut = 255; + } + + _data[i] = rgbPixelOut; + } + }); + + CGContextRelease(context); + + _top = top; + _left = left; +} + +- (BOOL)rotateSupported { + return YES; +} + +- (ZXLuminanceSource *)rotateCounterClockwise { + double radians = 270.0f * M_PI / 180; + +#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR + radians = -1 * radians; +#endif + + int sourceWidth = self.width; + int sourceHeight = self.height; + + CGRect imgRect = CGRectMake(0, 0, sourceWidth, sourceHeight); + CGAffineTransform transform = CGAffineTransformMakeRotation(radians); + CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, + rotatedRect.size.width, + rotatedRect.size.height, + CGImageGetBitsPerComponent(self.image), + 0, + colorSpace, + kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst); + CGContextSetAllowsAntialiasing(context, FALSE); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + CGColorSpaceRelease(colorSpace); + + CGContextTranslateCTM(context, + +(rotatedRect.size.width/2), + +(rotatedRect.size.height/2)); + CGContextRotateCTM(context, radians); + + CGContextDrawImage(context, CGRectMake(-imgRect.size.width/2, + -imgRect.size.height/2, + imgRect.size.width, + imgRect.size.height), + self.image); + + CGImageRef rotatedImage = CGBitmapContextCreateImage(context); + + CFRelease(context); + + ZXCGImageLuminanceSource *result = [[ZXCGImageLuminanceSource alloc] initWithCGImage:rotatedImage + left:self.top + top:sourceWidth - (self.left + self.width) + width:self.height + height:self.width]; + + CGImageRelease(rotatedImage); + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.h new file mode 100644 index 0000000..d8e529d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.h @@ -0,0 +1,60 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@protocol ZXCaptureDelegate, ZXReader; +@class ZXDecodeHints; + +@interface ZXCapture : NSObject + +@property (nonatomic, assign) int camera; +@property (nonatomic, strong) AVCaptureDevice *captureDevice; +@property (nonatomic, copy) NSString *captureToFilename; +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) AVCaptureFocusMode focusMode; +@property (nonatomic, strong) ZXDecodeHints *hints; +@property (nonatomic, assign) CGImageRef lastScannedImage; +@property (nonatomic, assign) BOOL invert; +@property (nonatomic, strong, readonly) CALayer *layer; +@property (nonatomic, assign) BOOL mirror; +@property (nonatomic, strong, readonly) AVCaptureVideoDataOutput *output; +@property (nonatomic, strong) id reader; +@property (nonatomic, assign) CGFloat rotation; +@property (nonatomic, assign, readonly) BOOL running; +@property (nonatomic, assign) CGRect scanRect; +@property (nonatomic, copy) NSString *sessionPreset; +@property (nonatomic, assign) BOOL torch; +@property (nonatomic, assign) CGAffineTransform transform; + +- (int)back; +- (int)front; +- (BOOL)hasBack; +- (BOOL)hasFront; +- (BOOL)hasTorch; + +- (CALayer *)binary; +- (void)setBinary:(BOOL)on_off; + +- (CALayer *)luminance; +- (void)setLuminance:(BOOL)on_off; + +- (void)hard_stop; +- (void)order_skip; +- (void)start; +- (void)stop; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.m new file mode 100644 index 0000000..ec7139c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.m @@ -0,0 +1,544 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "ZXBinaryBitmap.h" +#import "ZXCapture.h" +#import "ZXCaptureDelegate.h" +#import "ZXCGImageLuminanceSource.h" +#import "ZXDecodeHints.h" +#import "ZXHybridBinarizer.h" +#import "ZXReader.h" +#import "ZXResult.h" + +@interface ZXCapture () + +@property (nonatomic, strong) CALayer *binaryLayer; +@property (nonatomic, assign) BOOL cameraIsReady; +@property (nonatomic, assign) int captureDeviceIndex; +@property (nonatomic, strong) dispatch_queue_t captureQueue; +@property (nonatomic, assign) BOOL hardStop; +@property (nonatomic, strong) AVCaptureDeviceInput *input; +@property (nonatomic, strong) AVCaptureVideoPreviewLayer *layer; +@property (nonatomic, strong) CALayer *luminanceLayer; +@property (nonatomic, assign) int orderInSkip; +@property (nonatomic, assign) int orderOutSkip; +@property (nonatomic, assign) BOOL onScreen; +@property (nonatomic, strong) AVCaptureVideoDataOutput *output; +@property (nonatomic, assign) BOOL running; +@property (nonatomic, strong) AVCaptureSession *session; + +@end + +@implementation ZXCapture + +- (ZXCapture *)init { + if (self = [super init]) { + _captureDeviceIndex = -1; + _captureQueue = dispatch_queue_create("com.zxing.captureQueue", NULL); + _focusMode = AVCaptureFocusModeContinuousAutoFocus; + _hardStop = NO; + _hints = [ZXDecodeHints hints]; + _lastScannedImage = NULL; + _onScreen = NO; + _orderInSkip = 0; + _orderOutSkip = 0; + + if (NSClassFromString(@"ZXMultiFormatReader")) { + _reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)]; + } + + _rotation = 0.0f; + _running = NO; + _sessionPreset = AVCaptureSessionPresetMedium; + _transform = CGAffineTransformIdentity; + _scanRect = CGRectZero; + } + + return self; +} + +- (void)dealloc { + if (_lastScannedImage) { + CGImageRelease(_lastScannedImage); + } + + if (_session && _session.inputs) { + for (AVCaptureInput *input in _session.inputs) { + [_session removeInput:input]; + } + } + + if (_session && _session.outputs) { + for (AVCaptureOutput *output in _session.outputs) { + [_session removeOutput:output]; + } + } +} + +#pragma mark - Property Getters + +- (CALayer *)layer { + AVCaptureVideoPreviewLayer *layer = (AVCaptureVideoPreviewLayer *)_layer; + if (!_layer) { + layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; + layer.affineTransform = self.transform; + layer.delegate = self; + layer.videoGravity = AVLayerVideoGravityResizeAspect; + layer.videoGravity = AVLayerVideoGravityResizeAspectFill; + + _layer = layer; + } + return layer; +} + +- (AVCaptureVideoDataOutput *)output { + if (!_output) { + _output = [[AVCaptureVideoDataOutput alloc] init]; + [_output setVideoSettings:@{ + (NSString *)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA] + }]; + [_output setAlwaysDiscardsLateVideoFrames:YES]; + [_output setSampleBufferDelegate:self queue:_captureQueue]; + + [self.session addOutput:_output]; + } + + return _output; +} + +#pragma mark - Property Setters + +- (void)setCamera:(int)camera { + if (_camera != camera) { + _camera = camera; + self.captureDeviceIndex = -1; + self.captureDevice = nil; + [self replaceInput]; + } +} + +- (void)setDelegate:(id)delegate { + _delegate = delegate; + + if (delegate) { + self.hardStop = NO; + } + [self startStop]; +} + +- (void)setFocusMode:(AVCaptureFocusMode)focusMode { + if ([self.input.device isFocusModeSupported:focusMode] && self.input.device.focusMode != focusMode) { + _focusMode = focusMode; + + [self.input.device lockForConfiguration:nil]; + self.input.device.focusMode = focusMode; + [self.input.device unlockForConfiguration]; + } +} + +- (void)setLastScannedImage:(CGImageRef)lastScannedImage { + if (_lastScannedImage) { + CGImageRelease(_lastScannedImage); + } + + if (lastScannedImage) { + CGImageRetain(lastScannedImage); + } + + _lastScannedImage = lastScannedImage; +} + +- (void)setMirror:(BOOL)mirror { + if (_mirror != mirror) { + _mirror = mirror; + if (self.layer) { + CGAffineTransform transform = self.transform; + transform.a = - transform.a; + self.transform = transform; + [self.layer setAffineTransform:self.transform]; + } + } +} + +- (void)setTorch:(BOOL)torch { + _torch = torch; + + [self.input.device lockForConfiguration:nil]; + self.input.device.torchMode = self.torch ? AVCaptureTorchModeOn : AVCaptureTorchModeOff; + [self.input.device unlockForConfiguration]; +} + +- (void)setTransform:(CGAffineTransform)transform { + _transform = transform; + [self.layer setAffineTransform:transform]; +} + +#pragma mark - Back, Front, Torch + +- (int)back { + return 1; +} + +- (int)front { + return 0; +} + +- (BOOL)hasFront { + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + return [devices count] > 1; +} + +- (BOOL)hasBack { + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + return [devices count] > 0; +} + +- (BOOL)hasTorch { + if ([self device]) { + return [self device].hasTorch; + } else { + return NO; + } +} + +#pragma mark - Binary + +- (CALayer *)binary { + return self.binaryLayer; +} + +- (void)setBinary:(BOOL)on { + if (on && !self.binaryLayer) { + self.binaryLayer = [CALayer layer]; + } else if (!on && self.binaryLayer) { + self.binaryLayer = nil; + } +} + +#pragma mark - Luminance + +- (CALayer *)luminance { + return self.luminanceLayer; +} + +- (void)setLuminance:(BOOL)on { + if (on && !self.luminanceLayer) { + self.luminanceLayer = [CALayer layer]; + } else if (!on && self.luminanceLayer) { + self.luminanceLayer = nil; + } +} + +#pragma mark - Start, Stop + +- (void)hard_stop { + self.hardStop = YES; + + if (self.running) { + [self stop]; + } +} + +- (void)order_skip { + self.orderInSkip = 1; + self.orderOutSkip = 1; +} + +- (void)start { + if (self.hardStop) { + return; + } + + if (self.delegate || self.luminanceLayer || self.binaryLayer) { + (void)[self output]; + } + + if (!self.session.running) { + static int i = 0; + if (++i == -2) { + abort(); + } + + [self.session startRunning]; + } + self.running = YES; +} + +- (void)stop { + if (!self.running) { + return; + } + + if (self.session.running) { + [self.session stopRunning]; + } + + self.running = NO; +} + +#pragma mark - CAAction + +- (id)actionForLayer:(CALayer *)_layer forKey:(NSString *)event { + [CATransaction setValue:[NSNumber numberWithFloat:0.0f] forKey:kCATransactionAnimationDuration]; + + if ([event isEqualToString:kCAOnOrderIn] || [event isEqualToString:kCAOnOrderOut]) { + return self; + } + + return nil; +} + +- (void)runActionForKey:(NSString *)key object:(id)anObject arguments:(NSDictionary *)dict { + if ([key isEqualToString:kCAOnOrderIn]) { + if (self.orderInSkip) { + self.orderInSkip--; + return; + } + + self.onScreen = YES; + [self startStop]; + } else if ([key isEqualToString:kCAOnOrderOut]) { + if (self.orderOutSkip) { + self.orderOutSkip--; + return; + } + + self.onScreen = NO; + [self startStop]; + } +} + +#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate + +- (void)captureOutput:(AVCaptureOutput *)captureOutput +didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + fromConnection:(AVCaptureConnection *)connection { + if (!self.running) return; + + @autoreleasepool { + if (!self.cameraIsReady) { + self.cameraIsReady = YES; + if ([self.delegate respondsToSelector:@selector(captureCameraIsReady:)]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate captureCameraIsReady:self]; + }); + } + } + + if (!self.captureToFilename && !self.luminanceLayer && !self.binaryLayer && !self.delegate) { + return; + } + + CVImageBufferRef videoFrame = CMSampleBufferGetImageBuffer(sampleBuffer); + + CGImageRef videoFrameImage = [ZXCGImageLuminanceSource createImageFromBuffer:videoFrame]; + CGImageRef rotatedImage = [self createRotatedImage:videoFrameImage degrees:self.rotation]; + CGImageRelease(videoFrameImage); + + // If scanRect is set, crop the current image to include only the desired rect + if (!CGRectIsEmpty(self.scanRect)) { + CGImageRef croppedImage = CGImageCreateWithImageInRect(rotatedImage, self.scanRect); + CFRelease(rotatedImage); + rotatedImage = croppedImage; + } + + self.lastScannedImage = rotatedImage; + + if (self.captureToFilename) { + NSURL *url = [NSURL fileURLWithPath:self.captureToFilename]; + CGImageDestinationRef dest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)@"public.png", 1, nil); + CGImageDestinationAddImage(dest, rotatedImage, nil); + CGImageDestinationFinalize(dest); + CFRelease(dest); + self.captureToFilename = nil; + } + + ZXCGImageLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:rotatedImage]; + CGImageRelease(rotatedImage); + + if (self.luminanceLayer) { + CGImageRef image = source.image; + CGImageRetain(image); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ + self.luminanceLayer.contents = (__bridge id)image; + CGImageRelease(image); + }); + } + + if (self.binaryLayer || self.delegate) { + ZXHybridBinarizer *binarizer = [[ZXHybridBinarizer alloc] initWithSource:self.invert ? [source invert] : source]; + + if (self.binaryLayer) { + CGImageRef image = [binarizer createImage]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ + self.binaryLayer.contents = (__bridge id)image; + CGImageRelease(image); + }); + } + + if (self.delegate) { + ZXBinaryBitmap *bitmap = [[ZXBinaryBitmap alloc] initWithBinarizer:binarizer]; + + NSError *error; + ZXResult *result = [self.reader decode:bitmap hints:self.hints error:&error]; + if (result) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self.delegate captureResult:self result:result]; + }); + } + } + } + } +} + +#pragma mark - Private + +// Adapted from http://blog.coriolis.ch/2009/09/04/arbitrary-rotation-of-a-cgimage/ and https://github.com/JanX2/CreateRotateWriteCGImage +- (CGImageRef)createRotatedImage:(CGImageRef)original degrees:(float)degrees CF_RETURNS_RETAINED { + if (degrees == 0.0f) { + CGImageRetain(original); + return original; + } else { + double radians = degrees * M_PI / 180; + +#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR + radians = -1 * radians; +#endif + + size_t _width = CGImageGetWidth(original); + size_t _height = CGImageGetHeight(original); + + CGRect imgRect = CGRectMake(0, 0, _width, _height); + CGAffineTransform __transform = CGAffineTransformMakeRotation(radians); + CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, __transform); + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate(NULL, + rotatedRect.size.width, + rotatedRect.size.height, + CGImageGetBitsPerComponent(original), + 0, + colorSpace, + kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst); + CGContextSetAllowsAntialiasing(context, FALSE); + CGContextSetInterpolationQuality(context, kCGInterpolationNone); + CGColorSpaceRelease(colorSpace); + + CGContextTranslateCTM(context, + +(rotatedRect.size.width/2), + +(rotatedRect.size.height/2)); + CGContextRotateCTM(context, radians); + + CGContextDrawImage(context, CGRectMake(-imgRect.size.width/2, + -imgRect.size.height/2, + imgRect.size.width, + imgRect.size.height), + original); + + CGImageRef rotatedImage = CGBitmapContextCreateImage(context); + CFRelease(context); + + return rotatedImage; + } +} + +- (AVCaptureDevice *)device { + if (self.captureDevice) { + return self.captureDevice; + } + + AVCaptureDevice *zxd = nil; + + NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; + + if ([devices count] > 0) { + if (self.captureDeviceIndex == -1) { + AVCaptureDevicePosition position = AVCaptureDevicePositionBack; + if (self.camera == self.front) { + position = AVCaptureDevicePositionFront; + } + + for (unsigned int i = 0; i < [devices count]; ++i) { + AVCaptureDevice *dev = [devices objectAtIndex:i]; + if (dev.position == position) { + self.captureDeviceIndex = i; + zxd = dev; + break; + } + } + } + + if (!zxd && self.captureDeviceIndex != -1) { + zxd = [devices objectAtIndex:self.captureDeviceIndex]; + } + } + + if (!zxd) { + zxd = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + } + + self.captureDevice = zxd; + + return zxd; +} + +- (void)replaceInput { + [self.session beginConfiguration]; + + if (self.session && self.input) { + [self.session removeInput:self.input]; + self.input = nil; + } + + AVCaptureDevice *zxd = [self device]; + + if (zxd) { + self.input = [AVCaptureDeviceInput deviceInputWithDevice:zxd error:nil]; + self.focusMode = self.focusMode; + } + + if (self.input) { + self.session.sessionPreset = self.sessionPreset; + [self.session addInput:self.input]; + } + + [self.session commitConfiguration]; +} + +- (AVCaptureSession *)session { + if (!_session) { + _session = [[AVCaptureSession alloc] init]; + [self replaceInput]; + } + + return _session; +} + +- (void)startStop { + if ((!self.running && (self.delegate || self.onScreen)) || + (!self.output && + (self.delegate || + (self.onScreen && (self.luminanceLayer || self.binaryLayer))))) { + [self start]; + } + + if (self.running && !self.delegate && !self.onScreen) { + [self stop]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCaptureDelegate.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCaptureDelegate.h new file mode 100644 index 0000000..33a7f48 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXCaptureDelegate.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXCapture; +@class ZXResult; + +@protocol ZXCaptureDelegate + +- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result; + +@optional +- (void)captureSize:(ZXCapture *)capture + width:(NSNumber *)width + height:(NSNumber *)height; + +- (void)captureCameraIsReady:(ZXCapture *)capture; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.h new file mode 100644 index 0000000..03600c2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class ZXBitMatrix; + +@interface ZXImage : NSObject + +@property (nonatomic, assign, readonly) CGImageRef cgimage; + +- (ZXImage *)initWithCGImageRef:(CGImageRef)image; +- (ZXImage *)initWithURL:(NSURL const *)url; +- (size_t)width; +- (size_t)height; ++ (ZXImage *)imageWithMatrix:(ZXBitMatrix *)matrix; ++ (ZXImage *)imageWithMatrix:(ZXBitMatrix *)matrix onColor:(CGColorRef)onColor offColor:(CGColorRef)offColor; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.m new file mode 100644 index 0000000..7c09d6b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/ZXImage.m @@ -0,0 +1,135 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXImage.h" + +#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR +#import +#endif + +@implementation ZXImage + +- (ZXImage *)initWithCGImageRef:(CGImageRef)image { + if (self = [super init]) { + _cgimage = CGImageRetain(image); + } + + return self; +} + +- (ZXImage *)initWithURL:(NSURL const *)url { + if (self = [super init]) { + CGDataProviderRef provider = CGDataProviderCreateWithURL((__bridge CFURLRef)url); + + if (provider) { + CGImageSourceRef source = CGImageSourceCreateWithDataProvider(provider, 0); + + if (source) { + _cgimage = CGImageSourceCreateImageAtIndex(source, 0, 0); + CFRelease(source); + } + + CGDataProviderRelease(provider); + } + } + + return self; +} + +- (size_t)width { + return CGImageGetWidth(self.cgimage); +} + +- (size_t)height { + return CGImageGetHeight(self.cgimage); +} + +- (void)dealloc { + if (_cgimage) { + CGImageRelease(_cgimage); + } +} + ++ (ZXImage *)imageWithMatrix:(ZXBitMatrix *)matrix { + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); + + CGFloat blackComponents[] = {0.0f, 1.0f}; + CGColorRef black = CGColorCreate(colorSpace, blackComponents); + CGFloat whiteComponents[] = {1.0f, 1.0f}; + CGColorRef white = CGColorCreate(colorSpace, whiteComponents); + + CFRelease(colorSpace); + + ZXImage *result = [self imageWithMatrix:matrix onColor:black offColor:white]; + + CGColorRelease(white); + CGColorRelease(black); + + return result; +} + ++ (ZXImage *)imageWithMatrix:(ZXBitMatrix *)matrix onColor:(CGColorRef)onColor offColor:(CGColorRef)offColor { + int8_t onIntensities[4], offIntensities[4]; + + [self setColorIntensities:onIntensities color:onColor]; + [self setColorIntensities:offIntensities color:offColor]; + + int width = matrix.width; + int height = matrix.height; + int8_t *bytes = (int8_t *)malloc(width * height * 4); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + BOOL bit = [matrix getX:x y:y]; + for (int i = 0; i < 4; i++) { + int8_t intensity = bit ? onIntensities[i] : offIntensities[i]; + bytes[y * width * 4 + x * 4 + i] = intensity; + } + } + } + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef c = CGBitmapContextCreate(bytes, width, height, 8, 4 * width, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); + CFRelease(colorSpace); + CGImageRef image = CGBitmapContextCreateImage(c); + CFRelease(c); + free(bytes); + + ZXImage *zxImage = [[ZXImage alloc] initWithCGImageRef:image]; + + CFRelease(image); + return zxImage; +} + ++ (void)setColorIntensities:(int8_t *)intensities color:(CGColorRef)color { + memset(intensities, 0, 4); + + size_t numberOfComponents = CGColorGetNumberOfComponents(color); + const CGFloat *components = CGColorGetComponents(color); + + if (numberOfComponents == 4) { + for (int i = 0; i < 4; i++) { + intensities[i] = components[i] * 255; + } + } else if (numberOfComponents == 2) { + for (int i = 0; i < 3; i++) { + intensities[i] = components[0] * 255; + } + intensities[3] = components[1] * 255; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.h new file mode 100644 index 0000000..c1d10f7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * See DoCoMo's documentation http://www.nttdocomo.co.jp/english/service/imode/make/content/barcode/about/s2.html + * about the result types represented by subclasses of this class. + */ +@interface ZXAbstractDoCoMoResultParser : ZXResultParser + ++ (NSArray *)matchDoCoMoPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim; ++ (NSString *)matchSingleDoCoMoPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.m new file mode 100644 index 0000000..fc881b4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.m @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractDoCoMoResultParser.h" + +@implementation ZXAbstractDoCoMoResultParser + ++ (NSArray *)matchDoCoMoPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim { + return [self matchPrefixedField:prefix rawText:rawText endChar:';' trim:trim]; +} + ++ (NSString *)matchSingleDoCoMoPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim { + return [self matchSinglePrefixedField:prefix rawText:rawText endChar:';' trim:trim]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.h new file mode 100644 index 0000000..33700ab --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Implements KDDI AU's address book format. See http://www.au.kddi.com/ezfactory/tec/two_dimensions/index.html. + * (Thanks to Yuzo for translating!) + */ +@interface ZXAddressBookAUResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.m new file mode 100644 index 0000000..4c9f7d8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.m @@ -0,0 +1,80 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookAUResultParser.h" +#import "ZXAddressBookParsedResult.h" +#import "ZXResult.h" + +@implementation ZXAddressBookAUResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + + if ([rawText rangeOfString:@"MEMORY"].location == NSNotFound || + [rawText rangeOfString:@"\r\n"].location == NSNotFound) { + return nil; + } + + NSString *name = [[self class] matchSinglePrefixedField:@"NAME1:" rawText:rawText endChar:'\r' trim:YES]; + NSString *pronunciation = [[self class] matchSinglePrefixedField:@"NAME2:" rawText:rawText endChar:'\r' trim:YES]; + NSArray *phoneNumbers = [self matchMultipleValuePrefix:@"TEL" max:3 rawText:rawText trim:YES]; + NSArray *emails = [self matchMultipleValuePrefix:@"MAIL" max:3 rawText:rawText trim:YES]; + NSString *note = [[self class] matchSinglePrefixedField:@"MEMORY:" rawText:rawText endChar:'\r' trim:NO]; + NSString *address = [[self class] matchSinglePrefixedField:@"ADD:" rawText:rawText endChar:'\r' trim:YES]; + NSArray *addresses = address == nil ? nil : @[address]; + + return [ZXAddressBookParsedResult addressBookParsedResultWithNames:[self maybeWrap:name] + nicknames:nil + pronunciation:pronunciation + phoneNumbers:phoneNumbers + phoneTypes:nil + emails:emails + emailTypes:nil + instantMessenger:nil + note:note + addresses:addresses + addressTypes:nil + org:nil + birthday:nil + title:nil + urls:nil + geo:nil]; +} + +- (NSArray *)matchMultipleValuePrefix:(NSString *)prefix max:(int)max rawText:(NSString *)rawText trim:(BOOL)trim { + NSMutableArray *values = nil; + + for (int i = 1; i <= max; i++) { + NSString *value = [[self class] matchSinglePrefixedField:[NSString stringWithFormat:@"%@%d:", prefix, i] + rawText:rawText + endChar:'\r' + trim:trim]; + if (value == nil) { + break; + } + if (values == nil) { + values = [[NSMutableArray alloc] initWithCapacity:max]; + } + [values addObject:value]; + } + + if (values == nil) { + return nil; + } + return values; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.h new file mode 100644 index 0000000..daabf68 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.h @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractDoCoMoResultParser.h" +#import "ZXResult.h" + +/** + * Implements the "MECARD" address book entry format. + * + * Supported keys: N, SOUND, TEL, EMAIL, NOTE, ADR, BDAY, URL, plus ORG + * Unsupported keys: TEL-AV, NICKNAME + * + * Except for TEL, multiple values for keys are also not supported; + * the first one found takes precedence. + * + * Our understanding of the MECARD format is based on this document: + * + * http://www.mobicode.org.tw/files/OMIA%20Mobile%20Bar%20Code%20Standard%20v3.2.1.doc + */ +@interface ZXAddressBookDoCoMoResultParser : ZXAbstractDoCoMoResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.m new file mode 100644 index 0000000..7357473 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.m @@ -0,0 +1,75 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookDoCoMoResultParser.h" +#import "ZXAddressBookParsedResult.h" +#import "ZXResult.h" + +@implementation ZXAddressBookDoCoMoResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"MECARD:"]) { + return nil; + } + NSArray *rawName = [[self class] matchDoCoMoPrefixedField:@"N:" rawText:rawText trim:YES]; + if (rawName == nil) { + return nil; + } + NSString *name = [self parseName:rawName[0]]; + NSString *pronunciation = [[self class] matchSingleDoCoMoPrefixedField:@"SOUND:" rawText:rawText trim:YES]; + NSArray *phoneNumbers = [[self class] matchDoCoMoPrefixedField:@"TEL:" rawText:rawText trim:YES]; + NSArray *emails = [[self class] matchDoCoMoPrefixedField:@"EMAIL:" rawText:rawText trim:YES]; + NSString *note = [[self class] matchSingleDoCoMoPrefixedField:@"NOTE:" rawText:rawText trim:NO]; + NSArray *addresses = [[self class] matchDoCoMoPrefixedField:@"ADR:" rawText:rawText trim:YES]; + NSString *birthday = [[self class] matchSingleDoCoMoPrefixedField:@"BDAY:" rawText:rawText trim:YES]; + if (![[self class] isStringOfDigits:birthday length:8]) { + birthday = nil; + } + NSArray *urls = [[self class] matchDoCoMoPrefixedField:@"URL:" rawText:rawText trim:YES]; + + // Although ORG may not be strictly legal in MECARD, it does exist in VCARD and we might as well + // honor it when found in the wild. + NSString *org = [[self class] matchSingleDoCoMoPrefixedField:@"ORG:" rawText:rawText trim:YES]; + + return [ZXAddressBookParsedResult addressBookParsedResultWithNames:[self maybeWrap:name] + nicknames:nil + pronunciation:pronunciation + phoneNumbers:phoneNumbers + phoneTypes:nil + emails:emails + emailTypes:nil + instantMessenger:nil + note:note + addresses:addresses + addressTypes:nil + org:org + birthday:birthday + title:nil + urls:urls + geo:nil]; +} + +- (NSString *)parseName:(NSString *)name { + NSUInteger comma = [name rangeOfString:@","].location; + if (comma != NSNotFound) { + // Format may be last,first; switch it around + return [NSString stringWithFormat:@"%@ %@", [name substringFromIndex:comma + 1], [name substringToIndex:comma]]; + } + return name; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.h new file mode 100644 index 0000000..b05748f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.h @@ -0,0 +1,93 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXAddressBookParsedResult : ZXParsedResult + +@property (nonatomic, readonly, strong) NSArray *names; +@property (nonatomic, readonly, strong) NSArray *nicknames; + +/** + * In Japanese, the name is written in kanji, which can have multiple readings. Therefore a hint + * is often provided, called furigana, which spells the name phonetically. + * + * @return The pronunciation of the names property, often in hiragana or katakana. + */ +@property (nonatomic, readonly, copy) NSString *pronunciation; + +@property (nonatomic, readonly, strong) NSArray *phoneNumbers; + +/** + * @return optional descriptions of the type of each phone number. It could be like "HOME", but, + * there is no guaranteed or standard format. + */ +@property (nonatomic, readonly, strong) NSArray *phoneTypes; + +@property (nonatomic, readonly, strong) NSArray *emails; + +/** + * @return optional descriptions of the type of each e-mail. It could be like "WORK", but, + * there is no guaranteed or standard format. + */ +@property (nonatomic, readonly, strong) NSArray *emailTypes; + +@property (nonatomic, readonly, copy) NSString *instantMessenger; +@property (nonatomic, readonly, copy) NSString *note; +@property (nonatomic, readonly, strong) NSArray *addresses; + +/** + * @return optional descriptions of the type of each e-mail. It could be like "WORK", but, + * there is no guaranteed or standard format. + */ +@property (nonatomic, readonly, strong) NSArray *addressTypes; + +@property (nonatomic, readonly, copy) NSString *title; +@property (nonatomic, readonly, copy) NSString *org; +@property (nonatomic, readonly, strong) NSArray *urls; + +/** + * @return birthday formatted as yyyyMMdd (e.g. 19780917) + */ +@property (nonatomic, readonly, copy) NSString *birthday; + +/** + * @return a location as a latitude/longitude pair + */ +@property (nonatomic, readonly, strong) NSArray *geo; + +- (id)initWithNames:(NSArray *)names phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes; + +- (id)initWithNames:(NSArray *)names nicknames:(NSArray *)nicknames pronunciation:(NSString *)pronunciation + phoneNumbers:(NSArray *)phoneNumbers phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails + emailTypes:(NSArray *)emailTypes instantMessenger:(NSString *)instantMessenger note:(NSString *)note + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes org:(NSString *)org + birthday:(NSString *)birthday title:(NSString *)title urls:(NSArray *)urls geo:(NSArray *)geo; + ++ (id)addressBookParsedResultWithNames:(NSArray *)names phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes; + ++ (id)addressBookParsedResultWithNames:(NSArray *)names nicknames:(NSArray *)nicknames + pronunciation:(NSString *)pronunciation phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + instantMessenger:(NSString *)instantMessenger note:(NSString *)note addresses:(NSArray *)addresses + addressTypes:(NSArray *)addressTypes org:(NSString *)org birthday:(NSString *)birthday + title:(NSString *)title urls:(NSArray *)urls geo:(NSArray *)geo; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.m new file mode 100644 index 0000000..13a5e24 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.m @@ -0,0 +1,94 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookParsedResult.h" +#import "ZXParsedResultType.h" + +@implementation ZXAddressBookParsedResult + +- (id)initWithNames:(NSArray *)names phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes { + return [self initWithNames:names nicknames:nil pronunciation:nil phoneNumbers:phoneNumbers phoneTypes:phoneNumbers + emails:emails emailTypes:_emailTypes instantMessenger:nil note:nil addresses:addresses + addressTypes:addressTypes org:nil birthday:nil title:nil urls:nil geo:nil]; +} + +- (id)initWithNames:(NSArray *)names nicknames:(NSArray *)nicknames pronunciation:(NSString *)pronunciation + phoneNumbers:(NSArray *)phoneNumbers phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails + emailTypes:(NSArray *)emailTypes instantMessenger:(NSString *)instantMessenger note:(NSString *)note + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes org:(NSString *)org + birthday:(NSString *)birthday title:(NSString *)title urls:(NSArray *)urls geo:(NSArray *)geo { + if (self = [super initWithType:kParsedResultTypeAddressBook]) { + _names = names; + _nicknames = nicknames; + _pronunciation = pronunciation; + _phoneNumbers = phoneNumbers; + _phoneTypes = phoneTypes; + _emails = emails; + _emailTypes = emailTypes; + _instantMessenger = instantMessenger; + _note = note; + _addresses = addresses; + _addressTypes = addressTypes; + _org = org; + _birthday = birthday; + _title = title; + _urls = urls; + _geo = geo; + } + + return self; +} + ++ (id)addressBookParsedResultWithNames:(NSArray *)names phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + addresses:(NSArray *)addresses addressTypes:(NSArray *)addressTypes { + return [[self alloc] initWithNames:names phoneNumbers:phoneNumbers phoneTypes:phoneTypes emails:emails + emailTypes:emailTypes addresses:addresses addressTypes:addressTypes]; +} + ++ (id)addressBookParsedResultWithNames:(NSArray *)names nicknames:(NSArray *)nicknames + pronunciation:(NSString *)pronunciation phoneNumbers:(NSArray *)phoneNumbers + phoneTypes:(NSArray *)phoneTypes emails:(NSArray *)emails emailTypes:(NSArray *)emailTypes + instantMessenger:(NSString *)instantMessenger note:(NSString *)note addresses:(NSArray *)addresses + addressTypes:(NSArray *)addressTypes org:(NSString *)org birthday:(NSString *)birthday + title:(NSString *)title urls:(NSArray *)urls geo:(NSArray *)geo { + return [[self alloc] initWithNames:names nicknames:nicknames pronunciation:pronunciation phoneNumbers:phoneNumbers + phoneTypes:phoneTypes emails:emails emailTypes:emailTypes instantMessenger:instantMessenger + note:note addresses:addresses addressTypes:addressTypes org:org birthday:birthday + title:title urls:urls geo:geo]; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString string]; + [ZXParsedResult maybeAppendArray:self.names result:result]; + [ZXParsedResult maybeAppendArray:self.nicknames result:result]; + [ZXParsedResult maybeAppend:self.pronunciation result:result]; + [ZXParsedResult maybeAppend:self.title result:result]; + [ZXParsedResult maybeAppend:self.org result:result]; + [ZXParsedResult maybeAppendArray:self.addresses result:result]; + [ZXParsedResult maybeAppendArray:self.phoneNumbers result:result]; + [ZXParsedResult maybeAppendArray:self.emails result:result]; + [ZXParsedResult maybeAppend:self.instantMessenger result:result]; + [ZXParsedResult maybeAppendArray:self.urls result:result]; + [ZXParsedResult maybeAppend:self.birthday result:result]; + [ZXParsedResult maybeAppendArray:self.geo result:result]; + [ZXParsedResult maybeAppend:self.note result:result]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.h new file mode 100644 index 0000000..00eae58 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractDoCoMoResultParser.h" + +/** + * Implements the "BIZCARD" address book entry format, though this has been + * largely reverse-engineered from examples observed in the wild -- still + * looking for a definitive reference. + */ +@interface ZXBizcardResultParser : ZXAbstractDoCoMoResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.m new file mode 100644 index 0000000..f6a297c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.m @@ -0,0 +1,87 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookParsedResult.h" +#import "ZXBizcardResultParser.h" +#import "ZXResult.h" + +@implementation ZXBizcardResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"BIZCARD:"]) { + return nil; + } + NSString *firstName = [[self class] matchSingleDoCoMoPrefixedField:@"N:" rawText:rawText trim:YES]; + NSString *lastName = [[self class] matchSingleDoCoMoPrefixedField:@"X:" rawText:rawText trim:YES]; + NSString *fullName = [self buildName:firstName lastName:lastName]; + NSString *title = [[self class] matchSingleDoCoMoPrefixedField:@"T:" rawText:rawText trim:YES]; + NSString *org = [[self class] matchSingleDoCoMoPrefixedField:@"C:" rawText:rawText trim:YES]; + NSArray *addresses = [[self class] matchDoCoMoPrefixedField:@"A:" rawText:rawText trim:YES]; + NSString *phoneNumber1 = [[self class] matchSingleDoCoMoPrefixedField:@"B:" rawText:rawText trim:YES]; + NSString *phoneNumber2 = [[self class] matchSingleDoCoMoPrefixedField:@"M:" rawText:rawText trim:YES]; + NSString *phoneNumber3 = [[self class] matchSingleDoCoMoPrefixedField:@"F:" rawText:rawText trim:YES]; + NSString *email = [[self class] matchSingleDoCoMoPrefixedField:@"E:" rawText:rawText trim:YES]; + + return [ZXAddressBookParsedResult addressBookParsedResultWithNames:[self maybeWrap:fullName] + nicknames:nil + pronunciation:nil + phoneNumbers:[self buildPhoneNumbers:phoneNumber1 number2:phoneNumber2 number3:phoneNumber3] + phoneTypes:nil + emails:[self maybeWrap:email] + emailTypes:nil + instantMessenger:nil + note:nil + addresses:addresses + addressTypes:nil + org:org + birthday:nil + title:title + urls:nil + geo:nil]; +} + +- (NSArray *)buildPhoneNumbers:(NSString *)number1 number2:(NSString *)number2 number3:(NSString *)number3 { + NSMutableArray *numbers = [NSMutableArray arrayWithCapacity:3]; + if (number1 != nil) { + [numbers addObject:number1]; + } + if (number2 != nil) { + [numbers addObject:number2]; + } + if (number3 != nil) { + [numbers addObject:number3]; + } + NSUInteger size = [numbers count]; + if (size == 0) { + return nil; + } + NSMutableArray *result = [NSMutableArray arrayWithCapacity:size]; + for (int i = 0; i < size; i++) { + [result addObject:numbers[i]]; + } + return result; +} + +- (NSString *)buildName:(NSString *)firstName lastName:(NSString *)lastName { + if (firstName == nil) { + return lastName; + } else { + return lastName == nil ? firstName : [[firstName stringByAppendingString:@" "] stringByAppendingString:lastName]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.h new file mode 100644 index 0000000..bb9ca2d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractDoCoMoResultParser.h" + +@interface ZXBookmarkDoCoMoResultParser : ZXAbstractDoCoMoResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.m new file mode 100644 index 0000000..50f50a5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.m @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBookmarkDoCoMoResultParser.h" +#import "ZXResult.h" +#import "ZXURIParsedResult.h" +#import "ZXURIResultParser.h" + +@implementation ZXBookmarkDoCoMoResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [result text]; + if (![rawText hasPrefix:@"MEBKM:"]) { + return nil; + } + NSString *title = [[self class] matchSingleDoCoMoPrefixedField:@"TITLE:" rawText:rawText trim:YES]; + NSArray *rawUri = [[self class] matchDoCoMoPrefixedField:@"URL:" rawText:rawText trim:YES]; + if (rawUri == nil) { + return nil; + } + NSString *uri = rawUri[0]; + if (![ZXURIResultParser isBasicallyValidURI:uri]) { + return nil; + } + return [ZXURIParsedResult uriParsedResultWithUri:uri title:title]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.h new file mode 100644 index 0000000..c9f665e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXCalendarParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *summary; +@property (nonatomic, strong, readonly) NSDate *start; +@property (nonatomic, assign, readonly) BOOL startAllDay; +@property (nonatomic, strong, readonly) NSDate *end; +@property (nonatomic, assign, readonly) BOOL endAllDay; +@property (nonatomic, copy, readonly) NSString *location; +@property (nonatomic, copy, readonly) NSString *organizer; +@property (nonatomic, strong, readonly) NSArray *attendees; +@property (nonatomic, copy, readonly) NSString *resultDescription; +@property (nonatomic, assign, readonly) double latitude; +@property (nonatomic, assign, readonly) double longitude; + +- (id)initWithSummary:(NSString *)summary startString:(NSString *)startString endString:(NSString *)endString + durationString:(NSString *)durationString location:(NSString *)location organizer:(NSString *)organizer + attendees:(NSArray *)attendees description:(NSString *)description latitude:(double)latitude + longitude:(double)longitude; ++ (id)calendarParsedResultWithSummary:(NSString *)summary startString:(NSString *)startString + endString:(NSString *)endString durationString:(NSString *)durationString + location:(NSString *)location organizer:(NSString *)organizer + attendees:(NSArray *)attendees description:(NSString *)description latitude:(double)latitude + longitude:(double)longitude; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.m new file mode 100644 index 0000000..d439c3a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.m @@ -0,0 +1,164 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXCalendarParsedResult.h" + +static NSRegularExpression *ZX_DATE_TIME = nil; +static NSRegularExpression *ZX_RFC2445_DURATION = nil; + +const long ZX_RFC2445_DURATION_FIELD_UNITS[] = { + 7 * 24 * 60 * 60 * 1000, // 1 week + 24 * 60 * 60 * 1000, // 1 day + 60 * 60 * 1000, // 1 hour + 60 * 1000, // 1 minute + 1000, // 1 second +}; + +@implementation ZXCalendarParsedResult + ++ (void)initialize { + if ([self class] != [ZXCalendarParsedResult class]) return; + + ZX_DATE_TIME = [[NSRegularExpression alloc] initWithPattern:@"[0-9]{8}(T[0-9]{6}Z?)?" + options:0 + error:nil]; + + ZX_RFC2445_DURATION = [[NSRegularExpression alloc] initWithPattern:@"P(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?" + options:NSRegularExpressionCaseInsensitive + error:nil]; +} + +- (id)initWithSummary:(NSString *)summary startString:(NSString *)startString endString:(NSString *)endString + durationString:(NSString *)durationString location:(NSString *)location organizer:(NSString *)organizer + attendees:(NSArray *)attendees description:(NSString *)description latitude:(double)latitude + longitude:(double)longitude { + if (self = [super initWithType:kParsedResultTypeCalendar]) { + _summary = summary; + _start = [self parseDate:startString]; + + if (endString == nil) { + long durationMS = [self parseDurationMS:durationString]; + _end = durationMS < 0 ? nil : [NSDate dateWithTimeIntervalSince1970:[_start timeIntervalSince1970] + durationMS / 1000]; + } else { + _end = [self parseDate:endString]; + } + + _startAllDay = startString.length == 8; + _endAllDay = endString != nil && endString.length == 8; + + _location = location; + _organizer = organizer; + _attendees = attendees; + _resultDescription = description; + _latitude = latitude; + _longitude = longitude; + } + return self; +} + ++ (id)calendarParsedResultWithSummary:(NSString *)summary startString:(NSString *)startString + endString:(NSString *)endString durationString:(NSString *)durationString + location:(NSString *)location organizer:(NSString *)organizer + attendees:(NSArray *)attendees description:(NSString *)description latitude:(double)latitude + longitude:(double)longitude { + return [[self alloc] initWithSummary:summary startString:startString endString:endString durationString:durationString + location:location organizer:organizer attendees:attendees description:description + latitude:latitude longitude:longitude]; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:100]; + [ZXParsedResult maybeAppend:self.summary result:result]; + [ZXParsedResult maybeAppend:[self format:self.startAllDay date:self.start] result:result]; + [ZXParsedResult maybeAppend:[self format:self.endAllDay date:self.end] result:result]; + [ZXParsedResult maybeAppend:self.location result:result]; + [ZXParsedResult maybeAppend:self.organizer result:result]; + [ZXParsedResult maybeAppendArray:self.attendees result:result]; + [ZXParsedResult maybeAppend:self.description result:result]; + return result; +} + +/** + * Parses a string as a date. RFC 2445 allows the start and end fields to be of type DATE (e.g. 20081021) + * or DATE-TIME (e.g. 20081021T123000 for local time, or 20081021T123000Z for UTC). + */ +- (NSDate *)parseDate:(NSString *)when { + NSArray *matches = [ZX_DATE_TIME matchesInString:when options:0 range:NSMakeRange(0, when.length)]; + if (matches.count == 0) { + [NSException raise:NSInvalidArgumentException + format:@"Invalid date"]; + } + if (when.length == 8) { + // Show only year/month/day + return [[self buildDateFormat] dateFromString:when]; + } else { + // The when string can be local time, or UTC if it ends with a Z + if (when.length == 16 && [when characterAtIndex:15] == 'Z') { + return [[self buildDateTimeFormat] dateFromString:[when substringToIndex:15]]; + } else { + return [[self buildDateTimeFormat] dateFromString:when]; + } + } +} + +- (NSString *)format:(BOOL)allDay date:(NSDate *)date { + if (date == nil) { + return nil; + } + NSDateFormatter *format = [[NSDateFormatter alloc] init]; + format.dateFormat = allDay ? @"MMM d, yyyy" : @"MMM d, yyyy hh:mm:ss a"; + return [format stringFromDate:date]; +} + +- (long)parseDurationMS:(NSString *)durationString { + if (durationString == nil) { + return -1; + } + NSArray *m = [ZX_RFC2445_DURATION matchesInString:durationString options:0 range:NSMakeRange(0, durationString.length)]; + if (m.count == 0) { + return -1; + } + long durationMS = 0; + NSTextCheckingResult *match = m[0]; + for (int i = 0; i < sizeof(ZX_RFC2445_DURATION_FIELD_UNITS) / sizeof(long); i++) { + if ([match rangeAtIndex:i + 1].location != NSNotFound) { + NSString *fieldValue = [durationString substringWithRange:[match rangeAtIndex:i + 1]]; + if (fieldValue != nil) { + durationMS += ZX_RFC2445_DURATION_FIELD_UNITS[i] * [fieldValue intValue]; + } + } + } + return durationMS; +} + +- (NSDateFormatter *)buildDateFormat { + NSDateFormatter *format = [[NSDateFormatter alloc] init]; + format.dateFormat = @"yyyyMMdd"; + format.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; + return format; +} + +- (NSDateFormatter *)buildDateTimeFormat { + NSDateFormatter *format = [[NSDateFormatter alloc] init]; + format.dateFormat = @"yyyyMMdd'T'HHmmss"; + return format; +} + +- (NSString *)description { + return self.resultDescription; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.h new file mode 100644 index 0000000..0dd30ff --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.h @@ -0,0 +1,46 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXEmailAddressParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSArray *tos; +@property (nonatomic, copy, readonly) NSArray *ccs; +@property (nonatomic, copy, readonly) NSArray *bccs; +@property (nonatomic, copy, readonly) NSString *subject; +@property (nonatomic, copy, readonly) NSString *body; + +/** + * @return first elements of tos or nil if none + * @deprecated use tos + */ +@property (nonatomic, copy, readonly) NSString *emailAddress DEPRECATED_ATTRIBUTE; + +/** + * @return "mailto:" + * @deprecated without replacement + */ +@property (nonatomic, copy, readonly) NSString *mailtoURI DEPRECATED_ATTRIBUTE; + +- (id)initWithTo:(NSString *)to; +- (id)initWithTos:(NSArray *)tos + ccs:(NSArray *)ccs + bccs:(NSArray *)bccs + subject:(NSString *)subject + body:(NSString *)body; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.m new file mode 100644 index 0000000..f56f215 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.m @@ -0,0 +1,60 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEmailAddressParsedResult.h" +#import "ZXParsedResultType.h" + +@implementation ZXEmailAddressParsedResult + +- (id)initWithTo:(NSString *)to { + return [self initWithTos:@[to] ccs:nil bccs:nil subject:nil body:nil]; +} + +- (id)initWithTos:(NSArray *)tos + ccs:(NSArray *)ccs + bccs:(NSArray *)bccs + subject:(NSString *)subject + body:(NSString *)body { + if (self = [super initWithType:kParsedResultTypeEmailAddress]) { + _tos = tos; + _ccs = ccs; + _bccs = bccs; + _subject = subject; + _body = body; + } + + return self; +} + +- (NSString *)emailAddress { + return !self.tos || self.tos.count == 0 ? nil : self.tos[0]; +} + +- (NSString *)mailtoURI { + return @"mailto:"; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:30]; + [ZXParsedResult maybeAppendArray:self.tos result:result]; + [ZXParsedResult maybeAppendArray:self.ccs result:result]; + [ZXParsedResult maybeAppendArray:self.bccs result:result]; + [ZXParsedResult maybeAppend:self.subject result:result]; + [ZXParsedResult maybeAppend:self.body result:result]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.h new file mode 100644 index 0000000..2e7e765 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Represents a result that encodes an e-mail address, either as a plain address + * like "joe@example.org" or a mailto: URL like "mailto:joe@example.org". + */ +@interface ZXEmailAddressResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.m new file mode 100644 index 0000000..9bfb324 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.m @@ -0,0 +1,78 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEmailAddressParsedResult.h" +#import "ZXEmailAddressResultParser.h" +#import "ZXEmailDoCoMoResultParser.h" +#import "ZXResult.h" + +static NSCharacterSet *ZX_EMAIL_ADDRESS_RESULT_COMMA = nil; + +@implementation ZXEmailAddressResultParser + ++ (void)initialize { + if ([self class] != [ZXEmailAddressResultParser class]) return; + + ZX_EMAIL_ADDRESS_RESULT_COMMA = [NSCharacterSet characterSetWithCharactersInString:@","]; +} + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if ([rawText hasPrefix:@"mailto:"] || [rawText hasPrefix:@"MAILTO:"]) { + // If it starts with mailto:, assume it is definitely trying to be an email address + NSString *hostEmail = [rawText substringFromIndex:7]; + NSUInteger queryStart = [hostEmail rangeOfString:@"?"].location; + if (queryStart != NSNotFound) { + hostEmail = [hostEmail substringToIndex:queryStart]; + } + hostEmail = [[self class] urlDecode:hostEmail]; + NSArray *tos; + if (hostEmail.length > 0) { + tos = [hostEmail componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA]; + } + NSMutableDictionary *nameValues = [self parseNameValuePairs:rawText]; + NSArray *ccs; + NSArray *bccs; + NSString *subject = nil; + NSString *body = nil; + if (nameValues != nil) { + if (!tos) { + NSString *tosString = nameValues[@"to"]; + if (tosString) { + tos = [tosString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA]; + } + } + NSString *ccString = nameValues[@"cc"]; + if (ccString) { + ccs = [ccString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA]; + } + NSString *bccString = nameValues[@"bcc"]; + if (bccString) { + bccs = [bccString componentsSeparatedByCharactersInSet:ZX_EMAIL_ADDRESS_RESULT_COMMA]; + } + subject = nameValues[@"subject"]; + body = nameValues[@"body"]; + } + return [[ZXEmailAddressParsedResult alloc] initWithTos:tos ccs:ccs bccs:bccs subject:subject body:body]; + } else { + if (![ZXEmailDoCoMoResultParser isBasicallyValidEmailAddress:rawText]) { + return nil; + } + return [[ZXEmailAddressParsedResult alloc] initWithTo:rawText]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.h new file mode 100644 index 0000000..631be8e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractDoCoMoResultParser.h" + +/** + * Implements the "MATMSG" email message entry format. + * + * Supported keys: TO, SUB, BODY + */ +@interface ZXEmailDoCoMoResultParser : ZXAbstractDoCoMoResultParser + +/** + * This implements only the most basic checking for an email address's validity -- that it contains + * an '@' and contains no characters disallowed by RFC 2822. This is an overly lenient definition of + * validity. We want to generally be lenient here since this class is only intended to encapsulate what's + * in a barcode, not "judge" it. + */ ++ (BOOL)isBasicallyValidEmailAddress:(NSString *)email; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.m new file mode 100644 index 0000000..c8ca5d3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.m @@ -0,0 +1,56 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEmailAddressParsedResult.h" +#import "ZXEmailDoCoMoResultParser.h" +#import "ZXResult.h" + +static NSRegularExpression *ZX_ATEXT_ALPHANUMERIC = nil; + +@implementation ZXEmailDoCoMoResultParser + ++ (void)initialize { + if ([self class] != [ZXEmailDoCoMoResultParser class]) return; + + ZX_ATEXT_ALPHANUMERIC = [[NSRegularExpression alloc] initWithPattern:@"^[a-zA-Z0-9@.!#$%&'*+\\-/=?^_`{|}~]+$" + options:0 error:nil]; +} + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"MATMSG:"]) { + return nil; + } + NSArray *tos = [[self class] matchDoCoMoPrefixedField:@"TO:" rawText:rawText trim:YES]; + if (tos == nil) { + return nil; + } + for (NSString *to in tos) { + if (![[self class] isBasicallyValidEmailAddress:to]) { + return nil; + } + } + NSString *subject = [[self class] matchSingleDoCoMoPrefixedField:@"SUB:" rawText:rawText trim:NO]; + NSString *body = [[self class] matchSingleDoCoMoPrefixedField:@"BODY:" rawText:rawText trim:NO]; + + return [[ZXEmailAddressParsedResult alloc] initWithTos:tos ccs:nil bccs:nil subject:subject body:body]; +} + ++ (BOOL)isBasicallyValidEmailAddress:(NSString *)email { + return email != nil && [ZX_ATEXT_ALPHANUMERIC numberOfMatchesInString:email options:0 range:NSMakeRange(0, email.length)] > 0 && [email rangeOfString:@"@"].location != NSNotFound; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.h new file mode 100644 index 0000000..3341d6d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.h @@ -0,0 +1,54 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +extern NSString * const ZX_KILOGRAM; +extern NSString * const ZX_POUND; + +@interface ZXExpandedProductParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *rawText; +@property (nonatomic, copy, readonly) NSString *productID; +@property (nonatomic, copy, readonly) NSString *sscc; +@property (nonatomic, copy, readonly) NSString *lotNumber; +@property (nonatomic, copy, readonly) NSString *productionDate; +@property (nonatomic, copy, readonly) NSString *packagingDate; +@property (nonatomic, copy, readonly) NSString *bestBeforeDate; +@property (nonatomic, copy, readonly) NSString *expirationDate; +@property (nonatomic, copy, readonly) NSString *weight; +@property (nonatomic, copy, readonly) NSString *weightType; +@property (nonatomic, copy, readonly) NSString *weightIncrement; +@property (nonatomic, copy, readonly) NSString *price; +@property (nonatomic, copy, readonly) NSString *priceIncrement; +@property (nonatomic, copy, readonly) NSString *priceCurrency; +@property (nonatomic, strong, readonly) NSMutableDictionary *uncommonAIs; + +- (id)initWithRawText:(NSString *)rawText productID:(NSString *)productID sscc:(NSString *)sscc + lotNumber:(NSString *)lotNumber productionDate:(NSString *)productionDate + packagingDate:(NSString *)packagingDate bestBeforeDate:(NSString *)bestBeforeDate + expirationDate:(NSString *)expirationDate weight:(NSString *)weight weightType:(NSString *)weightType + weightIncrement:(NSString *)weightIncrement price:(NSString *)price priceIncrement:(NSString *)priceIncrement + priceCurrency:(NSString *)priceCurrency uncommonAIs:(NSMutableDictionary *)uncommonAIs; ++ (id)expandedProductParsedResultWithRawText:(NSString *)rawText productID:(NSString *)productID sscc:(NSString *)sscc + lotNumber:(NSString *)lotNumber productionDate:(NSString *)productionDate + packagingDate:(NSString *)packagingDate bestBeforeDate:(NSString *)bestBeforeDate + expirationDate:(NSString *)expirationDate weight:(NSString *)weight + weightType:(NSString *)weightType weightIncrement:(NSString *)weightIncrement + price:(NSString *)price priceIncrement:(NSString *)priceIncrement + priceCurrency:(NSString *)priceCurrency uncommonAIs:(NSMutableDictionary *)uncommonAIs; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.m new file mode 100644 index 0000000..f217dc8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.m @@ -0,0 +1,119 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXExpandedProductParsedResult.h" + +NSString * const ZX_KILOGRAM = @"KG"; +NSString * const ZX_POUND = @"LB"; + +@implementation ZXExpandedProductParsedResult + +- (id)init { + return [self initWithRawText:@"" productID:@"" sscc:@"" lotNumber:@"" productionDate:@"" packagingDate:@"" + bestBeforeDate:@"" expirationDate:@"" weight:@"" weightType:@"" weightIncrement:@"" price:@"" + priceIncrement:@"" priceCurrency:@"" uncommonAIs:[NSMutableDictionary dictionary]]; +} + +- (id)initWithRawText:(NSString *)rawText productID:(NSString *)productID sscc:(NSString *)sscc + lotNumber:(NSString *)lotNumber productionDate:(NSString *)productionDate + packagingDate:(NSString *)packagingDate bestBeforeDate:(NSString *)bestBeforeDate + expirationDate:(NSString *)expirationDate weight:(NSString *)weight weightType:(NSString *)weightType + weightIncrement:(NSString *)weightIncrement price:(NSString *)price priceIncrement:(NSString *)priceIncrement + priceCurrency:(NSString *)priceCurrency uncommonAIs:(NSMutableDictionary *)uncommonAIs { + if (self = [super initWithType:kParsedResultTypeProduct]) { + _rawText = rawText; + _productID = productID; + _sscc = sscc; + _lotNumber = lotNumber; + _productionDate = productionDate; + _packagingDate = packagingDate; + _bestBeforeDate = bestBeforeDate; + _expirationDate = expirationDate; + _weight = weight; + _weightType = weightType; + _weightIncrement = weightIncrement; + _price = price; + _priceIncrement = priceIncrement; + _priceCurrency = priceCurrency; + _uncommonAIs = uncommonAIs; + } + + return self; +} + ++ (id)expandedProductParsedResultWithRawText:(NSString *)rawText productID:(NSString *)productID sscc:(NSString *)sscc + lotNumber:(NSString *)lotNumber productionDate:(NSString *)productionDate + packagingDate:(NSString *)packagingDate bestBeforeDate:(NSString *)bestBeforeDate + expirationDate:(NSString *)expirationDate weight:(NSString *)weight + weightType:(NSString *)weightType weightIncrement:(NSString *)weightIncrement + price:(NSString *)price priceIncrement:(NSString *)priceIncrement + priceCurrency:(NSString *)priceCurrency uncommonAIs:(NSMutableDictionary *)uncommonAIs { + return [[self alloc] initWithRawText:rawText productID:productID sscc:sscc lotNumber:lotNumber + productionDate:productionDate packagingDate:packagingDate bestBeforeDate:bestBeforeDate + expirationDate:expirationDate weight:weight weightType:weightType + weightIncrement:weightIncrement price:price priceIncrement:priceIncrement + priceCurrency:priceCurrency uncommonAIs:uncommonAIs]; +} + +- (BOOL)isEqual:(id)o { + if (![o isKindOfClass:[self class]]) { + return NO; + } + + ZXExpandedProductParsedResult *other = (ZXExpandedProductParsedResult *)o; + + return [self equalsOrNil:self.productID o2:other.productID] + && [self equalsOrNil:self.sscc o2:other.sscc] + && [self equalsOrNil:self.lotNumber o2:other.lotNumber] + && [self equalsOrNil:self.productionDate o2:other.productionDate] + && [self equalsOrNil:self.bestBeforeDate o2:other.bestBeforeDate] + && [self equalsOrNil:self.expirationDate o2:other.expirationDate] + && [self equalsOrNil:self.weight o2:other.weight] + && [self equalsOrNil:self.weightType o2:other.weightType] + && [self equalsOrNil:self.weightIncrement o2:other.weightIncrement] + && [self equalsOrNil:self.price o2:other.price] + && [self equalsOrNil:self.priceIncrement o2:other.priceIncrement] + && [self equalsOrNil:self.priceCurrency o2:other.priceCurrency] + && [self equalsOrNil:self.uncommonAIs o2:other.uncommonAIs]; +} + +- (BOOL)equalsOrNil:(id)o1 o2:(id)o2 { + return o1 == nil ? o2 == nil : [o1 isEqual:o2]; +} + +- (NSUInteger)hash { + int hash = 0; + hash ^= [self.productID hash]; + hash ^= [self.sscc hash]; + hash ^= [self.lotNumber hash]; + hash ^= [self.productionDate hash]; + hash ^= [self.bestBeforeDate hash]; + hash ^= [self.expirationDate hash]; + hash ^= [self.weight hash]; + hash ^= [self.weightType hash]; + hash ^= [self.weightIncrement hash]; + hash ^= [self.price hash]; + hash ^= [self.priceIncrement hash]; + hash ^= [self.priceCurrency hash]; + hash ^= [self.uncommonAIs hash]; + return hash; +} + +- (NSString *)displayResult { + return self.rawText; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.h new file mode 100644 index 0000000..195c82d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses strings of digits that represent a RSS Extended code. + */ +@interface ZXExpandedProductResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.m new file mode 100644 index 0000000..4b76560 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.m @@ -0,0 +1,162 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXExpandedProductResultParser.h" +#import "ZXExpandedProductParsedResult.h" +#import "ZXResult.h" + +@implementation ZXExpandedProductResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + ZXBarcodeFormat format = [result barcodeFormat]; + if (kBarcodeFormatRSSExpanded != format) { + // ExtendedProductParsedResult NOT created. Not a RSS Expanded barcode + return nil; + } + NSString *rawText = [ZXResultParser massagedText:result]; + + NSString *productID = nil; + NSString *sscc = nil; + NSString *lotNumber = nil; + NSString *productionDate = nil; + NSString *packagingDate = nil; + NSString *bestBeforeDate = nil; + NSString *expirationDate = nil; + NSString *weight = nil; + NSString *weightType = nil; + NSString *weightIncrement = nil; + NSString *price = nil; + NSString *priceIncrement = nil; + NSString *priceCurrency = nil; + NSMutableDictionary *uncommonAIs = [NSMutableDictionary dictionary]; + + int i = 0; + + while (i < [rawText length]) { + NSString *ai = [self findAIvalue:i rawText:rawText]; + if (ai == nil) { + // Error. Code doesn't match with RSS expanded pattern + // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern + return nil; + } + i += [ai length] + 2; + NSString *value = [self findValue:i rawText:rawText]; + i += [value length]; + + if ([@"00" isEqualToString:ai]) { + sscc = value; + } else if ([@"01" isEqualToString:ai]) { + productID = value; + } else if ([@"10" isEqualToString:ai]) { + lotNumber = value; + } else if ([@"11" isEqualToString:ai]) { + productionDate = value; + } else if ([@"13" isEqualToString:ai]) { + packagingDate = value; + } else if ([@"15" isEqualToString:ai]) { + bestBeforeDate = value; + } else if ([@"17" isEqualToString:ai]) { + expirationDate = value; + } else if ([@"3100" isEqualToString:ai] || [@"3101" isEqualToString:ai] || [@"3102" isEqualToString:ai] || [@"3103" isEqualToString:ai] || [@"3104" isEqualToString:ai] || [@"3105" isEqualToString:ai] || [@"3106" isEqualToString:ai] || [@"3107" isEqualToString:ai] || [@"3108" isEqualToString:ai] || [@"3109" isEqualToString:ai]) { + weight = value; + weightType = ZX_KILOGRAM; + weightIncrement = [ai substringFromIndex:3]; + } else if ([@"3200" isEqualToString:ai] || [@"3201" isEqualToString:ai] || [@"3202" isEqualToString:ai] || [@"3203" isEqualToString:ai] || [@"3204" isEqualToString:ai] || [@"3205" isEqualToString:ai] || [@"3206" isEqualToString:ai] || [@"3207" isEqualToString:ai] || [@"3208" isEqualToString:ai] || [@"3209" isEqualToString:ai]) { + weight = value; + weightType = ZX_POUND; + weightIncrement = [ai substringFromIndex:3]; + } else if ([@"3920" isEqualToString:ai] || [@"3921" isEqualToString:ai] || [@"3922" isEqualToString:ai] || [@"3923" isEqualToString:ai]) { + price = value; + priceIncrement = [ai substringFromIndex:3]; + } else if ([@"3930" isEqualToString:ai] || [@"3931" isEqualToString:ai] || [@"3932" isEqualToString:ai] || [@"3933" isEqualToString:ai]) { + if ([value length] < 4) { + // The value must have more of 3 symbols (3 for currency and + // 1 at least for the price) + // ExtendedProductParsedResult NOT created. Not match with RSS Expanded pattern + return nil; + } + price = [value substringFromIndex:3]; + priceCurrency = [value substringToIndex:3]; + priceIncrement = [ai substringFromIndex:3]; + } else { + // No match with common AIs + uncommonAIs[ai] = value; + } + } + + return [ZXExpandedProductParsedResult expandedProductParsedResultWithRawText:rawText + productID:productID + sscc:sscc + lotNumber:lotNumber + productionDate:productionDate + packagingDate:packagingDate + bestBeforeDate:bestBeforeDate + expirationDate:expirationDate + weight:weight + weightType:weightType + weightIncrement:weightIncrement + price:price + priceIncrement:priceIncrement + priceCurrency:priceCurrency + uncommonAIs:uncommonAIs]; +} + +- (NSString *)findAIvalue:(int)i rawText:(NSString *)rawText { + unichar c = [rawText characterAtIndex:i]; + // First character must be a open parenthesis.If not, ERROR + if (c != '(') { + return nil; + } + + NSString *rawTextAux = [rawText substringFromIndex:i + 1]; + + NSMutableString *buf = [NSMutableString string]; + for (int index = 0; index < [rawTextAux length]; index++) { + unichar currentChar = [rawTextAux characterAtIndex:index]; + if (currentChar == ')') { + return buf; + } else if (currentChar >= '0' && currentChar <= '9') { + [buf appendFormat:@"%C", currentChar]; + } else { + return nil; + } + } + return buf; +} + +- (NSString *)findValue:(int)i rawText:(NSString *)rawText { + NSMutableString *buf = [NSMutableString string]; + NSString *rawTextAux = [rawText substringFromIndex:i]; + + for (int index = 0; index < [rawTextAux length]; index++) { + unichar c = [rawTextAux characterAtIndex:index]; + if (c == '(') { + // We look for a new AI. If it doesn't exist (ERROR), we coninue + // with the iteration + if ([self findAIvalue:index rawText:rawTextAux] == nil) { + [buf appendString:@"("]; + } else { + break; + } + } else { + [buf appendFormat:@"%C", c]; + } + } + + return buf; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.h new file mode 100644 index 0000000..3f4c354 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXGeoParsedResult : ZXParsedResult + +/** + * @return latitude in degrees + */ +@property (nonatomic, assign, readonly) double latitude; + +/** + * @return longitude in degrees + */ +@property (nonatomic, assign, readonly) double longitude; + +/** + * @return altitude in meters. If not specified, in the geo URI, returns 0.0 + */ +@property (nonatomic, assign, readonly) double altitude; + +/** + * @return query string associated with geo URI or null if none exists + */ +@property (nonatomic, copy, readonly) NSString *query; + +- (id)initWithLatitude:(double)latitude longitude:(double)longitude altitude:(double)altitude query:(NSString *)query; ++ (id)geoParsedResultWithLatitude:(double)latitude longitude:(double)longitude altitude:(double)altitude query:(NSString *)query; +- (NSString *)geoURI; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.m new file mode 100644 index 0000000..d2ec38b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.m @@ -0,0 +1,62 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGeoParsedResult.h" +#import "ZXParsedResultType.h" + +@implementation ZXGeoParsedResult + +- (id)initWithLatitude:(double)latitude longitude:(double)longitude altitude:(double)altitude query:(NSString *)query { + if (self = [super initWithType:kParsedResultTypeGeo]) { + _latitude = latitude; + _longitude = longitude; + _altitude = altitude; + _query = query; + } + + return self; +} + ++ (id)geoParsedResultWithLatitude:(double)latitude longitude:(double)longitude altitude:(double)altitude query:(NSString *)query { + return [[self alloc] initWithLatitude:latitude longitude:longitude altitude:altitude query:query]; +} + +- (NSString *)geoURI { + NSMutableString *result = [NSMutableString string]; + [result appendFormat:@"geo:%f,%f", self.latitude, self.longitude]; + if (self.altitude > 0) { + [result appendFormat:@",%f", self.altitude]; + } + if (self.query != nil) { + [result appendFormat:@"?%@", self.query]; + } + return result; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString string]; + [result appendFormat:@"%f, %f", self.latitude, self.longitude]; + if (self.altitude > 0.0) { + [result appendFormat:@", %f", self.altitude]; + [result appendString:@"m"]; + } + if (self.query != nil) { + [result appendFormat:@" (%@)", self.query]; + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.h new file mode 100644 index 0000000..9b16e3d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses a "geo:" URI result, which specifies a location on the surface of + * the Earth as well as an optional altitude above the surface. See + * http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00. + */ +@interface ZXGeoResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.m new file mode 100644 index 0000000..732a63d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.m @@ -0,0 +1,70 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGeoParsedResult.h" +#import "ZXGeoResultParser.h" + +static NSRegularExpression *ZX_GEO_URL_PATTERN = nil; + +@implementation ZXGeoResultParser + ++ (void)initialize { + if ([self class] != [ZXGeoResultParser class]) return; + + ZX_GEO_URL_PATTERN = [[NSRegularExpression alloc] initWithPattern:@"geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?" + options:NSRegularExpressionCaseInsensitive error:nil]; + +} + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (rawText == nil || (![rawText hasPrefix:@"geo:"] && ![rawText hasPrefix:@"GEO:"])) { + return nil; + } + + NSArray *matches = [ZX_GEO_URL_PATTERN matchesInString:rawText options:0 range:NSMakeRange(0, rawText.length)]; + if (matches.count == 0) { + return nil; + } + + NSTextCheckingResult *match = matches[0]; + NSString *query = nil; + if ([match rangeAtIndex:4].location != NSNotFound) { + query = [rawText substringWithRange:[match rangeAtIndex:4]]; + } + + double latitude = [[rawText substringWithRange:[match rangeAtIndex:1]] doubleValue]; + if (latitude > 90.0 || latitude < -90.0) { + return nil; + } + double longitude = [[rawText substringWithRange:[match rangeAtIndex:2]] doubleValue]; + if (longitude > 180.0 || longitude < -180.0) { + return nil; + } + double altitude; + if ([match rangeAtIndex:3].location == NSNotFound) { + altitude = 0.0; + } else { + altitude = [[rawText substringWithRange:[match rangeAtIndex:3]] doubleValue]; + if (altitude < 0.0) { + return nil; + } + } + + return [ZXGeoParsedResult geoParsedResultWithLatitude:latitude longitude:longitude altitude:altitude query:query]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.h new file mode 100644 index 0000000..76adecb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXISBNParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *isbn; + +- (id)initWithIsbn:(NSString *)isbn; ++ (id)isbnParsedResultWithIsbn:(NSString *)isbn; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.m new file mode 100644 index 0000000..22f2aab --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.m @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXISBNParsedResult.h" + +@implementation ZXISBNParsedResult + +- (id)initWithIsbn:(NSString *)isbn { + if (self = [super initWithType:kParsedResultTypeISBN]) { + _isbn = isbn; + } + + return self; +} + ++ (id)isbnParsedResultWithIsbn:(NSString *)isbn { + return [[self alloc] initWithIsbn:isbn]; +} + +- (NSString *)displayResult { + return self.isbn; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.h new file mode 100644 index 0000000..d364e1e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses strings of digits that represent a ISBN. + */ +@interface ZXISBNResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.m new file mode 100644 index 0000000..696d70d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.m @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXISBNParsedResult.h" +#import "ZXISBNResultParser.h" + +@implementation ZXISBNResultParser + +/** + * See ISBN-13 For Dummies + */ +- (ZXParsedResult *)parse:(ZXResult *)result { + ZXBarcodeFormat format = [result barcodeFormat]; + if (format != kBarcodeFormatEan13) { + return nil; + } + NSString *rawText = [ZXResultParser massagedText:result]; + NSUInteger length = [rawText length]; + if (length != 13) { + return nil; + } + if (![rawText hasPrefix:@"978"] && ![rawText hasPrefix:@"979"]) { + return nil; + } + return [ZXISBNParsedResult isbnParsedResultWithIsbn:rawText]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.h new file mode 100644 index 0000000..50691cf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResultType.h" +#import "ZXResult.h" + +/** + * Abstract class representing the result of decoding a barcode, as more than + * a String -- as some type of structured data. This might be a subclass which represents + * a URL, or an e-mail address. parseResult() will turn a raw + * decoded string into the most appropriate type of structured representation. + * + * Thanks to Jeff Griffin for proposing rewrite of these classes that relies less + * on exception-based mechanisms during parsing. + */ +@interface ZXParsedResult : NSObject + +@property (nonatomic, assign, readonly) ZXParsedResultType type; + +- (id)initWithType:(ZXParsedResultType)type; ++ (id)parsedResultWithType:(ZXParsedResultType)type; +- (NSString *)displayResult; ++ (void)maybeAppend:(NSString *)value result:(NSMutableString *)result; ++ (void)maybeAppendArray:(NSArray *)value result:(NSMutableString *)result; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.m new file mode 100644 index 0000000..5a363a1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.m @@ -0,0 +1,61 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@implementation ZXParsedResult + +- (id)initWithType:(ZXParsedResultType)type { + if (self = [super init]) { + _type = type; + } + + return self; +} + ++ (id)parsedResultWithType:(ZXParsedResultType)type { + return [[ZXParsedResult alloc] initWithType:type]; +} + +- (NSString *)displayResult { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (NSString *)description { + return [self displayResult]; +} + ++ (void)maybeAppend:(NSString *)value result:(NSMutableString *)result { + if (value != nil && (id)value != [NSNull null] && [value length] > 0) { + // Don't add a newline before the first value + if ([result length] > 0) { + [result appendString:@"\n"]; + } + [result appendString:value]; + } +} + ++ (void)maybeAppendArray:(NSArray *)values result:(NSMutableString *)result { + if (values != nil) { + for (NSString *value in values) { + [self maybeAppend:value result:result]; + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResultType.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResultType.h new file mode 100644 index 0000000..cdb375c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResultType.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Represents the type of data encoded by a barcode -- from plain text, to a + * URI, to an e-mail address, etc. + */ +typedef enum { + kParsedResultTypeAddressBook, + kParsedResultTypeEmailAddress, + kParsedResultTypeProduct, + kParsedResultTypeURI, + kParsedResultTypeText, + kParsedResultTypeAndroidIntent, + kParsedResultTypeGeo, + kParsedResultTypeTel, + kParsedResultTypeSMS, + kParsedResultTypeCalendar, + kParsedResultTypeWifi, + kParsedResultTypeNDEFSMartPoster, + kParsedResultTypeMobiletagRichWeb, + kParsedResultTypeISBN, + kParsedResultTypeVIN +} ZXParsedResultType; diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.h new file mode 100644 index 0000000..b2039c0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXProductParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *normalizedProductID; +@property (nonatomic, copy, readonly) NSString *productID; + +- (id)initWithProductID:(NSString *)productID; +- (id)initWithProductID:(NSString *)productID normalizedProductID:(NSString *)normalizedProductID; ++ (id)productParsedResultWithProductID:(NSString *)productID; ++ (id)productParsedResultWithProductID:(NSString *)productID normalizedProductID:(NSString *)normalizedProductID; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.m new file mode 100644 index 0000000..5fa5371 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.m @@ -0,0 +1,46 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXProductParsedResult.h" + +@implementation ZXProductParsedResult + +- (id)initWithProductID:(NSString *)productID { + return [self initWithProductID:productID normalizedProductID:productID]; +} + +- (id)initWithProductID:(NSString *)productID normalizedProductID:(NSString *)normalizedProductID { + if (self = [super initWithType:kParsedResultTypeProduct]) { + _normalizedProductID = normalizedProductID; + _productID = productID; + } + + return self; +} + ++ (id)productParsedResultWithProductID:(NSString *)productID { + return [[self alloc] initWithProductID:productID]; +} + ++ (id)productParsedResultWithProductID:(NSString *)productID normalizedProductID:(NSString *)normalizedProductID { + return [[self alloc] initWithProductID:productID normalizedProductID:normalizedProductID]; +} + +- (NSString *)displayResult { + return self.productID; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.h new file mode 100644 index 0000000..4954a40 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses strings of digits that represent a UPC code. + */ +@interface ZXProductResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.m new file mode 100644 index 0000000..a20446d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.m @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXProductParsedResult.h" +#import "ZXProductResultParser.h" +#import "ZXUPCEReader.h" + +@implementation ZXProductResultParser + +// Treat all UPC and EAN variants as UPCs, in the sense that they are all product barcodes. +- (ZXParsedResult *)parse:(ZXResult *)result { + ZXBarcodeFormat format = [result barcodeFormat]; + if (!(format == kBarcodeFormatUPCA || format == kBarcodeFormatUPCE || format == kBarcodeFormatEan8 || format == kBarcodeFormatEan13)) { + return nil; + } + NSString *rawText = [ZXResultParser massagedText:result]; + if (![[self class] isStringOfDigits:rawText length:(unsigned int)[rawText length]]) { + return nil; + } + // Not actually checking the checksum again here + + NSString *normalizedProductID; + if (format == kBarcodeFormatUPCE && [rawText length] == 8) { + normalizedProductID = [ZXUPCEReader convertUPCEtoUPCA:rawText]; + } else { + normalizedProductID = rawText; + } + return [ZXProductParsedResult productParsedResultWithProductID:rawText normalizedProductID:normalizedProductID]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.h new file mode 100644 index 0000000..688a438 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.h @@ -0,0 +1,50 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXParsedResult, ZXResult; + +/** + * Abstract class representing the result of decoding a barcode, as more than + * a String -- as some type of structured data. This might be a subclass which represents + * a URL, or an e-mail address. parseResult() will turn a raw + * decoded string into the most appropriate type of structured representation. + * + * Thanks to Jeff Griffin for proposing rewrite of these classes that relies less + * on exception-based mechanisms during parsing. + */ +@interface ZXResultParser : NSObject + +/** + * Attempts to parse the raw ZXResult's contents as a particular type + * of information (email, URL, etc.) and return a ZXParsedResult encapsulating + * the result of parsing. + */ +- (ZXParsedResult *)parse:(ZXResult *)result; + ++ (NSString *)massagedText:(ZXResult *)result; ++ (ZXParsedResult *)parseResult:(ZXResult *)theResult; +- (void)maybeAppend:(NSString *)value result:(NSMutableString *)result; +- (void)maybeAppendArray:(NSArray *)value result:(NSMutableString *)result; +- (NSArray *)maybeWrap:(NSString *)value; ++ (BOOL)isStringOfDigits:(NSString *)value length:(unsigned int)length; ++ (BOOL)isSubstringOfDigits:(NSString *)value offset:(int)offset length:(int)length; ++ (int)parseHexDigit:(unichar)c; +- (NSMutableDictionary *)parseNameValuePairs:(NSString *)uri; ++ (NSString *)urlDecode:(NSString *)encoded; ++ (NSArray *)matchPrefixedField:(NSString *)prefix rawText:(NSString *)rawText endChar:(unichar)endChar trim:(BOOL)trim; ++ (NSString *)matchSinglePrefixedField:(NSString *)prefix rawText:(NSString *)rawText endChar:(unichar)endChar trim:(BOOL)trim; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.m new file mode 100644 index 0000000..8981f7e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.m @@ -0,0 +1,317 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookAUResultParser.h" +#import "ZXAddressBookDoCoMoResultParser.h" +#import "ZXAddressBookParsedResult.h" +#import "ZXBizcardResultParser.h" +#import "ZXBookmarkDoCoMoResultParser.h" +#import "ZXCalendarParsedResult.h" +#import "ZXEmailAddressParsedResult.h" +#import "ZXEmailAddressResultParser.h" +#import "ZXEmailDoCoMoResultParser.h" +#import "ZXExpandedProductParsedResult.h" +#import "ZXExpandedProductResultParser.h" +#import "ZXGeoParsedResult.h" +#import "ZXGeoResultParser.h" +#import "ZXISBNParsedResult.h" +#import "ZXISBNResultParser.h" +#import "ZXParsedResult.h" +#import "ZXProductParsedResult.h" +#import "ZXProductResultParser.h" +#import "ZXResult.h" +#import "ZXResultParser.h" +#import "ZXSMSMMSResultParser.h" +#import "ZXSMSParsedResult.h" +#import "ZXSMSTOMMSTOResultParser.h" +#import "ZXSMTPResultParser.h" +#import "ZXTelParsedResult.h" +#import "ZXTelResultParser.h" +#import "ZXTextParsedResult.h" +#import "ZXURIParsedResult.h" +#import "ZXURIResultParser.h" +#import "ZXURLTOResultParser.h" +#import "ZXVCardResultParser.h" +#import "ZXVEventResultParser.h" +#import "ZXVINResultParser.h" +#import "ZXWifiParsedResult.h" +#import "ZXWifiResultParser.h" + +static NSArray *ZX_PARSERS = nil; +static NSRegularExpression *ZX_DIGITS = nil; +static NSString *ZX_AMPERSAND = @"&"; +static NSString *ZX_EQUALS = @"="; +static unichar ZX_BYTE_ORDER_MARK = L'\ufeff'; + +@implementation ZXResultParser + ++ (void)initialize { + if ([self class] != [ZXResultParser class]) return; + + ZX_PARSERS = @[[[ZXBookmarkDoCoMoResultParser alloc] init], + [[ZXAddressBookDoCoMoResultParser alloc] init], + [[ZXEmailDoCoMoResultParser alloc] init], + [[ZXAddressBookAUResultParser alloc] init], + [[ZXVCardResultParser alloc] init], + [[ZXBizcardResultParser alloc] init], + [[ZXVEventResultParser alloc] init], + [[ZXEmailAddressResultParser alloc] init], + [[ZXSMTPResultParser alloc] init], + [[ZXTelResultParser alloc] init], + [[ZXSMSMMSResultParser alloc] init], + [[ZXSMSTOMMSTOResultParser alloc] init], + [[ZXGeoResultParser alloc] init], + [[ZXWifiResultParser alloc] init], + [[ZXURLTOResultParser alloc] init], + [[ZXURIResultParser alloc] init], + [[ZXISBNResultParser alloc] init], + [[ZXProductResultParser alloc] init], + [[ZXExpandedProductResultParser alloc] init], + [[ZXVINResultParser alloc] init]]; + ZX_DIGITS = [[NSRegularExpression alloc] initWithPattern:@"^\\d+$" options:0 error:nil]; +} + +- (ZXParsedResult *)parse:(ZXResult *)result { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + ++ (NSString *)massagedText:(ZXResult *)result { + NSString *text = result.text; + if (text.length > 0 && [text characterAtIndex:0] == ZX_BYTE_ORDER_MARK) { + text = [text substringFromIndex:1]; + } + return text; +} + ++ (ZXParsedResult *)parseResult:(ZXResult *)theResult { + for (ZXResultParser *parser in ZX_PARSERS) { + ZXParsedResult *result = [parser parse:theResult]; + if (result != nil) { + return result; + } + } + return [ZXTextParsedResult textParsedResultWithText:[theResult text] language:nil]; +} + +- (void)maybeAppend:(NSString *)value result:(NSMutableString *)result { + if (value != nil) { + [result appendFormat:@"\n%@", value]; + } +} + +- (void)maybeAppendArray:(NSArray *)value result:(NSMutableString *)result { + if (value != nil) { + for (NSString *s in value) { + [result appendFormat:@"\n%@", s]; + } + } +} + +- (NSArray *)maybeWrap:(NSString *)value { + return value == nil ? nil : @[value]; +} + ++ (NSString *)unescapeBackslash:(NSString *)escaped { + NSUInteger backslash = [escaped rangeOfString:@"\\"].location; + if (backslash == NSNotFound) { + return escaped; + } + NSUInteger max = [escaped length]; + NSMutableString *unescaped = [NSMutableString stringWithCapacity:max - 1]; + [unescaped appendString:[escaped substringToIndex:backslash]]; + BOOL nextIsEscaped = NO; + for (int i = (int)backslash; i < max; i++) { + unichar c = [escaped characterAtIndex:i]; + if (nextIsEscaped || c != '\\') { + [unescaped appendFormat:@"%C", c]; + nextIsEscaped = NO; + } else { + nextIsEscaped = YES; + } + } + return unescaped; +} + ++ (int)parseHexDigit:(unichar)c { + if (c >= '0' && c <= '9') { + return c - '0'; + } + if (c >= 'a' && c <= 'f') { + return 10 + (c - 'a'); + } + if (c >= 'A' && c <= 'F') { + return 10 + (c - 'A'); + } + return -1; +} + ++ (BOOL)isStringOfDigits:(NSString *)value length:(unsigned int)length { + return value != nil && length > 0 && length == value.length && [ZX_DIGITS numberOfMatchesInString:value options:0 range:NSMakeRange(0, value.length)] > 0; +} + +- (NSString *)urlDecode:(NSString *)escaped { + if (escaped == nil) { + return nil; + } + + int first = [self findFirstEscape:escaped]; + if (first == -1) { + return escaped; + } + + NSUInteger max = [escaped length]; + NSMutableString *unescaped = [NSMutableString stringWithCapacity:max - 2]; + [unescaped appendString:[escaped substringToIndex:first]]; + + for (int i = first; i < max; i++) { + unichar c = [escaped characterAtIndex:i]; + switch (c) { + case '+': + [unescaped appendString:@" "]; + break; + case '%': + if (i >= max - 2) { + [unescaped appendString:@"%"]; + } else { + int firstDigitValue = [[self class] parseHexDigit:[escaped characterAtIndex:++i]]; + int secondDigitValue = [[self class] parseHexDigit:[escaped characterAtIndex:++i]]; + if (firstDigitValue < 0 || secondDigitValue < 0) { + [unescaped appendFormat:@"%%%C%C", [escaped characterAtIndex:i - 1], [escaped characterAtIndex:i]]; + } + [unescaped appendFormat:@"%C", (unichar)((firstDigitValue << 4) + secondDigitValue)]; + } + break; + default: + [unescaped appendFormat:@"%C", c]; + break; + } + } + + return unescaped; +} + +- (int)findFirstEscape:(NSString *)escaped { + NSUInteger max = [escaped length]; + for (int i = 0; i < max; i++) { + unichar c = [escaped characterAtIndex:i]; + if (c == '+' || c == '%') { + return i; + } + } + + return -1; +} + ++ (BOOL)isSubstringOfDigits:(NSString *)value offset:(int)offset length:(int)length { + if (value == nil || length <= 0) { + return NO; + } + int max = offset + length; + return value.length >= max && [ZX_DIGITS numberOfMatchesInString:value options:0 range:NSMakeRange(offset, max - offset)] > 0; +} + +- (NSMutableDictionary *)parseNameValuePairs:(NSString *)uri { + NSUInteger paramStart = [uri rangeOfString:@"?"].location; + if (paramStart == NSNotFound) { + return nil; + } + NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:3]; + for (NSString *keyValue in [[uri substringFromIndex:paramStart + 1] componentsSeparatedByString:ZX_AMPERSAND]) { + [self appendKeyValue:keyValue result:result]; + } + return result; +} + +- (void)appendKeyValue:(NSString *)keyValue result:(NSMutableDictionary *)result { + NSRange equalsRange = [keyValue rangeOfString:ZX_EQUALS]; + if (equalsRange.location != NSNotFound) { + NSString *key = [keyValue substringToIndex:equalsRange.location]; + NSString *value = [keyValue substringFromIndex:equalsRange.location + 1]; + value = [self urlDecode:value]; + result[key] = value; + } +} + ++ (NSString *)urlDecode:(NSString *)encoded { + NSString *result = [encoded stringByReplacingOccurrencesOfString:@"+" withString:@" "]; + result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + return result; +} + ++ (NSArray *)matchPrefixedField:(NSString *)prefix rawText:(NSString *)rawText endChar:(unichar)endChar trim:(BOOL)trim { + NSMutableArray *matches = nil; + NSUInteger i = 0; + NSUInteger max = [rawText length]; + while (i < max) { + i = [rawText rangeOfString:prefix options:NSLiteralSearch range:NSMakeRange(i, [rawText length] - i - 1)].location; + if (i == NSNotFound) { + break; + } + i += [prefix length]; // Skip past this prefix we found to start + NSUInteger start = i; // Found the start of a match here + BOOL more = YES; + while (more) { + i = [rawText rangeOfString:[NSString stringWithFormat:@"%C", endChar] options:NSLiteralSearch range:NSMakeRange(i, [rawText length] - i)].location; + if (i == NSNotFound) { + // No terminating end character? uh, done. Set i such that loop terminates and break + i = [rawText length]; + more = NO; + } else if ([self countPrecedingBackslashes:rawText pos:i] % 2 != 0) { + // semicolon was escaped (odd count of preceding backslashes) so continue + i++; + } else { + // found a match + if (matches == nil) { + matches = [NSMutableArray arrayWithCapacity:3]; // lazy init + } + NSString *element = [self unescapeBackslash:[rawText substringWithRange:NSMakeRange(start, i - start)]]; + if (trim) { + element = [element stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + if (element.length > 0) { + [matches addObject:element]; + } + i++; + more = NO; + } + } + } + if (matches == nil || [matches count] == 0) { + return nil; + } + return matches; +} + ++ (int)countPrecedingBackslashes:(NSString *)s pos:(NSInteger)pos { + int count = 0; + for (NSInteger i = pos - 1; i >= 0; i--) { + if ([s characterAtIndex:i] == '\\') { + count++; + } else { + break; + } + } + return count; +} + ++ (NSString *)matchSinglePrefixedField:(NSString *)prefix rawText:(NSString *)rawText endChar:(unichar)endChar trim:(BOOL)trim { + NSArray *matches = [self matchPrefixedField:prefix rawText:rawText endChar:endChar trim:trim]; + return matches == nil ? nil : matches[0]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.h new file mode 100644 index 0000000..be2ec7f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses an "sms:" URI result, which specifies a number to SMS. + * See http://tools.ietf.org/html/rfc5724 on this. + * + * This class supports "via" syntax for numbers, which is not part of the spec. + * For example "+12125551212;via=+12124440101" may appear as a number. + * It also supports a "subject" query parameter, which is not mentioned in the spec. + * These are included since they were mentioned in earlier IETF drafts and might be + * used. + * + * This actually also parses URIs starting with "mms:" and treats them all the same way, + * and effectively converts them to an "sms:" URI for purposes of forwarding to the platform. + */ +@interface ZXSMSMMSResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.m new file mode 100644 index 0000000..6510b50 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.m @@ -0,0 +1,83 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResult.h" +#import "ZXSMSMMSResultParser.h" +#import "ZXSMSParsedResult.h" + +@implementation ZXSMSMMSResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (!([rawText hasPrefix:@"sms:"] || [rawText hasPrefix:@"SMS:"] || [rawText hasPrefix:@"mms:"] || [rawText hasPrefix:@"MMS:"])) { + return nil; + } + + // Check up front if this is a URI syntax string with query arguments + NSMutableDictionary *nameValuePairs = [self parseNameValuePairs:rawText]; + NSString *subject = nil; + NSString *body = nil; + BOOL querySyntax = NO; + if (nameValuePairs != nil && [nameValuePairs count] > 0) { + subject = nameValuePairs[@"subject"]; + body = nameValuePairs[@"body"]; + querySyntax = YES; + } + + // Drop sms, query portion + NSUInteger queryStart = [rawText rangeOfString:@"?" options:NSLiteralSearch range:NSMakeRange(4, [rawText length] - 4)].location; + NSString *smsURIWithoutQuery; + // If it's not query syntax, the question mark is part of the subject or message + if (queryStart == NSNotFound || !querySyntax) { + smsURIWithoutQuery = [rawText substringFromIndex:4]; + } else { + smsURIWithoutQuery = [rawText substringWithRange:NSMakeRange(4, queryStart - 4)]; + } + + int lastComma = -1; + NSInteger comma; + NSMutableArray *numbers = [NSMutableArray arrayWithCapacity:1]; + NSMutableArray *vias = [NSMutableArray arrayWithCapacity:1]; + while ((comma = [smsURIWithoutQuery rangeOfString:@"," options:NSLiteralSearch range:NSMakeRange(lastComma + 1, (int)[smsURIWithoutQuery length] - lastComma - 1)].location) > lastComma && comma != NSNotFound) { + NSString *numberPart = [smsURIWithoutQuery substringWithRange:NSMakeRange(lastComma + 1, comma - lastComma - 1)]; + [self addNumberVia:numbers vias:vias numberPart:numberPart]; + lastComma = (int)comma; + } + [self addNumberVia:numbers vias:vias numberPart:[smsURIWithoutQuery substringFromIndex:lastComma + 1]]; + + return [ZXSMSParsedResult smsParsedResultWithNumbers:numbers + vias:vias + subject:subject + body:body]; +} + +- (void)addNumberVia:(NSMutableArray *)numbers vias:(NSMutableArray *)vias numberPart:(NSString *)numberPart { + NSUInteger numberEnd = [numberPart rangeOfString:@";"].location; + if (numberEnd == NSNotFound) { + [numbers addObject:numberPart]; + [vias addObject:[NSNull null]]; + } else { + [numbers addObject:[numberPart substringToIndex:numberEnd]]; + NSString *maybeVia = [numberPart substringFromIndex:numberEnd + 1]; + if ([maybeVia hasPrefix:@"via="]) { + [vias addObject:[maybeVia substringFromIndex:4]]; + } else { + [vias addObject:[NSNull null]]; + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.h new file mode 100644 index 0000000..0f594ff --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXSMSParsedResult : ZXParsedResult + +@property (nonatomic, strong, readonly) NSArray *numbers; +@property (nonatomic, strong, readonly) NSArray *vias; +@property (nonatomic, copy, readonly) NSString *subject; +@property (nonatomic, copy, readonly) NSString *body; + +- (id)initWithNumber:(NSString *)number via:(NSString *)via subject:(NSString *)subject body:(NSString *)body; +- (id)initWithNumbers:(NSArray *)numbers vias:(NSArray *)vias subject:(NSString *)subject body:(NSString *)body; ++ (id)smsParsedResultWithNumber:(NSString *)number via:(NSString *)via subject:(NSString *)subject body:(NSString *)body; ++ (id)smsParsedResultWithNumbers:(NSArray *)numbers vias:(NSArray *)vias subject:(NSString *)subject body:(NSString *)body; +- (NSString *)sMSURI; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.m new file mode 100644 index 0000000..6d4510e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.m @@ -0,0 +1,97 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXSMSParsedResult.h" + +@implementation ZXSMSParsedResult + +- (id)initWithNumber:(NSString *)number via:(NSString *)via subject:(NSString *)subject body:(NSString *)body { + NSArray *numbers; + if (number) { + numbers = @[number]; + } + + NSArray *vias; + if (via) { + vias = @[via]; + } + + return [self initWithNumbers:numbers vias:vias subject:subject body:body]; +} + +- (id)initWithNumbers:(NSArray *)numbers vias:(NSArray *)vias subject:(NSString *)subject body:(NSString *)body { + if (self = [super initWithType:kParsedResultTypeSMS]) { + _numbers = numbers; + _vias = vias; + _subject = subject; + _body = body; + } + + return self; +} + ++ (id)smsParsedResultWithNumber:(NSString *)number via:(NSString *)via subject:(NSString *)subject body:(NSString *)body { + return [[self alloc] initWithNumber:number via:via subject:subject body:body]; +} + ++ (id)smsParsedResultWithNumbers:(NSArray *)numbers vias:(NSArray *)vias subject:(NSString *)subject body:(NSString *)body { + return [[self alloc] initWithNumbers:numbers vias:vias subject:subject body:body]; +} + +- (NSString *)sMSURI { + NSMutableString *result = [NSMutableString stringWithString:@"sms:"]; + BOOL first = YES; + for (int i = 0; i < self.numbers.count; i++) { + if (first) { + first = NO; + } else { + [result appendString:@","]; + } + [result appendString:self.numbers[i]]; + if (self.vias != nil && self.vias[i] != [NSNull null]) { + [result appendString:@";via="]; + [result appendString:self.vias[i]]; + } + } + + BOOL hasBody = self.body != nil; + BOOL hasSubject = self.subject != nil; + if (hasBody || hasSubject) { + [result appendString:@"?"]; + if (hasBody) { + [result appendString:@"body="]; + [result appendString:self.body]; + } + if (hasSubject) { + if (hasBody) { + [result appendString:@"&"]; + } + [result appendString:@"subject="]; + [result appendString:self.subject]; + } + } + return result; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:100]; + [ZXParsedResult maybeAppendArray:self.numbers result:result]; + [ZXParsedResult maybeAppend:self.subject result:result]; + [ZXParsedResult maybeAppend:self.body result:result]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.h new file mode 100644 index 0000000..2408e67 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses an "smsto:" URI result, whose format is not standardized but appears to be like: + * smsto:number(:body). + * + * This actually also parses URIs starting with "smsto:", "mmsto:", "SMSTO:", and + * "MMSTO:", and treats them all the same way, and effectively converts them to an "sms:" URI + * for purposes of forwarding to the platform. + */ +@interface ZXSMSTOMMSTOResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.m new file mode 100644 index 0000000..832c931 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.m @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResult.h" +#import "ZXSMSTOMMSTOResultParser.h" +#import "ZXSMSParsedResult.h" + +@implementation ZXSMSTOMMSTOResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (!([rawText hasPrefix:@"smsto:"] || [rawText hasPrefix:@"SMSTO:"] || [rawText hasPrefix:@"mmsto:"] || [rawText hasPrefix:@"MMSTO:"])) { + return nil; + } + // Thanks to dominik.wild for suggesting this enhancement to support + // smsto:number:body URIs + NSString *number = [rawText substringFromIndex:6]; + NSString *body = nil; + NSUInteger bodyStart = [number rangeOfString:@":"].location; + if (bodyStart != NSNotFound) { + body = [number substringFromIndex:bodyStart + 1]; + number = [number substringToIndex:bodyStart]; + } + return [ZXSMSParsedResult smsParsedResultWithNumber:number via:nil subject:nil body:body]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.h new file mode 100644 index 0000000..9897c72 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses an "smtp:" URI result, whose format is not standardized but appears to be like: + * smtp[:subject[:body]]. + */ +@interface ZXSMTPResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.m new file mode 100644 index 0000000..f6b593b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.m @@ -0,0 +1,44 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEmailAddressParsedResult.h" +#import "ZXResult.h" +#import "ZXSMTPResultParser.h" + +@implementation ZXSMTPResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (!([rawText hasPrefix:@"smtp:"] || [rawText hasPrefix:@"SMTP:"])) { + return nil; + } + NSString *emailAddress = [rawText substringFromIndex:5]; + NSString *subject = nil; + NSString *body = nil; + NSUInteger colon = [emailAddress rangeOfString:@":"].location; + if (colon != NSNotFound) { + subject = [emailAddress substringFromIndex:colon + 1]; + emailAddress = [emailAddress substringToIndex:colon]; + colon = [subject rangeOfString:@":"].location; + if (colon != NSNotFound) { + body = [subject substringFromIndex:colon + 1]; + subject = [subject substringToIndex:colon]; + } + } + return [[ZXEmailAddressParsedResult alloc] initWithTos:@[emailAddress] ccs:nil bccs:nil subject:subject body:body]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.h new file mode 100644 index 0000000..7c5d2d1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXTelParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *number; +@property (nonatomic, copy, readonly) NSString *telURI; +@property (nonatomic, copy, readonly) NSString *title; + +- (id)initWithNumber:(NSString *)number telURI:(NSString *)telURI title:(NSString *)title; ++ (id)telParsedResultWithNumber:(NSString *)number telURI:(NSString *)telURI title:(NSString *)title; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.m new file mode 100644 index 0000000..aed1b28 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.m @@ -0,0 +1,42 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXTelParsedResult.h" + +@implementation ZXTelParsedResult + +- (id)initWithNumber:(NSString *)number telURI:(NSString *)telURI title:(NSString *)title { + if (self = [super initWithType:kParsedResultTypeTel]) { + _number = number; + _telURI = telURI; + _title = title; + } + + return self; +} + ++ (id)telParsedResultWithNumber:(NSString *)number telURI:(NSString *)telURI title:(NSString *)title { + return [[self alloc] initWithNumber:number telURI:telURI title:title]; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:20]; + [ZXParsedResult maybeAppend:self.number result:result]; + [ZXParsedResult maybeAppend:self.title result:result]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.h new file mode 100644 index 0000000..39c1e0a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses a "tel:" URI result, which specifies a phone number. + */ +@interface ZXTelResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.m new file mode 100644 index 0000000..529a934 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.m @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXTelParsedResult.h" +#import "ZXTelResultParser.h" + +@implementation ZXTelResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"tel:"] && ![rawText hasPrefix:@"TEL:"]) { + return nil; + } + // Normalize "TEL:" to "tel:" + NSString *telURI = [rawText hasPrefix:@"TEL:"] ? [@"tel:" stringByAppendingString:[rawText substringFromIndex:4]] : rawText; + // Drop tel, query portion + NSUInteger queryStart = [rawText rangeOfString:@"?" options:NSLiteralSearch range:NSMakeRange(4, [rawText length] - 4)].location; + NSString *number = queryStart == NSNotFound ? [rawText substringFromIndex:4] : [rawText substringWithRange:NSMakeRange(4, [rawText length] - queryStart)]; + return [ZXTelParsedResult telParsedResultWithNumber:number telURI:telURI title:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.h new file mode 100644 index 0000000..deb211f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +/** + * A simple result type encapsulating a string that has no further + * interpretation. + */ +@interface ZXTextParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *text; +@property (nonatomic, copy, readonly) NSString *language; + +- (id)initWithText:(NSString *)text language:(NSString *)language; ++ (id)textParsedResultWithText:(NSString *)text language:(NSString *)language; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.m new file mode 100644 index 0000000..059fae0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.m @@ -0,0 +1,39 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResultType.h" +#import "ZXTextParsedResult.h" + +@implementation ZXTextParsedResult + +- (id)initWithText:(NSString *)text language:(NSString *)language { + if (self = [super initWithType:kParsedResultTypeText]) { + _text = text; + _language = language; + } + + return self; +} + ++ (id)textParsedResultWithText:(NSString *)text language:(NSString *)language { + return [[self alloc] initWithText:text language:language]; +} + +- (NSString *)displayResult { + return self.text; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.h new file mode 100644 index 0000000..8443e6e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXURIParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *uri; +@property (nonatomic, copy, readonly) NSString *title; + +- (id)initWithUri:(NSString *)uri title:(NSString *)title; ++ (id)uriParsedResultWithUri:(NSString *)uri title:(NSString *)title; + +/** + * @return true if the URI contains suspicious patterns that may suggest it intends to + * mislead the user about its true nature. At the moment this looks for the presence + * of user/password syntax in the host/authority portion of a URI which may be used + * in attempts to make the URI's host appear to be other than it is. Example: + * http://yourbank.com@phisher.com This URI connects to phisher.com but may appear + * to connect to yourbank.com at first glance. + */ +- (BOOL)possiblyMaliciousURI; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.m new file mode 100644 index 0000000..3e66a76 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.m @@ -0,0 +1,80 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" +#import "ZXURIParsedResult.h" + +static NSRegularExpression *ZX_USER_IN_HOST = nil; + +@implementation ZXURIParsedResult + ++ (void)initialize { + if ([self class] != [ZXURIParsedResult class]) return; + + ZX_USER_IN_HOST = [[NSRegularExpression alloc] initWithPattern:@":/*([^/@]+)@[^/]+" options:0 error:nil]; +} + +- (id)initWithUri:(NSString *)uri title:(NSString *)title { + if (self = [super initWithType:kParsedResultTypeURI]) { + _uri = [self massageURI:uri]; + _title = title; + } + + return self; +} + ++ (id)uriParsedResultWithUri:(NSString *)uri title:(NSString *)title { + return [[self alloc] initWithUri:uri title:title]; +} + +- (BOOL)possiblyMaliciousURI { + return [ZX_USER_IN_HOST numberOfMatchesInString:self.uri options:0 range:NSMakeRange(0, self.uri.length)] > 0; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:30]; + [ZXParsedResult maybeAppend:self.title result:result]; + [ZXParsedResult maybeAppend:self.uri result:result]; + return result; +} + +/** + * Transforms a string that represents a URI into something more proper, by adding or canonicalizing + * the protocol. + */ +- (NSString *)massageURI:(NSString *)uri { + NSString *massagedUri = [uri stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSUInteger protocolEnd = [massagedUri rangeOfString:@":"].location; + if (protocolEnd == NSNotFound) { + // No protocol, assume http + massagedUri = [NSString stringWithFormat:@"http://%@", massagedUri]; + } else if ([self isColonFollowedByPortNumber:massagedUri protocolEnd:(int)protocolEnd]) { + // Found a colon, but it looks like it is after the host, so the protocol is still missing + massagedUri = [NSString stringWithFormat:@"http://%@", massagedUri]; + } + return massagedUri; +} + +- (BOOL)isColonFollowedByPortNumber:(NSString *)uri protocolEnd:(int)protocolEnd { + int start = protocolEnd + 1; + NSUInteger nextSlash = [uri rangeOfString:@"/" options:0 range:NSMakeRange(start, [uri length] - start)].location; + if (nextSlash == NSNotFound) { + nextSlash = [uri length]; + } + return [ZXResultParser isSubstringOfDigits:uri offset:start length:(int)nextSlash - start]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.h new file mode 100644 index 0000000..6b17f8a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Tries to parse results that are a URI of some kind. + */ +@interface ZXURIResultParser : ZXResultParser + ++ (BOOL)isBasicallyValidURI:(NSString *)uri; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.m new file mode 100644 index 0000000..b1b4403 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.m @@ -0,0 +1,66 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXURIResultParser.h" +#import "ZXResult.h" +#import "ZXURIParsedResult.h" + +static NSRegularExpression *ZX_URL_WITH_PROTOCOL_PATTERN = nil; +static NSRegularExpression *ZX_URL_WITHOUT_PROTOCOL_PATTERN = nil; + +@implementation ZXURIResultParser + ++ (void)initialize { + if ([self class] != [ZXURIResultParser class]) return; + + // See http://www.ietf.org/rfc/rfc2396.txt + ZX_URL_WITH_PROTOCOL_PATTERN = [[NSRegularExpression alloc] initWithPattern:@"^[a-zA-Z][a-zA-Z0-9+-.]+:" + options:0 + error:nil]; + ZX_URL_WITHOUT_PROTOCOL_PATTERN = [[NSRegularExpression alloc] initWithPattern: + [[@"([a-zA-Z0-9\\-]+\\.)+[a-zA-Z]{2,}" // host name elements + stringByAppendingString:@"(:\\d{1,5})?"] // maybe port + stringByAppendingString:@"(/|\\?|$)"] // query, path or nothing + options:0 + error:nil]; +} + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + // We specifically handle the odd "URL" scheme here for simplicity and add "URI" for fun + // Assume anything starting this way really means to be a URI + if ([rawText hasPrefix:@"URL:"] || [rawText hasPrefix:@"URI:"]) { + return [[ZXURIParsedResult alloc] initWithUri:[[rawText substringFromIndex:4] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] + title:nil]; + } + rawText = [rawText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + return [[self class] isBasicallyValidURI:rawText] ? [ZXURIParsedResult uriParsedResultWithUri:rawText title:nil] : nil; +} + + ++ (BOOL)isBasicallyValidURI:(NSString *)uri { + if ([uri rangeOfString:@" "].location != NSNotFound) { + // Quick hack check for a common case + return NO; + } + + if ([ZX_URL_WITH_PROTOCOL_PATTERN numberOfMatchesInString:uri options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, uri.length)] > 0) { // match at start only + return YES; + } + return [ZX_URL_WITHOUT_PROTOCOL_PATTERN numberOfMatchesInString:uri options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, uri.length)] > 0; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.h new file mode 100644 index 0000000..dd1c01a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses the "URLTO" result format, which is of the form "URLTO:[title]:[url]". + * This seems to be used sometimes, but I am not able to find documentation + * on its origin or official format? + */ +@interface ZXURLTOResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.m new file mode 100644 index 0000000..b95b884 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.m @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResult.h" +#import "ZXURIParsedResult.h" +#import "ZXURLTOResultParser.h" + +@implementation ZXURLTOResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"urlto:"] && ![rawText hasPrefix:@"URLTO:"]) { + return nil; + } + NSUInteger titleEnd = [rawText rangeOfString:@":" options:NSLiteralSearch range:NSMakeRange(6, [rawText length] - 6)].location; + if (titleEnd == NSNotFound) { + return nil; + } + NSString *title = titleEnd <= 6 ? nil : [rawText substringWithRange:NSMakeRange(6, titleEnd - 6)]; + NSString *uri = [rawText substringFromIndex:titleEnd + 1]; + return [ZXURIParsedResult uriParsedResultWithUri:uri title:title]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.h new file mode 100644 index 0000000..c1d946b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses contact information formatted according to the VCard (2.1) format. This is not a complete + * implementation but should parse information as commonly encoded in 2D barcodes. + */ +@interface ZXVCardResultParser : ZXResultParser + ++ (NSArray *)matchSingleVCardPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim parseFieldDivider:(BOOL)parseFieldDivider; ++ (NSMutableArray *)matchVCardPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim parseFieldDivider:(BOOL)parseFieldDivider; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.m new file mode 100644 index 0000000..f82f104 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.m @@ -0,0 +1,356 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAddressBookParsedResult.h" +#import "ZXResult.h" +#import "ZXVCardResultParser.h" + +static NSRegularExpression *ZX_BEGIN_VCARD = nil; +static NSRegularExpression *ZX_VCARD_LIKE_DATE = nil; +static NSRegularExpression *ZX_CR_LF_SPACE_TAB = nil; +static NSRegularExpression *ZX_NEWLINE_ESCAPE = nil; +static NSRegularExpression *ZX_VCARD_ESCAPES = nil; +static NSString *ZX_EQUALS = @"="; +static NSString *ZX_SEMICOLON = @";"; +static NSRegularExpression *ZX_UNESCAPED_SEMICOLONS = nil; +static NSCharacterSet *ZX_COMMA = nil; +static NSCharacterSet *ZX_SEMICOLON_OR_COMMA = nil; + +@implementation ZXVCardResultParser + ++ (void)initialize { + if ([self class] != [ZXVCardResultParser class]) return; + + ZX_BEGIN_VCARD = [[NSRegularExpression alloc] initWithPattern:@"BEGIN:VCARD" options:NSRegularExpressionCaseInsensitive error:nil]; + ZX_VCARD_LIKE_DATE = [[NSRegularExpression alloc] initWithPattern:@"\\d{4}-?\\d{2}-?\\d{2}" options:0 error:nil]; + ZX_CR_LF_SPACE_TAB = [[NSRegularExpression alloc] initWithPattern:@"\r\n[ \t]" options:0 error:nil]; + ZX_NEWLINE_ESCAPE = [[NSRegularExpression alloc] initWithPattern:@"\\\\[nN]" options:0 error:nil]; + ZX_VCARD_ESCAPES = [[NSRegularExpression alloc] initWithPattern:@"\\\\([,;\\\\])" options:0 error:nil]; + ZX_UNESCAPED_SEMICOLONS = [[NSRegularExpression alloc] initWithPattern:@"(? 0) { + i--; // Find from i-1 not i since looking at the preceding character + } + NSArray *regexMatches = [regex matchesInString:rawText options:0 range:NSMakeRange(i, rawText.length - i)]; + if (regexMatches.count == 0) { + break; + } + NSRange matchRange = [regexMatches[0] range]; + i = matchRange.location + matchRange.length; + + NSString *metadataString = nil; + if ([regexMatches[0] rangeAtIndex:1].location != NSNotFound) { + metadataString = [rawText substringWithRange:[regexMatches[0] rangeAtIndex:1]]; + } + NSMutableArray *metadata = nil; + BOOL quotedPrintable = NO; + NSString *quotedPrintableCharset = nil; + if (metadataString != nil) { + for (NSString *metadatum in [metadataString componentsSeparatedByString:ZX_SEMICOLON]) { + if (metadata == nil) { + metadata = [NSMutableArray array]; + } + [metadata addObject:metadatum]; + NSUInteger equals = [metadatum rangeOfString:ZX_EQUALS].location; + if (equals != NSNotFound) { + NSString *key = [metadatum substringToIndex:equals]; + NSString *value = [metadatum substringFromIndex:equals + 1]; + if ([@"ENCODING" caseInsensitiveCompare:key] == NSOrderedSame && + [@"QUOTED-PRINTABLE" caseInsensitiveCompare:value] == NSOrderedSame) { + quotedPrintable = YES; + } else if ([@"CHARSET" caseInsensitiveCompare:key] == NSOrderedSame) { + quotedPrintableCharset = value; + } + } + } + } + + NSUInteger matchStart = i; // Found the start of a match here + + while ((NSUInteger)(i = [rawText rangeOfString:@"\n" options:NSLiteralSearch range:NSMakeRange(i, [rawText length] - i)].location) != NSNotFound) { // Really, end in \r\n + if (i < [rawText length] - 1 && // But if followed by tab or space, + ([rawText characterAtIndex:i + 1] == ' ' || // this is only a continuation + [rawText characterAtIndex:i + 1] == '\t')) { + i += 2; // Skip \n and continutation whitespace + } else if (quotedPrintable && // If preceded by = in quoted printable + ((i >= 1 && [rawText characterAtIndex:i - 1] == '=') || // this is a continuation + (i >= 2 && [rawText characterAtIndex:i - 2] == '='))) { + i++; // Skip \n + } else { + break; + } + } + + if (i == NSNotFound) { + // No terminating end character? uh, done. Set i such that loop terminates and break + i = max; + } else if (i > matchStart) { + // found a match + if (matches == nil) { + matches = [NSMutableArray arrayWithCapacity:1]; + } + if (i >= 1 && [rawText characterAtIndex:i-1] == '\r') { + i--; // Back up over \r, which really should be there + } + NSString *element = [rawText substringWithRange:NSMakeRange(matchStart, i - matchStart)]; + if (trim) { + element = [element stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + if (quotedPrintable) { + element = [self decodeQuotedPrintable:element charset:quotedPrintableCharset]; + if (parseFieldDivider) { + element = [[ZX_UNESCAPED_SEMICOLONS stringByReplacingMatchesInString:element options:0 range:NSMakeRange(0, element.length) withTemplate:@"\n"] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + } else { + if (parseFieldDivider) { + element = [[ZX_UNESCAPED_SEMICOLONS stringByReplacingMatchesInString:element options:0 range:NSMakeRange(0, element.length) withTemplate:@"\n"] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + element = [ZX_CR_LF_SPACE_TAB stringByReplacingMatchesInString:element options:0 range:NSMakeRange(0, element.length) withTemplate:@""]; + element = [ZX_NEWLINE_ESCAPE stringByReplacingMatchesInString:element options:0 range:NSMakeRange(0, element.length) withTemplate:@"\n"]; + element = [ZX_VCARD_ESCAPES stringByReplacingMatchesInString:element options:0 range:NSMakeRange(0, element.length) withTemplate:@"$1"]; + } + if (metadata == nil) { + NSMutableArray *match = [NSMutableArray arrayWithObject:element]; + [match addObject:element]; + [matches addObject:match]; + } else { + [metadata insertObject:element atIndex:0]; + [matches addObject:metadata]; + } + i++; + } else { + i++; + } + } + + return matches; +} + ++ (NSString *)decodeQuotedPrintable:(NSString *)value charset:(NSString *)charset { + NSUInteger length = [value length]; + NSMutableString *result = [NSMutableString stringWithCapacity:length]; + NSMutableData *fragmentBuffer = [NSMutableData data]; + + for (int i = 0; i < length; i++) { + unichar c = [value characterAtIndex:i]; + + switch (c) { + case '\r': + case '\n': + break; + case '=': + if (i < length - 2) { + unichar nextChar = [value characterAtIndex:i + 1]; + if (nextChar != '\r' && nextChar != '\n') { + unichar nextNextChar = [value characterAtIndex:i + 2]; + int firstDigit = [self parseHexDigit:nextChar]; + int secondDigit = [self parseHexDigit:nextNextChar]; + if (firstDigit >= 0 && secondDigit >= 0) { + int encodedByte = (firstDigit << 4) + secondDigit; + [fragmentBuffer appendBytes:&encodedByte length:1]; + } // else ignore it, assume it was incorrectly encoded + i += 2; + } + } + break; + default: + [self maybeAppendFragment:fragmentBuffer charset:charset result:result]; + [result appendFormat:@"%C", c]; + } + } + + [self maybeAppendFragment:fragmentBuffer charset:charset result:result]; + return result; +} + ++ (void)maybeAppendFragment:(NSMutableData *)fragmentBuffer charset:(NSString *)charset result:(NSMutableString *)result { + if ([fragmentBuffer length] > 0) { + NSString *fragment; + if (charset == nil || CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset) == kCFStringEncodingInvalidId) { + fragment = [[NSString alloc] initWithData:fragmentBuffer encoding:NSUTF8StringEncoding]; + } else { + fragment = [[NSString alloc] initWithData:fragmentBuffer encoding:CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset))]; + if (!fragment) { + fragment = [[NSString alloc] initWithData:fragmentBuffer encoding:NSUTF8StringEncoding]; + } + } + [fragmentBuffer setLength:0]; + [result appendString:fragment]; + } +} + ++ (NSArray *)matchSingleVCardPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim parseFieldDivider:(BOOL)parseFieldDivider { + NSArray *values = [self matchVCardPrefixedField:prefix rawText:rawText trim:trim parseFieldDivider:parseFieldDivider]; + return values == nil ? nil : values[0]; +} + +- (NSString *)toPrimaryValue:(NSArray *)list { + return list == nil || list.count == 0 ? nil : list[0]; +} + +- (NSArray *)toPrimaryValues:(NSArray *)lists { + if (lists == nil || lists.count == 0) { + return nil; + } + NSMutableArray *result = [NSMutableArray arrayWithCapacity:lists.count]; + for (NSArray *list in lists) { + NSString *value = list[0]; + if (value != nil && value.length > 0) { + [result addObject:value]; + } + } + return result; +} + +- (NSArray *)toTypes:(NSArray *)lists { + if (lists == nil || lists.count == 0) { + return nil; + } + NSMutableArray *result = [NSMutableArray arrayWithCapacity:lists.count]; + for (NSArray *list in lists) { + NSString *type = nil; + for (int i = 1; i < list.count; i++) { + NSString *metadatum = list[i]; + NSUInteger equals = [metadatum rangeOfString:@"=" options:NSCaseInsensitiveSearch].location; + if (equals == NSNotFound) { + // take the whole thing as a usable label + type = metadatum; + break; + } + if ([@"TYPE" isEqualToString:[[metadatum substringToIndex:equals] uppercaseString]]) { + type = [metadatum substringFromIndex:equals + 1]; + break; + } + } + + if (type) { + [result addObject:type]; + } else { + [result addObject:[NSNull null]]; + } + } + return result; +} + +- (BOOL)isLikeVCardDate:(NSString *)value { + return value == nil || [ZX_VCARD_LIKE_DATE numberOfMatchesInString:value options:0 range:NSMakeRange(0, value.length)] > 0; +} + +/** + * Formats name fields of the form "Public;John;Q.;Reverend;III" into a form like + * "Reverend John Q. Public III". + * + * @param names name values to format, in place + */ +- (void)formatNames:(NSMutableArray *)names { + if (names != nil) { + for (NSMutableArray *list in names) { + NSString *name = list[0]; + NSArray *allComponents = [name componentsSeparatedByString:@";"]; + NSMutableArray *components = [NSMutableArray array]; + for (NSString *component in allComponents) { + if ([component length] > 0) { + [components addObject:component]; + } + } + + NSMutableString *newName = [NSMutableString stringWithCapacity:100]; + [self maybeAppendComponent:components i:3 newName:newName]; + [self maybeAppendComponent:components i:1 newName:newName]; + [self maybeAppendComponent:components i:2 newName:newName]; + [self maybeAppendComponent:components i:0 newName:newName]; + [self maybeAppendComponent:components i:4 newName:newName]; + list[0] = [newName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + } +} + +- (void)maybeAppendComponent:(NSArray *)components i:(int)i newName:(NSMutableString *)newName { + if ([components count] > i && components[i] && [(NSString *)components[i] length] > 0) { + if ([newName length] > 0) { + [newName appendString:@" "]; + } + [newName appendString:components[i]]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.h new file mode 100644 index 0000000..bedc558 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Partially implements the iCalendar format's "VEVENT" format for specifying a + * calendar event. See RFC 2445. This supports SUMMARY, LOCATION, GEO, DTSTART and DTEND fields. + */ +@interface ZXVEventResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.m new file mode 100644 index 0000000..f564087 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.m @@ -0,0 +1,108 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXCalendarParsedResult.h" +#import "ZXResult.h" +#import "ZXVCardResultParser.h" +#import "ZXVEventResultParser.h" + +@implementation ZXVEventResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (rawText == nil) { + return nil; + } + NSUInteger vEventStart = [rawText rangeOfString:@"BEGIN:VEVENT"].location; + if (vEventStart == NSNotFound) { + return nil; + } + + NSString *summary = [self matchSingleVCardPrefixedField:@"SUMMARY" rawText:rawText trim:YES]; + NSString *start = [self matchSingleVCardPrefixedField:@"DTSTART" rawText:rawText trim:YES]; + if (start == nil) { + return nil; + } + NSString *end = [self matchSingleVCardPrefixedField:@"DTEND" rawText:rawText trim:YES]; + NSString *duration = [self matchSingleVCardPrefixedField:@"DURATION" rawText:rawText trim:YES]; + NSString *location = [self matchSingleVCardPrefixedField:@"LOCATION" rawText:rawText trim:YES]; + NSString *organizer = [self stripMailto:[self matchSingleVCardPrefixedField:@"ORGANIZER" rawText:rawText trim:YES]]; + + NSMutableArray *attendees = [self matchVCardPrefixedField:@"ATTENDEE" rawText:rawText trim:YES]; + if (attendees != nil) { + for (int i = 0; i < attendees.count; i++) { + attendees[i] = [self stripMailto:attendees[i]]; + } + } + NSString *description = [self matchSingleVCardPrefixedField:@"DESCRIPTION" rawText:rawText trim:YES]; + + NSString *geoString = [self matchSingleVCardPrefixedField:@"GEO" rawText:rawText trim:YES]; + double latitude; + double longitude; + if (geoString == nil) { + latitude = NAN; + longitude = NAN; + } else { + NSUInteger semicolon = [geoString rangeOfString:@";"].location; + if (semicolon == NSNotFound) { + return nil; + } + latitude = [[geoString substringToIndex:semicolon] doubleValue]; + longitude = [[geoString substringFromIndex:semicolon + 1] doubleValue]; + } + + @try { + return [ZXCalendarParsedResult calendarParsedResultWithSummary:summary + startString:start + endString:end + durationString:duration + location:location + organizer:organizer + attendees:attendees + description:description + latitude:latitude + longitude:longitude]; + } @catch (NSException *iae) { + return nil; + } +} + +- (NSString *)matchSingleVCardPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim { + NSArray *values = [ZXVCardResultParser matchSingleVCardPrefixedField:prefix rawText:rawText trim:trim parseFieldDivider:NO]; + return values == nil || values.count == 0 ? nil : values[0]; +} + +- (NSMutableArray *)matchVCardPrefixedField:(NSString *)prefix rawText:(NSString *)rawText trim:(BOOL)trim { + NSMutableArray *values = [ZXVCardResultParser matchVCardPrefixedField:prefix rawText:rawText trim:trim parseFieldDivider:NO]; + if (values == nil || values.count == 0) { + return nil; + } + NSUInteger size = values.count; + NSMutableArray *result = [NSMutableArray arrayWithCapacity:size]; + for (int i = 0; i < size; i++) { + [result addObject:values[i][0]]; + } + return result; +} + +- (NSString *)stripMailto:(NSString *)s { + if (s != nil && ([s hasPrefix:@"mailto:"] || [s hasPrefix:@"MAILTO:"])) { + s = [s substringFromIndex:7]; + } + return s; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.h new file mode 100644 index 0000000..e312462 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.h @@ -0,0 +1,37 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXVINParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *vin; +@property (nonatomic, copy, readonly) NSString *worldManufacturerID; +@property (nonatomic, copy, readonly) NSString *vehicleDescriptorSection; +@property (nonatomic, copy, readonly) NSString *vehicleIdentifierSection; +@property (nonatomic, copy, readonly) NSString *countryCode; +@property (nonatomic, copy, readonly) NSString *vehicleAttributes; +@property (nonatomic, assign, readonly) int modelYear; +@property (nonatomic, assign, readonly) unichar plantCode; +@property (nonatomic, copy, readonly) NSString *sequentialNumber; + +- (id)initWithVIN:(NSString *)vin worldManufacturerID:(NSString *)worldManufacturerID + vehicleDescriptorSection:(NSString *)vehicleDescriptorSection vehicleIdentifierSection:(NSString *)vehicleIdentifierSection + countryCode:(NSString *)countryCode vehicleAttributes:(NSString *)vehicleAttributes modelYear:(int)modelYear + plantCode:(unichar)plantCode sequentialNumber:(NSString *)sequentialNumber; + + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.m new file mode 100644 index 0000000..1baea36 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.m @@ -0,0 +1,54 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXVINParsedResult.h" + +@implementation ZXVINParsedResult + +- (id)initWithVIN:(NSString *)vin worldManufacturerID:(NSString *)worldManufacturerID +vehicleDescriptorSection:(NSString *)vehicleDescriptorSection vehicleIdentifierSection:(NSString *)vehicleIdentifierSection + countryCode:(NSString *)countryCode vehicleAttributes:(NSString *)vehicleAttributes modelYear:(int)modelYear + plantCode:(unichar)plantCode sequentialNumber:(NSString *)sequentialNumber { + if (self = [super initWithType:kParsedResultTypeVIN]) { + _vin = vin; + _worldManufacturerID = worldManufacturerID; + _vehicleDescriptorSection = vehicleDescriptorSection; + _vehicleIdentifierSection = vehicleIdentifierSection; + _countryCode = countryCode; + _vehicleAttributes = vehicleAttributes; + _modelYear = modelYear; + _plantCode = plantCode; + _sequentialNumber = sequentialNumber; + } + + return self; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:50]; + [result appendFormat:@"%@ ", self.worldManufacturerID]; + [result appendFormat:@"%@ ", self.vehicleDescriptorSection]; + [result appendFormat:@"%@\n", self.vehicleIdentifierSection]; + if (self.countryCode) { + [result appendFormat:@"%@ ", self.countryCode]; + } + [result appendFormat:@"%d ", self.modelYear]; + [result appendFormat:@"%C ", self.plantCode]; + [result appendFormat:@"%@\n", self.sequentialNumber]; + return [NSString stringWithString:result]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.h new file mode 100644 index 0000000..73f5b3b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Detects a result that is likely a vehicle identification number. + */ +@interface ZXVINResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.m new file mode 100644 index 0000000..6865792 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.m @@ -0,0 +1,219 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXVINParsedResult.h" +#import "ZXVINResultParser.h" + +static NSRegularExpression *ZX_IOQ = nil; +static NSRegularExpression *ZX_AZ09 = nil; + +@implementation ZXVINResultParser + ++ (void)initialize { + if ([self class] != [ZXVINResultParser class]) return; + + ZX_IOQ = [[NSRegularExpression alloc] initWithPattern:@"[IOQ]" options:0 error:nil]; + ZX_AZ09 = [[NSRegularExpression alloc] initWithPattern:@"[A-Z0-9]{17}" options:0 error:nil]; +} + +- (ZXVINParsedResult *)parse:(ZXResult *)result { + if (result.barcodeFormat != kBarcodeFormatCode39) { + return nil; + } + NSString *rawText = result.text; + rawText = [[ZX_IOQ stringByReplacingMatchesInString:rawText options:0 range:NSMakeRange(0, rawText.length) withTemplate:@""] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if ([ZX_AZ09 matchesInString:rawText options:0 range:NSMakeRange(0, rawText.length)] == 0) { + return nil; + } + if (![self checkChecksum:rawText]) { + return nil; + } + + int modelYear = [self modelYear:[rawText characterAtIndex:9]]; + if (modelYear == -1) { + return nil; + } + + NSString *wmi = [rawText substringToIndex:3]; + return [[ZXVINParsedResult alloc] initWithVIN:rawText + worldManufacturerID:wmi + vehicleDescriptorSection:[rawText substringWithRange:NSMakeRange(3, 6)] + vehicleIdentifierSection:[rawText substringWithRange:NSMakeRange(9, 8)] + countryCode:[self countryCode:wmi] + vehicleAttributes:[rawText substringWithRange:NSMakeRange(3, 5)] + modelYear:modelYear + plantCode:[rawText characterAtIndex:10] + sequentialNumber:[rawText substringFromIndex:11]]; +} + +- (BOOL)checkChecksum:(NSString *)vin { + int sum = 0; + for (int i = 0; i < [vin length]; i++) { + int vinPositionWeight = [self vinPositionWeight:i + 1]; + if (vinPositionWeight == -1) { + return NO; + } + int vinCharValue = [self vinCharValue:[vin characterAtIndex:i]]; + if (vinCharValue == -1) { + return NO; + } + sum += vinPositionWeight * vinCharValue; + } + unichar checkChar = [vin characterAtIndex:8]; + if (checkChar == '\0') { + return NO; + } + unichar expectedCheckChar = [self checkChar:sum % 11]; + return checkChar == expectedCheckChar; +} + +- (int)vinCharValue:(unichar)c { + if (c >= 'A' && c <= 'I') { + return (c - 'A') + 1; + } + if (c >= 'J' && c <= 'R') { + return (c - 'J') + 1; + } + if (c >= 'S' && c <= 'Z') { + return (c - 'S') + 2; + } + if (c >= '0' && c <= '9') { + return c - '0'; + } + return -1; +} + +- (int)vinPositionWeight:(int)position { + if (position >= 1 && position <= 7) { + return 9 - position; + } + if (position == 8) { + return 10; + } + if (position == 9) { + return 0; + } + if (position >= 10 && position <= 17) { + return 19 - position; + } + return -1; +} + +- (unichar)checkChar:(int)remainder { + if (remainder < 10) { + return (unichar) ('0' + remainder); + } + if (remainder == 10) { + return 'X'; + } + return '\0'; +} + +- (int)modelYear:(unichar)c { + if (c >= 'E' && c <= 'H') { + return (c - 'E') + 1984; + } + if (c >= 'J' && c <= 'N') { + return (c - 'J') + 1988; + } + if (c == 'P') { + return 1993; + } + if (c >= 'R' && c <= 'T') { + return (c - 'R') + 1994; + } + if (c >= 'V' && c <= 'Y') { + return (c - 'V') + 1997; + } + if (c >= '1' && c <= '9') { + return (c - '1') + 2001; + } + if (c >= 'A' && c <= 'D') { + return (c - 'A') + 2010; + } + return -1; +} + +- (NSString *)countryCode:(NSString *)wmi { + unichar c1 = [wmi characterAtIndex:0]; + unichar c2 = [wmi characterAtIndex:1]; + switch (c1) { + case '1': + case '4': + case '5': + return @"US"; + case '2': + return @"CA"; + case '3': + if (c2 >= 'A' && c2 <= 'W') { + return @"MX"; + } + break; + case '9': + if ((c2 >= 'A' && c2 <= 'E') || (c2 >= '3' && c2 <= '9')) { + return @"BR"; + } + break; + case 'J': + if (c2 >= 'A' && c2 <= 'T') { + return @"JP"; + } + break; + case 'K': + if (c2 >= 'L' && c2 <= 'R') { + return @"KO"; + } + break; + case 'L': + return @"CN"; + case 'M': + if (c2 >= 'A' && c2 <= 'E') { + return @"IN"; + } + break; + case 'S': + if (c2 >= 'A' && c2 <= 'M') { + return @"UK"; + } + if (c2 >= 'N' && c2 <= 'T') { + return @"DE"; + } + break; + case 'V': + if (c2 >= 'F' && c2 <= 'R') { + return @"FR"; + } + if (c2 >= 'S' && c2 <= 'W') { + return @"ES"; + } + break; + case 'W': + return @"DE"; + case 'X': + if (c2 == '0' || (c2 >= '3' && c2 <= '9')) { + return @"RU"; + } + break; + case 'Z': + if (c2 >= 'A' && c2 <= 'R') { + return @"IT"; + } + break; + } + return nil; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.h new file mode 100644 index 0000000..708a1df --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResult.h" + +@interface ZXWifiParsedResult : ZXParsedResult + +@property (nonatomic, copy, readonly) NSString *ssid; +@property (nonatomic, copy, readonly) NSString *networkEncryption; +@property (nonatomic, copy, readonly) NSString *password; +@property (nonatomic, assign, readonly) BOOL hidden; + +- (id)initWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password; +- (id)initWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password hidden:(BOOL)hidden; ++ (id)wifiParsedResultWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password; ++ (id)wifiParsedResultWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password hidden:(BOOL)hidden; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.m new file mode 100644 index 0000000..cc6e655 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.m @@ -0,0 +1,54 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXParsedResultType.h" +#import "ZXWifiParsedResult.h" + +@implementation ZXWifiParsedResult + +- (id)initWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password { + return [self initWithNetworkEncryption:networkEncryption ssid:ssid password:password]; +} + +- (id)initWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password hidden:(BOOL)hidden { + if (self = [super initWithType:kParsedResultTypeWifi]) { + _ssid = ssid; + _networkEncryption = networkEncryption; + _password = password; + _hidden = hidden; + } + + return self; +} + ++ (id)wifiParsedResultWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password { + return [[self alloc] initWithNetworkEncryption:networkEncryption ssid:ssid password:password]; +} + ++ (id)wifiParsedResultWithNetworkEncryption:(NSString *)networkEncryption ssid:(NSString *)ssid password:(NSString *)password hidden:(BOOL)hidden { + return [[self alloc] initWithNetworkEncryption:networkEncryption ssid:ssid password:password hidden:hidden]; +} + +- (NSString *)displayResult { + NSMutableString *result = [NSMutableString stringWithCapacity:80]; + [ZXParsedResult maybeAppend:self.ssid result:result]; + [ZXParsedResult maybeAppend:self.networkEncryption result:result]; + [ZXParsedResult maybeAppend:self.password result:result]; + [ZXParsedResult maybeAppend:[@(self.hidden) stringValue] result:result]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.h new file mode 100644 index 0000000..9c85c9a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultParser.h" + +/** + * Parses a WIFI configuration string. Strings will be of the form: + * + * WIFI:T:[network type];S:[SSID];P:[network password];H:[hidden?];; + * + * The fields can appear in any order. Only "S:" is required. + */ +@interface ZXWifiResultParser : ZXResultParser + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.m new file mode 100644 index 0000000..3b70ed2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.m @@ -0,0 +1,42 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResult.h" +#import "ZXWifiResultParser.h" +#import "ZXWifiParsedResult.h" + +@implementation ZXWifiResultParser + +- (ZXParsedResult *)parse:(ZXResult *)result { + NSString *rawText = [ZXResultParser massagedText:result]; + if (![rawText hasPrefix:@"WIFI:"]) { + return nil; + } + NSString *ssid = [[self class] matchSinglePrefixedField:@"S:" rawText:rawText endChar:';' trim:NO]; + if (ssid == nil || ssid.length == 0) { + return nil; + } + NSString *pass = [[self class] matchSinglePrefixedField:@"P:" rawText:rawText endChar:';' trim:NO]; + NSString *type = [[self class] matchSinglePrefixedField:@"T:" rawText:rawText endChar:';' trim:NO]; + if (type == nil) { + type = @"nopass"; + } + + BOOL hidden = [[[self class] matchSinglePrefixedField:@"H:" rawText:rawText endChar:';' trim:NO] boolValue]; + return [ZXWifiParsedResult wifiParsedResultWithNetworkEncryption:type ssid:ssid password:pass hidden:hidden]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.h new file mode 100644 index 0000000..0243264 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.h @@ -0,0 +1,132 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXIntArray; + +/** + * A simple, fast array of bits, represented compactly by an array of ints internally. + */ +@interface ZXBitArray : NSObject + +/** + * @return underlying array of ints. The first element holds the first 32 bits, and the least + * significant bit is bit 0. + */ +@property (nonatomic, assign, readonly) int32_t *bits; + +@property (nonatomic, assign, readonly) int size; + +- (id)initWithSize:(int)size; + +- (int)sizeInBytes; + +/** + * @param i bit to get + * @return true iff bit i is set + */ +- (BOOL)get:(int)i; + +/** + * Sets bit i. + * + * @param i bit to set + */ +- (void)set:(int)i; + +/** + * Flips bit i. + * + * @param i bit to set + */ +- (void)flip:(int)i; + +/** + * @param from first bit to check + * @return index of first bit that is set, starting from the given index, or size if none are set + * at or beyond this given index + */ +- (int)nextSet:(int)from; + +- (int)nextUnset:(int)from; + +/** + * Sets a block of 32 bits, starting at bit i. + * + * @param i first bit to set + * @param newBits the new value of the next 32 bits. Note again that the least-significant bit + * corresponds to bit i, the next-least-significant to i+1, and so on. + */ +- (void)setBulk:(int)i newBits:(int32_t)newBits; + +/** + * Sets a range of bits. + * + * @param start start of range, inclusive. + * @param end end of range, exclusive + */ +- (void)setRange:(int)start end:(int)end; + +/** + * Clears all bits (sets to false). + */ +- (void)clear; + +/** + * Efficient method to check if a range of bits is set, or not set. + * + * @param start start of range, inclusive. + * @param end end of range, exclusive + * @param value if true, checks that bits in range are set, otherwise checks that they are not set + * @return true iff all bits are set or not set in range, according to value argument + * @throws NSInvalidArgumentException if end is less than or equal to start + */ +- (BOOL)isRange:(int)start end:(int)end value:(BOOL)value; + +- (void)appendBit:(BOOL)bit; + +/** + * Appends the least-significant bits, from value, in order from most-significant to + * least-significant. For example, appending 6 bits from 0x000001E will append the bits + * 0, 1, 1, 1, 1, 0 in that order. + */ +- (void)appendBits:(int32_t)value numBits:(int)numBits; + +- (void)appendBitArray:(ZXBitArray *)other; + +- (void)xor:(ZXBitArray *)other; + +/** + * + * @param bitOffset first bit to start writing + * @param array array to write into. Bytes are written most-significant byte first. This is the opposite + * of the internal representation, which is exposed by {@link #getBitArray()} + * @param offset position in array to start writing + * @param numBytes how many bytes to write + */ +- (void)toBytes:(int)bitOffset array:(ZXByteArray *)array offset:(int)offset numBytes:(int)numBytes; + +/** + * @return underlying array of ints. The first element holds the first 32 bits, and the least + * significant bit is bit 0. + */ +- (ZXIntArray *)bitArray; + +/** + * Reverses all bits in the array. + */ +- (void)reverse; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.m new file mode 100644 index 0000000..9e415d3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.m @@ -0,0 +1,348 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXByteArray.h" +#import "ZXIntArray.h" + +@interface ZXBitArray () + +@property (nonatomic, assign) int32_t *bits; +@property (nonatomic, assign) int bitsLength; +@property (nonatomic, assign) int size; + +@end + +@implementation ZXBitArray + +- (id)init { + if (self = [super init]) { + _size = 0; + _bits = (int32_t *)calloc(1, sizeof(int32_t)); + _bitsLength = 1; + } + + return self; +} + +// For testing only +- (id)initWithBits:(ZXIntArray *)bits size:(int)size { + if (self = [self initWithSize:size]) { + _bits = bits.array; + _bits = (int32_t *)malloc(bits.length * sizeof(int32_t)); + memcpy(_bits, bits.array, bits.length * sizeof(int32_t)); + _bitsLength = bits.length; + } + + return self; +} + +- (id)initWithSize:(int)size { + if (self = [super init]) { + _size = size; + _bitsLength = (size + 31) / 32; + _bits = (int32_t *)calloc(_bitsLength, sizeof(int32_t)); + } + + return self; +} + +- (void)dealloc { + if (_bits != NULL) { + free(_bits); + _bits = NULL; + } +} + +- (int)sizeInBytes { + return (self.size + 7) / 8; +} + +- (void)ensureCapacity:(int)size { + if (size > self.bitsLength * 32) { + int newBitsLength = (size + 31) / 32; + self.bits = realloc(self.bits, newBitsLength * sizeof(int32_t)); + memset(self.bits + self.bitsLength, 0, (newBitsLength - self.bitsLength) * sizeof(int32_t)); + + self.bitsLength = newBitsLength; + } +} + +- (BOOL)get:(int)i { + return (_bits[i / 32] & (1 << (i & 0x1F))) != 0; +} + +- (void)set:(int)i { + _bits[i / 32] |= 1 << (i & 0x1F); +} + +- (void)flip:(int)i { + _bits[i / 32] ^= 1 << (i & 0x1F); +} + +- (int)nextSet:(int)from { + if (from >= self.size) { + return self.size; + } + int bitsOffset = from / 32; + int32_t currentBits = self.bits[bitsOffset]; + // mask off lesser bits first + currentBits &= ~((1 << (from & 0x1F)) - 1); + while (currentBits == 0) { + if (++bitsOffset == self.bitsLength) { + return self.size; + } + currentBits = self.bits[bitsOffset]; + } + int result = (bitsOffset * 32) + [self numberOfTrailingZeros:currentBits]; + return result > self.size ? self.size : result; +} + +- (int)nextUnset:(int)from { + if (from >= self.size) { + return self.size; + } + int bitsOffset = from / 32; + int32_t currentBits = ~self.bits[bitsOffset]; + // mask off lesser bits first + currentBits &= ~((1 << (from & 0x1F)) - 1); + while (currentBits == 0) { + if (++bitsOffset == self.bitsLength) { + return self.size; + } + currentBits = ~self.bits[bitsOffset]; + } + int result = (bitsOffset * 32) + [self numberOfTrailingZeros:currentBits]; + return result > self.size ? self.size : result; +} + +- (void)setBulk:(int)i newBits:(int32_t)newBits { + _bits[i / 32] = newBits; +} + +- (void)setRange:(int)start end:(int)end { + if (end < start) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Start greater than end" userInfo:nil]; + } + if (end == start) { + return; + } + end--; // will be easier to treat this as the last actually set bit -- inclusive + int firstInt = start / 32; + int lastInt = end / 32; + for (int i = firstInt; i <= lastInt; i++) { + int firstBit = i > firstInt ? 0 : start & 0x1F; + int lastBit = i < lastInt ? 31 : end & 0x1F; + int32_t mask; + if (lastBit > 31) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Bit-shift operand does not support more than 31 bits" userInfo:nil]; + } + if (firstBit == 0 && lastBit == 31) { + mask = -1; + } else { + mask = 0; + for (int j = firstBit; j <= lastBit; j++) { + mask |= 1 << j; + } + } + _bits[i] |= mask; + } +} + +- (void)clear { + memset(self.bits, 0, self.bitsLength * sizeof(int32_t)); +} + +- (BOOL)isRange:(int)start end:(int)end value:(BOOL)value { + if (end < start) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Start greater than end" userInfo:nil]; + } + if (end == start) { + return YES; // empty range matches + } + end--; // will be easier to treat this as the last actually set bit -- inclusive + int firstInt = start / 32; + int lastInt = end / 32; + for (int i = firstInt; i <= lastInt; i++) { + int firstBit = i > firstInt ? 0 : start & 0x1F; + int lastBit = i < lastInt ? 31 : end & 0x1F; + int32_t mask; + if (lastBit > 31) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Bit-shift operand does not support more than 31 bits" userInfo:nil]; + } + if (firstBit == 0 && lastBit == 31) { + mask = -1; + } else { + mask = 0; + for (int j = firstBit; j <= lastBit; j++) { + mask |= 1 << j; + } + } + + // Return false if we're looking for 1s and the masked bits[i] isn't all 1s (that is, + // equals the mask, or we're looking for 0s and the masked portion is not all 0s + if ((_bits[i] & mask) != (value ? mask : 0)) { + return NO; + } + } + + return YES; +} + +- (void)appendBit:(BOOL)bit { + [self ensureCapacity:self.size + 1]; + if (bit) { + self.bits[self.size / 32] |= 1 << (self.size & 0x1F); + } + self.size++; +} + +- (void)appendBits:(int32_t)value numBits:(int)numBits { + if (numBits < 0 || numBits > 32) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Num bits must be between 0 and 32" + userInfo:nil]; + } + [self ensureCapacity:self.size + numBits]; + for (int numBitsLeft = numBits; numBitsLeft > 0; numBitsLeft--) { + [self appendBit:((value >> (numBitsLeft - 1)) & 0x01) == 1]; + } +} + +- (void)appendBitArray:(ZXBitArray *)other { + int otherSize = [other size]; + [self ensureCapacity:self.size + otherSize]; + + for (int i = 0; i < otherSize; i++) { + [self appendBit:[other get:i]]; + } +} + +- (void)xor:(ZXBitArray *)other { + if (self.bitsLength != other.bitsLength) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Sizes don't match" + userInfo:nil]; + } + + for (int i = 0; i < self.bitsLength; i++) { + // The last byte could be incomplete (i.e. not have 8 bits in + // it) but there is no problem since 0 XOR 0 == 0. + self.bits[i] ^= other.bits[i]; + } +} + +- (void)toBytes:(int)bitOffset array:(ZXByteArray *)array offset:(int)offset numBytes:(int)numBytes { + for (int i = 0; i < numBytes; i++) { + int32_t theByte = 0; + for (int j = 0; j < 8; j++) { + if ([self get:bitOffset]) { + theByte |= 1 << (7 - j); + } + bitOffset++; + } + array.array[offset + i] = (int8_t) theByte; + } +} + +- (ZXIntArray *)bitArray { + ZXIntArray *array = [[ZXIntArray alloc] initWithLength:self.bitsLength]; + memcpy(array.array, self.bits, array.length * sizeof(int32_t)); + return array; +} + +- (BOOL)isEqual:(id)o { + if (![o isKindOfClass:[ZXBitArray class]]) { + return NO; + } + ZXBitArray *other = (ZXBitArray *)o; + return self.size == other.size && memcmp(self.bits, other.bits, self.bitsLength) != 0; +} + +- (NSUInteger)hash { + return 31 * self.size; +} + +- (void)reverse { + int32_t *newBits = (int32_t *)calloc(self.bitsLength, sizeof(int32_t)); + int size = self.size; + + // reverse all int's first + int len = ((size-1) / 32); + int oldBitsLen = len + 1; + for (int i = 0; i < oldBitsLen; i++) { + long x = (long) self.bits[i]; + x = ((x >> 1) & 0x55555555L) | ((x & 0x55555555L) << 1); + x = ((x >> 2) & 0x33333333L) | ((x & 0x33333333L) << 2); + x = ((x >> 4) & 0x0f0f0f0fL) | ((x & 0x0f0f0f0fL) << 4); + x = ((x >> 8) & 0x00ff00ffL) | ((x & 0x00ff00ffL) << 8); + x = ((x >> 16) & 0x0000ffffL) | ((x & 0x0000ffffL) << 16); + newBits[len - i] = (int32_t) x; + } + // now correct the int's if the bit size isn't a multiple of 32 + if (size != oldBitsLen * 32) { + int leftOffset = oldBitsLen * 32 - size; + int mask = 1; + for (int i = 0; i < 31 - leftOffset; i++) { + mask = (mask << 1) | 1; + } + int32_t currentInt = (newBits[0] >> leftOffset) & mask; + for (int i = 1; i < oldBitsLen; i++) { + int32_t nextInt = newBits[i]; + currentInt |= nextInt << (32 - leftOffset); + newBits[i - 1] = currentInt; + currentInt = (nextInt >> leftOffset) & mask; + } + newBits[oldBitsLen - 1] = currentInt; + } + if (self.bits != NULL) { + free(self.bits); + } + self.bits = newBits; +} + +- (NSString *)description { + NSMutableString *result = [NSMutableString string]; + + for (int i = 0; i < self.size; i++) { + if ((i & 0x07) == 0) { + [result appendString:@" "]; + } + [result appendString:[self get:i] ? @"X" : @"."]; + } + + return result; +} + +// Ported from OpenJDK Integer.numberOfTrailingZeros implementation +- (int32_t)numberOfTrailingZeros:(int32_t)i { + int32_t y; + if (i == 0) return 32; + int32_t n = 31; + y = i <<16; if (y != 0) { n = n -16; i = y; } + y = i << 8; if (y != 0) { n = n - 8; i = y; } + y = i << 4; if (y != 0) { n = n - 4; i = y; } + y = i << 2; if (y != 0) { n = n - 2; i = y; } + return n - (int32_t)((uint32_t)(i << 1) >> 31); +} + +- (id)copyWithZone:(NSZone *)zone { + ZXBitArray *copy = [[ZXBitArray allocWithZone:zone] initWithSize:self.size]; + memcpy(copy.bits, self.bits, self.size * sizeof(int32_t)); + return copy; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.h new file mode 100644 index 0000000..be65fcf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.h @@ -0,0 +1,153 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXIntArray; + +/** + * Represents a 2D matrix of bits. In function arguments below, and throughout the common + * module, x is the column position, and y is the row position. The ordering is always x, y. + * The origin is at the top-left. + * + * Internally the bits are represented in a 1-D array of 32-bit ints. However, each row begins + * with a new NSInteger. This is done intentionally so that we can copy out a row into a BitArray very + * efficiently. + * + * The ordering of bits is row-major. Within each NSInteger, the least significant bits are used first, + * meaning they represent lower x values. This is compatible with BitArray's implementation. + */ +@interface ZXBitMatrix : NSObject + +/** + * @return The width of the matrix + */ +@property (nonatomic, assign, readonly) int width; + +/** + * @return The height of the matrix + */ +@property (nonatomic, assign, readonly) int height; + +@property (nonatomic, assign, readonly) int32_t *bits; + +/** + * @return The row size of the matrix + */ +@property (nonatomic, assign, readonly) int rowSize; + +// A helper to construct a square matrix. +- (id)initWithDimension:(int)dimension; +- (id)initWithWidth:(int)width height:(int)height; + ++ (ZXBitMatrix *)parse:(NSString *)stringRepresentation + setString:(NSString *)setString + unsetString:(NSString *)unsetString; + +/** + * Gets the requested bit, where true means black. + * + * @param x The horizontal component (i.e. which column) + * @param y The vertical component (i.e. which row) + * @return value of given bit in matrix + */ +- (BOOL)getX:(int)x y:(int)y; + +/** + * Sets the given bit to true. + * + * @param x The horizontal component (i.e. which column) + * @param y The vertical component (i.e. which row) + */ +- (void)setX:(int)x y:(int)y; + +- (void)unsetX:(int)x y:(int)y; + +/** + * Flips the given bit. + * + * @param x The horizontal component (i.e. which column) + * @param y The vertical component (i.e. which row) + */ +- (void)flipX:(int)x y:(int)y; + +/** + * Exclusive-or (XOR): Flip the bit in this ZXBitMatrix if the corresponding + * mask bit is set. + * + * @param mask XOR mask + */ +- (void)xor:(ZXBitMatrix *)mask; + +/** + * Clears all bits (sets to false). + */ +- (void)clear; + +/** + * Sets a square region of the bit matrix to true. + * + * @param left The horizontal position to begin at (inclusive) + * @param top The vertical position to begin at (inclusive) + * @param width The width of the region + * @param height The height of the region + */ +- (void)setRegionAtLeft:(int)left top:(int)top width:(int)width height:(int)height; + +/** + * A fast method to retrieve one row of data from the matrix as a ZXBitArray. + * + * @param y The row to retrieve + * @param row An optional caller-allocated BitArray, will be allocated if null or too small + * @return The resulting BitArray - this reference should always be used even when passing + * your own row + */ +- (ZXBitArray *)rowAtY:(int)y row:(ZXBitArray *)row; + +/** + * @param y row to set + * @param row ZXBitArray to copy from + */ +- (void)setRowAtY:(int)y row:(ZXBitArray *)row; + +/** + * Modifies this ZXBitMatrix to represent the same but rotated 180 degrees + */ +- (void)rotate180; + +/** + * This is useful in detecting the enclosing rectangle of a 'pure' barcode. + * + * @return {left,top,width,height} enclosing rectangle of all 1 bits, or null if it is all white + */ +- (ZXIntArray *)enclosingRectangle; + +/** + * This is useful in detecting a corner of a 'pure' barcode. + * + * @return {x,y} coordinate of top-left-most 1 bit, or null if it is all white + */ +- (ZXIntArray *)topLeftOnBit; + +- (ZXIntArray *)bottomRightOnBit; + +- (NSString *)descriptionWithSetString:(NSString *)setString unsetString:(NSString *)unsetString; + +/** + * @deprecated call descriptionWithSetString:unsetString: only, which uses \n line separator always + */ +- (NSString *)descriptionWithSetString:(NSString *)setString unsetString:(NSString *)unsetString + lineSeparator:(NSString *)lineSeparator DEPRECATED_ATTRIBUTE; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.m new file mode 100644 index 0000000..4e03103 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.m @@ -0,0 +1,377 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXIntArray.h" + +@interface ZXBitMatrix () + +@property (nonatomic, assign, readonly) int bitsSize; + +@end + +@implementation ZXBitMatrix + +- (id)initWithDimension:(int)dimension { + return [self initWithWidth:dimension height:dimension]; +} + +- (id)initWithWidth:(int)width height:(int)height { + if (self = [super init]) { + if (width < 1 || height < 1) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Both dimensions must be greater than 0" + userInfo:nil]; + } + _width = width; + _height = height; + _rowSize = (_width + 31) / 32; + _bitsSize = _rowSize * _height; + _bits = (int32_t *)malloc(_bitsSize * sizeof(int32_t)); + [self clear]; + } + + return self; +} + +- (id)initWithWidth:(int)width height:(int)height rowSize:(int)rowSize bits:(int32_t *)bits { + if (self = [super init]) { + _width = width; + _height = height; + _rowSize = rowSize; + _bitsSize = _rowSize * _height; + _bits = (int32_t *)malloc(_bitsSize * sizeof(int32_t)); + memcpy(_bits, bits, _bitsSize * sizeof(int32_t)); + } + + return self; +} + +- (void)dealloc { + if (_bits != NULL) { + free(_bits); + _bits = NULL; + } +} + ++ (ZXBitMatrix *)parse:(NSString *)stringRepresentation + setString:(NSString *)setString + unsetString:(NSString *)unsetString { + if (!stringRepresentation) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"stringRepresentation is required" + userInfo:nil]; + } + + ZXBoolArray *bits = [[ZXBoolArray alloc] initWithLength:(unsigned int)stringRepresentation.length]; + int bitsPos = 0; + int rowStartPos = 0; + int rowLength = -1; + int nRows = 0; + int pos = 0; + while (pos < stringRepresentation.length) { + if ([stringRepresentation characterAtIndex:pos] == '\n' || + [stringRepresentation characterAtIndex:pos] == '\r') { + if (bitsPos > rowStartPos) { + if(rowLength == -1) { + rowLength = bitsPos - rowStartPos; + } else if (bitsPos - rowStartPos != rowLength) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"row lengths do not match" + userInfo:nil]; + } + rowStartPos = bitsPos; + nRows++; + } + pos++; + } else if ([[stringRepresentation substringWithRange:NSMakeRange(pos, setString.length)] isEqualToString:setString]) { + pos += setString.length; + bits.array[bitsPos] = YES; + bitsPos++; + } else if ([[stringRepresentation substringWithRange:NSMakeRange(pos, unsetString.length)] isEqualToString:unsetString]) { + pos += unsetString.length; + bits.array[bitsPos] = NO; + bitsPos++; + } else { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:[NSString stringWithFormat:@"illegal character encountered: %@", [stringRepresentation substringFromIndex:pos]] + userInfo:nil]; + } + } + + // no EOL at end? + if (bitsPos > rowStartPos) { + if (rowLength == -1) { + rowLength = bitsPos - rowStartPos; + } else if (bitsPos - rowStartPos != rowLength) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"row lengths do not match" + userInfo:nil]; + } + nRows++; + } + + ZXBitMatrix *matrix = [[ZXBitMatrix alloc] initWithWidth:rowLength height:nRows]; + for (int i = 0; i < bitsPos; i++) { + if (bits.array[i]) { + [matrix setX:i % rowLength y:i / rowLength]; + } + } + return matrix; +} + +- (BOOL)getX:(int)x y:(int)y { + NSInteger offset = y * self.rowSize + (x / 32); + return ((_bits[offset] >> (x & 0x1f)) & 1) != 0; +} + +- (void)setX:(int)x y:(int)y { + NSInteger offset = y * self.rowSize + (x / 32); + _bits[offset] |= 1 << (x & 0x1f); +} + +- (void)unsetX:(int)x y:(int)y { + int offset = y * self.rowSize + (x / 32); + _bits[offset] &= ~(1 << (x & 0x1f)); +} + +- (void)flipX:(int)x y:(int)y { + NSUInteger offset = y * self.rowSize + (x / 32); + _bits[offset] ^= 1 << (x & 0x1f); +} + +- (void)xor:(ZXBitMatrix *)mask { + if (self.width != mask.width || self.height != mask.height + || self.rowSize != mask.rowSize) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"input matrix dimensions do not match" + userInfo:nil]; + } + ZXBitArray *rowArray = [[ZXBitArray alloc] initWithSize:self.width]; + for (int y = 0; y < self.height; y++) { + int offset = y * self.rowSize; + int32_t *row = [mask rowAtY:y row:rowArray].bits; + for (int x = 0; x < self.rowSize; x++) { + self.bits[offset + x] ^= row[x]; + } + } +} + +- (void)clear { + NSInteger max = self.bitsSize; + memset(_bits, 0, max * sizeof(int32_t)); +} + +- (void)setRegionAtLeft:(int)left top:(int)top width:(int)aWidth height:(int)aHeight { + if (aHeight < 1 || aWidth < 1) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Height and width must be at least 1" + userInfo:nil]; + } + NSUInteger right = left + aWidth; + NSUInteger bottom = top + aHeight; + if (bottom > self.height || right > self.width) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"The region must fit inside the matrix" + userInfo:nil]; + } + for (NSUInteger y = top; y < bottom; y++) { + NSUInteger offset = y * self.rowSize; + for (NSInteger x = left; x < right; x++) { + _bits[offset + (x / 32)] |= 1 << (x & 0x1f); + } + } +} + +- (ZXBitArray *)rowAtY:(int)y row:(ZXBitArray *)row { + if (row == nil || [row size] < self.width) { + row = [[ZXBitArray alloc] initWithSize:self.width]; + } else { + [row clear]; + } + int offset = y * self.rowSize; + for (int x = 0; x < self.rowSize; x++) { + [row setBulk:x * 32 newBits:_bits[offset + x]]; + } + + return row; +} + +- (void)setRowAtY:(int)y row:(ZXBitArray *)row { + for (NSUInteger i = 0; i < self.rowSize; i++) { + _bits[(y * self.rowSize) + i] = row.bits[i]; + } +} + +- (void)rotate180 { + int width = self.width; + int height = self.height; + ZXBitArray *topRow = [[ZXBitArray alloc] initWithSize:width]; + ZXBitArray *bottomRow = [[ZXBitArray alloc] initWithSize:width]; + for (int i = 0; i < (height+1) / 2; i++) { + topRow = [self rowAtY:i row:topRow]; + bottomRow = [self rowAtY:height - 1 - i row:bottomRow]; + [topRow reverse]; + [bottomRow reverse]; + [self setRowAtY:i row:bottomRow]; + [self setRowAtY:height - 1 - i row:topRow]; + } +} + +- (ZXIntArray *)enclosingRectangle { + int left = self.width; + int top = self.height; + int right = -1; + int bottom = -1; + + for (int y = 0; y < self.height; y++) { + for (int x32 = 0; x32 < self.rowSize; x32++) { + int32_t theBits = _bits[y * self.rowSize + x32]; + if (theBits != 0) { + if (y < top) { + top = y; + } + if (y > bottom) { + bottom = y; + } + if (x32 * 32 < left) { + int32_t bit = 0; + while ((theBits << (31 - bit)) == 0) { + bit++; + } + if ((x32 * 32 + bit) < left) { + left = x32 * 32 + bit; + } + } + if (x32 * 32 + 31 > right) { + int bit = 31; + while ((theBits >> bit) == 0) { + bit--; + } + if ((x32 * 32 + bit) > right) { + right = x32 * 32 + bit; + } + } + } + } + } + + NSInteger width = right - left; + NSInteger height = bottom - top; + + if (width < 0 || height < 0) { + return nil; + } + + return [[ZXIntArray alloc] initWithInts:left, top, width, height, -1]; +} + +- (ZXIntArray *)topLeftOnBit { + int bitsOffset = 0; + while (bitsOffset < self.bitsSize && _bits[bitsOffset] == 0) { + bitsOffset++; + } + if (bitsOffset == self.bitsSize) { + return nil; + } + int y = bitsOffset / self.rowSize; + int x = (bitsOffset % self.rowSize) * 32; + + int32_t theBits = _bits[bitsOffset]; + int32_t bit = 0; + while ((theBits << (31 - bit)) == 0) { + bit++; + } + x += bit; + return [[ZXIntArray alloc] initWithInts:x, y, -1]; +} + +- (ZXIntArray *)bottomRightOnBit { + int bitsOffset = self.bitsSize - 1; + while (bitsOffset >= 0 && _bits[bitsOffset] == 0) { + bitsOffset--; + } + if (bitsOffset < 0) { + return nil; + } + + int y = bitsOffset / self.rowSize; + int x = (bitsOffset % self.rowSize) * 32; + + int32_t theBits = _bits[bitsOffset]; + int32_t bit = 31; + while ((theBits >> bit) == 0) { + bit--; + } + x += bit; + + return [[ZXIntArray alloc] initWithInts:x, y, -1]; +} + +- (BOOL)isEqual:(NSObject *)o { + if (!([o isKindOfClass:[ZXBitMatrix class]])) { + return NO; + } + ZXBitMatrix *other = (ZXBitMatrix *)o; + for (int i = 0; i < self.bitsSize; i++) { + if (_bits[i] != other.bits[i]) { + return NO; + } + } + return self.width == other.width && self.height == other.height && self.rowSize == other.rowSize && self.bitsSize == other.bitsSize; +} + +- (NSUInteger)hash { + NSInteger hash = self.width; + hash = 31 * hash + self.width; + hash = 31 * hash + self.height; + hash = 31 * hash + self.rowSize; + for (NSUInteger i = 0; i < self.bitsSize; i++) { + hash = 31 * hash + _bits[i]; + } + return hash; +} + +- (NSString *)description { + return [self descriptionWithSetString:@"X " unsetString:@" "]; +} + +- (NSString *)descriptionWithSetString:(NSString *)setString unsetString:(NSString *)unsetString { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + return [self descriptionWithSetString:setString unsetString:unsetString lineSeparator:@"\n"]; +#pragma GCC diagnostic pop +} + +- (NSString *)descriptionWithSetString:(NSString *)setString unsetString:(NSString *)unsetString + lineSeparator:(NSString *)lineSeparator { + NSMutableString *result = [NSMutableString stringWithCapacity:self.height * (self.width + 1)]; + for (int y = 0; y < self.height; y++) { + for (int x = 0; x < self.width; x++) { + [result appendString:[self getX:x y:y] ? setString : unsetString]; + } + [result appendString:lineSeparator]; + } + return result; +} + +- (id)copyWithZone:(NSZone *)zone { + return [[ZXBitMatrix allocWithZone:zone] initWithWidth:self.width height:self.height rowSize:self.rowSize bits:self.bits]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.h new file mode 100644 index 0000000..6cc0d5e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.h @@ -0,0 +1,57 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray; + +/** + * This provides an easy abstraction to read bits at a time from a sequence of bytes, where the + * number of bits read is not often a multiple of 8. + * + * This class is thread-safe but not reentrant -- unless the caller modifies the bytes array + * it passed in, in which case all bets are off. + */ +@interface ZXBitSource : NSObject + +/** + * @return index of next bit in current byte which would be read by the next call to {@link #readBits(int)}. + */ +@property (nonatomic, assign, readonly) int bitOffset; + +/** + * @return index of next byte in input byte array which would be read by the next call to {@link #readBits(int)}. + */ +@property (nonatomic, assign, readonly) int byteOffset; + +/** + * @param bytes bytes from which this will read bits. Bits will be read from the first byte first. + * Bits are read within a byte from most-significant to least-significant bit. + */ +- (id)initWithBytes:(ZXByteArray *)bytes; + +/** + * @param numBits number of bits to read + * @return int representing the bits read. The bits will appear as the least-significant + * bits of the int + * @throws NSInvalidArgumentException if numBits isn't in [1,32] or more than is available + */ +- (int)readBits:(int)numBits; + +/** + * @return number of bits that can be read successfully + */ +- (int)available; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.m new file mode 100644 index 0000000..9453f32 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.m @@ -0,0 +1,84 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitSource.h" +#import "ZXByteArray.h" + +@interface ZXBitSource () + +@property (nonatomic, strong, readonly) ZXByteArray *bytes; +@property (nonatomic, assign) int byteOffset; +@property (nonatomic, assign) int bitOffset; + +@end + +@implementation ZXBitSource + +- (id)initWithBytes:(ZXByteArray *)bytes { + if (self = [super init]) { + _bytes = bytes; + } + + return self; +} + +- (int)readBits:(int)numBits { + if (numBits < 1 || numBits > 32 || numBits > self.available) { + [NSException raise:NSInvalidArgumentException format:@"Invalid number of bits: %d", numBits]; + } + + int result = 0; + + // First, read remainder from current byte + if (self.bitOffset > 0) { + int bitsLeft = 8 - self.bitOffset; + int toRead = numBits < bitsLeft ? numBits : bitsLeft; + int bitsToNotRead = bitsLeft - toRead; + int mask = (0xFF >> (8 - toRead)) << bitsToNotRead; + result = (self.bytes.array[self.byteOffset] & mask) >> bitsToNotRead; + numBits -= toRead; + self.bitOffset += toRead; + if (self.bitOffset == 8) { + self.bitOffset = 0; + self.byteOffset++; + } + } + + // Next read whole bytes + if (numBits > 0) { + while (numBits >= 8) { + result = (result << 8) | (self.bytes.array[self.byteOffset] & 0xFF); + self.byteOffset++; + numBits -= 8; + } + + // Finally read a partial byte + if (numBits > 0) { + int bitsToNotRead = 8 - numBits; + int mask = (0xFF >> bitsToNotRead) << bitsToNotRead; + result = (result << numBits) | ((self.bytes.array[self.byteOffset] & mask) >> bitsToNotRead); + self.bitOffset += numBits; + } + } + + return result; +} + +- (int)available { + return 8 * (self.bytes.length - self.byteOffset) - self.bitOffset; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.h new file mode 100644 index 0000000..582d3a3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.h @@ -0,0 +1,24 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXBoolArray : NSObject + +@property (nonatomic, assign, readonly) BOOL *array; +@property (nonatomic, assign, readonly) unsigned int length; + +- (id)initWithLength:(unsigned int)length; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.m new file mode 100644 index 0000000..9639f87 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.m @@ -0,0 +1,36 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBoolArray.h" + +@implementation ZXBoolArray + +- (id)initWithLength:(unsigned int)length { + if (self = [super init]) { + _array = (BOOL *)calloc(length, sizeof(BOOL)); + _length = length; + } + + return self; +} + +- (void)dealloc { + if (_array) { + free(_array); + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.h new file mode 100644 index 0000000..e837cc6 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.h @@ -0,0 +1,25 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXByteArray : NSObject + +@property (nonatomic, assign, readonly) int8_t *array; +@property (nonatomic, assign, readonly) unsigned int length; + +- (id)initWithLength:(unsigned int)length; +- (id)initWithBytes:(int8_t)byte1, ...; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.m new file mode 100644 index 0000000..8c4ca58 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.m @@ -0,0 +1,76 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" + +@implementation ZXByteArray + +- (id)initWithLength:(unsigned int)length { + if (self = [super init]) { + if (length > 0) { + _array = (int8_t *)calloc(length, sizeof(int8_t)); + } else { + _array = NULL; + } + _length = length; + } + + return self; +} + +- (id)initWithBytes:(int8_t)byte1, ... { + va_list args; + va_start(args, byte1); + unsigned int length = 0; + for (int8_t byte = byte1; byte != -1; byte = va_arg(args, int)) { + length++; + } + va_end(args); + + if ((self = [self initWithLength:length]) && (length > 0)) { + va_list args; + va_start(args, byte1); + int i = 0; + for (int8_t byte = byte1; byte != -1; byte = va_arg(args, int)) { + _array[i++] = byte; + } + va_end(args); + } + + return self; +} + +- (void)dealloc { + if (_array) { + free(_array); + } +} + +- (NSString *)description { + NSMutableString *s = [NSMutableString stringWithFormat:@"length=%u, array=(", self.length]; + + for (int i = 0; i < self.length; i++) { + [s appendFormat:@"%d", self.array[i]]; + if (i < self.length - 1) { + [s appendString:@", "]; + } + } + + [s appendString:@")"]; + return s; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.h new file mode 100644 index 0000000..ea855f2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.h @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Encapsulates a Character Set ECI, according to "Extended Channel Interpretations" 5.3.1.1 + * of ISO 18004. + */ +@interface ZXCharacterSetECI : NSObject + +@property (nonatomic, assign, readonly) NSStringEncoding encoding; +@property (nonatomic, assign, readonly) int value; + +/** + * @param value character set ECI value + * @return CharacterSetECI representing ECI of given value, or nil if it is legal but + * unsupported + */ ++ (ZXCharacterSetECI *)characterSetECIByValue:(int)value; + +/** + * @param name character set ECI encoding name + * @return CharacterSetECI representing ECI for character encoding, or nil if it is legal + * but unsupported + */ ++ (ZXCharacterSetECI *)characterSetECIByEncoding:(NSStringEncoding)encoding; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.m new file mode 100644 index 0000000..6d2398f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.m @@ -0,0 +1,94 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXCharacterSetECI.h" +#import "ZXErrors.h" + +static NSMutableDictionary *VALUE_TO_ECI = nil; +static NSMutableDictionary *ENCODING_TO_ECI = nil; + +@implementation ZXCharacterSetECI + ++ (void)initialize { + if ([self class] != [ZXCharacterSetECI class]) return; + + VALUE_TO_ECI = [[NSMutableDictionary alloc] initWithCapacity:29]; + ENCODING_TO_ECI = [[NSMutableDictionary alloc] initWithCapacity:29]; + [self addCharacterSet:0 encoding:(NSStringEncoding) 0x80000400]; + [self addCharacterSet:1 encoding:NSISOLatin1StringEncoding]; + [self addCharacterSet:2 encoding:(NSStringEncoding) 0x80000400]; + [self addCharacterSet:3 encoding:NSISOLatin1StringEncoding]; + [self addCharacterSet:4 encoding:NSISOLatin2StringEncoding]; + [self addCharacterSet:5 encoding:(NSStringEncoding) 0x80000203]; + [self addCharacterSet:6 encoding:(NSStringEncoding) 0x80000204]; + [self addCharacterSet:7 encoding:(NSStringEncoding) 0x80000205]; + [self addCharacterSet:8 encoding:(NSStringEncoding) 0x80000206]; + [self addCharacterSet:9 encoding:(NSStringEncoding) 0x80000207]; + [self addCharacterSet:10 encoding:(NSStringEncoding) 0x80000208]; + [self addCharacterSet:11 encoding:(NSStringEncoding) 0x80000209]; + [self addCharacterSet:12 encoding:(NSStringEncoding) 0x8000020A]; + [self addCharacterSet:13 encoding:(NSStringEncoding) 0x8000020B]; + [self addCharacterSet:15 encoding:(NSStringEncoding) 0x8000020D]; + [self addCharacterSet:16 encoding:(NSStringEncoding) 0x8000020E]; + [self addCharacterSet:17 encoding:(NSStringEncoding) 0x8000020F]; + [self addCharacterSet:18 encoding:(NSStringEncoding) 0x80000210]; + [self addCharacterSet:20 encoding:NSShiftJISStringEncoding]; + [self addCharacterSet:21 encoding:NSWindowsCP1250StringEncoding]; + [self addCharacterSet:22 encoding:NSWindowsCP1251StringEncoding]; + [self addCharacterSet:23 encoding:NSWindowsCP1252StringEncoding]; + [self addCharacterSet:24 encoding:(NSStringEncoding) 0x80000505]; + [self addCharacterSet:25 encoding:NSUTF16BigEndianStringEncoding]; + [self addCharacterSet:26 encoding:NSUTF8StringEncoding]; + [self addCharacterSet:27 encoding:NSASCIIStringEncoding]; + [self addCharacterSet:28 encoding:(NSStringEncoding) 0x80000A03]; + [self addCharacterSet:29 encoding:(NSStringEncoding) 0x80000632]; + [self addCharacterSet:30 encoding:(NSStringEncoding) 0x80000940]; + [self addCharacterSet:170 encoding:NSASCIIStringEncoding]; +} + +- (id)initWithValue:(int)value encoding:(NSStringEncoding)encoding { + if (self = [super init]) { + _value = value; + _encoding = encoding; + } + + return self; +} + ++ (void)addCharacterSet:(int)value encoding:(NSStringEncoding)encoding { + ZXCharacterSetECI *eci = [[ZXCharacterSetECI alloc] initWithValue:value encoding:encoding]; + VALUE_TO_ECI[@(value)] = eci; + ENCODING_TO_ECI[@(encoding)] = eci; +} + ++ (ZXCharacterSetECI *)characterSetECIByValue:(int)value { + if (VALUE_TO_ECI == nil) { + [self initialize]; + } + if (value < 0 || value >= 900) { + return nil; + } + return VALUE_TO_ECI[@(value)]; +} + ++ (ZXCharacterSetECI *)characterSetECIByEncoding:(NSStringEncoding)encoding { + if (ENCODING_TO_ECI == nil) { + [self initialize]; + } + return ENCODING_TO_ECI[@(encoding)]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.h new file mode 100644 index 0000000..4d92c3a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray; + +/** + * Encapsulates the result of decoding a matrix of bits. This typically + * applies to 2D barcode formats. For now it contains the raw bytes obtained, + * as well as a String interpretation of those bytes, if applicable. + */ +@interface ZXDecoderResult : NSObject + +@property (nonatomic, strong, readonly) ZXByteArray *rawBytes; +@property (nonatomic, copy, readonly) NSString *text; +@property (nonatomic, strong, readonly) NSMutableArray *byteSegments; +@property (nonatomic, copy, readonly) NSString *ecLevel; +@property (nonatomic, copy) NSNumber *errorsCorrected; +@property (nonatomic, copy) NSNumber *erasures; +@property (nonatomic, strong) id other; +@property (nonatomic, assign, readonly) int structuredAppendParity; +@property (nonatomic, assign, readonly) int structuredAppendSequenceNumber; + +- (id)initWithRawBytes:(ZXByteArray *)rawBytes text:(NSString *)text + byteSegments:(NSMutableArray *)byteSegments ecLevel:(NSString *)ecLevel; + +- (id)initWithRawBytes:(ZXByteArray *)rawBytes text:(NSString *)text + byteSegments:(NSMutableArray *)byteSegments ecLevel:(NSString *)ecLevel + saSequence:(int)saSequence saParity:(int)saParity; + +- (BOOL)hasStructuredAppend; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.m new file mode 100644 index 0000000..3e60556 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.m @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDecoderResult.h" + +@implementation ZXDecoderResult + +- (id)initWithRawBytes:(ZXByteArray *)rawBytes text:(NSString *)text + byteSegments:(NSMutableArray *)byteSegments ecLevel:(NSString *)ecLevel { + return [self initWithRawBytes:rawBytes text:text byteSegments:byteSegments ecLevel:ecLevel saSequence:-1 saParity:-1]; +} + +- (id)initWithRawBytes:(ZXByteArray *)rawBytes text:(NSString *)text + byteSegments:(NSMutableArray *)byteSegments ecLevel:(NSString *)ecLevel + saSequence:(int)saSequence saParity:(int)saParity { + if (self = [super init]) { + _rawBytes = rawBytes; + _text = text; + _byteSegments = byteSegments; + _ecLevel = ecLevel; + _structuredAppendParity = saParity; + _structuredAppendSequenceNumber = saSequence; + } + + return self; +} + +- (BOOL)hasStructuredAppend { + return self.structuredAppendParity >= 0 && self.structuredAppendSequenceNumber >= 0; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.h new file mode 100644 index 0000000..b7776cc --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGridSampler.h" + +@class ZXBitMatrix, ZXPerspectiveTransform; + +@interface ZXDefaultGridSampler : ZXGridSampler + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.m new file mode 100644 index 0000000..c4445c5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.m @@ -0,0 +1,91 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDefaultGridSampler.h" +#import "ZXErrors.h" +#import "ZXPerspectiveTransform.h" + +@implementation ZXDefaultGridSampler + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + p1ToX:(float)p1ToX p1ToY:(float)p1ToY + p2ToX:(float)p2ToX p2ToY:(float)p2ToY + p3ToX:(float)p3ToX p3ToY:(float)p3ToY + p4ToX:(float)p4ToX p4ToY:(float)p4ToY + p1FromX:(float)p1FromX p1FromY:(float)p1FromY + p2FromX:(float)p2FromX p2FromY:(float)p2FromY + p3FromX:(float)p3FromX p3FromY:(float)p3FromY + p4FromX:(float)p4FromX p4FromY:(float)p4FromY + error:(NSError **)error { + ZXPerspectiveTransform *transform = + [ZXPerspectiveTransform quadrilateralToQuadrilateral:p1ToX y0:p1ToY + x1:p2ToX y1:p2ToY + x2:p3ToX y2:p3ToY + x3:p4ToX y3:p4ToY + x0p:p1FromX y0p:p1FromY + x1p:p2FromX y1p:p2FromY + x2p:p3FromX y2p:p3FromY + x3p:p4FromX y3p:p4FromY]; + return [self sampleGrid:image dimensionX:dimensionX dimensionY:dimensionY transform:transform error:error]; +} + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + transform:(ZXPerspectiveTransform *)transform + error:(NSError **)error { + if (dimensionX <= 0 || dimensionY <= 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithWidth:dimensionX height:dimensionY]; + int pointsLen = 2 * dimensionX; + float pointsf[pointsLen]; + memset(pointsf, 0, pointsLen * sizeof(float)); + + for (int y = 0; y < dimensionY; y++) { + int max = dimensionX << 1; + float iValue = (float)y + 0.5f; + for (int x = 0; x < max; x += 2) { + pointsf[x] = (float) (x / 2) + 0.5f; + pointsf[x + 1] = iValue; + } + [transform transformPoints:pointsf pointsLen:pointsLen]; + + if (![ZXGridSampler checkAndNudgePoints:image points:pointsf pointsLen:pointsLen error:error]) { + return nil; + } + for (int x = 0; x < max; x += 2) { + int xx = (int)pointsf[x]; + int yy = (int)pointsf[x + 1]; + if (xx < 0 || yy < 0 || xx >= image.width || yy >= image.height) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if ([image getX:xx y:yy]) { + [bits setX:x / 2 y:y]; + } + } + } + + return bits; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.h new file mode 100644 index 0000000..91428b1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix; + +/** + * Encapsulates the result of detecting a barcode in an image. This includes the raw + * matrix of black/white pixels corresponding to the barcode, and possibly points of interest + * in the image, like the location of finder patterns or corners of the barcode in the image. + */ +@interface ZXDetectorResult : NSObject + +@property (nonatomic, strong, readonly) ZXBitMatrix *bits; +@property (nonatomic, strong, readonly) NSArray *points; + +- (id)initWithBits:(ZXBitMatrix *)bits points:(NSArray *)points; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.m new file mode 100644 index 0000000..edd9d25 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.m @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDetectorResult.h" + +@implementation ZXDetectorResult + +- (id)initWithBits:(ZXBitMatrix *)bits points:(NSArray *)points { + if (self = [super init]) { + _bits = bits; + _points = points; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.h new file mode 100644 index 0000000..8166353 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinarizer.h" + +@class ZXBitArray, ZXBitMatrix, ZXLuminanceSource; + +/** + * This Binarizer implementation uses the old ZXing global histogram approach. It is suitable + * for low-end mobile devices which don't have enough CPU or memory to use a local thresholding + * algorithm. However, because it picks a global black point, it cannot handle difficult shadows + * and gradients. + * + * Faster mobile devices and all desktop applications should probably use ZXHybridBinarizer instead. + */ +@interface ZXGlobalHistogramBinarizer : ZXBinarizer + +// Applies simple sharpening to the row data to improve performance of the 1D Readers. +- (ZXBitArray *)blackRow:(int)y row:(ZXBitArray *)row error:(NSError **)error; + +// Does not sharpen the data, as this call is intended to only be used by 2D Readers. +- (ZXBinarizer *)createBinarizer:(ZXLuminanceSource *)source; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.m new file mode 100644 index 0000000..4dc07f8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.m @@ -0,0 +1,199 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGlobalHistogramBinarizer.h" +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXLuminanceSource.h" + +const int ZX_LUMINANCE_BITS = 5; +const int ZX_LUMINANCE_SHIFT = 8 - ZX_LUMINANCE_BITS; +const int ZX_LUMINANCE_BUCKETS = 1 << ZX_LUMINANCE_BITS; + +@interface ZXGlobalHistogramBinarizer () + +@property (nonatomic, strong) ZXByteArray *luminances; +@property (nonatomic, strong) ZXIntArray *buckets; + +@end + +@implementation ZXGlobalHistogramBinarizer + +- (id)initWithSource:(ZXLuminanceSource *)source { + if (self = [super initWithSource:source]) { + _luminances = [[ZXByteArray alloc] initWithLength:0]; + _buckets = [[ZXIntArray alloc] initWithLength:ZX_LUMINANCE_BUCKETS]; + } + + return self; +} + +- (ZXBitArray *)blackRow:(int)y row:(ZXBitArray *)row error:(NSError **)error { + ZXLuminanceSource *source = self.luminanceSource; + int width = source.width; + if (row == nil || row.size < width) { + row = [[ZXBitArray alloc] initWithSize:width]; + } else { + [row clear]; + } + + [self initArrays:width]; + ZXByteArray *localLuminances = [source rowAtY:y row:self.luminances]; + ZXIntArray *localBuckets = self.buckets; + for (int x = 0; x < width; x++) { + int pixel = localLuminances.array[x] & 0xff; + localBuckets.array[pixel >> ZX_LUMINANCE_SHIFT]++; + } + int blackPoint = [self estimateBlackPoint:localBuckets]; + if (blackPoint == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + int left = localLuminances.array[0] & 0xff; + int center = localLuminances.array[1] & 0xff; + for (int x = 1; x < width - 1; x++) { + int right = localLuminances.array[x + 1] & 0xff; + // A simple -1 4 -1 box filter with a weight of 2. + int luminance = ((center * 4) - left - right) >> 1; + if (luminance < blackPoint) { + [row set:x]; + } + left = center; + center = right; + } + + return row; +} + +- (ZXBitMatrix *)blackMatrixWithError:(NSError **)error { + ZXLuminanceSource *source = self.luminanceSource; + int width = source.width; + int height = source.height; + ZXBitMatrix *matrix = [[ZXBitMatrix alloc] initWithWidth:width height:height]; + + // Quickly calculates the histogram by sampling four rows from the image. This proved to be + // more robust on the blackbox tests than sampling a diagonal as we used to do. + [self initArrays:width]; + + // We delay reading the entire image luminance until the black point estimation succeeds. + // Although we end up reading four rows twice, it is consistent with our motto of + // "fail quickly" which is necessary for continuous scanning. + ZXIntArray *localBuckets = self.buckets; + for (int y = 1; y < 5; y++) { + int row = height * y / 5; + ZXByteArray *localLuminances = [source rowAtY:row row:self.luminances]; + int right = (width * 4) / 5; + for (int x = width / 5; x < right; x++) { + int pixel = localLuminances.array[x] & 0xff; + localBuckets.array[pixel >> ZX_LUMINANCE_SHIFT]++; + } + } + int blackPoint = [self estimateBlackPoint:localBuckets]; + if (blackPoint == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + ZXByteArray *localLuminances = source.matrix; + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + int pixel = localLuminances.array[offset + x] & 0xff; + if (pixel < blackPoint) { + [matrix setX:x y:y]; + } + } + } + + return matrix; +} + +- (ZXBinarizer *)createBinarizer:(ZXLuminanceSource *)source { + return [[ZXGlobalHistogramBinarizer alloc] initWithSource:source]; +} + +- (void)initArrays:(int)luminanceSize { + if (self.luminances.length < luminanceSize) { + self.luminances = [[ZXByteArray alloc] initWithLength:luminanceSize]; + } + + for (int x = 0; x < ZX_LUMINANCE_BUCKETS; x++) { + self.buckets.array[x] = 0; + } +} + +- (int)estimateBlackPoint:(ZXIntArray *)buckets { + // Find the tallest peak in the histogram. + int numBuckets = buckets.length; + int maxBucketCount = 0; + int firstPeak = 0; + int firstPeakSize = 0; + for (int x = 0; x < numBuckets; x++) { + if (buckets.array[x] > firstPeakSize) { + firstPeak = x; + firstPeakSize = buckets.array[x]; + } + if (buckets.array[x] > maxBucketCount) { + maxBucketCount = buckets.array[x]; + } + } + + // Find the second-tallest peak which is somewhat far from the tallest peak. + int secondPeak = 0; + int secondPeakScore = 0; + for (int x = 0; x < numBuckets; x++) { + int distanceToBiggest = x - firstPeak; + // Encourage more distant second peaks by multiplying by square of distance. + int score = buckets.array[x] * distanceToBiggest * distanceToBiggest; + if (score > secondPeakScore) { + secondPeak = x; + secondPeakScore = score; + } + } + + // Make sure firstPeak corresponds to the black peak. + if (firstPeak > secondPeak) { + int temp = firstPeak; + firstPeak = secondPeak; + secondPeak = temp; + } + + // If there is too little contrast in the image to pick a meaningful black point, throw rather + // than waste time trying to decode the image, and risk false positives. + if (secondPeak - firstPeak <= numBuckets / 16) { + return -1; + } + + // Find a valley between them that is low and closer to the white peak. + int bestValley = secondPeak - 1; + int bestValleyScore = -1; + for (int x = secondPeak - 1; x > firstPeak; x--) { + int fromFirst = x - firstPeak; + int score = fromFirst * fromFirst * (secondPeak - x) * (maxBucketCount - buckets.array[x]); + if (score > bestValleyScore) { + bestValley = x; + bestValleyScore = score; + } + } + + return bestValley << ZX_LUMINANCE_SHIFT; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.h new file mode 100644 index 0000000..2ccfd1b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.h @@ -0,0 +1,93 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXPerspectiveTransform; + +/** + * Implementations of this class can, given locations of finder patterns for a QR code in an + * image, sample the right points in the image to reconstruct the QR code, accounting for + * perspective distortion. It is abstracted since it is relatively expensive and should be allowed + * to take advantage of platform-specific optimized implementations, like Sun's Java Advanced + * Imaging library, but which may not be available in other environments such as J2ME, and vice + * versa. + * + * The implementation used can be controlled by calling {@link #setGridSampler(GridSampler)} + * with an instance of a class which implements this interface. + */ +@interface ZXGridSampler : NSObject + +/** + * Sets the implementation of GridSampler used by the library. One global + * instance is stored, which may sound problematic. But, the implementation provided + * ought to be appropriate for the entire platform, and all uses of this library + * in the whole lifetime of the JVM. For instance, an Android activity can swap in + * an implementation that takes advantage of native platform libraries. + * + * @param newGridSampler The platform-specific object to install. + */ ++ (void)setGridSampler:(ZXGridSampler *)newGridSampler; + +/** + * @return the current implementation of GridSampler + */ ++ (ZXGridSampler *)instance; + +/** + * Samples an image for a rectangular matrix of bits of the given dimension. + * @param image image to sample + * @param dimensionX width of ZXBitMatrix to sample from image + * @param dimensionY height of ZXBitMatrix to sample from image + * @return ZXBitMatrix representing a grid of points sampled from the image within a region + * defined by the "from" parameters or nil if image can't be sampled, for example, if the transformation defined + * by the given points is invalid or results in sampling outside the image boundaries + */ +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + p1ToX:(float)p1ToX p1ToY:(float)p1ToY + p2ToX:(float)p2ToX p2ToY:(float)p2ToY + p3ToX:(float)p3ToX p3ToY:(float)p3ToY + p4ToX:(float)p4ToX p4ToY:(float)p4ToY + p1FromX:(float)p1FromX p1FromY:(float)p1FromY + p2FromX:(float)p2FromX p2FromY:(float)p2FromY + p3FromX:(float)p3FromX p3FromY:(float)p3FromY + p4FromX:(float)p4FromX p4FromY:(float)p4FromY + error:(NSError **)error; + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + transform:(ZXPerspectiveTransform *)transform + error:(NSError **)error; + +/** + *

Checks a set of points that have been transformed to sample points on an image against + * the image's dimensions to see if the point are even within the image.

+ * + *

This method will actually "nudge" the endpoints back onto the image if they are found to be + * barely (less than 1 pixel) off the image. This accounts for imperfect detection of finder + * patterns in an image where the QR Code runs all the way to the image border.

+ * + *

For efficiency, the method will check points from either end of the line until one is found + * to be within the image. Because the set of points are assumed to be linear, this is valid.

+ * + * @param image image into which the points should map + * @param points actual points in x1,y1,...,xn,yn form + * @returns NO if an endpoint is lies outside the image boundaries + */ ++ (BOOL)checkAndNudgePoints:(ZXBitMatrix *)image points:(float *)points pointsLen:(int)pointsLen error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.m new file mode 100644 index 0000000..cf9add8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.m @@ -0,0 +1,122 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDefaultGridSampler.h" +#import "ZXErrors.h" +#import "ZXGridSampler.h" +#import "ZXPerspectiveTransform.h" + +static ZXGridSampler *gridSampler = nil; + +@implementation ZXGridSampler + ++ (void)setGridSampler:(ZXGridSampler *)newGridSampler { + gridSampler = newGridSampler; +} + ++ (ZXGridSampler *)instance { + if (!gridSampler) { + gridSampler = [[ZXDefaultGridSampler alloc] init]; + } + + return gridSampler; +} + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + p1ToX:(float)p1ToX p1ToY:(float)p1ToY + p2ToX:(float)p2ToX p2ToY:(float)p2ToY + p3ToX:(float)p3ToX p3ToY:(float)p3ToY + p4ToX:(float)p4ToX p4ToY:(float)p4ToY + p1FromX:(float)p1FromX p1FromY:(float)p1FromY + p2FromX:(float)p2FromX p2FromY:(float)p2FromY + p3FromX:(float)p3FromX p3FromY:(float)p3FromY + p4FromX:(float)p4FromX p4FromY:(float)p4FromY + error:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + transform:(ZXPerspectiveTransform *)transform + error:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + ++ (BOOL)checkAndNudgePoints:(ZXBitMatrix *)image points:(float *)points pointsLen:(int)pointsLen error:(NSError **)error { + int width = image.width; + int height = image.height; + // Check and nudge points from start until we see some that are OK: + BOOL nudged = YES; + for (int offset = 0; offset < pointsLen && nudged; offset += 2) { + int x = (int) points[offset]; + int y = (int) points[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + if (error) *error = ZXNotFoundErrorInstance(); + return NO; + } + nudged = NO; + if (x == -1) { + points[offset] = 0.0f; + nudged = YES; + } else if (x == width) { + points[offset] = width - 1; + nudged = YES; + } + if (y == -1) { + points[offset + 1] = 0.0f; + nudged = YES; + } else if (y == height) { + points[offset + 1] = height - 1; + nudged = YES; + } + } + // Check and nudge points from end: + nudged = YES; + for (int offset = pointsLen - 2; offset >= 0 && nudged; offset -= 2) { + int x = (int) points[offset]; + int y = (int) points[offset + 1]; + if (x < -1 || x > width || y < -1 || y > height) { + if (error) *error = ZXNotFoundErrorInstance(); + return NO; + } + nudged = NO; + if (x == -1) { + points[offset] = 0.0f; + nudged = YES; + } else if (x == width) { + points[offset] = width - 1; + nudged = YES; + } + if (y == -1) { + points[offset + 1] = 0.0f; + nudged = YES; + } else if (y == height) { + points[offset + 1] = height - 1; + nudged = YES; + } + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.h new file mode 100644 index 0000000..bb309ef --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGlobalHistogramBinarizer.h" + +@class ZXBinarizer, ZXBitMatrix, ZXLuminanceSource; + +/** + * This class implements a local thresholding algorithm, which while slower than the + * ZXGlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for + * high frequency images of barcodes with black data on white backgrounds. For this application, + * it does a much better job than a global blackpoint with severe shadows and gradients. + * However it tends to produce artifacts on lower frequency images and is therefore not + * a good general purpose binarizer for uses outside ZXing. + * + * This class extends ZXGlobalHistogramBinarizer, using the older histogram approach for 1D readers, + * and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already + * inherently local, and only fails for horizontal gradients. We can revisit that problem later, + * but for now it was not a win to use local blocks for 1D. + * + * This Binarizer is the default for the unit tests and the recommended class for library users. + */ +@interface ZXHybridBinarizer : ZXGlobalHistogramBinarizer + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.m new file mode 100644 index 0000000..5742cb0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.m @@ -0,0 +1,223 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXHybridBinarizer.h" +#import "ZXIntArray.h" + +// This class uses 5x5 blocks to compute local luminance, where each block is 8x8 pixels. +// So this is the smallest dimension in each axis we can accept. +const int ZX_BLOCK_SIZE_POWER = 3; +const int ZX_BLOCK_SIZE = 1 << ZX_BLOCK_SIZE_POWER; // ...0100...00 +const int ZX_BLOCK_SIZE_MASK = ZX_BLOCK_SIZE - 1; // ...0011...11 +const int ZX_MINIMUM_DIMENSION = ZX_BLOCK_SIZE * 5; +const int ZX_MIN_DYNAMIC_RANGE = 24; + +@interface ZXHybridBinarizer () + +@property (nonatomic, strong) ZXBitMatrix *matrix; + +@end + +@implementation ZXHybridBinarizer + +/** + * Calculates the final BitMatrix once for all requests. This could be called once from the + * constructor instead, but there are some advantages to doing it lazily, such as making + * profiling easier, and not doing heavy lifting when callers don't expect it. + */ +- (ZXBitMatrix *)blackMatrixWithError:(NSError **)error { + if (self.matrix != nil) { + return self.matrix; + } + ZXLuminanceSource *source = [self luminanceSource]; + int width = source.width; + int height = source.height; + if (width >= ZX_MINIMUM_DIMENSION && height >= ZX_MINIMUM_DIMENSION) { + ZXByteArray *luminances = source.matrix; + int subWidth = width >> ZX_BLOCK_SIZE_POWER; + if ((width & ZX_BLOCK_SIZE_MASK) != 0) { + subWidth++; + } + int subHeight = height >> ZX_BLOCK_SIZE_POWER; + if ((height & ZX_BLOCK_SIZE_MASK) != 0) { + subHeight++; + } + int **blackPoints = [self calculateBlackPoints:luminances.array subWidth:subWidth subHeight:subHeight width:width height:height]; + + ZXBitMatrix *newMatrix = [[ZXBitMatrix alloc] initWithWidth:width height:height]; + [self calculateThresholdForBlock:luminances.array subWidth:subWidth subHeight:subHeight width:width height:height blackPoints:blackPoints matrix:newMatrix]; + self.matrix = newMatrix; + + for (int i = 0; i < subHeight; i++) { + free(blackPoints[i]); + } + free(blackPoints); + } else { + // If the image is too small, fall back to the global histogram approach. + self.matrix = [super blackMatrixWithError:error]; + } + return self.matrix; +} + +- (ZXBinarizer *)createBinarizer:(ZXLuminanceSource *)source { + return [[ZXHybridBinarizer alloc] initWithSource:source]; +} + +/** + * For each block in the image, calculate the average black point using a 5x5 grid + * of the blocks around it. Also handles the corner cases (fractional blocks are computed based + * on the last pixels in the row/column which are also used in the previous block). + */ +- (void)calculateThresholdForBlock:(int8_t *)luminances + subWidth:(int)subWidth + subHeight:(int)subHeight + width:(int)width + height:(int)height + blackPoints:(int **)blackPoints + matrix:(ZXBitMatrix *)matrix { + for (int y = 0; y < subHeight; y++) { + int yoffset = y << ZX_BLOCK_SIZE_POWER; + int maxYOffset = height - ZX_BLOCK_SIZE; + if (yoffset > maxYOffset) { + yoffset = maxYOffset; + } + for (int x = 0; x < subWidth; x++) { + int xoffset = x << ZX_BLOCK_SIZE_POWER; + int maxXOffset = width - ZX_BLOCK_SIZE; + if (xoffset > maxXOffset) { + xoffset = maxXOffset; + } + int left = [self cap:x min:2 max:subWidth - 3]; + int top = [self cap:y min:2 max:subHeight - 3]; + int sum = 0; + for (int z = -2; z <= 2; z++) { + int *blackRow = blackPoints[top + z]; + sum += blackRow[left - 2] + blackRow[left - 1] + blackRow[left] + blackRow[left + 1] + blackRow[left + 2]; + } + int average = sum / 25; + [self thresholdBlock:luminances xoffset:xoffset yoffset:yoffset threshold:average stride:width matrix:matrix]; + } + } +} + +- (int)cap:(int)value min:(int)min max:(int)max { + return value < min ? min : value > max ? max : value; +} + +/** + * Applies a single threshold to a block of pixels. + */ +- (void)thresholdBlock:(int8_t *)luminances + xoffset:(int)xoffset + yoffset:(int)yoffset + threshold:(int)threshold + stride:(int)stride + matrix:(ZXBitMatrix *)matrix { + for (int y = 0, offset = yoffset * stride + xoffset; y < ZX_BLOCK_SIZE; y++, offset += stride) { + for (int x = 0; x < ZX_BLOCK_SIZE; x++) { + // Comparison needs to be <= so that black == 0 pixels are black even if the threshold is 0 + if ((luminances[offset + x] & 0xFF) <= threshold) { + [matrix setX:xoffset + x y:yoffset + y]; + } + } + } +} + +/** + * Calculates a single black point for each block of pixels and saves it away. + * See the following thread for a discussion of this algorithm: + * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 + */ +- (int **)calculateBlackPoints:(int8_t *)luminances + subWidth:(int)subWidth + subHeight:(int)subHeight + width:(int)width + height:(int)height { + int **blackPoints = (int **)malloc(subHeight * sizeof(int *)); + for (int y = 0; y < subHeight; y++) { + blackPoints[y] = (int *)malloc(subWidth * sizeof(int)); + + int yoffset = y << ZX_BLOCK_SIZE_POWER; + int maxYOffset = height - ZX_BLOCK_SIZE; + if (yoffset > maxYOffset) { + yoffset = maxYOffset; + } + for (int x = 0; x < subWidth; x++) { + int xoffset = x << ZX_BLOCK_SIZE_POWER; + int maxXOffset = width - ZX_BLOCK_SIZE; + if (xoffset > maxXOffset) { + xoffset = maxXOffset; + } + int sum = 0; + int min = 0xFF; + int max = 0; + for (int yy = 0, offset = yoffset * width + xoffset; yy < ZX_BLOCK_SIZE; yy++, offset += width) { + for (int xx = 0; xx < ZX_BLOCK_SIZE; xx++) { + int pixel = luminances[offset + xx] & 0xFF; + sum += pixel; + // still looking for good contrast + if (pixel < min) { + min = pixel; + } + if (pixel > max) { + max = pixel; + } + } + // short-circuit min/max tests once dynamic range is met + if (max - min > ZX_MIN_DYNAMIC_RANGE) { + // finish the rest of the rows quickly + for (yy++, offset += width; yy < ZX_BLOCK_SIZE; yy++, offset += width) { + for (int xx = 0; xx < ZX_BLOCK_SIZE; xx++) { + sum += luminances[offset + xx] & 0xFF; + } + } + } + } + + // The default estimate is the average of the values in the block. + int average = sum >> (ZX_BLOCK_SIZE_POWER * 2); + if (max - min <= ZX_MIN_DYNAMIC_RANGE) { + // If variation within the block is low, assume this is a block with only light or only + // dark pixels. In that case we do not want to use the average, as it would divide this + // low contrast area into black and white pixels, essentially creating data out of noise. + // + // The default assumption is that the block is light/background. Since no estimate for + // the level of dark pixels exists locally, use half the min for the block. + average = min / 2; + + if (y > 0 && x > 0) { + // Correct the "white background" assumption for blocks that have neighbors by comparing + // the pixels in this block to the previously calculated black points. This is based on + // the fact that dark barcode symbology is always surrounded by some amount of light + // background for which reasonable black point estimates were made. The bp estimated at + // the boundaries is used for the interior. + + // The (min < bp) is arbitrary but works better than other heuristics that were tried. + int averageNeighborBlackPoint = + (blackPoints[y - 1][x] + (2 * blackPoints[y][x - 1]) + blackPoints[y - 1][x - 1]) / 4; + if (min < averageNeighborBlackPoint) { + average = averageNeighborBlackPoint; + } + } + } + blackPoints[y][x] = average; + } + } + return blackPoints; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.h new file mode 100644 index 0000000..0b45e62 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.h @@ -0,0 +1,27 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXIntArray : NSObject + +@property (nonatomic, assign, readonly) int32_t *array; +@property (nonatomic, assign, readonly) unsigned int length; + +- (id)initWithLength:(unsigned int)length; +- (id)initWithInts:(int32_t)int1, ...; +- (void)clear; +- (int)sum; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.m new file mode 100644 index 0000000..40221d1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.m @@ -0,0 +1,95 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" + +@implementation ZXIntArray + +- (id)initWithLength:(unsigned int)length { + if (self = [super init]) { + if (length > 0) { + _array = (int32_t *)calloc(length, sizeof(int32_t)); + } else { + _array = NULL; + } + _length = length; + } + + return self; +} + +- (id)initWithInts:(int32_t)int1, ... { + va_list args; + va_start(args, int1); + unsigned int length = 0; + for (int32_t i = int1; i != -1; i = va_arg(args, int)) { + length++; + } + va_end(args); + + if ((self = [self initWithLength:length]) && (length > 0)) { + va_list args; + va_start(args, int1); + int i = 0; + for (int32_t c = int1; c != -1; c = va_arg(args, int)) { + _array[i++] = c; + } + va_end(args); + } + + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + ZXIntArray *copy = [[ZXIntArray allocWithZone:zone] initWithLength:self.length]; + memcpy(copy.array, self.array, self.length * sizeof(int32_t)); + return copy; +} + +- (void)dealloc { + if (_array) { + free(_array); + } +} + +- (void)clear { + memset(self.array, 0, self.length * sizeof(int32_t)); +} + +- (int)sum { + int sum = 0; + int32_t *array = self.array; + for (int i = 0; i < self.length; i++) { + sum += array[i]; + } + return sum; +} + +- (NSString *)description { + NSMutableString *s = [NSMutableString stringWithFormat:@"length=%u, array=(", self.length]; + + for (int i = 0; i < self.length; i++) { + [s appendFormat:@"%d", self.array[i]]; + if (i < self.length - 1) { + [s appendString:@", "]; + } + } + + [s appendString:@")"]; + return s; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.h new file mode 100644 index 0000000..ab8cceb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This class implements a perspective transform in two dimensions. Given four source and four + * destination points, it will compute the transformation implied between them. The code is based + * directly upon section 3.4.2 of George Wolberg's "Digital Image Warping"; see pages 54-56. + */ +@interface ZXPerspectiveTransform : NSObject + ++ (ZXPerspectiveTransform *)quadrilateralToQuadrilateral:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 x0p:(float)x0p y0p:(float)y0p x1p:(float)x1p y1p:(float)y1p x2p:(float)x2p y2p:(float)y2p x3p:(float)x3p y3p:(float)y3p; +- (void)transformPoints:(float *)points pointsLen:(int)pointsLen; +- (void)transformPoints:(float *)xValues yValues:(float *)yValues pointsLen:(int)pointsLen; ++ (ZXPerspectiveTransform *)squareToQuadrilateral:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3; ++ (ZXPerspectiveTransform *)quadrilateralToSquare:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3; +- (ZXPerspectiveTransform *)buildAdjoint; +- (ZXPerspectiveTransform *)times:(ZXPerspectiveTransform *)other; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.m new file mode 100644 index 0000000..442b5c5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.m @@ -0,0 +1,128 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPerspectiveTransform.h" + +@interface ZXPerspectiveTransform () + +@property (nonatomic, assign, readonly) float a11; +@property (nonatomic, assign, readonly) float a12; +@property (nonatomic, assign, readonly) float a13; +@property (nonatomic, assign, readonly) float a21; +@property (nonatomic, assign, readonly) float a22; +@property (nonatomic, assign, readonly) float a23; +@property (nonatomic, assign, readonly) float a31; +@property (nonatomic, assign, readonly) float a32; +@property (nonatomic, assign, readonly) float a33; + +@end + +@implementation ZXPerspectiveTransform + +- (id)initWithA11:(float)a11 a21:(float)a21 a31:(float)a31 a12:(float)a12 a22:(float)a22 a32:(float)a32 a13:(float)a13 a23:(float)a23 a33:(float)a33 { + if (self = [super init]) { + _a11 = a11; + _a12 = a12; + _a13 = a13; + _a21 = a21; + _a22 = a22; + _a23 = a23; + _a31 = a31; + _a32 = a32; + _a33 = a33; + } + + return self; +} + ++ (ZXPerspectiveTransform *)quadrilateralToQuadrilateral:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 x0p:(float)x0p y0p:(float)y0p x1p:(float)x1p y1p:(float)y1p x2p:(float)x2p y2p:(float)y2p x3p:(float)x3p y3p:(float)y3p { + ZXPerspectiveTransform *qToS = [self quadrilateralToSquare:x0 y0:y0 x1:x1 y1:y1 x2:x2 y2:y2 x3:x3 y3:y3]; + ZXPerspectiveTransform *sToQ = [self squareToQuadrilateral:x0p y0:y0p x1:x1p y1:y1p x2:x2p y2:y2p x3:x3p y3:y3p]; + return [sToQ times:qToS]; +} + +- (void)transformPoints:(float *)points pointsLen:(int)pointsLen { + int max = pointsLen; + for (int i = 0; i < max; i += 2) { + float x = points[i]; + float y = points[i + 1]; + float denominator = self.a13 * x + self.a23 * y + self.a33; + points[i] = (self.a11 * x + self.a21 * y + self.a31) / denominator; + points[i + 1] = (self.a12 * x + self.a22 * y + self.a32) / denominator; + } +} + +/** + * Convenience method, not optimized for performance. + */ +- (void)transformPoints:(float *)xValues yValues:(float *)yValues pointsLen:(int)pointsLen { + int n = pointsLen; + for (int i = 0; i < n; i ++) { + float x = xValues[i]; + float y = yValues[i]; + float denominator = self.a13 * x + self.a23 * y + self.a33; + xValues[i] = (self.a11 * x + self.a21 * y + self.a31) / denominator; + yValues[i] = (self.a12 * x + self.a22 * y + self.a32) / denominator; + } +} + ++ (ZXPerspectiveTransform *)squareToQuadrilateral:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { + float dx3 = x0 - x1 + x2 - x3; + float dy3 = y0 - y1 + y2 - y3; + if (dx3 == 0.0f && dy3 == 0.0f) { + // Affine + return [[ZXPerspectiveTransform alloc] initWithA11:x1 - x0 a21:x2 - x1 a31:x0 a12:y1 - y0 a22:y2 - y1 a32:y0 a13:0.0f a23:0.0f a33:1.0f]; + } else { + float dx1 = x1 - x2; + float dx2 = x3 - x2; + float dy1 = y1 - y2; + float dy2 = y3 - y2; + float denominator = dx1 * dy2 - dx2 * dy1; + float a13 = (dx3 * dy2 - dx2 * dy3) / denominator; + float a23 = (dx1 * dy3 - dx3 * dy1) / denominator; + return [[ZXPerspectiveTransform alloc] initWithA11:x1 - x0 + a13 * x1 a21:x3 - x0 + a23 * x3 a31:x0 a12:y1 - y0 + a13 * y1 a22:y3 - y0 + a23 * y3 a32:y0 a13:a13 a23:a23 a33:1.0f]; + } +} + ++ (ZXPerspectiveTransform *)quadrilateralToSquare:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { + return [[self squareToQuadrilateral:x0 y0:y0 x1:x1 y1:y1 x2:x2 y2:y2 x3:x3 y3:y3] buildAdjoint]; +} + +- (ZXPerspectiveTransform *)buildAdjoint { + return [[ZXPerspectiveTransform alloc] initWithA11:self.a22 * self.a33 - self.a23 * self.a32 + a21:self.a23 * self.a31 - self.a21 * self.a33 + a31:self.a21 * self.a32 - self.a22 * self.a31 + a12:self.a13 * self.a32 - self.a12 * self.a33 + a22:self.a11 * self.a33 - self.a13 * self.a31 + a32:self.a12 * self.a31 - self.a11 * self.a32 + a13:self.a12 * self.a23 - self.a13 * self.a22 + a23:self.a13 * self.a21 - self.a11 * self.a23 + a33:self.a11 * self.a22 - self.a12 * self.a21]; +} + +- (ZXPerspectiveTransform *)times:(ZXPerspectiveTransform *)other { + return [[ZXPerspectiveTransform alloc] initWithA11:self.a11 * other.a11 + self.a21 * other.a12 + self.a31 * other.a13 + a21:self.a11 * other.a21 + self.a21 * other.a22 + self.a31 * other.a23 + a31:self.a11 * other.a31 + self.a21 * other.a32 + self.a31 * other.a33 + a12:self.a12 * other.a11 + self.a22 * other.a12 + self.a32 * other.a13 + a22:self.a12 * other.a21 + self.a22 * other.a22 + self.a32 * other.a23 + a32:self.a12 * other.a31 + self.a22 * other.a32 + self.a32 * other.a33 + a13:self.a13 * other.a11 + self.a23 * other.a12 + self.a33 * other.a13 + a23:self.a13 * other.a21 + self.a23 * other.a22 + self.a33 * other.a23 + a33:self.a13 * other.a31 + self.a23 * other.a32 + self.a33 * other.a33]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.h new file mode 100644 index 0000000..074af7e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.h @@ -0,0 +1,33 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXDecodeHints; + +/** + * Common string-related functions. + */ +@interface ZXStringUtils : NSObject + +/** + * @param bytes bytes encoding a string, whose encoding should be guessed + * @param hints decode hints if applicable + * @return name of guessed encoding; at the moment will only guess one of: + * NSShiftJISStringEncoding, NSUTF8StringEncoding, NSISOLatin1StringEncoding, or the platform + * default encoding if none of these can possibly be correct + */ ++ (NSStringEncoding)guessEncoding:(ZXByteArray *)bytes hints:(ZXDecodeHints *)hints; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.m new file mode 100644 index 0000000..ebd0dff --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.m @@ -0,0 +1,188 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXDecodeHints.h" +#import "ZXStringUtils.h" + +@implementation ZXStringUtils + ++ (NSStringEncoding)guessEncoding:(ZXByteArray *)bytes hints:(ZXDecodeHints *)hints { + NSStringEncoding systemEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringGetSystemEncoding()); + BOOL assumeShiftJIS = systemEncoding == NSShiftJISStringEncoding || systemEncoding == NSJapaneseEUCStringEncoding; + + if (hints != nil) { + NSStringEncoding encoding = hints.encoding; + if (encoding > 0) { + return encoding; + } + } + // For now, merely tries to distinguish ISO-8859-1, UTF-8 and Shift_JIS, + // which should be by far the most common encodings. + int length = bytes.length; + BOOL canBeISO88591 = YES; + BOOL canBeShiftJIS = YES; + BOOL canBeUTF8 = YES; + int utf8BytesLeft = 0; + //int utf8LowChars = 0; + int utf2BytesChars = 0; + int utf3BytesChars = 0; + int utf4BytesChars = 0; + int sjisBytesLeft = 0; + //int sjisLowChars = 0; + int sjisKatakanaChars = 0; + //int sjisDoubleBytesChars = 0; + int sjisCurKatakanaWordLength = 0; + int sjisCurDoubleBytesWordLength = 0; + int sjisMaxKatakanaWordLength = 0; + int sjisMaxDoubleBytesWordLength = 0; + //int isoLowChars = 0; + //int isoHighChars = 0; + int isoHighOther = 0; + + BOOL utf8bom = length > 3 && + bytes.array[0] == (int8_t) 0xEF && + bytes.array[1] == (int8_t) 0xBB && + bytes.array[2] == (int8_t) 0xBF; + + for (int i = 0; + i < length && (canBeISO88591 || canBeShiftJIS || canBeUTF8); + i++) { + + int value = bytes.array[i] & 0xFF; + + // UTF-8 stuff + if (canBeUTF8) { + if (utf8BytesLeft > 0) { + if ((value & 0x80) == 0) { + canBeUTF8 = NO; + } else { + utf8BytesLeft--; + } + } else if ((value & 0x80) != 0) { + if ((value & 0x40) == 0) { + canBeUTF8 = NO; + } else { + utf8BytesLeft++; + if ((value & 0x20) == 0) { + utf2BytesChars++; + } else { + utf8BytesLeft++; + if ((value & 0x10) == 0) { + utf3BytesChars++; + } else { + utf8BytesLeft++; + if ((value & 0x08) == 0) { + utf4BytesChars++; + } else { + canBeUTF8 = NO; + } + } + } + } + } //else { + //utf8LowChars++; + //} + } + + // ISO-8859-1 stuff + if (canBeISO88591) { + if (value > 0x7F && value < 0xA0) { + canBeISO88591 = NO; + } else if (value > 0x9F) { + if (value < 0xC0 || value == 0xD7 || value == 0xF7) { + isoHighOther++; + } //else { + //isoHighChars++; + //} + } //else { + //isoLowChars++; + //} + } + + // Shift_JIS stuff + if (canBeShiftJIS) { + if (sjisBytesLeft > 0) { + if (value < 0x40 || value == 0x7F || value > 0xFC) { + canBeShiftJIS = NO; + } else { + sjisBytesLeft--; + } + } else if (value == 0x80 || value == 0xA0 || value > 0xEF) { + canBeShiftJIS = NO; + } else if (value > 0xA0 && value < 0xE0) { + sjisKatakanaChars++; + sjisCurDoubleBytesWordLength = 0; + sjisCurKatakanaWordLength++; + if (sjisCurKatakanaWordLength > sjisMaxKatakanaWordLength) { + sjisMaxKatakanaWordLength = sjisCurKatakanaWordLength; + } + } else if (value > 0x7F) { + sjisBytesLeft++; + //sjisDoubleBytesChars++; + sjisCurKatakanaWordLength = 0; + sjisCurDoubleBytesWordLength++; + if (sjisCurDoubleBytesWordLength > sjisMaxDoubleBytesWordLength) { + sjisMaxDoubleBytesWordLength = sjisCurDoubleBytesWordLength; + } + } else { + //sjisLowChars++; + sjisCurKatakanaWordLength = 0; + sjisCurDoubleBytesWordLength = 0; + } + } + } + + if (canBeUTF8 && utf8BytesLeft > 0) { + canBeUTF8 = NO; + } + if (canBeShiftJIS && sjisBytesLeft > 0) { + canBeShiftJIS = NO; + } + + // Easy -- if there is BOM or at least 1 valid not-single byte character (and no evidence it can't be UTF-8), done + if (canBeUTF8 && (utf8bom || utf2BytesChars + utf3BytesChars + utf4BytesChars > 0)) { + return NSUTF8StringEncoding; + } + // Easy -- if assuming Shift_JIS or at least 3 valid consecutive not-ascii characters (and no evidence it can't be), done + if (canBeShiftJIS && (assumeShiftJIS || sjisMaxKatakanaWordLength >= 3 || sjisMaxDoubleBytesWordLength >= 3)) { + return NSShiftJISStringEncoding; + } + // Distinguishing Shift_JIS and ISO-8859-1 can be a little tough for short words. The crude heuristic is: + // - If we saw + // - only two consecutive katakana chars in the whole text, or + // - at least 10% of bytes that could be "upper" not-alphanumeric Latin1, + // - then we conclude Shift_JIS, else ISO-8859-1 + if (canBeISO88591 && canBeShiftJIS) { + return (sjisMaxKatakanaWordLength == 2 && sjisKatakanaChars == 2) || isoHighOther * 10 >= length + ? NSShiftJISStringEncoding : NSISOLatin1StringEncoding; + } + + // Otherwise, try in order ISO-8859-1, Shift JIS, UTF-8 and fall back to default platform encoding + if (canBeISO88591) { + return NSISOLatin1StringEncoding; + } + if (canBeShiftJIS) { + return NSShiftJISStringEncoding; + } + if (canBeUTF8) { + return NSUTF8StringEncoding; + } + // Otherwise, we take a wild guess with platform encoding + return systemEncoding; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.h new file mode 100644 index 0000000..cd38da4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXMathUtils : NSObject + ++ (int)round:(float)d; ++ (float)distance:(float)aX aY:(float)aY bX:(float)bX bY:(float)bY; ++ (float)distanceInt:(int)aX aY:(int)aY bX:(int)bX bY:(int)bY; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.m new file mode 100644 index 0000000..3c83ce2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.m @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXMathUtils.h" + +@implementation ZXMathUtils + ++ (int)round:(float)d { + return (int) (d + (d < 0.0f ? -0.5f : 0.5f)); +} + ++ (float)distance:(float)aX aY:(float)aY bX:(float)bX bY:(float)bY { + float xDiff = aX - bX; + float yDiff = aY - bY; + return sqrtf(xDiff * xDiff + yDiff * yDiff); +} + ++ (float)distanceInt:(int)aX aY:(int)aY bX:(int)bX bY:(int)bY { + int xDiff = aX - bX; + int yDiff = aY - bY; + return sqrtf(xDiff * xDiff + yDiff * yDiff); +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.h new file mode 100644 index 0000000..96bd259 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.h @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix; + +/** + * A somewhat generic detector that looks for a barcode-like rectangular region within an image. + * It looks within a mostly white region of an image for a region of black and white, but mostly + * black. It returns the four corners of the region, as best it can determine. + */ +@interface ZXMonochromeRectangleDetector : NSObject + +- (id)initWithImage:(ZXBitMatrix *)image; + +/** + * Detects a rectangular region of black and white -- mostly black -- with a region of mostly + * white, in an image. + * + * @return ZXResultPoint array describing the corners of the rectangular region. The first and + * last points are opposed on the diagonal, as are the second and third. The first point will be + * the topmost point and the last, the bottommost. The second point will be leftmost and the + * third, the rightmost + * @return nil if no Data Matrix Code can be found + */ +- (NSArray *)detectWithError:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.m new file mode 100644 index 0000000..8549d27 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.m @@ -0,0 +1,209 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXErrors.h" +#import "ZXMonochromeRectangleDetector.h" +#import "ZXResultPoint.h" + +const int ZX_MONOCHROME_MAX_MODULES = 32; + +@interface ZXMonochromeRectangleDetector () + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; + +@end + +@implementation ZXMonochromeRectangleDetector + +- (id)initWithImage:(ZXBitMatrix *)image { + if (self = [super init]) { + _image = image; + } + + return self; +} + +- (NSArray *)detectWithError:(NSError **)error { + int height = [self.image height]; + int width = [self.image width]; + int halfHeight = height / 2; + int halfWidth = width / 2; + int deltaY = MAX(1, height / (ZX_MONOCHROME_MAX_MODULES * 8) > 1); + int deltaX = MAX(1, width / (ZX_MONOCHROME_MAX_MODULES * 8) > 1); + + int top = 0; + int bottom = height; + int left = 0; + int right = width; + ZXResultPoint *pointA = [self findCornerFromCenter:halfWidth deltaX:0 left:left right:right + centerY:halfHeight deltaY:-deltaY top:top bottom:bottom maxWhiteRun:halfWidth / 2]; + if (!pointA) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + top = (int)[pointA y] - 1; + ZXResultPoint *pointB = [self findCornerFromCenter:halfWidth deltaX:-deltaX left:left right:right + centerY:halfHeight deltaY:0 top:top bottom:bottom maxWhiteRun:halfHeight / 2]; + if (!pointB) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + left = (int)[pointB x] - 1; + ZXResultPoint *pointC = [self findCornerFromCenter:halfWidth deltaX:deltaX left:left right:right + centerY:halfHeight deltaY:0 top:top bottom:bottom maxWhiteRun:halfHeight / 2]; + if (!pointC) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + right = (int)[pointC x] + 1; + ZXResultPoint *pointD = [self findCornerFromCenter:halfWidth deltaX:0 left:left right:right + centerY:halfHeight deltaY:deltaY top:top bottom:bottom maxWhiteRun:halfWidth / 2]; + if (!pointD) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + bottom = (int)[pointD y] + 1; + + pointA = [self findCornerFromCenter:halfWidth deltaX:0 left:left right:right + centerY:halfHeight deltaY:-deltaY top:top bottom:bottom maxWhiteRun:halfWidth / 4]; + if (!pointA) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + return @[pointA, pointB, pointC, pointD]; +} + +/** + * Attempts to locate a corner of the barcode by scanning up, down, left or right from a center + * point which should be within the barcode. + * + * @param centerX center's x component (horizontal) + * @param deltaX same as deltaY but change in x per step instead + * @param left minimum value of x + * @param right maximum value of x + * @param centerY center's y component (vertical) + * @param deltaY change in y per step. If scanning up this is negative; down, positive; + * left or right, 0 + * @param top minimum value of y to search through (meaningless when di == 0) + * @param bottom maximum value of y + * @param maxWhiteRun maximum run of white pixels that can still be considered to be within + * the barcode + * @return a {@link com.google.zxing.ResultPoint} encapsulating the corner that was found + * or nil if such a point cannot be found + */ +- (ZXResultPoint *)findCornerFromCenter:(int)centerX deltaX:(int)deltaX left:(int)left right:(int)right centerY:(int)centerY deltaY:(int)deltaY top:(int)top bottom:(int)bottom maxWhiteRun:(int)maxWhiteRun { + NSArray *lastRange = nil; + for (int y = centerY, x = centerX; y < bottom && y >= top && x < right && x >= left; y += deltaY, x += deltaX) { + NSArray *range; + if (deltaX == 0) { + range = [self blackWhiteRange:y maxWhiteRun:maxWhiteRun minDim:left maxDim:right horizontal:YES]; + } else { + range = [self blackWhiteRange:x maxWhiteRun:maxWhiteRun minDim:top maxDim:bottom horizontal:NO]; + } + if (range == nil) { + if (lastRange == nil) { + return nil; + } + if (deltaX == 0) { + int lastY = y - deltaY; + if ([lastRange[0] intValue] < centerX) { + if ([lastRange[0] intValue] > centerX) { + return [[ZXResultPoint alloc] initWithX:deltaY > 0 ? [lastRange[0] intValue] : [lastRange[1] intValue] y:lastY]; + } + return [[ZXResultPoint alloc] initWithX:[lastRange[0] intValue] y:lastY]; + } else { + return [[ZXResultPoint alloc] initWithX:[lastRange[1] intValue] y:lastY]; + } + } else { + int lastX = x - deltaX; + if ([lastRange[0] intValue] < centerY) { + if ([lastRange[1] intValue] > centerY) { + return [[ZXResultPoint alloc] initWithX:lastX y:deltaX < 0 ? [lastRange[0] intValue] : [lastRange[1] intValue]]; + } + return [[ZXResultPoint alloc] initWithX:lastX y:[lastRange[0] intValue]]; + } else { + return [[ZXResultPoint alloc] initWithX:lastX y:[lastRange[1] intValue]]; + } + } + } + lastRange = range; + } + + return nil; +} + +/** + * Computes the start and end of a region of pixels, either horizontally or vertically, that could + * be part of a Data Matrix barcode. + * + * @param fixedDimension if scanning horizontally, this is the row (the fixed vertical location) + * where we are scanning. If scanning vertically it's the column, the fixed horizontal location + * @param maxWhiteRun largest run of white pixels that can still be considered part of the + * barcode region + * @param minDim minimum pixel location, horizontally or vertically, to consider + * @param maxDim maximum pixel location, horizontally or vertically, to consider + * @param horizontal if true, we're scanning left-right, instead of up-down + * @return int[] with start and end of found range, or nil if no such range is found + * (e.g. only white was found) + */ +- (NSArray *)blackWhiteRange:(int)fixedDimension maxWhiteRun:(int)maxWhiteRun minDim:(int)minDim maxDim:(int)maxDim horizontal:(BOOL)horizontal { + int center = (minDim + maxDim) / 2; + + int start = center; + while (start >= minDim) { + if (horizontal ? [self.image getX:start y:fixedDimension] : [self.image getX:fixedDimension y:start]) { + start--; + } else { + int whiteRunStart = start; + + do { + start--; + } while (start >= minDim && !(horizontal ? [self.image getX:start y:fixedDimension] : [self.image getX:fixedDimension y:start])); + int whiteRunSize = whiteRunStart - start; + if (start < minDim || whiteRunSize > maxWhiteRun) { + start = whiteRunStart; + break; + } + } + } + + start++; + int end = center; + + while (end < maxDim) { + if (horizontal ? [self.image getX:end y:fixedDimension] : [self.image getX:fixedDimension y:end]) { + end++; + } else { + int whiteRunStart = end; + + do { + end++; + } while (end < maxDim && !(horizontal ? [self.image getX:end y:fixedDimension] : [self.image getX:fixedDimension y:end])); + int whiteRunSize = end - whiteRunStart; + if (end >= maxDim || whiteRunSize > maxWhiteRun) { + end = whiteRunStart; + break; + } + } + } + + end--; + return end > start ? @[@(start), @(end)] : nil; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.h new file mode 100644 index 0000000..09dbb46 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.h @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultPoint.h" +#import "ZXBitMatrix.h" + +/** + * Detects a candidate barcode-like rectangular region within an image. It + * starts around the center of the image, increases the size of the candidate + * region until it finds a white rectangular region. By keeping track of the + * last black points it encountered, it determines the corners of the barcode. + */ +@interface ZXWhiteRectangleDetector : NSObject + +- (id)initWithImage:(ZXBitMatrix *)image error:(NSError **)error; +- (id)initWithImage:(ZXBitMatrix *)image initSize:(int)initSize x:(int)x y:(int)y error:(NSError **)error; + +/** + * Detects a candidate barcode-like rectangular region within an image. It + * starts around the center of the image, increases the size of the candidate + * region until it finds a white rectangular region. + * + * @return {@link ResultPoint}[] describing the corners of the rectangular + * region. The first and last points are opposed on the diagonal, as + * are the second and third. The first point will be the topmost + * point and the last, the bottommost. The second point will be + * leftmost and the third, the rightmost + * @return nil if no Data Matrix Code can be found + */ +- (NSArray *)detectWithError:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.m new file mode 100644 index 0000000..677c873 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.m @@ -0,0 +1,311 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXMathUtils.h" +#import "ZXWhiteRectangleDetector.h" + +@interface ZXWhiteRectangleDetector () + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, assign, readonly) int height; +@property (nonatomic, assign, readonly) int width; +@property (nonatomic, assign, readonly) int leftInit; +@property (nonatomic, assign, readonly) int rightInit; +@property (nonatomic, assign, readonly) int downInit; +@property (nonatomic, assign, readonly) int upInit; + +@end + +const int ZX_INIT_SIZE = 10; +const int ZX_CORR = 1; + +@implementation ZXWhiteRectangleDetector + +- (id)initWithImage:(ZXBitMatrix *)image error:(NSError **)error { + return [self initWithImage:image initSize:ZX_INIT_SIZE x:image.width / 2 y:image.height / 2 error:error]; +} + +- (id)initWithImage:(ZXBitMatrix *)image initSize:(int)initSize x:(int)x y:(int)y error:(NSError **)error { + if (self = [super init]) { + _image = image; + _height = image.height; + _width = image.width; + int halfsize = initSize / 2; + _leftInit = x - halfsize; + _rightInit = x + halfsize; + _upInit = y - halfsize; + _downInit = y + halfsize; + if (_upInit < 0 || _leftInit < 0 || _downInit >= _height || _rightInit >= _width) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + } + + return self; +} + +- (NSArray *)detectWithError:(NSError **)error { + int left = self.leftInit; + int right = self.rightInit; + int up = self.upInit; + int down = self.downInit; + BOOL sizeExceeded = NO; + BOOL aBlackPointFoundOnBorder = YES; + BOOL atLeastOneBlackPointFoundOnBorder = NO; + + BOOL atLeastOneBlackPointFoundOnRight = NO; + BOOL atLeastOneBlackPointFoundOnBottom = NO; + BOOL atLeastOneBlackPointFoundOnLeft = NO; + BOOL atLeastOneBlackPointFoundOnTop = NO; + + while (aBlackPointFoundOnBorder) { + aBlackPointFoundOnBorder = NO; + + // ..... + // . | + // ..... + BOOL rightBorderNotWhite = YES; + while ((rightBorderNotWhite || !atLeastOneBlackPointFoundOnRight) && right < self.width) { + rightBorderNotWhite = [self containsBlackPoint:up b:down fixed:right horizontal:NO]; + if (rightBorderNotWhite) { + right++; + aBlackPointFoundOnBorder = YES; + atLeastOneBlackPointFoundOnRight = YES; + } else if (!atLeastOneBlackPointFoundOnRight) { + right++; + } + } + + if (right >= self.width) { + sizeExceeded = YES; + break; + } + + // ..... + // . . + // .___. + BOOL bottomBorderNotWhite = YES; + while ((bottomBorderNotWhite || !atLeastOneBlackPointFoundOnBottom) && down < self.height) { + bottomBorderNotWhite = [self containsBlackPoint:left b:right fixed:down horizontal:YES]; + if (bottomBorderNotWhite) { + down++; + aBlackPointFoundOnBorder = YES; + atLeastOneBlackPointFoundOnBottom = YES; + } else if (!atLeastOneBlackPointFoundOnBottom) { + down++; + } + } + + if (down >= self.height) { + sizeExceeded = YES; + break; + } + + // ..... + // | . + // ..... + BOOL leftBorderNotWhite = YES; + while ((leftBorderNotWhite || !atLeastOneBlackPointFoundOnLeft) && left >= 0) { + leftBorderNotWhite = [self containsBlackPoint:up b:down fixed:left horizontal:NO]; + if (leftBorderNotWhite) { + left--; + aBlackPointFoundOnBorder = YES; + atLeastOneBlackPointFoundOnLeft = YES; + } else if (!atLeastOneBlackPointFoundOnLeft) { + left--; + } + } + + if (left < 0) { + sizeExceeded = YES; + break; + } + + // .___. + // . . + // ..... + BOOL topBorderNotWhite = YES; + while ((topBorderNotWhite || !atLeastOneBlackPointFoundOnTop) && up >= 0) { + topBorderNotWhite = [self containsBlackPoint:left b:right fixed:up horizontal:YES]; + if (topBorderNotWhite) { + up--; + aBlackPointFoundOnBorder = YES; + atLeastOneBlackPointFoundOnTop = YES; + } else if (!atLeastOneBlackPointFoundOnTop) { + up--; + } + } + + if (up < 0) { + sizeExceeded = YES; + break; + } + + if (aBlackPointFoundOnBorder) { + atLeastOneBlackPointFoundOnBorder = YES; + } + } + + if (!sizeExceeded && atLeastOneBlackPointFoundOnBorder) { + int maxSize = right - left; + + ZXResultPoint *z = nil; + for (int i = 1; i < maxSize; i++) { + z = [self blackPointOnSegment:left aY:down - i bX:left + i bY:down]; + if (z != nil) { + break; + } + } + + if (z == nil) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + ZXResultPoint *t = nil; + for (int i = 1; i < maxSize; i++) { + t = [self blackPointOnSegment:left aY:up + i bX:left + i bY:up]; + if (t != nil) { + break; + } + } + + if (t == nil) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + ZXResultPoint *x = nil; + for (int i = 1; i < maxSize; i++) { + x = [self blackPointOnSegment:right aY:up + i bX:right - i bY:up]; + if (x != nil) { + break; + } + } + + if (x == nil) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + ZXResultPoint *y = nil; + for (int i = 1; i < maxSize; i++) { + y = [self blackPointOnSegment:right aY:down - i bX:right - i bY:down]; + if (y != nil) { + break; + } + } + + if (y == nil) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return [self centerEdges:y z:z x:x t:t]; + } else { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } +} + + +- (ZXResultPoint *)blackPointOnSegment:(float)aX aY:(float)aY bX:(float)bX bY:(float)bY { + int dist = [ZXMathUtils round:[ZXMathUtils distance:aX aY:aY bX:bX bY:bY]]; + float xStep = (bX - aX) / dist; + float yStep = (bY - aY) / dist; + + for (int i = 0; i < dist; i++) { + int x = [ZXMathUtils round:aX + i * xStep]; + int y = [ZXMathUtils round:aY + i * yStep]; + if ([self.image getX:x y:y]) { + return [[ZXResultPoint alloc] initWithX:x y:y]; + } + } + + return nil; +} + +/** + * recenters the points of a constant distance towards the center + * + * @param y bottom most point + * @param z left most point + * @param x right most point + * @param t top most point + * @return ZXResultPoint array describing the corners of the rectangular + * region. The first and last points are opposed on the diagonal, as + * are the second and third. The first point will be the topmost + * point and the last, the bottommost. The second point will be + * leftmost and the third, the rightmost + */ +- (NSArray *)centerEdges:(ZXResultPoint *)y z:(ZXResultPoint *)z x:(ZXResultPoint *)x t:(ZXResultPoint *)t { + // + // t t + // z x + // x OR z + // y y + // + + float yi = y.x; + float yj = y.y; + float zi = z.x; + float zj = z.y; + float xi = x.x; + float xj = x.y; + float ti = t.x; + float tj = t.y; + + if (yi < self.width / 2.0f) { + return @[[[ZXResultPoint alloc] initWithX:ti - ZX_CORR y:tj + ZX_CORR], + [[ZXResultPoint alloc] initWithX:zi + ZX_CORR y:zj + ZX_CORR], + [[ZXResultPoint alloc] initWithX:xi - ZX_CORR y:xj - ZX_CORR], + [[ZXResultPoint alloc] initWithX:yi + ZX_CORR y:yj - ZX_CORR]]; + } else { + return @[[[ZXResultPoint alloc] initWithX:ti + ZX_CORR y:tj + ZX_CORR], + [[ZXResultPoint alloc] initWithX:zi + ZX_CORR y:zj - ZX_CORR], + [[ZXResultPoint alloc] initWithX:xi - ZX_CORR y:xj + ZX_CORR], + [[ZXResultPoint alloc] initWithX:yi - ZX_CORR y:yj - ZX_CORR]]; + } +} + +/** + * Determines whether a segment contains a black point + * + * @param a min value of the scanned coordinate + * @param b max value of the scanned coordinate + * @param fixed value of fixed coordinate + * @param horizontal set to true if scan must be horizontal, false if vertical + * @return true if a black point has been found, else false. + */ +- (BOOL)containsBlackPoint:(int)a b:(int)b fixed:(int)fixed horizontal:(BOOL)horizontal { + if (horizontal) { + for (int x = a; x <= b; x++) { + if ([self.image getX:x y:fixed]) { + return YES; + } + } + } else { + for (int y = a; y <= b; y++) { + if ([self.image getX:fixed y:y]) { + return YES; + } + } + } + + return NO; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.h new file mode 100644 index 0000000..f5d0b62 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.h @@ -0,0 +1,87 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXGenericGFPoly; + +/** + * This class contains utility methods for performing mathematical operations over + * the Galois Fields. Operations use a given primitive polynomial in calculations. + * + * Throughout this package, elements of the GF are represented as an int + * for convenience and speed (but at the cost of memory). + */ +@interface ZXGenericGF : NSObject + +@property (nonatomic, strong, readonly) ZXGenericGFPoly *zero; +@property (nonatomic, strong, readonly) ZXGenericGFPoly *one; +@property (nonatomic, assign, readonly) int32_t size; +@property (nonatomic, assign, readonly) int32_t generatorBase; + ++ (ZXGenericGF *)AztecData12; ++ (ZXGenericGF *)AztecData10; ++ (ZXGenericGF *)AztecData6; ++ (ZXGenericGF *)AztecParam; ++ (ZXGenericGF *)QrCodeField256; ++ (ZXGenericGF *)DataMatrixField256; ++ (ZXGenericGF *)AztecData8; ++ (ZXGenericGF *)MaxiCodeField64; + +/** + * Create a representation of GF(size) using the given primitive polynomial. + * + * @param primitive irreducible polynomial whose coefficients are represented by + * the bits of an int, where the least-significant bit represents the constant + * coefficient + * @param size the size of the field + * @param b the factor b in the generator polynomial can be 0- or 1-based + * (g(x) = (x+a^b)(x+a^(b+1))...(x+a^(b+2t-1))). + * In most cases it should be 1, but for QR code it is 0. + */ +- (id)initWithPrimitive:(int)primitive size:(int)size b:(int)b; + +/** + * @return the monomial representing coefficient * x^degree + */ +- (ZXGenericGFPoly *)buildMonomial:(int)degree coefficient:(int)coefficient; + +/** + * Implements both addition and subtraction -- they are the same in GF(size). + * + * @return sum/difference of a and b + */ ++ (int32_t)addOrSubtract:(int32_t)a b:(int32_t)b; + +/** + * @return 2 to the power of a in GF(size) + */ +- (int32_t)exp:(int)a; + +/** + * @return base 2 log of a in GF(size) + */ +- (int32_t)log:(int)a; + +/** + * @return multiplicative inverse of a + */ +- (int32_t)inverse:(int)a; + +/** + * @return product of a and b in GF(size) + */ +- (int32_t)multiply:(int)a b:(int)b; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.m new file mode 100644 index 0000000..be1eb5d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.m @@ -0,0 +1,178 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGenericGF.h" +#import "ZXGenericGFPoly.h" +#import "ZXIntArray.h" + +@interface ZXGenericGF () + +@property (nonatomic, assign, readonly) int32_t *expTable; +@property (nonatomic, assign, readonly) int32_t *logTable; +@property (nonatomic, assign, readonly) int primitive; + +@end + +@implementation ZXGenericGF { + ZXGenericGFPoly *_one; + ZXGenericGFPoly *_zero; +} + +- (id)initWithPrimitive:(int)primitive size:(int)size b:(int)b { + if (self = [super init]) { + _primitive = primitive; + _size = size; + _generatorBase = b; + + _expTable = (int32_t *)calloc(self.size, sizeof(int32_t)); + _logTable = (int32_t *)calloc(self.size, sizeof(int32_t)); + int32_t x = 1; + for (int i = 0; i < self.size; i++) { + _expTable[i] = x; + x <<= 1; // we're assuming the generator alpha is 2 + if (x >= self.size) { + x ^= (int32_t)self.primitive; + x &= (int32_t)self.size - 1; + } + } + + for (int32_t i = 0; i < (int32_t)self.size-1; i++) { + _logTable[_expTable[i]] = i; + } + // logTable[0] == 0 but this should never be used + _zero = [[ZXGenericGFPoly alloc] initWithField:self coefficients:[[ZXIntArray alloc] initWithLength:1]]; + + _one = [[ZXGenericGFPoly alloc] initWithField:self coefficients:[[ZXIntArray alloc] initWithInts:1, -1]]; + } + + return self; +} + ++ (ZXGenericGF *)AztecData12 { + static ZXGenericGF *AztecData12 = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + AztecData12 = [[ZXGenericGF alloc] initWithPrimitive:0x1069 size:4096 b:1]; // x^12 + x^6 + x^5 + x^3 + 1 + }); + return AztecData12; +} + ++ (ZXGenericGF *)AztecData10 { + static ZXGenericGF *AztecData10 = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + AztecData10 = [[ZXGenericGF alloc] initWithPrimitive:0x409 size:1024 b:1]; // x^10 + x^3 + 1 + }); + return AztecData10; +} + ++ (ZXGenericGF *)AztecData6 { + static ZXGenericGF *AztecData6 = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + AztecData6 = [[ZXGenericGF alloc] initWithPrimitive:0x43 size:64 b:1]; // x^6 + x + 1 + }); + return AztecData6; +} + ++ (ZXGenericGF *)AztecParam { + static ZXGenericGF *AztecParam = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + AztecParam = [[ZXGenericGF alloc] initWithPrimitive:0x13 size:16 b:1]; // x^4 + x + 1 + }); + return AztecParam; +} + ++ (ZXGenericGF *)QrCodeField256 { + static ZXGenericGF *QrCodeField256 = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + QrCodeField256 = [[ZXGenericGF alloc] initWithPrimitive:0x011D size:256 b:0]; // x^8 + x^4 + x^3 + x^2 + 1 + }); + return QrCodeField256; +} + ++ (ZXGenericGF *)DataMatrixField256 { + static ZXGenericGF *DataMatrixField256 = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + DataMatrixField256 = [[ZXGenericGF alloc] initWithPrimitive:0x012D size:256 b:1]; // x^8 + x^5 + x^3 + x^2 + 1 + }); + return DataMatrixField256; +} + ++ (ZXGenericGF *)AztecData8 { + return [self DataMatrixField256]; +} + ++ (ZXGenericGF *)MaxiCodeField64 { + return [self AztecData6]; +} + +- (ZXGenericGFPoly *)buildMonomial:(int)degree coefficient:(int32_t)coefficient { + if (degree < 0) { + [NSException raise:NSInvalidArgumentException format:@"Degree must be greater than 0."]; + } + if (coefficient == 0) { + return self.zero; + } + ZXIntArray *coefficients = [[ZXIntArray alloc] initWithLength:degree + 1]; + coefficients.array[0] = coefficient; + return [[ZXGenericGFPoly alloc] initWithField:self coefficients:coefficients]; +} + ++ (int32_t)addOrSubtract:(int32_t)a b:(int32_t)b { + return a ^ b; +} + +- (int32_t)exp:(int)a { + return _expTable[a]; +} + +- (int32_t)log:(int)a { + if (a == 0) { + [NSException raise:NSInvalidArgumentException format:@"Argument must be non-zero."]; + } + + return _logTable[a]; +} + +- (int32_t)inverse:(int)a { + if (a == 0) { + [NSException raise:NSInvalidArgumentException format:@"Argument must be non-zero."]; + } + + return _expTable[_size - _logTable[a] - 1]; +} + +- (int32_t)multiply:(int)a b:(int)b { + if (a == 0 || b == 0) { + return 0; + } + + return _expTable[(_logTable[a] + _logTable[b]) % (_size - 1)]; +} + +- (BOOL)isEqual:(ZXGenericGF *)object { + return self.primitive == object.primitive && self.size == object.size; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"GF(0x%X,%d)", self.primitive, self.size]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.h new file mode 100644 index 0000000..feae94a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.h @@ -0,0 +1,64 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXGenericGF, ZXIntArray; + +/** + * Represents a polynomial whose coefficients are elements of a GF. + * Instances of this class are immutable. + * + * Much credit is due to William Rucklidge since portions of this code are an indirect + * port of his C++ Reed-Solomon implementation. + */ +@interface ZXGenericGFPoly : NSObject + +@property (nonatomic, strong, readonly) ZXIntArray *coefficients; + +/** + * @param field the {@link GenericGF} instance representing the field to use + * to perform computations + * @param coefficients coefficients as ints representing elements of GF(size), arranged + * from most significant (highest-power term) coefficient to least significant + */ +- (id)initWithField:(ZXGenericGF *)field coefficients:(ZXIntArray *)coefficients; + +/** + * @return degree of this polynomial + */ +- (int)degree; + +/** + * @return true iff this polynomial is the monomial "0" + */ +- (BOOL)zero; + +/** + * @return coefficient of x^degree term in this polynomial + */ +- (int)coefficient:(int)degree; + +/** + * @return evaluation of this polynomial at a given point + */ +- (int)evaluateAt:(int)a; + +- (ZXGenericGFPoly *)addOrSubtract:(ZXGenericGFPoly *)other; +- (ZXGenericGFPoly *)multiply:(ZXGenericGFPoly *)other; +- (ZXGenericGFPoly *)multiplyScalar:(int)scalar; +- (ZXGenericGFPoly *)multiplyByMonomial:(int)degree coefficient:(int)coefficient; +- (NSArray *)divide:(ZXGenericGFPoly *)other; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.m new file mode 100644 index 0000000..5df43db --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.m @@ -0,0 +1,246 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGenericGF.h" +#import "ZXGenericGFPoly.h" +#import "ZXIntArray.h" + +@interface ZXGenericGFPoly () + +@property (nonatomic, strong, readonly) ZXGenericGF *field; + +@end + +@implementation ZXGenericGFPoly + +- (id)initWithField:(ZXGenericGF *)field coefficients:(ZXIntArray *)coefficients { + if (self = [super init]) { + if (coefficients.length == 0) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"coefficients must have at least one element" + userInfo:nil]; + } + _field = field; + int coefficientsLength = coefficients.length; + if (coefficientsLength > 1 && coefficients.array[0] == 0) { + // Leading term must be non-zero for anything except the constant polynomial "0" + int firstNonZero = 1; + while (firstNonZero < coefficientsLength && coefficients.array[firstNonZero] == 0) { + firstNonZero++; + } + if (firstNonZero == coefficientsLength) { + _coefficients = [[ZXIntArray alloc] initWithLength:1]; + } else { + _coefficients = [[ZXIntArray alloc] initWithLength:coefficientsLength - firstNonZero]; + for (int i = 0; i < _coefficients.length; i++) { + _coefficients.array[i] = coefficients.array[firstNonZero + i]; + } + } + } else { + _coefficients = coefficients; + } + } + + return self; +} + +- (int)degree { + return self.coefficients.length - 1; +} + +- (BOOL)zero { + return self.coefficients.array[0] == 0; +} + +- (int)coefficient:(int)degree { + return self.coefficients.array[self.coefficients.length - 1 - degree]; +} + +- (int)evaluateAt:(int)a { + if (a == 0) { + return [self coefficient:0]; + } + int size = self.coefficients.length; + int32_t *coefficients = self.coefficients.array; + ZXGenericGF *field = self.field; + if (a == 1) { + // Just the sum of the coefficients + int result = 0; + for (int i = 0; i < size; i++) { + result = [ZXGenericGF addOrSubtract:result b:coefficients[i]]; + } + return result; + } + int result = coefficients[0]; + for (int i = 1; i < size; i++) { + result = [ZXGenericGF addOrSubtract:[field multiply:a b:result] b:coefficients[i]]; + } + return result; +} + +- (ZXGenericGFPoly *)addOrSubtract:(ZXGenericGFPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXGenericGFPolys do not have same ZXGenericGF field"]; + } + if (self.zero) { + return other; + } + if (other.zero) { + return self; + } + + ZXIntArray *smallerCoefficients = self.coefficients; + ZXIntArray *largerCoefficients = other.coefficients; + if (smallerCoefficients.length > largerCoefficients.length) { + ZXIntArray *temp = smallerCoefficients; + smallerCoefficients = largerCoefficients; + largerCoefficients = temp; + } + ZXIntArray *sumDiff = [[ZXIntArray alloc] initWithLength:largerCoefficients.length]; + int lengthDiff = largerCoefficients.length - smallerCoefficients.length; + // Copy high-order terms only found in higher-degree polynomial's coefficients + memcpy(sumDiff.array, largerCoefficients.array, lengthDiff * sizeof(int32_t)); + + for (int i = lengthDiff; i < largerCoefficients.length; i++) { + sumDiff.array[i] = [ZXGenericGF addOrSubtract:smallerCoefficients.array[i - lengthDiff] b:largerCoefficients.array[i]]; + } + + return [[ZXGenericGFPoly alloc] initWithField:self.field coefficients:sumDiff]; +} + +- (ZXGenericGFPoly *)multiply:(ZXGenericGFPoly *)other { + ZXGenericGF *field = self.field; + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXGenericGFPolys do not have same GenericGF field"]; + } + if (self.zero || other.zero) { + return field.zero; + } + ZXIntArray *aCoefficients = self.coefficients; + int aLength = aCoefficients.length; + ZXIntArray *bCoefficients = other.coefficients; + int bLength = bCoefficients.length; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:aLength + bLength - 1]; + for (int i = 0; i < aLength; i++) { + int aCoeff = aCoefficients.array[i]; + for (int j = 0; j < bLength; j++) { + product.array[i + j] = [ZXGenericGF addOrSubtract:product.array[i + j] + b:[field multiply:aCoeff b:bCoefficients.array[j]]]; + } + } + return [[ZXGenericGFPoly alloc] initWithField:field coefficients:product]; +} + +- (ZXGenericGFPoly *)multiplyScalar:(int)scalar { + if (scalar == 0) { + return self.field.zero; + } + if (scalar == 1) { + return self; + } + int size = self.coefficients.length; + int32_t *coefficients = self.coefficients.array; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:size]; + for (int i = 0; i < size; i++) { + product.array[i] = [self.field multiply:coefficients[i] b:scalar]; + } + return [[ZXGenericGFPoly alloc] initWithField:self.field coefficients:product]; +} + +- (ZXGenericGFPoly *)multiplyByMonomial:(int)degree coefficient:(int)coefficient { + if (degree < 0) { + [NSException raise:NSInvalidArgumentException format:@"Degree must be greater than 0."]; + } + if (coefficient == 0) { + return self.field.zero; + } + int size = self.coefficients.length; + int32_t *coefficients = self.coefficients.array; + ZXGenericGF *field = self.field; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:size + degree]; + for (int i = 0; i < size; i++) { + product.array[i] = [field multiply:coefficients[i] b:coefficient]; + } + + return [[ZXGenericGFPoly alloc] initWithField:field coefficients:product]; +} + +- (NSArray *)divide:(ZXGenericGFPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXGenericGFPolys do not have same ZXGenericGF field"]; + } + if (other.zero) { + [NSException raise:NSInvalidArgumentException format:@"Divide by 0"]; + } + + ZXGenericGFPoly *quotient = self.field.zero; + ZXGenericGFPoly *remainder = self; + + int denominatorLeadingTerm = [other coefficient:other.degree]; + int inverseDenominatorLeadingTerm = [self.field inverse:denominatorLeadingTerm]; + + ZXGenericGF *field = self.field; + while ([remainder degree] >= other.degree && !remainder.zero) { + int degreeDifference = remainder.degree - other.degree; + int scale = [field multiply:[remainder coefficient:remainder.degree] b:inverseDenominatorLeadingTerm]; + ZXGenericGFPoly *term = [other multiplyByMonomial:degreeDifference coefficient:scale]; + ZXGenericGFPoly *iterationQuotient = [field buildMonomial:degreeDifference coefficient:scale]; + quotient = [quotient addOrSubtract:iterationQuotient]; + remainder = [remainder addOrSubtract:term]; + } + + return @[quotient, remainder]; +} + +- (NSString *)description { + NSMutableString *result = [NSMutableString stringWithCapacity:8 * [self degree]]; + for (int degree = [self degree]; degree >= 0; degree--) { + int coefficient = [self coefficient:degree]; + if (coefficient != 0) { + if (coefficient < 0) { + [result appendString:@" - "]; + coefficient = -coefficient; + } else { + if ([result length] > 0) { + [result appendString:@" + "]; + } + } + if (degree == 0 || coefficient != 1) { + int alphaPower = [self.field log:coefficient]; + if (alphaPower == 0) { + [result appendString:@"1"]; + } else if (alphaPower == 1) { + [result appendString:@"a"]; + } else { + [result appendString:@"a^"]; + [result appendFormat:@"%d", alphaPower]; + } + } + if (degree != 0) { + if (degree == 1) { + [result appendString:@"x"]; + } else { + [result appendString:@"x^"]; + [result appendFormat:@"%d", degree]; + } + } + } + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.h new file mode 100644 index 0000000..62863d2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.h @@ -0,0 +1,51 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXGenericGF, ZXIntArray; + +/** + * Implements Reed-Solomon decoding, as the name implies. + * + * The algorithm will not be explained here, but the following references were helpful + * in creating this implementation: + * + * Bruce Maggs. + * http://www.cs.cmu.edu/afs/cs.cmu.edu/project/pscico-guyb/realworld/www/rs_decode.ps + * "Decoding Reed-Solomon Codes" (see discussion of Forney's Formula) + * + * J.I. Hall. www.mth.msu.edu/~jhall/classes/codenotes/GRS.pdf + * "Chapter 5. Generalized Reed-Solomon Codes" + * (see discussion of Euclidean algorithm) + * + * Much credit is due to William Rucklidge since portions of this code are an indirect + * port of his C++ Reed-Solomon implementation. + */ +@interface ZXReedSolomonDecoder : NSObject + +- (id)initWithField:(ZXGenericGF *)field; + +/** + * Decodes given set of received codewords, which include both data and error-correction + * codewords. Really, this means it uses Reed-Solomon to detect and correct errors, in-place, + * in the input. + * + * @param received data and error-correction codewords + * @param twoS number of error-correction codewords available + * @return NO if decoding fails for any reason + */ +- (BOOL)decode:(ZXIntArray *)received twoS:(int)twoS error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.m new file mode 100644 index 0000000..3f7b6d8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.m @@ -0,0 +1,189 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXGenericGFPoly.h" +#import "ZXIntArray.h" +#import "ZXReedSolomonDecoder.h" + +@interface ZXReedSolomonDecoder () + +@property (nonatomic, strong, readonly) ZXGenericGF *field; + +@end + +@implementation ZXReedSolomonDecoder + +- (id)initWithField:(ZXGenericGF *)field { + if (self = [super init]) { + _field = field; + } + + return self; +} + +- (BOOL)decode:(ZXIntArray *)received twoS:(int)twoS error:(NSError **)error { + ZXGenericGFPoly *poly = [[ZXGenericGFPoly alloc] initWithField:self.field coefficients:received]; + ZXIntArray *syndromeCoefficients = [[ZXIntArray alloc] initWithLength:twoS]; + BOOL noError = YES; + for (int i = 0; i < twoS; i++) { + int eval = [poly evaluateAt:[self.field exp:i + self.field.generatorBase]]; + syndromeCoefficients.array[syndromeCoefficients.length - 1 - i] = eval; + if (eval != 0) { + noError = NO; + } + } + if (noError) { + return YES; + } + ZXGenericGFPoly *syndrome = [[ZXGenericGFPoly alloc] initWithField:self.field coefficients:syndromeCoefficients]; + NSArray *sigmaOmega = [self runEuclideanAlgorithm:[self.field buildMonomial:twoS coefficient:1] b:syndrome R:twoS error:error]; + if (!sigmaOmega) { + return NO; + } + ZXGenericGFPoly *sigma = sigmaOmega[0]; + ZXGenericGFPoly *omega = sigmaOmega[1]; + ZXIntArray *errorLocations = [self findErrorLocations:sigma error:error]; + if (!errorLocations) { + return NO; + } + ZXIntArray *errorMagnitudes = [self findErrorMagnitudes:omega errorLocations:errorLocations]; + for (int i = 0; i < errorLocations.length; i++) { + int position = received.length - 1 - [self.field log:errorLocations.array[i]]; + if (position < 0) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Bad error location"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXReedSolomonError userInfo:userInfo]; + return NO; + } + received.array[position] = [ZXGenericGF addOrSubtract:received.array[position] b:errorMagnitudes.array[i]]; + } + return YES; +} + +- (NSArray *)runEuclideanAlgorithm:(ZXGenericGFPoly *)a b:(ZXGenericGFPoly *)b R:(int)R error:(NSError **)error { + if (a.degree < b.degree) { + ZXGenericGFPoly *temp = a; + a = b; + b = temp; + } + + ZXGenericGFPoly *rLast = a; + ZXGenericGFPoly *r = b; + ZXGenericGFPoly *tLast = self.field.zero; + ZXGenericGFPoly *t = self.field.one; + + while ([r degree] >= R / 2) { + ZXGenericGFPoly *rLastLast = rLast; + ZXGenericGFPoly *tLastLast = tLast; + rLast = r; + tLast = t; + + if ([rLast zero]) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"r_{i-1} was zero"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXReedSolomonError userInfo:userInfo]; + return nil; + } + r = rLastLast; + ZXGenericGFPoly *q = [self.field zero]; + int denominatorLeadingTerm = [rLast coefficient:[rLast degree]]; + int dltInverse = [self.field inverse:denominatorLeadingTerm]; + + while ([r degree] >= [rLast degree] && ![r zero]) { + int degreeDiff = [r degree] - [rLast degree]; + int scale = [self.field multiply:[r coefficient:[r degree]] b:dltInverse]; + q = [q addOrSubtract:[self.field buildMonomial:degreeDiff coefficient:scale]]; + r = [r addOrSubtract:[rLast multiplyByMonomial:degreeDiff coefficient:scale]]; + } + + t = [[q multiply:tLast] addOrSubtract:tLastLast]; + + if (r.degree >= rLast.degree) { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:@"Division algorithm failed to reduce polynomial?" + userInfo:nil]; + } + } + + int sigmaTildeAtZero = [t coefficient:0]; + if (sigmaTildeAtZero == 0) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"sigmaTilde(0) was zero"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXReedSolomonError userInfo:userInfo]; + return nil; + } + + int inverse = [self.field inverse:sigmaTildeAtZero]; + ZXGenericGFPoly *sigma = [t multiplyScalar:inverse]; + ZXGenericGFPoly *omega = [r multiplyScalar:inverse]; + return @[sigma, omega]; +} + +- (ZXIntArray *)findErrorLocations:(ZXGenericGFPoly *)errorLocator error:(NSError **)error { + int numErrors = [errorLocator degree]; + if (numErrors == 1) { + ZXIntArray *array = [[ZXIntArray alloc] initWithLength:1]; + array.array[0] = [errorLocator coefficient:1]; + return array; + } + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:numErrors]; + int e = 0; + for (int i = 1; i < [self.field size] && e < numErrors; i++) { + if ([errorLocator evaluateAt:i] == 0) { + result.array[e] = [self.field inverse:i]; + e++; + } + } + + if (e != numErrors) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Error locator degree does not match number of roots"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXReedSolomonError userInfo:userInfo]; + return nil; + } + return result; +} + +- (ZXIntArray *)findErrorMagnitudes:(ZXGenericGFPoly *)errorEvaluator errorLocations:(ZXIntArray *)errorLocations { + int s = errorLocations.length; + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:s]; + ZXGenericGF *field = self.field; + for (int i = 0; i < s; i++) { + int xiInverse = [field inverse:errorLocations.array[i]]; + int denominator = 1; + for (int j = 0; j < s; j++) { + if (i != j) { + //denominator = field.multiply(denominator, + // GenericGF.addOrSubtract(1, field.multiply(errorLocations[j], xiInverse))); + // Above should work but fails on some Apple and Linux JDKs due to a Hotspot bug. + // Below is a funny-looking workaround from Steven Parkes + int term = [field multiply:errorLocations.array[j] b:xiInverse]; + int termPlus1 = (term & 0x1) == 0 ? term | 1 : term & ~1; + denominator = [field multiply:denominator b:termPlus1]; + } + } + result.array[i] = [field multiply:[errorEvaluator evaluateAt:xiInverse] b:[field inverse:denominator]]; + if (field.generatorBase != 0) { + result.array[i] = [field multiply:result.array[i] b:xiInverse]; + } + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.h new file mode 100644 index 0000000..af27289 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXGenericGF, ZXIntArray; + +/** + * Implements Reed-Solomon enbcoding, as the name implies. + */ +@interface ZXReedSolomonEncoder : NSObject + +- (id)initWithField:(ZXGenericGF *)field; +- (void)encode:(ZXIntArray *)toEncode ecBytes:(int)ecBytes; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.m new file mode 100644 index 0000000..2a6ccc4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.m @@ -0,0 +1,88 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXGenericGF.h" +#import "ZXGenericGFPoly.h" +#import "ZXIntArray.h" +#import "ZXReedSolomonEncoder.h" + +@interface ZXReedSolomonEncoder () + +@property (nonatomic, strong, readonly) NSMutableArray *cachedGenerators; +@property (nonatomic, strong, readonly) ZXGenericGF *field; + +@end + +@implementation ZXReedSolomonEncoder + +- (id)initWithField:(ZXGenericGF *)field { + if (self = [super init]) { + _field = field; + ZXIntArray *one = [[ZXIntArray alloc] initWithLength:1]; + one.array[0] = 1; + _cachedGenerators = [NSMutableArray arrayWithObject:[[ZXGenericGFPoly alloc] initWithField:field coefficients:one]]; + } + + return self; +} + +- (ZXGenericGFPoly *)buildGenerator:(int)degree { + if (degree >= self.cachedGenerators.count) { + ZXGenericGFPoly *lastGenerator = self.cachedGenerators[[self.cachedGenerators count] - 1]; + for (NSUInteger d = [self.cachedGenerators count]; d <= degree; d++) { + ZXIntArray *next = [[ZXIntArray alloc] initWithLength:2]; + next.array[0] = 1; + next.array[1] = [self.field exp:(int)d - 1 + self.field.generatorBase]; + ZXGenericGFPoly *nextGenerator = [lastGenerator multiply:[[ZXGenericGFPoly alloc] initWithField:self.field coefficients:next]]; + [self.cachedGenerators addObject:nextGenerator]; + lastGenerator = nextGenerator; + } + } + + return (ZXGenericGFPoly *)self.cachedGenerators[degree]; +} + +- (void)encode:(ZXIntArray *)toEncode ecBytes:(int)ecBytes { + if (ecBytes == 0) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"No error correction bytes" + userInfo:nil]; + } + int dataBytes = toEncode.length - ecBytes; + if (dataBytes <= 0) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"No data bytes provided" + userInfo:nil]; + } + ZXGenericGFPoly *generator = [self buildGenerator:ecBytes]; + ZXIntArray *infoCoefficients = [[ZXIntArray alloc] initWithLength:dataBytes]; + for (int i = 0; i < dataBytes; i++) { + infoCoefficients.array[i] = toEncode.array[i]; + } + ZXGenericGFPoly *info = [[ZXGenericGFPoly alloc] initWithField:self.field coefficients:infoCoefficients]; + info = [info multiplyByMonomial:ecBytes coefficient:1]; + ZXGenericGFPoly *remainder = [info divide:generator][1]; + ZXIntArray *coefficients = remainder.coefficients; + int numZeroCoefficients = ecBytes - coefficients.length; + for (int i = 0; i < numZeroCoefficients; i++) { + toEncode.array[dataBytes + i] = 0; + } + for (int i = 0; i < coefficients.length; i++) { + toEncode.array[dataBytes + numZeroCoefficients + i] = coefficients.array[i]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBarcodeFormat.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBarcodeFormat.h new file mode 100644 index 0000000..4f74599 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBarcodeFormat.h @@ -0,0 +1,71 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Enumerates barcode formats known to this package. Please keep alphabetized. + */ +typedef enum { + /** Aztec 2D barcode format. */ + kBarcodeFormatAztec, + + /** CODABAR 1D format. */ + kBarcodeFormatCodabar, + + /** Code 39 1D format. */ + kBarcodeFormatCode39, + + /** Code 93 1D format. */ + kBarcodeFormatCode93, + + /** Code 128 1D format. */ + kBarcodeFormatCode128, + + /** Data Matrix 2D barcode format. */ + kBarcodeFormatDataMatrix, + + /** EAN-8 1D format. */ + kBarcodeFormatEan8, + + /** EAN-13 1D format. */ + kBarcodeFormatEan13, + + /** ITF (Interleaved Two of Five) 1D format. */ + kBarcodeFormatITF, + + /** MaxiCode 2D barcode format. */ + kBarcodeFormatMaxiCode, + + /** PDF417 format. */ + kBarcodeFormatPDF417, + + /** QR Code 2D barcode format. */ + kBarcodeFormatQRCode, + + /** RSS 14 */ + kBarcodeFormatRSS14, + + /** RSS EXPANDED */ + kBarcodeFormatRSSExpanded, + + /** UPC-A 1D format. */ + kBarcodeFormatUPCA, + + /** UPC-E 1D format. */ + kBarcodeFormatUPCE, + + /** UPC/EAN extension format. Not a stand-alone format. */ + kBarcodeFormatUPCEANExtension +} ZXBarcodeFormat; diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.h new file mode 100644 index 0000000..c6fe676 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.h @@ -0,0 +1,74 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXLuminanceSource.h" + +/** + * This class hierarchy provides a set of methods to convert luminance data to 1 bit data. + * It allows the algorithm to vary polymorphically, for example allowing a very expensive + * thresholding technique for servers and a fast one for mobile. It also permits the implementation + * to vary, e.g. a JNI version for Android and a Java fallback version for other platforms. + */ +@interface ZXBinarizer : NSObject + +@property (nonatomic, strong, readonly) ZXLuminanceSource *luminanceSource; +@property (nonatomic, assign, readonly) int width; +@property (nonatomic, assign, readonly) int height; + +- (id)initWithSource:(ZXLuminanceSource *)source; ++ (id)binarizerWithSource:(ZXLuminanceSource *)source; + +/** + * Converts one row of luminance data to 1 bit data. May actually do the conversion, or return + * cached data. Callers should assume this method is expensive and call it as seldom as possible. + * This method is intended for decoding 1D barcodes and may choose to apply sharpening. + * For callers which only examine one row of pixels at a time, the same BitArray should be reused + * and passed in with each call for performance. However it is legal to keep more than one row + * at a time if needed. + * + * @param y The row to fetch, 0 <= y < bitmap height. + * @param row An optional preallocated array. If null or too small, it will be ignored. + * If used, the Binarizer will call ZXBitArray clear. Always use the returned object. + * @return The array of bits for this row (true means black). + */ +- (ZXBitArray *)blackRow:(int)y row:(ZXBitArray *)row error:(NSError **)error; + +/** + * Converts a 2D array of luminance data to 1 bit data. As above, assume this method is expensive + * and do not call it repeatedly. This method is intended for decoding 2D barcodes and may or + * may not apply sharpening. Therefore, a row from this matrix may not be identical to one + * fetched using getBlackRow(), so don't mix and match between them. + * + * @return The 2D array of bits for the image (true means black). + */ +- (ZXBitMatrix *)blackMatrixWithError:(NSError **)error; + +/** + * Creates a new object with the same type as this Binarizer implementation, but with pristine + * state. This is needed because Binarizer implementations may be stateful, e.g. keeping a cache + * of 1 bit data. See Effective Java for why we can't use Java's clone() method. + * + * @param source The LuminanceSource this Binarizer will operate on. + * @return A new concrete Binarizer implementation object. + */ +- (ZXBinarizer *)createBinarizer:(ZXLuminanceSource *)source; + +- (CGImageRef)createImage CF_RETURNS_RETAINED; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.m new file mode 100644 index 0000000..d87e551 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.m @@ -0,0 +1,123 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinarizer.h" + +#if TARGET_OS_EMBEDDED || TARGET_IPHONE_SIMULATOR +#import +#define ZXBlack [[UIColor blackColor] CGColor] +#define ZXWhite [[UIColor whiteColor] CGColor] +#else +#define ZXBlack CGColorGetConstantColor(kCGColorBlack) +#define ZXWhite CGColorGetConstantColor(kCGColorWhite) +#endif + +@implementation ZXBinarizer + +- (id)initWithSource:(ZXLuminanceSource *)source { + if (self = [super init]) { + _luminanceSource = source; + } + + return self; +} + +- (id)initWithLuminanceSource:(ZXLuminanceSource *)source { + return [self initWithSource:source]; +} + ++ (id)binarizerWithSource:(ZXLuminanceSource *)source { + return [[self alloc] initWithLuminanceSource:source]; +} + +- (ZXBitArray *)blackRow:(int)y row:(ZXBitArray *)row error:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + + +- (ZXBitMatrix *)blackMatrixWithError:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (ZXBinarizer *)createBinarizer:(ZXLuminanceSource *)source { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (CGImageRef)createImage CF_RETURNS_RETAINED { + ZXBitMatrix *matrix = [self blackMatrixWithError:nil]; + if (!matrix) { + return nil; + } + ZXLuminanceSource *source = [self luminanceSource]; + + int width = source.width; + int height = source.height; + + int bytesPerRow = ((width&0xf)>>4)<<4; + + CGColorSpaceRef gray = CGColorSpaceCreateDeviceGray(); + CGContextRef context = CGBitmapContextCreate ( + 0, + width, + height, + 8, // bits per component + bytesPerRow, + gray, + kCGBitmapAlphaInfoMask & kCGImageAlphaNone); + CGColorSpaceRelease(gray); + + CGRect r = CGRectZero; + r.size.width = width; + r.size.height = height; + CGContextSetFillColorWithColor(context, ZXBlack); + CGContextFillRect(context, r); + + r.size.width = 1; + r.size.height = 1; + + CGContextSetFillColorWithColor(context, ZXWhite); + for (int y=0; y + ++ (id)hints; + +/** + * Assume Code 39 codes employ a check digit. + */ +@property (nonatomic, assign) BOOL assumeCode39CheckDigit; + +/** + * Assume the barcode is being processed as a GS1 barcode, and modify behavior as needed. + * For example this affects FNC1 handling for Code 128 (aka GS1-128). + */ +@property (nonatomic, assign) BOOL assumeGS1; + +/** + * Allowed lengths of encoded data -- reject anything else. + */ +@property (nonatomic, strong) NSArray *allowedLengths; + +/** + * Specifies what character encoding to use when decoding, where applicable (type String) + */ +@property (nonatomic, assign) NSStringEncoding encoding; + +/** + * Unspecified, application-specific hint. + */ +@property (nonatomic, strong) id other; + +/** + * Image is a pure monochrome image of a barcode. + */ +@property (nonatomic, assign) BOOL pureBarcode; + +/** + * If true, return the start and end digits in a Codabar barcode instead of stripping them. They + * are alpha, whereas the rest are numeric. By default, they are stripped, but this causes them + * to not be. + */ +@property (nonatomic, assign) BOOL returnCodaBarStartEnd; + +/** + * The caller needs to be notified via callback when a possible ZXResultPoint + * is found. + */ +@property (nonatomic, strong) id resultPointCallback; + +/** + * Spend more time to try to find a barcode; optimize for accuracy, not speed. + */ +@property (nonatomic, assign) BOOL tryHarder; + +/** + * Allowed extension lengths for EAN or UPC barcodes. Other formats will ignore this. + * Maps to an ZXIntArray of the allowed extension lengths, for example [2], [5], or [2, 5]. + * If it is optional to have an extension, do not set this hint. If this is set, + * and a UPC or EAN barcode is found but an extension is not, then no result will be returned + * at all. + */ +@property (nonatomic, strong) ZXIntArray *allowedEANExtensions; + +/** + * Image is known to be of one of a few possible formats. + */ +- (void)addPossibleFormat:(ZXBarcodeFormat)format; +- (BOOL)containsFormat:(ZXBarcodeFormat)format; +- (int)numberOfPossibleFormats; +- (void)removePossibleFormat:(ZXBarcodeFormat)format; + +@end \ No newline at end of file diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDecodeHints.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDecodeHints.m new file mode 100644 index 0000000..2c1f5ca --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDecodeHints.m @@ -0,0 +1,77 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDecodeHints.h" +#import "ZXResultPointCallback.h" + +@interface ZXDecodeHints () + +@property (nonatomic, strong, readonly) NSMutableArray *barcodeFormats; + +@end + +@implementation ZXDecodeHints + +- (id)init { + if (self = [super init]) { + _barcodeFormats = [NSMutableArray array]; + } + + return self; +} + ++ (id)hints { + return [[self alloc] init]; +} + +- (id)copyWithZone:(NSZone *)zone { + ZXDecodeHints *result = [[[self class] allocWithZone:zone] init]; + if (result) { + result.assumeCode39CheckDigit = self.assumeCode39CheckDigit; + result.allowedLengths = [self.allowedLengths copy]; + + for (NSNumber *formatNumber in self.barcodeFormats) { + [result addPossibleFormat:[formatNumber intValue]]; + } + + result.encoding = self.encoding; + result.other = self.other; + result.pureBarcode = self.pureBarcode; + result.returnCodaBarStartEnd = self.returnCodaBarStartEnd; + result.resultPointCallback = self.resultPointCallback; + result.tryHarder = self.tryHarder; + } + + return result; +} + +- (void)addPossibleFormat:(ZXBarcodeFormat)format { + [self.barcodeFormats addObject:[NSNumber numberWithInt:format]]; +} + +- (BOOL)containsFormat:(ZXBarcodeFormat)format { + return [self.barcodeFormats containsObject:[NSNumber numberWithInt:format]]; +} + +- (int)numberOfPossibleFormats { + return (int)self.barcodeFormats.count; +} + +- (void)removePossibleFormat:(ZXBarcodeFormat)format { + [self.barcodeFormats removeObject:[NSNumber numberWithInt:format]]; +} + +@end \ No newline at end of file diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.h new file mode 100644 index 0000000..8095847 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.h @@ -0,0 +1,27 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Simply encapsulates a width and height. + */ +@interface ZXDimension : NSObject + +@property (nonatomic, assign, readonly) int height; +@property (nonatomic, assign, readonly) int width; + +- (id)initWithWidth:(int)width height:(int)height; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.m new file mode 100644 index 0000000..3eed89a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.m @@ -0,0 +1,50 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDimension.h" + +@implementation ZXDimension + +- (id)initWithWidth:(int)width height:(int)height { + if (width < 0 || height < 0) { + [NSException raise:NSInvalidArgumentException format:@"Width and height must not be negative"]; + } + + if (self = [super init]) { + _width = width; + _height = height; + } + + return self; +} + +- (BOOL)isEqual:(id)other { + if ([other isKindOfClass:[ZXDimension class]]) { + ZXDimension *d = (ZXDimension *)other; + return self.width == d.width && self.height == d.height; + } + return NO; +} + +- (NSUInteger)hash { + return self.width * 32713 + self.height; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%dx%d", self.width, self.height]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.h new file mode 100644 index 0000000..b3571eb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.h @@ -0,0 +1,112 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Enumeration for DataMatrix symbol shape hint. It can be used to force square or rectangular + * symbols. + */ +typedef enum { + ZXDataMatrixSymbolShapeHintForceNone, + ZXDataMatrixSymbolShapeHintForceSquare, + ZXDataMatrixSymbolShapeHintForceRectangle +} ZXDataMatrixSymbolShapeHint; + +typedef enum { + ZXPDF417CompactionAuto, + ZXPDF417CompactionText, + ZXPDF417CompactionByte, + ZXPDF417CompactionNumeric +} ZXPDF417Compaction; + +@class ZXDimension, ZXPDF417Dimensions, ZXQRCodeErrorCorrectionLevel; + +/** + * These are a set of hints that you may pass to Writers to specify their behavior. + */ +@interface ZXEncodeHints : NSObject + ++ (id)hints; + +/** + * Specifies what character encoding to use where applicable. + */ +@property (nonatomic, assign) NSStringEncoding encoding; + +/** + * Specifies the matrix shape for Data Matrix. + */ +@property (nonatomic, assign) ZXDataMatrixSymbolShapeHint dataMatrixShape; + +/** + * Specifies a minimum barcode size. Only applicable to Data Matrix now. + * + * @deprecated use width/height params in + * ZXDataMatrixWriter encode:format:width:height:error: + */ +@property (nonatomic, strong) ZXDimension *minSize DEPRECATED_ATTRIBUTE; + +/** + * Specifies a maximum barcode size. Only applicable to Data Matrix now. + * + * @deprecated without replacement + */ +@property (nonatomic, strong) ZXDimension *maxSize DEPRECATED_ATTRIBUTE; + +/** + * Specifies what degree of error correction to use, for example in QR Codes. + * For Aztec it represents the minimal percentage of error correction words. + * Note: an Aztec symbol should have a minimum of 25% EC words. + */ +@property (nonatomic, strong) ZXQRCodeErrorCorrectionLevel *errorCorrectionLevel; + +/** + * Specifies what percent of error correction to use. + * For Aztec it represents the minimal percentage of error correction words. + * Note: an Aztec symbol should have a minimum of 25% EC words. + */ +@property (nonatomic, strong) NSNumber *errorCorrectionPercent; + +/** + * Specifies margin, in pixels, to use when generating the barcode. The meaning can vary + * by format; for example it controls margin before and after the barcode horizontally for + * most 1D formats. + */ +@property (nonatomic, strong) NSNumber *margin; + +/** + * Specifies whether to use compact mode for PDF417. + */ +@property (nonatomic, assign) BOOL pdf417Compact; + +/** + * Specifies what compaction mode to use for PDF417. + */ +@property (nonatomic, assign) ZXPDF417Compaction pdf417Compaction; + +/** + * Specifies the minimum and maximum number of rows and columns for PDF417. + */ +@property (nonatomic, strong) ZXPDF417Dimensions *pdf417Dimensions; + +/** + * Specifies the required number of layers for an Aztec code: + * a negative number (-1, -2, -3, -4) specifies a compact Aztec code + * 0 indicates to use the minimum number of layers (the default) + * a positive number (1, 2, .. 32) specifies a normaol (non-compact) Aztec code + */ +@property (nonatomic, strong) NSNumber *aztecLayers; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.m new file mode 100644 index 0000000..539a3ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.m @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +@implementation ZXEncodeHints + ++ (id)hints { + return [[self alloc] init]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.h new file mode 100644 index 0000000..20e6e88 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.h @@ -0,0 +1,61 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define ZXErrorDomain @"ZXErrorDomain" + +enum { + /** + * Thrown when a barcode was successfully detected and decoded, but + * was not returned because its checksum feature failed. + */ + ZXChecksumError = 1000, + + /** + * Thrown when a barcode was successfully detected, but some aspect of + * the content did not conform to the barcode's format rules. This could have + * been due to a mis-detection. + */ + ZXFormatError = 1001, + + /** + * Thrown when a barcode was not found in the image. It might have been + * partially detected but could not be confirmed. + */ + ZXNotFoundError = 1002, + + /** + * Thrown when an exception occurs during Reed-Solomon decoding, such as when + * there are too many errors to correct. + */ + ZXReedSolomonError = 1003, + + /** + * This general error is thrown when something goes wrong during decoding of a barcode. + * This includes, but is not limited to, failing checksums / error correction algorithms, being + * unable to locate finder timing patterns, and so on. + */ + ZXReaderError = 1004, + + /** + * Covers the range of error which may occur when encoding a barcode using the Writer framework. + */ + ZXWriterError = 1005 +}; + +// Helper methods for error instances +NSError *ZXChecksumErrorInstance(void); +NSError *ZXFormatErrorInstance(void); +NSError *ZXNotFoundErrorInstance(void); diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.m new file mode 100644 index 0000000..08730cf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.m @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" + +NSError *ZXChecksumErrorInstance() { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"This barcode failed its checksum"}; + + return [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXChecksumError userInfo:userInfo]; +} + +NSError *ZXFormatErrorInstance() { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"This barcode does not confirm to the format's rules"}; + + return [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXFormatError userInfo:userInfo]; +} + +NSError *ZXNotFoundErrorInstance() { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"A barcode was not found in this image"}; + + return [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:userInfo]; +} diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.h new file mode 100644 index 0000000..7db6f2d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.h @@ -0,0 +1,27 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXLuminanceSource.h" + +/** + * A wrapper implementation of ZXLuminanceSource which inverts the luminances it returns -- black becomes + * white and vice versa, and each value becomes (255-value). + */ +@interface ZXInvertedLuminanceSource : ZXLuminanceSource + +- (id)initWithDelegate:(ZXLuminanceSource *)delegate; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.m new file mode 100644 index 0000000..5265f87 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.m @@ -0,0 +1,86 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXInvertedLuminanceSource.h" + +@interface ZXInvertedLuminanceSource () + +@property (nonatomic, weak, readonly) ZXLuminanceSource *delegate; + +@end + +@implementation ZXInvertedLuminanceSource + +- (id)initWithDelegate:(ZXLuminanceSource *)delegate { + self = [super initWithWidth:delegate.width height:delegate.height]; + if (self) { + _delegate = delegate; + } + + return self; +} + +- (ZXByteArray *)rowAtY:(int)y row:(ZXByteArray *)row { + row = [self.delegate rowAtY:y row:row]; + int width = self.width; + int8_t *rowArray = row.array; + for (int i = 0; i < width; i++) { + rowArray[i] = (int8_t) (255 - (rowArray[i] & 0xFF)); + } + return row; +} + +- (ZXByteArray *)matrix { + ZXByteArray *matrix = [self.delegate matrix]; + int length = self.width * self.height; + ZXByteArray *invertedMatrix = [[ZXByteArray alloc] initWithLength:length]; + int8_t *invertedMatrixArray = invertedMatrix.array; + int8_t *matrixArray = matrix.array; + for (int i = 0; i < length; i++) { + invertedMatrixArray[i] = (int8_t) (255 - (matrixArray[i] & 0xFF)); + } + return invertedMatrix; +} + +- (BOOL)cropSupported { + return self.delegate.cropSupported; +} + +- (ZXLuminanceSource *)crop:(int)left top:(int)top width:(int)aWidth height:(int)aHeight { + return [[ZXInvertedLuminanceSource alloc] initWithDelegate:[self.delegate crop:left top:top width:aWidth height:aHeight]]; +} + +- (BOOL)rotateSupported { + return self.delegate.rotateSupported; +} + +/** + * @return original delegate ZXLuminanceSource since invert undoes itself + */ +- (ZXLuminanceSource *)invert { + return self.delegate; +} + +- (ZXLuminanceSource *)rotateCounterClockwise { + return [[ZXInvertedLuminanceSource alloc] initWithDelegate:[self.delegate rotateCounterClockwise]]; +} + +- (ZXLuminanceSource *)rotateCounterClockwise45 { + return [[ZXInvertedLuminanceSource alloc] initWithDelegate:[self.delegate rotateCounterClockwise45]]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.h new file mode 100644 index 0000000..d279afd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.h @@ -0,0 +1,108 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray; + +/** + * The purpose of this class hierarchy is to abstract different bitmap implementations across + * platforms into a standard interface for requesting greyscale luminance values. The interface + * only provides immutable methods; therefore crop and rotation create copies. This is to ensure + * that one Reader does not modify the original luminance source and leave it in an unknown state + * for other Readers in the chain. + */ +@interface ZXLuminanceSource : NSObject + +/** + * @return The width of the bitmap. + */ +@property (nonatomic, assign, readonly) int width; + +/** + * @return The height of the bitmap. + */ +@property (nonatomic, assign, readonly) int height; + +/** + * @return Whether this subclass supports cropping. + */ +@property (nonatomic, assign, readonly) BOOL cropSupported; + +/** + * @return Whether this subclass supports counter-clockwise rotation. + */ +@property (nonatomic, assign, readonly) BOOL rotateSupported; + +- (id)initWithWidth:(int)width height:(int)height; + +/** + * Fetches one row of luminance data from the underlying platform's bitmap. Values range from + * 0 (black) to 255 (white). Because Java does not have an unsigned byte type, callers will have + * to bitwise and with 0xff for each value. It is preferable for implementations of this method + * to only fetch this row rather than the whole image, since no 2D Readers may be installed and + * getMatrix() may never be called. + * + * @param y The row to fetch, 0 <= y < getHeight(). + * @param row An optional preallocated array. If null or too small, it will be ignored. + * Always use the returned object, and ignore the .length of the array. + * @return An array containing the luminance data. + */ +- (ZXByteArray *)rowAtY:(int)y row:(ZXByteArray *)row; + +/** + * Fetches luminance data for the underlying bitmap. Values should be fetched using: + * int luminance = array[y * width + x] & 0xff; + * + * @return A row-major 2D array of luminance values. Do not use result.length as it may be + * larger than width * height bytes on some platforms. Do not modify the contents + * of the result. + */ +- (ZXByteArray *)matrix; + +/** + * Returns a new object with cropped image data. Implementations may keep a reference to the + * original data rather than a copy. Only callable if isCropSupported() is true. + * + * @param left The left coordinate, 0 <= left < getWidth(). + * @param top The top coordinate, 0 <= top <= getHeight(). + * @param width The width of the rectangle to crop. + * @param height The height of the rectangle to crop. + * @return A cropped version of this object. + */ +- (ZXLuminanceSource *)crop:(int)left top:(int)top width:(int)width height:(int)height; + +/** + * @return a wrapper of this ZXLuminanceSource which inverts the luminances it returns -- black becomes + * white and vice versa, and each value becomes (255-value). + */ +- (ZXLuminanceSource *)invert; + +/** + * Returns a new object with rotated image data by 90 degrees counterclockwise. + * Only callable if isRotateSupported is true. + * + * @return A rotated version of this object. + */ +- (ZXLuminanceSource *)rotateCounterClockwise; + +/** + * Returns a new object with rotated image data by 45 degrees counterclockwise. + * Only callable if isRotateSupported is true. + * + * @return A rotated version of this object. + */ +- (ZXLuminanceSource *)rotateCounterClockwise45; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.m new file mode 100644 index 0000000..6351d18 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.m @@ -0,0 +1,92 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXInvertedLuminanceSource.h" +#import "ZXLuminanceSource.h" + +@implementation ZXLuminanceSource + +- (id)initWithWidth:(int)width height:(int)height { + if (self = [super init]) { + _width = width; + _height = height; + _cropSupported = NO; + _rotateSupported = NO; + } + + return self; +} + +- (ZXByteArray *)rowAtY:(int)y row:(ZXByteArray *)row { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (ZXByteArray *)matrix { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (ZXLuminanceSource *)crop:(int)left top:(int)top width:(int)width height:(int)height { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"This luminance source does not support cropping." + userInfo:nil]; +} + +- (ZXLuminanceSource *)invert { + return [[ZXInvertedLuminanceSource alloc] initWithDelegate:self]; +} + +- (ZXLuminanceSource *)rotateCounterClockwise { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"This luminance source does not support rotation by 90 degrees." + userInfo:nil]; +} + +- (ZXLuminanceSource *)rotateCounterClockwise45 { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:@"This luminance source does not support rotation by 45 degrees." + userInfo:nil]; +} + +- (NSString *)description { + ZXByteArray *row = [[ZXByteArray alloc] initWithLength:self.width]; + NSMutableString *result = [NSMutableString stringWithCapacity:self.height * (self.width + 1)]; + for (int y = 0; y < self.height; y++) { + row = [self rowAtY:y row:row]; + for (int x = 0; x < self.width; x++) { + int luminance = row.array[x] & 0xFF; + unichar c; + if (luminance < 0x40) { + c = '#'; + } else if (luminance < 0x80) { + c = '+'; + } else if (luminance < 0xC0) { + c = '.'; + } else { + c = ' '; + } + [result appendFormat:@"%C", c]; + } + [result appendString:@"\n"]; + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.h new file mode 100644 index 0000000..e11aa73 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.h @@ -0,0 +1,44 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXLuminanceSource.h" + +/** + * This object extends LuminanceSource around an array of YUV data returned from the camera driver, + * with the option to crop to a rectangle within the full data. This can be used to exclude + * superfluous pixels around the perimeter and speed up decoding. + * + * It works for any pixel format where the Y channel is planar and appears first, including + * YCbCr_420_SP and YCbCr_422_SP. + */ +@interface ZXPlanarYUVLuminanceSource : ZXLuminanceSource + +/** + * @return width of image from renderThumbnail + */ +@property (nonatomic, assign, readonly) int thumbnailWidth; + +/** + * @return height of image from renderThumbnail + */ +@property (nonatomic, assign, readonly) int thumbnailHeight; + +- (id)initWithYuvData:(int8_t *)yuvData yuvDataLen:(int)yuvDataLen dataWidth:(int)dataWidth + dataHeight:(int)dataHeight left:(int)left top:(int)top width:(int)width height:(int)height + reverseHorizontal:(BOOL)reverseHorizontal; +- (int32_t *)renderThumbnail; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.m new file mode 100644 index 0000000..8d26033 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.m @@ -0,0 +1,147 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXPlanarYUVLuminanceSource.h" + +const int THUMBNAIL_SCALE_FACTOR = 2; + +@interface ZXPlanarYUVLuminanceSource () + +@property (nonatomic, strong, readonly) ZXByteArray *yuvData; +@property (nonatomic, assign, readonly) int dataWidth; +@property (nonatomic, assign, readonly) int dataHeight; +@property (nonatomic, assign, readonly) int left; +@property (nonatomic, assign, readonly) int top; + +@end + +@implementation ZXPlanarYUVLuminanceSource + +- (id)initWithYuvData:(int8_t *)yuvData yuvDataLen:(int)yuvDataLen dataWidth:(int)dataWidth + dataHeight:(int)dataHeight left:(int)left top:(int)top width:(int)width height:(int)height + reverseHorizontal:(BOOL)reverseHorizontal { + if (self = [super initWithWidth:width height:height]) { + if (left + width > dataWidth || top + height > dataHeight) { + [NSException raise:NSInvalidArgumentException format:@"Crop rectangle does not fit within image data."]; + } + + _yuvData = [[ZXByteArray alloc] initWithLength:yuvDataLen]; + memcpy(_yuvData.array, yuvData, yuvDataLen * sizeof(int8_t)); + _dataWidth = dataWidth; + _dataHeight = dataHeight; + _left = left; + _top = top; + + if (reverseHorizontal) { + [self reverseHorizontal:width height:height]; + } + } + + return self; +} + +- (ZXByteArray *)rowAtY:(int)y row:(ZXByteArray *)row { + if (y < 0 || y >= self.height) { + [NSException raise:NSInvalidArgumentException + format:@"Requested row is outside the image: %d", y]; + } + int width = self.width; + if (!row || row.length < width) { + row = [[ZXByteArray alloc] initWithLength:width]; + } + int offset = (y + self.top) * self.dataWidth + self.left; + memcpy(row.array, self.yuvData.array + offset, self.width * sizeof(int8_t)); + return row; +} + +- (ZXByteArray *)matrix { + int width = self.width; + int height = self.height; + + // If the caller asks for the entire underlying image, save the copy and give them the + // original data. The docs specifically warn that result.length must be ignored. + if (width == self.dataWidth && height == self.dataHeight) { + return self.yuvData; + } + + int area = self.width * self.height; + ZXByteArray *matrix = [[ZXByteArray alloc] initWithLength:area]; + int inputOffset = self.top * self.dataWidth + self.left; + + // If the width matches the full width of the underlying data, perform a single copy. + if (self.width == self.dataWidth) { + memcpy(matrix.array, self.yuvData.array + inputOffset, (area - inputOffset) * sizeof(int8_t)); + return matrix; + } + + // Otherwise copy one cropped row at a time. + ZXByteArray *yuvData = self.yuvData; + for (int y = 0; y < self.height; y++) { + int outputOffset = y * self.width; + memcpy(matrix.array + outputOffset, yuvData.array + inputOffset, self.width * sizeof(int8_t)); + inputOffset += self.dataWidth; + } + return matrix; +} + +- (BOOL)cropSupported { + return YES; +} + +- (ZXLuminanceSource *)crop:(int)left top:(int)top width:(int)width height:(int)height { + return [[[self class] alloc] initWithYuvData:self.yuvData.array yuvDataLen:self.yuvData.length dataWidth:self.dataWidth + dataHeight:self.dataHeight left:self.left + left top:self.top + top + width:width height:height reverseHorizontal:NO]; +} + +- (int *)renderThumbnail { + int thumbWidth = self.width / THUMBNAIL_SCALE_FACTOR; + int thumbHeight = self.height / THUMBNAIL_SCALE_FACTOR; + int *pixels = (int *)malloc(thumbWidth * thumbHeight * sizeof(int)); + int inputOffset = self.top * self.dataWidth + self.left; + + for (int y = 0; y < self.height; y++) { + int outputOffset = y * self.width; + for (int x = 0; x < self.width; x++) { + int grey = self.yuvData.array[inputOffset + x * THUMBNAIL_SCALE_FACTOR] & 0xff; + pixels[outputOffset + x] = 0xFF000000 | (grey * 0x00010101); + } + inputOffset += self.dataWidth * THUMBNAIL_SCALE_FACTOR; + } + return pixels; +} + +- (int)thumbnailWidth { + return self.width / THUMBNAIL_SCALE_FACTOR; +} + +- (int)thumbnailHeight { + return self.height / THUMBNAIL_SCALE_FACTOR; +} + +- (void)reverseHorizontal:(int)width height:(int)height { + for (int y = 0, rowStart = self.top * self.dataWidth + self.left; y < height; y++, rowStart += self.dataWidth) { + int middle = rowStart + width / 2; + for (int x1 = rowStart, x2 = rowStart + width - 1; x1 < middle; x1++, x2--) { + int8_t temp = self.yuvData.array[x1]; + self.yuvData.array[x1] = self.yuvData.array[x2]; + self.yuvData.array[x2] = temp; + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.h new file mode 100644 index 0000000..3944cac --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXLuminanceSource.h" + +/** + * This class is used to help decode images from files which arrive as RGB data from + * an ARGB pixel array. It does not support rotation. + */ +@interface ZXRGBLuminanceSource : ZXLuminanceSource + +- (id)initWithWidth:(int)width height:(int)height pixels:(int32_t *)pixels pixelsLen:(int)pixelsLen; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.m new file mode 100644 index 0000000..91aa197 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.m @@ -0,0 +1,136 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXRGBLuminanceSource.h" + +@interface ZXRGBLuminanceSource () + +@property (nonatomic, strong, readonly) ZXByteArray *luminances; +@property (nonatomic, assign, readonly) int dataWidth; +@property (nonatomic, assign, readonly) int dataHeight; +@property (nonatomic, assign, readonly) int left; +@property (nonatomic, assign, readonly) int top; + +@end + +@implementation ZXRGBLuminanceSource + +- (id)initWithWidth:(int)width height:(int)height pixels:(int *)pixels pixelsLen:(int)pixelsLen { + if (self = [super initWithWidth:width height:height]) { + _dataWidth = width; + _dataHeight = height; + _left = 0; + _top = 0; + + // In order to measure pure decoding speed, we convert the entire image to a greyscale array + // up front, which is the same as the Y channel of the YUVLuminanceSource in the real app. + _luminances = [[ZXByteArray alloc] initWithLength:width * height]; + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + int pixel = pixels[offset + x]; + int r = (pixel >> 16) & 0xff; + int g = (pixel >> 8) & 0xff; + int b = pixel & 0xff; + if (r == g && g == b) { + // Image is already greyscale, so pick any channel. + _luminances.array[offset + x] = (int8_t) r; + } else { + // Calculate luminance cheaply, favoring green. + _luminances.array[offset + x] = (int8_t) ((r + g + g + b) / 4); + } + } + } + } + + return self; +} + +- (id)initWithPixels:(ZXByteArray *)pixels dataWidth:(int)dataWidth dataHeight:(int)dataHeight + left:(int)left top:(int)top width:(int)width height:(int)height { + if (self = [super initWithWidth:width height:height]) { + if (left + self.width > dataWidth || top + self.height > dataHeight) { + [NSException raise:NSInvalidArgumentException format:@"Crop rectangle does not fit within image data."]; + } + + _luminances = pixels; + _dataWidth = dataWidth; + _dataHeight = dataHeight; + _left = left; + _top = top; + } + + return self; +} + +- (ZXByteArray *)rowAtY:(int)y row:(ZXByteArray *)row { + if (y < 0 || y >= self.height) { + [NSException raise:NSInvalidArgumentException format:@"Requested row is outside the image: %d", y]; + } + int width = self.width; + if (!row || row.length < width) { + row = [[ZXByteArray alloc] initWithLength:width]; + } + int offset = (y + self.top) * self.dataWidth + self.left; + memcpy(row.array, self.luminances.array + offset, self.width * sizeof(int8_t)); + return row; +} + +- (ZXByteArray *)matrix { + int width = self.width; + int height = self.height; + + // If the caller asks for the entire underlying image, save the copy and give them the + // original data. The docs specifically warn that result.length must be ignored. + if (width == self.dataWidth && height == self.dataHeight) { + return self.luminances; + } + + int area = self.width * self.height; + ZXByteArray *matrix = [[ZXByteArray alloc] initWithLength:area]; + int inputOffset = self.top * self.dataWidth + self.left; + + // If the width matches the full width of the underlying data, perform a single copy. + if (self.width == self.dataWidth) { + memcpy(matrix.array, self.luminances.array + inputOffset, (area - inputOffset) * sizeof(int8_t)); + return matrix; + } + + // Otherwise copy one cropped row at a time. + for (int y = 0; y < self.height; y++) { + int outputOffset = y * self.width; + memcpy(matrix.array + outputOffset, self.luminances.array + inputOffset, self.width * sizeof(int8_t)); + inputOffset += self.dataWidth; + } + return matrix; +} + +- (BOOL)cropSupported { + return YES; +} + +- (ZXLuminanceSource *)crop:(int)left top:(int)top width:(int)width height:(int)height { + return [[[self class] alloc] initWithPixels:self.luminances + dataWidth:self.dataWidth + dataHeight:self.dataHeight + left:self.left + left + top:self.top + top + width:width + height:height]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXReader.h new file mode 100644 index 0000000..d1a5d86 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXReader.h @@ -0,0 +1,59 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBinaryBitmap, ZXDecodeHints, ZXResult; + +/** + * Implementations of this interface can decode an image of a barcode in some format into + * the String it encodes. For example, ZXQRCodeReader can + * decode a QR code. The decoder may optionally receive hints from the caller which may help + * it decode more quickly or accurately. + * + * See ZXMultiFormatReader, which attempts to determine what barcode + * format is present within the image as well, and then decodes it accordingly. + */ +@protocol ZXReader + +/** + * Locates and decodes a barcode in some format within an image. + * + * @param image image of barcode to decode + * @return String which the barcode encodes or nil if + * the barcode cannot be located or decoded for any reason + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error; + +/** + * Locates and decodes a barcode in some format within an image. This method also accepts + * hints, each possibly associated to some data, which may help the implementation decode. + * + * @param image image of barcode to decode + * @param hints passed as a {@link java.util.Map} from {@link com.google.zxing.DecodeHintType} + * to arbitrary data. The + * meaning of the data depends upon the hint type. The implementation may or may not do + * anything with these hints. + * @return String which the barcode encodes or nil if + * the barcode cannot be located or decoded for any reason + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error; + +/** + * Resets any internal state the implementation has after a decode, to prepare it + * for reuse. + */ +- (void)reset; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.h new file mode 100644 index 0000000..dab3e97 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.h @@ -0,0 +1,66 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXResultMetadataType.h" + +@class ZXByteArray; + +/** + * Encapsulates the result of decoding a barcode within an image. + */ +@interface ZXResult : NSObject + +/** + * @return raw text encoded by the barcode + */ +@property (nonatomic, copy, readonly) NSString *text; + +/** + * @return raw bytes encoded by the barcode, if applicable, otherwise nil + */ +@property (nonatomic, strong, readonly) ZXByteArray *rawBytes; + +/** + * @return points related to the barcode in the image. These are typically points + * identifying finder patterns or the corners of the barcode. The exact meaning is + * specific to the type of barcode that was decoded. + */ +@property (nonatomic, strong, readonly) NSMutableArray *resultPoints; + +/** + * @return ZXBarcodeFormat representing the format of the barcode that was decoded + */ +@property (nonatomic, assign, readonly) ZXBarcodeFormat barcodeFormat; + +/** + * @return NSDictionary mapping ZXResultMetadataType keys to values. May be + * nil. This contains optional metadata about what was detected about the barcode, + * like orientation. + */ +@property (nonatomic, strong, readonly) NSMutableDictionary *resultMetadata; + +@property (nonatomic, assign, readonly) long timestamp; + +- (id)initWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format; +- (id)initWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format timestamp:(long)timestamp; ++ (id)resultWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format; ++ (id)resultWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format timestamp:(long)timestamp; +- (void)putMetadata:(ZXResultMetadataType)type value:(id)value; +- (void)putAllMetadata:(NSMutableDictionary *)metadata; +- (void)addResultPoints:(NSArray *)newPoints; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.m new file mode 100644 index 0000000..c2ae7cf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResult.m @@ -0,0 +1,82 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResult.h" + +@interface ZXResult () + +@property (nonatomic, strong) NSMutableDictionary *resultMetadata; +@property (nonatomic, strong) NSMutableArray *resultPoints; + +@end + +@implementation ZXResult + +- (id)initWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format { + return [self initWithText:text rawBytes:rawBytes resultPoints:resultPoints format:format timestamp:CFAbsoluteTimeGetCurrent()]; +} + +- (id)initWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format timestamp:(long)timestamp { + if (self = [super init]) { + _text = text; + _rawBytes = rawBytes; + _resultPoints = [resultPoints mutableCopy]; + _barcodeFormat = format; + _resultMetadata = nil; + _timestamp = timestamp; + } + + return self; +} + ++ (id)resultWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format { + return [[self alloc] initWithText:text rawBytes:rawBytes resultPoints:resultPoints format:format]; +} + ++ (id)resultWithText:(NSString *)text rawBytes:(ZXByteArray *)rawBytes resultPoints:(NSArray *)resultPoints format:(ZXBarcodeFormat)format timestamp:(long)timestamp { + return [[self alloc] initWithText:text rawBytes:rawBytes resultPoints:resultPoints format:format timestamp:timestamp]; +} + +- (void)putMetadata:(ZXResultMetadataType)type value:(id)value { + if (self.resultMetadata == nil) { + self.resultMetadata = [NSMutableDictionary dictionary]; + } + self.resultMetadata[@(type)] = value; +} + +- (void)putAllMetadata:(NSMutableDictionary *)metadata { + if (metadata != nil) { + if (self.resultMetadata == nil) { + self.resultMetadata = metadata; + } else { + [self.resultMetadata addEntriesFromDictionary:metadata]; + } + } +} + +- (void)addResultPoints:(NSArray *)newPoints { + if (self.resultPoints == nil) { + self.resultPoints = [newPoints mutableCopy]; + } else if (newPoints != nil && [newPoints count] > 0) { + [self.resultPoints addObjectsFromArray:newPoints]; + } +} + +- (NSString *)description { + return self.text; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultMetadataType.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultMetadataType.h new file mode 100644 index 0000000..e466f02 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultMetadataType.h @@ -0,0 +1,91 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Represents some type of metadata about the result of the decoding that the decoder + * wishes to communicate back to the caller. + */ +typedef enum { + /** + * Unspecified, application-specific metadata. Maps to an unspecified NSObject. + */ + kResultMetadataTypeOther, + + /** + * Denotes the likely approximate orientation of the barcode in the image. This value + * is given as degrees rotated clockwise from the normal, upright orientation. + * For example a 1D barcode which was found by reading top-to-bottom would be + * said to have orientation "90". This key maps to an integer whose + * value is in the range [0,360). + */ + kResultMetadataTypeOrientation, + + /** + * 2D barcode formats typically encode text, but allow for a sort of 'byte mode' + * which is sometimes used to encode binary data. While {@link Result} makes available + * the complete raw bytes in the barcode for these formats, it does not offer the bytes + * from the byte segments alone. + * + * This maps to an array of byte arrays corresponding to the + * raw bytes in the byte segments in the barcode, in order. + */ + kResultMetadataTypeByteSegments, + + /** + * Error correction level used, if applicable. The value type depends on the + * format, but is typically a String. + */ + kResultMetadataTypeErrorCorrectionLevel, + + /** + * For some periodicals, indicates the issue number as an integer. + */ + kResultMetadataTypeIssueNumber, + + /** + * For some products, indicates the suggested retail price in the barcode as a + * formatted NSString. + */ + kResultMetadataTypeSuggestedPrice, + + /** + * For some products, the possible country of manufacture as NSString denoting the + * ISO country code. Some map to multiple possible countries, like "US/CA". + */ + kResultMetadataTypePossibleCountry, + + /** + * For some products, the extension text + */ + kResultMetadataTypeUPCEANExtension, + + /** + * PDF417-specific metadata + */ + kResultMetadataTypePDF417ExtraMetadata, + + /** + * If the code format supports structured append and the current scanned code is part of one then the + * sequence number is given with it. + */ + kResultMetadataTypeStructuredAppendSequence, + + /** + * If the code format supports structured append and the current scanned code is part of one then the + * parity is given with it. + */ + kResultMetadataTypeStructuredAppendParity +} ZXResultMetadataType; diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.h new file mode 100644 index 0000000..8435c07 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.h @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Encapsulates a point of interest in an image containing a barcode. Typically, this + * would be the location of a finder pattern or the corner of the barcode, for example. + */ +@interface ZXResultPoint : NSObject + +@property (nonatomic, assign, readonly) float x; +@property (nonatomic, assign, readonly) float y; + +- (id)initWithX:(float)x y:(float)y; + ++ (id)resultPointWithX:(float)x y:(float)y; + +/** + * Orders an array of three ResultPoints in an order [A,B,C] such that AB < AC and + * BC < AC and the angle between BC and BA is less than 180 degrees. + */ ++ (void)orderBestPatterns:(NSMutableArray *)patterns; + +/** + * @return distance between two points + */ ++ (float)distance:(ZXResultPoint *)pattern1 pattern2:(ZXResultPoint *)pattern2; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.m new file mode 100644 index 0000000..038c41a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.m @@ -0,0 +1,99 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXMathUtils.h" +#import "ZXResultPoint.h" + +@implementation ZXResultPoint + +- (id)initWithX:(float)x y:(float)y { + if (self = [super init]) { + _x = x; + _y = y; + } + + return self; +} + ++ (id)resultPointWithX:(float)x y:(float)y { + return [[self alloc] initWithX:x y:y]; +} + +- (id)copyWithZone:(NSZone *)zone { + return [[ZXResultPoint allocWithZone:zone] initWithX:self.x y:self.y]; +} + +- (BOOL)isEqual:(id)other { + if ([other isKindOfClass:[ZXResultPoint class]]) { + ZXResultPoint *otherPoint = (ZXResultPoint *)other; + return self.x == otherPoint.x && self.y == otherPoint.y; + } + return NO; +} + +- (NSUInteger)hash { + return 31 * *((int *)(&_x)) + *((int *)(&_y)); +} + +- (NSString *)description { + return [NSString stringWithFormat:@"(%f,%f)", self.x, self.y]; +} + ++ (void)orderBestPatterns:(NSMutableArray *)patterns { + float zeroOneDistance = [self distance:patterns[0] pattern2:patterns[1]]; + float oneTwoDistance = [self distance:patterns[1] pattern2:patterns[2]]; + float zeroTwoDistance = [self distance:patterns[0] pattern2:patterns[2]]; + ZXResultPoint *pointA; + ZXResultPoint *pointB; + ZXResultPoint *pointC; + if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) { + pointB = patterns[0]; + pointA = patterns[1]; + pointC = patterns[2]; + } else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) { + pointB = patterns[1]; + pointA = patterns[0]; + pointC = patterns[2]; + } else { + pointB = patterns[2]; + pointA = patterns[0]; + pointC = patterns[1]; + } + + if ([self crossProductZ:pointA pointB:pointB pointC:pointC] < 0.0f) { + ZXResultPoint *temp = pointA; + pointA = pointC; + pointC = temp; + } + patterns[0] = pointA; + patterns[1] = pointB; + patterns[2] = pointC; +} + ++ (float)distance:(ZXResultPoint *)pattern1 pattern2:(ZXResultPoint *)pattern2 { + return [ZXMathUtils distance:pattern1.x aY:pattern1.y bX:pattern2.x bY:pattern2.y]; +} + +/** + * Returns the z component of the cross product between vectors BC and BA. + */ ++ (float)crossProductZ:(ZXResultPoint *)pointA pointB:(ZXResultPoint *)pointB pointC:(ZXResultPoint *)pointC { + float bX = pointB.x; + float bY = pointB.y; + return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPointCallback.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPointCallback.h new file mode 100644 index 0000000..1755e0e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXResultPointCallback.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXResultPoint; + +/** + * Callback which is invoked when a possible result point (significant + * point in the barcode image such as a corner) is found. + */ +@protocol ZXResultPointCallback + +- (void)foundPossibleResultPoint:(ZXResultPoint *)point; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXWriter.h new file mode 100644 index 0000000..a46850d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXWriter.h @@ -0,0 +1,46 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" + +@class ZXBitMatrix, ZXEncodeHints; + +/** + * The base class for all objects which encode/generate a barcode image. + */ +@protocol ZXWriter + +/** + * Encode a barcode using the default settings. + * + * @param contents The contents to encode in the barcode + * @param format The barcode format to generate + * @param width The preferred width in pixels + * @param height The preferred height in pixels + */ +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error; + +/** + * + * @param contents The contents to encode in the barcode + * @param format The barcode format to generate + * @param width The preferred width in pixels + * @param height The preferred height in pixels + * @param hints Additional parameters to supply to the encoder + */ +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXingObjCCore.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXingObjCCore.h new file mode 100644 index 0000000..7253b03 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/core/ZXingObjCCore.h @@ -0,0 +1,77 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ZXINGOBJC_CORE_ + +#define _ZXINGOBJC_CORE_ + +// Client +#import "ZXCapture.h" +#import "ZXCaptureDelegate.h" +#import "ZXCGImageLuminanceSource.h" +#import "ZXImage.h" + +// Common +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXBitSource.h" +#import "ZXBoolArray.h" +#import "ZXByteArray.h" +#import "ZXCharacterSetECI.h" +#import "ZXDecoderResult.h" +#import "ZXDefaultGridSampler.h" +#import "ZXDetectorResult.h" +#import "ZXGenericGF.h" +#import "ZXGlobalHistogramBinarizer.h" +#import "ZXGridSampler.h" +#import "ZXHybridBinarizer.h" +#import "ZXIntArray.h" +#import "ZXMathUtils.h" +#import "ZXMonochromeRectangleDetector.h" +#import "ZXPerspectiveTransform.h" +#import "ZXReedSolomonDecoder.h" +#import "ZXReedSolomonEncoder.h" +#import "ZXStringUtils.h" +#import "ZXWhiteRectangleDetector.h" + +// Core +#import "ZXBarcodeFormat.h" +#import "ZXBinarizer.h" +#import "ZXBinaryBitmap.h" +#import "ZXByteMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDimension.h" +#import "ZXEncodeHints.h" +#import "ZXErrors.h" +#import "ZXInvertedLuminanceSource.h" +#import "ZXLuminanceSource.h" +#import "ZXPlanarYUVLuminanceSource.h" +#import "ZXReader.h" +#import "ZXResult.h" +#import "ZXResultMetadataType.h" +#import "ZXResultPoint.h" +#import "ZXResultPointCallback.h" +#import "ZXRGBLuminanceSource.h" +#import "ZXWriter.h" + +// Multi +#import "ZXByQuadrantReader.h" +#import "ZXGenericMultipleBarcodeReader.h" +#import "ZXMultiDetector.h" +#import "ZXMultipleBarcodeReader.h" +#import "ZXQRCodeMultiReader.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.h new file mode 100644 index 0000000..7c15883 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXBinaryBitmap, ZXDecodeHints, ZXResult; + +/** + * This implementation can detect and decode Data Matrix codes in an image. + */ +@interface ZXDataMatrixReader : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.m new file mode 100644 index 0000000..08f4ddc --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.m @@ -0,0 +1,173 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinaryBitmap.h" +#import "ZXBitMatrix.h" +#import "ZXDataMatrixDecoder.h" +#import "ZXDataMatrixDetector.h" +#import "ZXDataMatrixReader.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXDetectorResult.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" + +@interface ZXDataMatrixReader () + +@property (nonatomic, strong, readonly) ZXDataMatrixDecoder *decoder; + +@end + +@implementation ZXDataMatrixReader + +- (id)init { + if (self = [super init]) { + _decoder = [[ZXDataMatrixDecoder alloc] init]; + } + + return self; +} + +/** + * Locates and decodes a Data Matrix code in an image. + * + * @return a String representing the content encoded by the Data Matrix code + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXDecoderResult *decoderResult; + NSArray *points; + if (hints != nil && hints.pureBarcode) { + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + ZXBitMatrix *bits = [self extractPureBits:matrix]; + if (!bits) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + decoderResult = [self.decoder decodeMatrix:bits error:error]; + if (!decoderResult) { + return nil; + } + points = @[]; + } else { + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + ZXDataMatrixDetector *detector = [[ZXDataMatrixDetector alloc] initWithImage:matrix error:error]; + if (!detector) { + return nil; + } + ZXDetectorResult *detectorResult = [detector detectWithError:error]; + if (!detectorResult) { + return nil; + } + decoderResult = [self.decoder decodeMatrix:detectorResult.bits error:error]; + if (!decoderResult) { + return nil; + } + points = detectorResult.points; + } + ZXResult *result = [ZXResult resultWithText:decoderResult.text + rawBytes:decoderResult.rawBytes + resultPoints:points + format:kBarcodeFormatDataMatrix]; + if (decoderResult.byteSegments != nil) { + [result putMetadata:kResultMetadataTypeByteSegments value:decoderResult.byteSegments]; + } + if (decoderResult.ecLevel != nil) { + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:decoderResult.ecLevel]; + } + return result; +} + +- (void)reset { + // do nothing +} + + +/** + * This method detects a code in a "pure" image -- that is, pure monochrome image + * which contains only an unrotated, unskewed, image of a code, with some white border + * around it. This is a specialized method that works exceptionally fast in this special + * case. + */ +- (ZXBitMatrix *)extractPureBits:(ZXBitMatrix *)image { + ZXIntArray *leftTopBlack = image.topLeftOnBit; + ZXIntArray *rightBottomBlack = image.bottomRightOnBit; + if (leftTopBlack == nil || rightBottomBlack == nil) { + return nil; + } + + int moduleSize = [self moduleSize:leftTopBlack image:image]; + if (moduleSize == -1) { + return nil; + } + + int top = leftTopBlack.array[1]; + int bottom = rightBottomBlack.array[1]; + int left = leftTopBlack.array[0]; + int right = rightBottomBlack.array[0]; + + int matrixWidth = (right - left + 1) / moduleSize; + int matrixHeight = (bottom - top + 1) / moduleSize; + if (matrixWidth <= 0 || matrixHeight <= 0) { + return nil; + } + + int nudge = moduleSize / 2; + top += nudge; + left += nudge; + + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithWidth:matrixWidth height:matrixHeight]; + for (int y = 0; y < matrixHeight; y++) { + int iOffset = top + y * moduleSize; + for (int x = 0; x < matrixWidth; x++) { + if ([image getX:left + x * moduleSize y:iOffset]) { + [bits setX:x y:y]; + } + } + } + + return bits; +} + +- (int)moduleSize:(ZXIntArray *)leftTopBlack image:(ZXBitMatrix *)image { + int width = image.width; + int x = leftTopBlack.array[0]; + int y = leftTopBlack.array[1]; + while (x < width && [image getX:x y:y]) { + x++; + } + if (x == width) { + return -1; + } + + int moduleSize = x - leftTopBlack.array[0]; + if (moduleSize == 0) { + return -1; + } + return moduleSize; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.h new file mode 100644 index 0000000..2b7387d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +/** + * This object renders a Data Matrix code as a BitMatrix 2D array of greyscale values. + */ +@interface ZXDataMatrixWriter : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.m new file mode 100644 index 0000000..63f9bb4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.m @@ -0,0 +1,169 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteMatrix.h" +#import "ZXDataMatrixDefaultPlacement.h" +#import "ZXDataMatrixErrorCorrection.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixWriter.h" +#import "ZXDimension.h" +#import "ZXEncodeHints.h" + +@implementation ZXDataMatrixWriter + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (contents.length == 0) { + [NSException raise:NSInvalidArgumentException format:@"Found empty contents"]; + } + + if (format != kBarcodeFormatDataMatrix) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode kBarcodeFormatDataMatrix"]; + } + + if (width < 0 || height < 0) { + [NSException raise:NSInvalidArgumentException + format:@"Requested dimensions are too small: %dx%d", width, height]; + } + + // Try to get force shape & min / max size + ZXDataMatrixSymbolShapeHint shape = ZXDataMatrixSymbolShapeHintForceNone; + ZXDimension *minSize = [[ZXDimension alloc] initWithWidth:width height:height]; + ZXDimension *maxSize = nil; + if (hints != nil) { + shape = hints.dataMatrixShape; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + ZXDimension *requestedMinSize = hints.minSize; +#pragma GCC diagnostic pop + if (requestedMinSize != nil) { + minSize = requestedMinSize; + } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + ZXDimension *requestedMaxSize = hints.maxSize; +#pragma GCC diagnostic pop + if (requestedMaxSize != nil) { + maxSize = requestedMaxSize; + } + } + + //1. step: Data encodation + NSString *encoded = [ZXDataMatrixHighLevelEncoder encodeHighLevel:contents shape:shape minSize:minSize maxSize:maxSize]; + + ZXDataMatrixSymbolInfo *symbolInfo = [ZXDataMatrixSymbolInfo lookup:(int)encoded.length shape:shape minSize:minSize maxSize:maxSize fail:YES]; + + //2. step: ECC generation + NSString *codewords = [ZXDataMatrixErrorCorrection encodeECC200:encoded symbolInfo:symbolInfo]; + + //3. step: Module placement in Matrix + ZXDataMatrixDefaultPlacement *placement = [[ZXDataMatrixDefaultPlacement alloc] initWithCodewords:codewords numcols:symbolInfo.symbolDataWidth numrows:symbolInfo.symbolDataHeight]; + [placement place]; + + //4. step: low-level encoding + return [self encodeLowLevel:placement symbolInfo:symbolInfo width:width height:height]; +} + +/** + * Encode the given symbol info to a bit matrix. + * + * @param placement The DataMatrix placement. + * @param symbolInfo The symbol info to encode. + * @return The bit matrix generated. + */ +- (ZXBitMatrix *)encodeLowLevel:(ZXDataMatrixDefaultPlacement *)placement symbolInfo:(ZXDataMatrixSymbolInfo *)symbolInfo width:(int)width height:(int)height { + int symbolWidth = symbolInfo.symbolDataWidth; + int symbolHeight = symbolInfo.symbolDataHeight; + + ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:symbolInfo.symbolWidth height:symbolInfo.symbolHeight]; + + int matrixY = 0; + + for (int y = 0; y < symbolHeight; y++) { + // Fill the top edge with alternate 0 / 1 + int matrixX; + if ((y % symbolInfo.matrixHeight) == 0) { + matrixX = 0; + for (int x = 0; x < symbolInfo.symbolWidth; x++) { + [matrix setX:matrixX y:matrixY boolValue:(x % 2) == 0]; + matrixX++; + } + matrixY++; + } + matrixX = 0; + for (int x = 0; x < symbolWidth; x++) { + // Fill the right edge with full 1 + if ((x % symbolInfo.matrixWidth) == 0) { + [matrix setX:matrixX y:matrixY boolValue:YES]; + matrixX++; + } + [matrix setX:matrixX y:matrixY boolValue:[placement bitAtCol:x row:y]]; + matrixX++; + // Fill the right edge with alternate 0 / 1 + if ((x % symbolInfo.matrixWidth) == symbolInfo.matrixWidth - 1) { + [matrix setX:matrixX y:matrixY boolValue:(y % 2) == 0]; + matrixX++; + } + } + matrixY++; + // Fill the bottom edge with full 1 + if ((y % symbolInfo.matrixHeight) == symbolInfo.matrixHeight - 1) { + matrixX = 0; + for (int x = 0; x < symbolInfo.symbolWidth; x++) { + [matrix setX:matrixX y:matrixY boolValue:YES]; + matrixX++; + } + matrixY++; + } + } + + return [self convertByteMatrixToBitMatrix:matrix width:width height:height]; +} + +/** + * Convert the ZXByteMatrix to ZXBitMatrix. + * + * @param matrix The input matrix. + * @return The output matrix. + */ +- (ZXBitMatrix *)convertByteMatrixToBitMatrix:(ZXByteMatrix *)input width:(int)width height:(int)height { + int inputWidth = input.width; + int inputHeight = input.height; + int outputWidth = MAX(width, inputWidth); + int outputHeight = MAX(height, inputHeight); + + int multiple = MIN(outputWidth / inputWidth, outputHeight / inputHeight); + int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; + int topPadding = (outputHeight - (inputHeight * multiple)) / 2; + + ZXBitMatrix *output = [[ZXBitMatrix alloc] initWithWidth:outputWidth height:outputHeight]; + + for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { + for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { + if ([input getX:inputX y:inputY] == 1) { + [output setRegionAtLeft:outputX top:outputY width:multiple height:multiple]; + } + } + } + return output; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXingObjCDataMatrix.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXingObjCDataMatrix.h new file mode 100644 index 0000000..39bbd4b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXingObjCDataMatrix.h @@ -0,0 +1,31 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ZXINGOBJC_DATAMATRIX_ + +#define _ZXINGOBJC_DATAMATRIX_ + +#import "ZXDataMatrixDecoder.h" +#import "ZXDataMatrixDefaultPlacement.h" +#import "ZXDataMatrixDetector.h" +#import "ZXDataMatrixErrorCorrection.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixReader.h" +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixVersion.h" +#import "ZXDataMatrixWriter.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.h new file mode 100644 index 0000000..b8f1757 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXByteArray, ZXDataMatrixVersion; + +@interface ZXDataMatrixBitMatrixParser : NSObject + +@property (nonatomic, strong, readonly) ZXDataMatrixVersion *version; + +/** + * @param bitMatrix ZXBitMatrix to parse + * @return nil if dimension is < 8 or > 144 or not 0 mod 2 + */ +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error; + +/** + * Reads the bits in the ZXBitMatrix representing the mapping matrix (No alignment patterns) + * in the correct order in order to reconstitute the codewords bytes contained within the + * Data Matrix Code. + * + * @return bytes encoded within the Data Matrix Code or nil if the exact number of bytes expected is not read + */ +- (ZXByteArray *)readCodewords; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.m new file mode 100644 index 0000000..af4e921 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.m @@ -0,0 +1,429 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXDataMatrixBitMatrixParser.h" +#import "ZXDataMatrixVersion.h" +#import "ZXErrors.h" + +@interface ZXDataMatrixBitMatrixParser () + +@property (nonatomic, strong, readonly) ZXBitMatrix *mappingBitMatrix; +@property (nonatomic, strong, readonly) ZXBitMatrix *readMappingMatrix; + +@end + +@implementation ZXDataMatrixBitMatrixParser + +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error { + if (self = [super init]) { + int dimension = bitMatrix.height; + if (dimension < 8 || dimension > 144 || (dimension & 0x01) != 0) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + _version = [self readVersion:bitMatrix]; + if (!_version) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + _mappingBitMatrix = [self extractDataRegion:bitMatrix]; + _readMappingMatrix = [[ZXBitMatrix alloc] initWithWidth:_mappingBitMatrix.width + height:_mappingBitMatrix.height]; + } + + return self; +} + +/** + * Creates the version object based on the dimension of the original bit matrix from + * the datamatrix code. + * + * See ISO 16022:2006 Table 7 - ECC 200 symbol attributes< + * + * @param bitMatrix Original ZXBitMatrix including alignment patterns + * @return ZXDatamatrixVersion encapsulating the Data Matrix Code's "version" + * or nil if the dimensions of the mapping matrix are not valid + * Data Matrix dimensions. + */ +- (ZXDataMatrixVersion *)readVersion:(ZXBitMatrix *)bitMatrix { + int numRows = bitMatrix.height; + int numColumns = bitMatrix.width; + return [ZXDataMatrixVersion versionForDimensions:numRows numColumns:numColumns]; +} + +- (ZXByteArray *)readCodewords { + ZXByteArray *result = [[ZXByteArray alloc] initWithLength:self.version.totalCodewords]; + int resultOffset = 0; + + int row = 4; + int column = 0; + + int numRows = self.mappingBitMatrix.height; + int numColumns = self.mappingBitMatrix.width; + + BOOL corner1Read = NO; + BOOL corner2Read = NO; + BOOL corner3Read = NO; + BOOL corner4Read = NO; + + do { + if ((row == numRows) && (column == 0) && !corner1Read) { + result.array[resultOffset++] = (int8_t) [self readCorner1:numRows numColumns:numColumns]; + row -= 2; + column += 2; + corner1Read = YES; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x03) != 0) && !corner2Read) { + result.array[resultOffset++] = (int8_t) [self readCorner2:numRows numColumns:numColumns]; + row -= 2; + column += 2; + corner2Read = YES; + } else if ((row == numRows + 4) && (column == 2) && ((numColumns & 0x07) == 0) && !corner3Read) { + result.array[resultOffset++] = (int8_t) [self readCorner3:numRows numColumns:numColumns]; + row -= 2; + column += 2; + corner3Read = YES; + } else if ((row == numRows - 2) && (column == 0) && ((numColumns & 0x07) == 4) && !corner4Read) { + result.array[resultOffset++] = (int8_t) [self readCorner4:numRows numColumns:numColumns]; + row -= 2; + column += 2; + corner4Read = YES; + } else { + do { + if ((row < numRows) && (column >= 0) && ![self.readMappingMatrix getX:column y:row]) { + result.array[resultOffset++] = (int8_t) [self readUtah:row column:column numRows:numRows numColumns:numColumns]; + } + row -= 2; + column += 2; + } while ((row >= 0) && (column < numColumns)); + row += 1; + column += 3; + + do { + if ((row >= 0) && (column < numColumns) && ![self.readMappingMatrix getX:column y:row]) { + result.array[resultOffset++] = (int8_t) [self readUtah:row column:column numRows:numRows numColumns:numColumns]; + } + row += 2; + column -= 2; + } while ((row < numRows) && (column >= 0)); + row += 3; + column += 1; + } + } while ((row < numRows) || (column < numColumns)); + + if (resultOffset != self.version.totalCodewords) { + return nil; + } + return result; +} + +/** + * Reads a bit of the mapping matrix accounting for boundary wrapping. + * + * @param row Row to read in the mapping matrix + * @param column Column to read in the mapping matrix + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return value of the given bit in the mapping matrix + */ +- (BOOL)readModule:(int)row column:(int)column numRows:(int)numRows numColumns:(int)numColumns { + if (row < 0) { + row += numRows; + column += 4 - ((numRows + 4) & 0x07); + } + if (column < 0) { + column += numColumns; + row += 4 - ((numColumns + 4) & 0x07); + } + [self.readMappingMatrix setX:column y:row]; + return [self.mappingBitMatrix getX:column y:row]; +} + +/** + * Reads the 8 bits of the standard Utah-shaped pattern. + * + * See ISO 16022:2006, 5.8.1 Figure 6 + * + * @param row Current row in the mapping matrix, anchored at the 8th bit (LSB) of the pattern + * @param column Current column in the mapping matrix, anchored at the 8th bit (LSB) of the pattern + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return byte from the utah shape + */ +- (int)readUtah:(int)row column:(int)column numRows:(int)numRows numColumns:(int)numColumns { + int currentByte = 0; + if ([self readModule:row - 2 column:column - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row - 2 column:column - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row - 1 column:column - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row - 1 column:column - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row - 1 column:column numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row column:column - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row column:column - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:row column:column numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + return currentByte; +} + +/** + * Reads the 8 bits of the special corner condition 1. + * + * See ISO 16022:2006, Figure F.3 + * + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return byte from the Corner condition 1 + */ +- (int)readCorner1:(int)numRows numColumns:(int)numColumns { + int currentByte = 0; + if ([self readModule:numRows - 1 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 1 column:1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 1 column:2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:2 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:3 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + return currentByte; +} + +/** + * Reads the 8 bits of the special corner condition 2. + * + * See ISO 16022:2006, Figure F.4 + * + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return byte from the Corner condition 2 + */ +- (int)readCorner2:(int)numRows numColumns:(int)numColumns { + int currentByte = 0; + if ([self readModule:numRows - 3 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 2 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 1 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 4 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 3 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + return currentByte; +} + +/** + * Reads the 8 bits of the special corner condition 3. + * + * See ISO 16022:2006, Figure F.5 + * + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return byte from the Corner condition 3 + */ +- (int)readCorner3:(int)numRows numColumns:(int)numColumns { + int currentByte = 0; + if ([self readModule:numRows - 1 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 1 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 3 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 3 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + return currentByte; +} + +/** + * Reads the 8 bits of the special corner condition 4. + * + * See ISO 16022:2006, Figure F.6 + * + * @param numRows Number of rows in the mapping matrix + * @param numColumns Number of columns in the mapping matrix + * @return byte from the Corner condition 4 + */ +- (int)readCorner4:(int)numRows numColumns:(int)numColumns { + int currentByte = 0; + if ([self readModule:numRows - 3 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 2 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:numRows - 1 column:0 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 2 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:0 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:1 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:2 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + currentByte <<= 1; + if ([self readModule:3 column:numColumns - 1 numRows:numRows numColumns:numColumns]) { + currentByte |= 1; + } + return currentByte; +} + +/** + * Extracts the data region from a ZXBitMatrix that contains + * alignment patterns. + * + * @param bitMatrix Original ZXBitMatrix with alignment patterns + * @return BitMatrix that has the alignment patterns removed + */ +- (ZXBitMatrix *)extractDataRegion:(ZXBitMatrix *)bitMatrix { + int symbolSizeRows = self.version.symbolSizeRows; + int symbolSizeColumns = self.version.symbolSizeColumns; + + if (bitMatrix.height != symbolSizeRows) { + [NSException raise:NSInvalidArgumentException format:@"Dimension of bitMatrix must match the version size"]; + } + + int dataRegionSizeRows = self.version.dataRegionSizeRows; + int dataRegionSizeColumns = self.version.dataRegionSizeColumns; + + int numDataRegionsRow = symbolSizeRows / dataRegionSizeRows; + int numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns; + + int sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows; + int sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns; + + ZXBitMatrix *bitMatrixWithoutAlignment = [[ZXBitMatrix alloc] initWithWidth:sizeDataRegionColumn height:sizeDataRegionRow]; + for (int dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) { + int dataRegionRowOffset = dataRegionRow * dataRegionSizeRows; + for (int dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) { + int dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns; + for (int i = 0; i < dataRegionSizeRows; ++i) { + int readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i; + int writeRowOffset = dataRegionRowOffset + i; + for (int j = 0; j < dataRegionSizeColumns; ++j) { + int readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j; + if ([bitMatrix getX:readColumnOffset y:readRowOffset]) { + int writeColumnOffset = dataRegionColumnOffset + j; + [bitMatrixWithoutAlignment setX:writeColumnOffset y:writeRowOffset]; + } + } + } + } + } + + return bitMatrixWithoutAlignment; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.h new file mode 100644 index 0000000..3894233 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.h @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXDataMatrixVersion; + +/** + * Encapsulates a block of data within a Data Matrix Code. Data Matrix Codes may split their data into + * multiple blocks, each of which is a unit of data and error-correction codewords. Each + * is represented by an instance of this class. + */ +@interface ZXDataMatrixDataBlock : NSObject + +@property (nonatomic, assign, readonly) int numDataCodewords; +@property (nonatomic, strong, readonly) ZXByteArray *codewords; + +/** + * When Data Matrix Codes use multiple data blocks, they actually interleave the bytes of each of them. + * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This + * method will separate the data into original blocks. + * + * @param rawCodewords bytes as read directly from the Data Matrix Code + * @param version version of the Data Matrix Code + * @return DataBlocks containing original bytes, "de-interleaved" from representation in the + * Data Matrix Code + */ ++ (NSArray *)dataBlocks:(ZXByteArray *)rawCodewords version:(ZXDataMatrixVersion *)version; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.m new file mode 100644 index 0000000..b26fcf3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.m @@ -0,0 +1,92 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXDataMatrixDataBlock.h" +#import "ZXDataMatrixVersion.h" + +@implementation ZXDataMatrixDataBlock + +- (id)initWithNumDataCodewords:(int)numDataCodewords codewords:(ZXByteArray *)codewords { + if (self = [super init]) { + _numDataCodewords = numDataCodewords; + _codewords = codewords; + } + + return self; +} + ++ (NSArray *)dataBlocks:(ZXByteArray *)rawCodewords version:(ZXDataMatrixVersion *)version { + // Figure out the number and size of data blocks used by this version + ZXDataMatrixECBlocks *ecBlocks = version.ecBlocks; + + // First count the total number of data blocks + int totalBlocks = 0; + NSArray *ecBlockArray = ecBlocks.ecBlocks; + for (ZXDataMatrixECB *ecBlock in ecBlockArray) { + totalBlocks += ecBlock.count; + } + + // Now establish DataBlocks of the appropriate size and number of data codewords + NSMutableArray *result = [NSMutableArray arrayWithCapacity:totalBlocks]; + for (ZXDataMatrixECB *ecBlock in ecBlockArray) { + for (int i = 0; i < ecBlock.count; i++) { + int numDataCodewords = ecBlock.dataCodewords; + int numBlockCodewords = ecBlocks.ecCodewords + numDataCodewords; + [result addObject:[[ZXDataMatrixDataBlock alloc] initWithNumDataCodewords:numDataCodewords codewords:[[ZXByteArray alloc] initWithLength:numBlockCodewords]]]; + } + } + + // All blocks have the same amount of data, except that the last n + // (where n may be 0) have 1 less byte. Figure out where these start. + // TODO(bbrown): There is only one case where there is a difference for Data Matrix for size 144 + int longerBlocksTotalCodewords = [[(ZXDataMatrixDataBlock *)result[0] codewords] length]; + //int shorterBlocksTotalCodewords = longerBlocksTotalCodewords - 1; + + int longerBlocksNumDataCodewords = longerBlocksTotalCodewords - ecBlocks.ecCodewords; + int shorterBlocksNumDataCodewords = longerBlocksNumDataCodewords - 1; + // The last elements of result may be 1 element shorter for 144 matrix + // first fill out as many elements as all of them have minus 1 + int rawCodewordsOffset = 0; + for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { + for (ZXDataMatrixDataBlock *block in result) { + block.codewords.array[i] = rawCodewords.array[rawCodewordsOffset++]; + } + } + + // Fill out the last data block in the longer ones + BOOL specialVersion = version.versionNumber == 24; + int numLongerBlocks = specialVersion ? 8 : (int)[result count]; + for (int j = 0; j < numLongerBlocks; j++) { + [(ZXDataMatrixDataBlock *)result[j] codewords].array[longerBlocksNumDataCodewords - 1] = rawCodewords.array[rawCodewordsOffset++]; + } + + NSUInteger max = [(ZXDataMatrixDataBlock *)result[0] codewords].length; + for (int i = longerBlocksNumDataCodewords; i < max; i++) { + for (int j = 0; j < [result count]; j++) { + int jOffset = specialVersion ? (j + 8) % [result count] : j; + int iOffset = specialVersion && jOffset > 7 ? i - 1 : i; + [(ZXDataMatrixDataBlock *)result[jOffset] codewords].array[iOffset] = rawCodewords.array[rawCodewordsOffset++]; + } + } + + if (rawCodewordsOffset != rawCodewords.length) { + [NSException raise:NSInvalidArgumentException format:@"Codewords size mismatch"]; + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.h new file mode 100644 index 0000000..115f313 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXDecoderResult; + +/** + * Data Matrix Codes can encode text as bits in one of several modes, and can use multiple modes + * in one Data Matrix Code. This class decodes the bits back into text. + * + * See ISO 16022:2006, 5.2.1 - 5.2.9.2 + */ +@interface ZXDataMatrixDecodedBitStreamParser : NSObject + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.m new file mode 100644 index 0000000..7c7de50 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.m @@ -0,0 +1,497 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitSource.h" +#import "ZXByteArray.h" +#import "ZXDataMatrixDecodedBitStreamParser.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" + +/** + * See ISO 16022:2006, Annex C Table C.1 + * The C40 Basic Character Set (*'s used for placeholders for the shift values) + */ +const unichar C40_BASIC_SET_CHARS[40] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' +}; + +const unichar C40_SHIFT2_SET_CHARS[40] = { + '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', + '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_' +}; + +/** + * See ISO 16022:2006, Annex C Table C.2 + * The Text Basic Character Set (*'s used for placeholders for the shift values) + */ +const unichar TEXT_BASIC_SET_CHARS[40] = { + '*', '*', '*', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' +}; + +// Shift 2 for Text is the same encoding as C40 +static unichar TEXT_SHIFT2_SET_CHARS[40]; + +const unichar TEXT_SHIFT3_SET_CHARS[32] = { + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '{', '|', '}', '~', (unichar) 127 +}; + +enum { + PAD_ENCODE = 0, // Not really a mode + ASCII_ENCODE, + C40_ENCODE, + TEXT_ENCODE, + ANSIX12_ENCODE, + EDIFACT_ENCODE, + BASE256_ENCODE +}; + +@implementation ZXDataMatrixDecodedBitStreamParser + ++ (void)initialize { + if ([self class] != [ZXDataMatrixDecodedBitStreamParser class]) return; + + memcpy(TEXT_SHIFT2_SET_CHARS, C40_SHIFT2_SET_CHARS, sizeof(C40_SHIFT2_SET_CHARS)); +} + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes error:(NSError **)error { + ZXBitSource *bits = [[ZXBitSource alloc] initWithBytes:bytes]; + NSMutableString *result = [NSMutableString stringWithCapacity:100]; + NSMutableString *resultTrailer = [NSMutableString string]; + NSMutableArray *byteSegments = [NSMutableArray arrayWithCapacity:1]; + int mode = ASCII_ENCODE; + do { + if (mode == ASCII_ENCODE) { + mode = [self decodeAsciiSegment:bits result:result resultTrailer:resultTrailer]; + if (mode == -1) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else { + switch (mode) { + case C40_ENCODE: + if (![self decodeC40Segment:bits result:result]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + case TEXT_ENCODE: + if (![self decodeTextSegment:bits result:result]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + case ANSIX12_ENCODE: + if (![self decodeAnsiX12Segment:bits result:result]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + case EDIFACT_ENCODE: + [self decodeEdifactSegment:bits result:result]; + break; + case BASE256_ENCODE: + if (![self decodeBase256Segment:bits result:result byteSegments:byteSegments]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + default: + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + mode = ASCII_ENCODE; + } + } while (mode != PAD_ENCODE && bits.available > 0); + if ([resultTrailer length] > 0) { + [result appendString:resultTrailer]; + } + return [[ZXDecoderResult alloc] initWithRawBytes:bytes + text:result + byteSegments:[byteSegments count] == 0 ? nil : byteSegments + ecLevel:nil]; +} + +/** + * See ISO 16022:2006, 5.2.3 and Annex C, Table C.2 + */ ++ (int)decodeAsciiSegment:(ZXBitSource *)bits result:(NSMutableString *)result resultTrailer:(NSMutableString *)resultTrailer { + BOOL upperShift = NO; + do { + int oneByte = [bits readBits:8]; + if (oneByte == 0) { + return -1; + } else if (oneByte <= 128) { // ASCII data (ASCII value + 1) + if (upperShift) { + oneByte += 128; + //upperShift = NO; + } + [result appendFormat:@"%C", (unichar)(oneByte - 1)]; + return ASCII_ENCODE; + } else if (oneByte == 129) { // Pad + return PAD_ENCODE; + } else if (oneByte <= 229) { // 2-digit data 00-99 (Numeric Value + 130) + int value = oneByte - 130; + if (value < 10) { // pad with '0' for single digit values + [result appendString:@"0"]; + } + [result appendFormat:@"%d", value]; + } else if (oneByte == 230) { // Latch to C40 encodation + return C40_ENCODE; + } else if (oneByte == 231) { // Latch to Base 256 encodation + return BASE256_ENCODE; + } else if (oneByte == 232) { + // FNC1 + [result appendFormat:@"%C", (unichar)29]; // translate as ASCII 29 + } else if (oneByte == 233 || oneByte == 234) { + // Structured Append, Reader Programming + // Ignore these symbols for now + //return -1; + } else if (oneByte == 235) { // Upper Shift (shift to Extended ASCII) + upperShift = YES; + } else if (oneByte == 236) { // 05 Macro + [result appendFormat:@"[)>%C%C", (unichar)0x001E05, (unichar)0x001D]; + [resultTrailer insertString:[NSString stringWithFormat:@"%C%C", (unichar)0x001E, (unichar)0x0004] atIndex:0]; + } else if (oneByte == 237) { // 06 Macro + [result appendFormat:@"[)>%C%C", (unichar)0x001E06, (unichar)0x001D]; + [resultTrailer insertString:[NSString stringWithFormat:@"%C%C", (unichar)0x001E, (unichar)0x0004] atIndex:0]; + } else if (oneByte == 238) { // Latch to ANSI X12 encodation + return ANSIX12_ENCODE; + } else if (oneByte == 239) { // Latch to Text encodation + return TEXT_ENCODE; + } else if (oneByte == 240) { // Latch to EDIFACT encodation + return EDIFACT_ENCODE; + } else if (oneByte == 241) { // ECI Character + // TODO(bbrown): I think we need to support ECI + // Ignore this symbol for now + } else if (oneByte >= 242) { // Not to be used in ASCII encodation + // ... but work around encoders that end with 254, latch back to ASCII + if (oneByte != 254 || bits.available != 0) { + return -1; + } + } + } while (bits.available > 0); + return ASCII_ENCODE; +} + +/** + * See ISO 16022:2006, 5.2.5 and Annex C, Table C.1 + */ ++ (BOOL)decodeC40Segment:(ZXBitSource *)bits result:(NSMutableString *)result { + // Three C40 values are encoded in a 16-bit value as + // (1600 * C1) + (40 * C2) + C3 + 1 + // TODO(bbrown): The Upper Shift with C40 doesn't work in the 4 value scenario all the time + BOOL upperShift = NO; + + int cValues[3] = {0}; + int shift = 0; + + do { + // If there is only one byte left then it will be encoded as ASCII + if ([bits available] == 8) { + return YES; + } + int firstByte = [bits readBits:8]; + if (firstByte == 254) { // Unlatch codeword + return YES; + } + + [self parseTwoBytes:firstByte secondByte:[bits readBits:8] result:cValues]; + + for (int i = 0; i < 3; i++) { + int cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < sizeof(C40_BASIC_SET_CHARS) / sizeof(char)) { + unichar c40char = C40_BASIC_SET_CHARS[cValue]; + if (upperShift) { + [result appendFormat:@"%C", (unichar)(c40char + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", c40char]; + } + } else { + return NO; + } + break; + case 1: + if (upperShift) { + [result appendFormat:@"%C", (unichar)(cValue + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", (unichar)cValue]; + } + shift = 0; + break; + case 2: + if (cValue < sizeof(C40_SHIFT2_SET_CHARS) / sizeof(char)) { + unichar c40char = C40_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + [result appendFormat:@"%C", (unichar)(c40char + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", c40char]; + } + } else if (cValue == 27) { // FNC1 + [result appendFormat:@"%C", (unichar)29]; // translate as ASCII 29 + } else if (cValue == 30) { // Upper Shift + upperShift = YES; + } else { + return NO; + } + shift = 0; + break; + case 3: + if (upperShift) { + [result appendFormat:@"%C", (unichar)(cValue + 224)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", (unichar)(cValue + 96)]; + } + shift = 0; + break; + default: + return NO; + } + } + } while (bits.available > 0); + + return YES; +} + +/** + * See ISO 16022:2006, 5.2.6 and Annex C, Table C.2 + */ ++ (BOOL)decodeTextSegment:(ZXBitSource *)bits result:(NSMutableString *)result { + // Three Text values are encoded in a 16-bit value as + // (1600 * C1) + (40 * C2) + C3 + 1 + // TODO(bbrown): The Upper Shift with Text doesn't work in the 4 value scenario all the time + BOOL upperShift = NO; + + int cValues[3] = {0}; + + int shift = 0; + do { + // If there is only one byte left then it will be encoded as ASCII + if (bits.available == 8) { + return YES; + } + int firstByte = [bits readBits:8]; + if (firstByte == 254) { // Unlatch codeword + return YES; + } + + [self parseTwoBytes:firstByte secondByte:[bits readBits:8] result:cValues]; + + for (int i = 0; i < 3; i++) { + int cValue = cValues[i]; + switch (shift) { + case 0: + if (cValue < 3) { + shift = cValue + 1; + } else if (cValue < sizeof(TEXT_BASIC_SET_CHARS) / sizeof(char)) { + unichar textChar = TEXT_BASIC_SET_CHARS[cValue]; + if (upperShift) { + [result appendFormat:@"%C", (unichar)(textChar + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", textChar]; + } + } else { + return NO; + } + break; + case 1: + if (upperShift) { + [result appendFormat:@"%C", (unichar)(cValue + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", (unichar)cValue]; + } + shift = 0; + break; + case 2: + // Shift 2 for Text is the same encoding as C40 + if (cValue < sizeof(TEXT_SHIFT2_SET_CHARS) / sizeof(unichar)) { + unichar textChar = TEXT_SHIFT2_SET_CHARS[cValue]; + if (upperShift) { + [result appendFormat:@"%C", (unichar)(textChar + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", textChar]; + } + } else if (cValue == 27) { + [result appendFormat:@"%C", (unichar)29]; // translate as ASCII 29 + } else if (cValue == 30) { // Upper Shift + upperShift = YES; + } else { + return NO; + } + shift = 0; + break; + case 3: + if (cValue < sizeof(TEXT_SHIFT3_SET_CHARS) / sizeof(char)) { + unichar textChar = TEXT_SHIFT3_SET_CHARS[cValue]; + if (upperShift) { + [result appendFormat:@"%C", (unichar)(textChar + 128)]; + upperShift = NO; + } else { + [result appendFormat:@"%C", textChar]; + } + shift = 0; + } else { + return NO; + } + break; + default: + return NO; + } + } + } while (bits.available > 0); + return YES; +} + +/** + * See ISO 16022:2006, 5.2.7 + */ ++ (BOOL)decodeAnsiX12Segment:(ZXBitSource *)bits result:(NSMutableString *)result { + // Three ANSI X12 values are encoded in a 16-bit value as + // (1600 * C1) + (40 * C2) + C3 + 1 + + int cValues[3] = {0}; + do { + // If there is only one byte left then it will be encoded as ASCII + if (bits.available == 8) { + return YES; + } + int firstByte = [bits readBits:8]; + if (firstByte == 254) { // Unlatch codeword + return YES; + } + + [self parseTwoBytes:firstByte secondByte:[bits readBits:8] result:cValues]; + + for (int i = 0; i < 3; i++) { + int cValue = cValues[i]; + if (cValue == 0) { // X12 segment terminator + [result appendString:@"\r"]; + } else if (cValue == 1) { // X12 segment separator * + [result appendString:@"*"]; + } else if (cValue == 2) { // X12 sub-element separator > + [result appendString:@">"]; + } else if (cValue == 3) { // space + [result appendString:@" "]; + } else if (cValue < 14) { // 0 - 9 + [result appendFormat:@"%C", (unichar)(cValue + 44)]; + } else if (cValue < 40) { // A - Z + [result appendFormat:@"%C", (unichar)(cValue + 51)]; + } else { + return NO; + } + } + } while (bits.available > 0); + return YES; +} + ++ (void)parseTwoBytes:(int)firstByte secondByte:(int)secondByte result:(int[])result { + int fullBitValue = (firstByte << 8) + secondByte - 1; + int temp = fullBitValue / 1600; + result[0] = temp; + fullBitValue -= temp * 1600; + temp = fullBitValue / 40; + result[1] = temp; + result[2] = fullBitValue - temp * 40; +} + +/** + * See ISO 16022:2006, 5.2.8 and Annex C Table C.3 + */ ++ (void)decodeEdifactSegment:(ZXBitSource *)bits result:(NSMutableString *)result { + do { + // If there is only two or less bytes left then it will be encoded as ASCII + if (bits.available <= 16) { + return; + } + + for (int i = 0; i < 4; i++) { + int edifactValue = [bits readBits:6]; + + // Check for the unlatch character + if (edifactValue == 0x1F) { // 011111 + // Read rest of byte, which should be 0, and stop + int bitsLeft = 8 - bits.bitOffset; + if (bitsLeft != 8) { + [bits readBits:bitsLeft]; + } + return; + } + + if ((edifactValue & 0x20) == 0) { // no 1 in the leading (6th) bit + edifactValue |= 0x40; // Add a leading 01 to the 6 bit binary value + } + [result appendFormat:@"%c", (char)edifactValue]; + } + } while (bits.available > 0); +} + +/** + * See ISO 16022:2006, 5.2.9 and Annex B, B.2 + */ ++ (BOOL)decodeBase256Segment:(ZXBitSource *)bits result:(NSMutableString *)result byteSegments:(NSMutableArray *)byteSegments { + int codewordPosition = 1 + bits.byteOffset; // position is 1-indexed + int d1 = [self unrandomize255State:[bits readBits:8] base256CodewordPosition:codewordPosition++]; + int count; + if (d1 == 0) { + count = [bits available] / 8; + } else if (d1 < 250) { + count = d1; + } else { + count = 250 * (d1 - 249) + [self unrandomize255State:[bits readBits:8] base256CodewordPosition:codewordPosition++]; + } + + if (count < 0) { + return NO; + } + + ZXByteArray *bytes = [[ZXByteArray alloc] initWithLength:count]; + for (int i = 0; i < count; i++) { + if ([bits available] < 8) { + return NO; + } + bytes.array[i] = (int8_t)[self unrandomize255State:[bits readBits:8] base256CodewordPosition:codewordPosition++]; + } + [byteSegments addObject:bytes]; + + [result appendString:[[NSString alloc] initWithBytes:bytes.array length:bytes.length encoding:NSISOLatin1StringEncoding]]; + return YES; +} + +/** + * See ISO 16022:2006, Annex B, B.2 + */ ++ (int)unrandomize255State:(int)randomizedBase256Codeword base256CodewordPosition:(int)base256CodewordPosition { + int pseudoRandomNumber = ((149 * base256CodewordPosition) % 255) + 1; + int tempVariable = randomizedBase256Codeword - pseudoRandomNumber; + return tempVariable >= 0 ? tempVariable : tempVariable + 256; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.h new file mode 100644 index 0000000..cf7660a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.h @@ -0,0 +1,47 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDecoderResult, ZXReedSolomonDecoder; + +/** + * The main class which implements Data Matrix Code decoding -- as opposed to locating and extracting + * the Data Matrix Code from an image. + */ +@interface ZXDataMatrixDecoder : NSObject + +/** + * Convenience method that can decode a Data Matrix Code represented as a 2D array of booleans. + * "true" is taken to mean a black module. + * + * @param image booleans representing white/black Data Matrix Code modules + * @return text and bytes encoded within the Data Matrix Code + * @return nil if the Data Matrix Code cannot be decoded + * @return nil if error correction fails + */ +- (ZXDecoderResult *)decode:(NSArray *)image error:(NSError **)error; + +/** + * Decodes a Data Matrix Code represented as a {@link BitMatrix}. A 1 or "true" is taken + * to mean a black module. + * + * @param bits booleans representing white/black Data Matrix Code modules + * @return text and bytes encoded within the Data Matrix Code + * @return nil if the Data Matrix Code cannot be decoded + * @return nil if error correction fails + */ +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.m new file mode 100644 index 0000000..d2b33fa --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.m @@ -0,0 +1,135 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXByteArray.h" +#import "ZXDataMatrixBitMatrixParser.h" +#import "ZXDataMatrixDataBlock.h" +#import "ZXDataMatrixDecodedBitStreamParser.h" +#import "ZXDataMatrixDecoder.h" +#import "ZXDataMatrixVersion.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXReedSolomonDecoder.h" + +@interface ZXDataMatrixDecoder () + +@property (nonatomic, strong, readonly) ZXReedSolomonDecoder *rsDecoder; + +@end + +@implementation ZXDataMatrixDecoder + +- (id)init { + if (self = [super init]) { + _rsDecoder = [[ZXReedSolomonDecoder alloc] initWithField:[ZXGenericGF DataMatrixField256]]; + } + + return self; +} + +- (ZXDecoderResult *)decode:(NSArray *)image error:(NSError **)error { + int dimension = (int)[image count]; + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithDimension:dimension]; + for (int i = 0; i < dimension; i++) { + ZXBoolArray *b = image[i]; + for (int j = 0; j < dimension; j++) { + if (b.array[j]) { + [bits setX:j y:i]; + } + } + } + + return [self decodeMatrix:bits error:error]; +} + +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits error:(NSError **)error { + ZXDataMatrixBitMatrixParser *parser = [[ZXDataMatrixBitMatrixParser alloc] initWithBitMatrix:bits error:error]; + if (!parser) { + return nil; + } + ZXDataMatrixVersion *version = [parser version]; + + ZXByteArray *codewords = [parser readCodewords]; + NSArray *dataBlocks = [ZXDataMatrixDataBlock dataBlocks:codewords version:version]; + + NSUInteger dataBlocksCount = [dataBlocks count]; + + int totalBytes = 0; + for (int i = 0; i < dataBlocksCount; i++) { + totalBytes += [dataBlocks[i] numDataCodewords]; + } + + if (totalBytes == 0) { + return nil; + } + + ZXByteArray *resultBytes = [[ZXByteArray alloc] initWithLength:totalBytes]; + + for (int j = 0; j < dataBlocksCount; j++) { + ZXDataMatrixDataBlock *dataBlock = dataBlocks[j]; + ZXByteArray *codewordBytes = dataBlock.codewords; + int numDataCodewords = [dataBlock numDataCodewords]; + if (![self correctErrors:codewordBytes numDataCodewords:numDataCodewords error:error]) { + return nil; + } + for (int i = 0; i < numDataCodewords; i++) { + // De-interlace data blocks. + resultBytes.array[i * dataBlocksCount + j] = codewordBytes.array[i]; + } + } + + return [ZXDataMatrixDecodedBitStreamParser decode:resultBytes error:error]; +} + +/** + * Given data and error-correction codewords received, possibly corrupted by errors, attempts to + * correct the errors in-place using Reed-Solomon error correction. + * + * @param codewordBytes data and error correction codewords + * @param numDataCodewords number of codewords that are data bytes + * @return NO if error correction fails + */ +- (BOOL)correctErrors:(ZXByteArray *)codewordBytes numDataCodewords:(int)numDataCodewords error:(NSError **)error { + int numCodewords = codewordBytes.length; + // First read into an array of ints + ZXIntArray *codewordsInts = [[ZXIntArray alloc] initWithLength:numCodewords]; + for (int i = 0; i < numCodewords; i++) { + codewordsInts.array[i] = codewordBytes.array[i] & 0xFF; + } + int numECCodewords = codewordBytes.length - numDataCodewords; + + NSError *decodeError = nil; + if (![self.rsDecoder decode:codewordsInts twoS:numECCodewords error:&decodeError]) { + if (decodeError.code == ZXReedSolomonError) { + if (error) *error = ZXChecksumErrorInstance(); + return NO; + } else { + if (error) *error = decodeError; + return NO; + } + } + + for (int i = 0; i < numDataCodewords; i++) { + codewordBytes.array[i] = (int8_t) codewordsInts.array[i]; + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.h new file mode 100644 index 0000000..82e01a9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.h @@ -0,0 +1,66 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Encapsulates a set of error-correction blocks in one symbol version. Most versions will + * use blocks of differing sizes within one version, so, this encapsulates the parameters for + * each set of blocks. It also holds the number of error-correction codewords per block since it + * will be the same across all blocks within one version. + */ +@interface ZXDataMatrixECBlocks : NSObject + +@property (nonatomic, strong, readonly) NSArray *ecBlocks; +@property (nonatomic, assign, readonly) int ecCodewords; + +@end + +/** + * Encapsualtes the parameters for one error-correction block in one symbol version. + * This includes the number of data codewords, and the number of times a block with these + * parameters is used consecutively in the Data Matrix code version's format. + */ +@interface ZXDataMatrixECB : NSObject + +@property (nonatomic, assign, readonly) int count; +@property (nonatomic, assign, readonly) int dataCodewords; + +@end + +/** + * The Version object encapsulates attributes about a particular + * size Data Matrix Code. + */ +@interface ZXDataMatrixVersion : NSObject + +@property (nonatomic, strong, readonly) ZXDataMatrixECBlocks *ecBlocks; +@property (nonatomic, assign, readonly) int dataRegionSizeColumns; +@property (nonatomic, assign, readonly) int dataRegionSizeRows; +@property (nonatomic, assign, readonly) int symbolSizeColumns; +@property (nonatomic, assign, readonly) int symbolSizeRows; +@property (nonatomic, assign, readonly) int totalCodewords; +@property (nonatomic, assign, readonly) int versionNumber; + +/** + *

Deduces version information from Data Matrix dimensions.

+ * + * @param numRows Number of rows in modules + * @param numColumns Number of columns in modules + * @return Version for a Data Matrix Code of those dimensions or nil + * if dimensions do correspond to a valid Data Matrix size + */ ++ (ZXDataMatrixVersion *)versionForDimensions:(int)numRows numColumns:(int)numColumns; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.m new file mode 100644 index 0000000..6a3aa82 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.m @@ -0,0 +1,348 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixVersion.h" + +@implementation ZXDataMatrixECBlocks + +- (id)initWithCodewords:(int)ecCodewords ecBlocks:(ZXDataMatrixECB *)ecBlocks { + if (self = [super init]) { + _ecCodewords = ecCodewords; + _ecBlocks = @[ecBlocks]; + } + + return self; +} + +- (id)initWithCodewords:(int)ecCodewords ecBlocks1:(ZXDataMatrixECB *)ecBlocks1 ecBlocks2:(ZXDataMatrixECB *)ecBlocks2 { + if (self = [super init]) { + _ecCodewords = ecCodewords; + _ecBlocks = @[ecBlocks1, ecBlocks2]; + } + + return self; +} + +@end + + +@implementation ZXDataMatrixECB + +- (id)initWithCount:(int)count dataCodewords:(int)dataCodewords { + if (self = [super init]) { + _count = count; + _dataCodewords = dataCodewords; + } + + return self; +} + +@end + + +static NSArray *VERSIONS = nil; + +@implementation ZXDataMatrixVersion + +- (id)initWithVersionNumber:(int)versionNumber symbolSizeRows:(int)symbolSizeRows symbolSizeColumns:(int)symbolSizeColumns + dataRegionSizeRows:(int)dataRegionSizeRows dataRegionSizeColumns:(int)dataRegionSizeColumns ecBlocks:(ZXDataMatrixECBlocks *)ecBlocks { + if (self = [super init]) { + _versionNumber = versionNumber; + _symbolSizeRows = symbolSizeRows; + _symbolSizeColumns = symbolSizeColumns; + _dataRegionSizeRows = dataRegionSizeRows; + _dataRegionSizeColumns = dataRegionSizeColumns; + _ecBlocks = ecBlocks; + + int total = 0; + int ecCodewords = ecBlocks.ecCodewords; + NSArray *ecbArray = ecBlocks.ecBlocks; + for (ZXDataMatrixECB *ecBlock in ecbArray) { + total += ecBlock.count * (ecBlock.dataCodewords + ecCodewords); + } + _totalCodewords = total; + } + + return self; +} + ++ (ZXDataMatrixVersion *)versionForDimensions:(int)numRows numColumns:(int)numColumns { + if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { + return nil; + } + + for (ZXDataMatrixVersion *version in VERSIONS) { + if (version.symbolSizeRows == numRows && version.symbolSizeColumns == numColumns) { + return version; + } + } + + return nil; +} + +- (NSString *)description { + return [@(self.versionNumber) stringValue]; +} + +/** + * See ISO 16022:2006 5.5.1 Table 7 + */ ++ (void)initialize { + if ([self class] != [ZXDataMatrixVersion class]) return; + + VERSIONS = @[[[ZXDataMatrixVersion alloc] initWithVersionNumber:1 + symbolSizeRows:10 + symbolSizeColumns:10 + dataRegionSizeRows:8 + dataRegionSizeColumns:8 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:5 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:3]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:2 + symbolSizeRows:12 + symbolSizeColumns:12 + dataRegionSizeRows:10 + dataRegionSizeColumns:10 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:7 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:5]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:3 + symbolSizeRows:14 + symbolSizeColumns:14 + dataRegionSizeRows:12 + dataRegionSizeColumns:12 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:10 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:8]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:4 + symbolSizeRows:16 + symbolSizeColumns:16 + dataRegionSizeRows:14 + dataRegionSizeColumns:14 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:12 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:12]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:5 + symbolSizeRows:18 + symbolSizeColumns:18 + dataRegionSizeRows:16 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:14 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:18]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:6 + symbolSizeRows:20 + symbolSizeColumns:20 + dataRegionSizeRows:18 + dataRegionSizeColumns:18 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:18 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:22]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:7 + symbolSizeRows:22 + symbolSizeColumns:22 + dataRegionSizeRows:20 + dataRegionSizeColumns:20 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:20 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:30]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:8 + symbolSizeRows:24 + symbolSizeColumns:24 + dataRegionSizeRows:22 + dataRegionSizeColumns:22 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:24 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:36]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:9 + symbolSizeRows:26 + symbolSizeColumns:26 + dataRegionSizeRows:24 + dataRegionSizeColumns:24 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:28 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:44]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:10 + symbolSizeRows:32 + symbolSizeColumns:32 + dataRegionSizeRows:14 + dataRegionSizeColumns:14 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:36 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:62]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:11 + symbolSizeRows:36 + symbolSizeColumns:36 + dataRegionSizeRows:16 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:42 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:86]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:12 + symbolSizeRows:40 + symbolSizeColumns:40 + dataRegionSizeRows:18 + dataRegionSizeColumns:18 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:48 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:114]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:13 + symbolSizeRows:44 + symbolSizeColumns:44 + dataRegionSizeRows:20 + dataRegionSizeColumns:20 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:56 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:144]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:14 + symbolSizeRows:48 + symbolSizeColumns:48 + dataRegionSizeRows:22 + dataRegionSizeColumns:22 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:68 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:174]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:15 + symbolSizeRows:52 + symbolSizeColumns:52 + dataRegionSizeRows:24 + dataRegionSizeColumns:24 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:42 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:2 dataCodewords:102]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:16 + symbolSizeRows:64 + symbolSizeColumns:64 + dataRegionSizeRows:14 + dataRegionSizeColumns:14 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:56 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:2 dataCodewords:140]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:17 + symbolSizeRows:72 + symbolSizeColumns:72 + dataRegionSizeRows:16 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:36 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:4 dataCodewords:92]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:18 + symbolSizeRows:80 + symbolSizeColumns:80 + dataRegionSizeRows:18 + dataRegionSizeColumns:18 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:48 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:4 dataCodewords:114]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:19 + symbolSizeRows:88 + symbolSizeColumns:88 + dataRegionSizeRows:20 + dataRegionSizeColumns:20 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:56 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:4 dataCodewords:144]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:20 + symbolSizeRows:96 + symbolSizeColumns:96 + dataRegionSizeRows:22 + dataRegionSizeColumns:22 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:68 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:4 dataCodewords:174]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:21 + symbolSizeRows:104 + symbolSizeColumns:104 + dataRegionSizeRows:24 + dataRegionSizeColumns:24 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:56 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:6 dataCodewords:136]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:22 + symbolSizeRows:120 + symbolSizeColumns:120 + dataRegionSizeRows:18 + dataRegionSizeColumns:18 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:68 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:6 dataCodewords:175]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:23 + symbolSizeRows:132 + symbolSizeColumns:132 + dataRegionSizeRows:20 + dataRegionSizeColumns:20 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:62 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:8 dataCodewords:163]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:24 + symbolSizeRows:144 + symbolSizeColumns:144 + dataRegionSizeRows:22 + dataRegionSizeColumns:22 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:62 + ecBlocks1:[[ZXDataMatrixECB alloc] initWithCount:8 dataCodewords:156] + ecBlocks2:[[ZXDataMatrixECB alloc] initWithCount:2 dataCodewords:155]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:25 + symbolSizeRows:8 + symbolSizeColumns:18 + dataRegionSizeRows:6 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:7 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:5]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:26 + symbolSizeRows:8 + symbolSizeColumns:32 + dataRegionSizeRows:6 + dataRegionSizeColumns:14 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:11 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:10]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:27 + symbolSizeRows:12 + symbolSizeColumns:26 + dataRegionSizeRows:10 + dataRegionSizeColumns:24 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:14 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:16]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:28 + symbolSizeRows:12 + symbolSizeColumns:36 + dataRegionSizeRows:10 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:18 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:22]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:29 + symbolSizeRows:16 + symbolSizeColumns:36 + dataRegionSizeRows:14 + dataRegionSizeColumns:16 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:24 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:32]]], + + [[ZXDataMatrixVersion alloc] initWithVersionNumber:30 + symbolSizeRows:16 + symbolSizeColumns:48 + dataRegionSizeRows:14 + dataRegionSizeColumns:22 + ecBlocks:[[ZXDataMatrixECBlocks alloc] initWithCodewords:28 + ecBlocks:[[ZXDataMatrixECB alloc] initWithCount:1 dataCodewords:49]]]]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.h new file mode 100644 index 0000000..babf9e1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.h @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDetectorResult, ZXWhiteRectangleDetector; + +/** + * Encapsulates logic that can detect a Data Matrix Code in an image, even if the Data Matrix Code + * is rotated or skewed, or partially obscured. + */ +@interface ZXDataMatrixDetector : NSObject + +- (id)initWithImage:(ZXBitMatrix *)image error:(NSError **)error; + +/** + * Detects a Data Matrix Code in an image. + * + * @return ZXDetectorResult encapsulating results of detecting a Data Matrix Code or nil + * if no Data Matrix Code can be found + */ +- (ZXDetectorResult *)detectWithError:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.m new file mode 100644 index 0000000..ada6c2f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.m @@ -0,0 +1,359 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixDetector.h" +#import "ZXDetectorResult.h" +#import "ZXErrors.h" +#import "ZXGridSampler.h" +#import "ZXMathUtils.h" +#import "ZXResultPoint.h" +#import "ZXWhiteRectangleDetector.h" + +/** + * Simply encapsulates two points and a number of transitions between them. + */ +@interface ZXResultPointsAndTransitions : NSObject + +@property (nonatomic, strong, readonly) ZXResultPoint *from; +@property (nonatomic, strong, readonly) ZXResultPoint *to; +@property (nonatomic, assign, readonly) int transitions; + +@end + +@implementation ZXResultPointsAndTransitions + +- (id)initWithFrom:(ZXResultPoint *)from to:(ZXResultPoint *)to transitions:(int)transitions { + if (self = [super init]) { + _from = from; + _to = to; + _transitions = transitions; + } + + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%@/%@/%d", self.from, self.to, self.transitions]; +} + +- (NSComparisonResult)compare:(ZXResultPointsAndTransitions *)otherObject { + return [@(self.transitions) compare:@(otherObject.transitions)]; +} + +@end + + +@interface ZXDataMatrixDetector () + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, strong, readonly) ZXWhiteRectangleDetector *rectangleDetector; + +@end + +@implementation ZXDataMatrixDetector + +- (id)initWithImage:(ZXBitMatrix *)image error:(NSError **)error { + if (self = [super init]) { + _image = image; + _rectangleDetector = [[ZXWhiteRectangleDetector alloc] initWithImage:_image error:error]; + if (!_rectangleDetector) { + return nil; + } + } + + return self; +} + +- (ZXDetectorResult *)detectWithError:(NSError **)error { + NSArray *cornerPoints = [self.rectangleDetector detectWithError:error]; + if (!cornerPoints) { + return nil; + } + ZXResultPoint *pointA = cornerPoints[0]; + ZXResultPoint *pointB = cornerPoints[1]; + ZXResultPoint *pointC = cornerPoints[2]; + ZXResultPoint *pointD = cornerPoints[3]; + + NSMutableArray *transitions = [NSMutableArray arrayWithCapacity:4]; + [transitions addObject:[self transitionsBetween:pointA to:pointB]]; + [transitions addObject:[self transitionsBetween:pointA to:pointC]]; + [transitions addObject:[self transitionsBetween:pointB to:pointD]]; + [transitions addObject:[self transitionsBetween:pointC to:pointD]]; + [transitions sortUsingSelector:@selector(compare:)]; + + ZXResultPointsAndTransitions *lSideOne = (ZXResultPointsAndTransitions *)transitions[0]; + ZXResultPointsAndTransitions *lSideTwo = (ZXResultPointsAndTransitions *)transitions[1]; + + NSMutableDictionary *pointCount = [NSMutableDictionary dictionary]; + [self increment:pointCount key:[lSideOne from]]; + [self increment:pointCount key:[lSideOne to]]; + [self increment:pointCount key:[lSideTwo from]]; + [self increment:pointCount key:[lSideTwo to]]; + + ZXResultPoint *maybeTopLeft = nil; + ZXResultPoint *bottomLeft = nil; + ZXResultPoint *maybeBottomRight = nil; + for (ZXResultPoint *point in [pointCount allKeys]) { + NSNumber *value = pointCount[point]; + if ([value intValue] == 2) { + bottomLeft = point; + } else { + if (maybeTopLeft == nil) { + maybeTopLeft = point; + } else { + maybeBottomRight = point; + } + } + } + + if (maybeTopLeft == nil || bottomLeft == nil || maybeBottomRight == nil) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSMutableArray *corners = [NSMutableArray arrayWithObjects:maybeTopLeft, bottomLeft, maybeBottomRight, nil]; + [ZXResultPoint orderBestPatterns:corners]; + + ZXResultPoint *bottomRight = corners[0]; + bottomLeft = corners[1]; + ZXResultPoint *topLeft = corners[2]; + + ZXResultPoint *topRight; + if (!pointCount[pointA]) { + topRight = pointA; + } else if (!pointCount[pointB]) { + topRight = pointB; + } else if (!pointCount[pointC]) { + topRight = pointC; + } else { + topRight = pointD; + } + + int dimensionTop = [[self transitionsBetween:topLeft to:topRight] transitions]; + int dimensionRight = [[self transitionsBetween:bottomRight to:topRight] transitions]; + + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + dimensionTop += 2; + + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + dimensionRight += 2; + + ZXBitMatrix *bits; + ZXResultPoint *correctedTopRight; + + if (4 * dimensionTop >= 7 * dimensionRight || 4 * dimensionRight >= 7 * dimensionTop) { + correctedTopRight = [self correctTopRightRectangular:bottomLeft bottomRight:bottomRight topLeft:topLeft topRight:topRight dimensionTop:dimensionTop dimensionRight:dimensionRight]; + if (correctedTopRight == nil) { + correctedTopRight = topRight; + } + + dimensionTop = [[self transitionsBetween:topLeft to:correctedTopRight] transitions]; + dimensionRight = [[self transitionsBetween:bottomRight to:correctedTopRight] transitions]; + + if ((dimensionTop & 0x01) == 1) { + dimensionTop++; + } + + if ((dimensionRight & 0x01) == 1) { + dimensionRight++; + } + + bits = [self sampleGrid:self.image topLeft:topLeft bottomLeft:bottomLeft bottomRight:bottomRight topRight:correctedTopRight dimensionX:dimensionTop dimensionY:dimensionRight error:error]; + if (!bits) { + return nil; + } + } else { + int dimension = MIN(dimensionRight, dimensionTop); + correctedTopRight = [self correctTopRight:bottomLeft bottomRight:bottomRight topLeft:topLeft topRight:topRight dimension:dimension]; + if (correctedTopRight == nil) { + correctedTopRight = topRight; + } + + int dimensionCorrected = MAX([[self transitionsBetween:topLeft to:correctedTopRight] transitions], [[self transitionsBetween:bottomRight to:correctedTopRight] transitions]); + dimensionCorrected++; + if ((dimensionCorrected & 0x01) == 1) { + dimensionCorrected++; + } + + bits = [self sampleGrid:self.image topLeft:topLeft bottomLeft:bottomLeft bottomRight:bottomRight topRight:correctedTopRight dimensionX:dimensionCorrected dimensionY:dimensionCorrected error:error]; + if (!bits) { + return nil; + } + } + return [[ZXDetectorResult alloc] initWithBits:bits points:@[topLeft, bottomLeft, bottomRight, correctedTopRight]]; +} + +/** + * Calculates the position of the white top right module using the output of the rectangle detector + * for a rectangular matrix + */ +- (ZXResultPoint *)correctTopRightRectangular:(ZXResultPoint *)bottomLeft bottomRight:(ZXResultPoint *)bottomRight + topLeft:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight + dimensionTop:(int)dimensionTop dimensionRight:(int)dimensionRight { + float corr = [self distance:bottomLeft b:bottomRight] / (float)dimensionTop; + int norm = [self distance:topLeft b:topRight]; + float cos = ([topRight x] - [topLeft x]) / norm; + float sin = ([topRight y] - [topLeft y]) / norm; + + ZXResultPoint *c1 = [[ZXResultPoint alloc] initWithX:[topRight x] + corr * cos y:[topRight y] + corr * sin]; + + corr = [self distance:bottomLeft b:topLeft] / (float)dimensionRight; + norm = [self distance:bottomRight b:topRight]; + cos = ([topRight x] - [bottomRight x]) / norm; + sin = ([topRight y] - [bottomRight y]) / norm; + + ZXResultPoint *c2 = [[ZXResultPoint alloc] initWithX:[topRight x] + corr * cos y:[topRight y] + corr * sin]; + + if (![self isValid:c1]) { + if ([self isValid:c2]) { + return c2; + } + return nil; + } else if (![self isValid:c2]) { + return c1; + } + + int l1 = abs(dimensionTop - [[self transitionsBetween:topLeft to:c1] transitions]) + abs(dimensionRight - [[self transitionsBetween:bottomRight to:c1] transitions]); + int l2 = abs(dimensionTop - [[self transitionsBetween:topLeft to:c2] transitions]) + abs(dimensionRight - [[self transitionsBetween:bottomRight to:c2] transitions]); + + if (l1 <= l2) { + return c1; + } + + return c2; +} + +/** + * Calculates the position of the white top right module using the output of the rectangle detector + * for a square matrix + */ +- (ZXResultPoint *)correctTopRight:(ZXResultPoint *)bottomLeft bottomRight:(ZXResultPoint *)bottomRight + topLeft:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight dimension:(int)dimension { + float corr = [self distance:bottomLeft b:bottomRight] / (float)dimension; + int norm = [self distance:topLeft b:topRight]; + float cos = ([topRight x] - [topLeft x]) / norm; + float sin = ([topRight y] - [topLeft y]) / norm; + + ZXResultPoint *c1 = [[ZXResultPoint alloc] initWithX:[topRight x] + corr * cos y:[topRight y] + corr * sin]; + + corr = [self distance:bottomLeft b:topLeft] / (float)dimension; + norm = [self distance:bottomRight b:topRight]; + cos = ([topRight x] - [bottomRight x]) / norm; + sin = ([topRight y] - [bottomRight y]) / norm; + + ZXResultPoint *c2 = [[ZXResultPoint alloc] initWithX:[topRight x] + corr * cos y:[topRight y] + corr * sin]; + + if (![self isValid:c1]) { + if ([self isValid:c2]) { + return c2; + } + return nil; + } else if (![self isValid:c2]) { + return c1; + } + + int l1 = abs([[self transitionsBetween:topLeft to:c1] transitions] - [[self transitionsBetween:bottomRight to:c1] transitions]); + int l2 = abs([[self transitionsBetween:topLeft to:c2] transitions] - [[self transitionsBetween:bottomRight to:c2] transitions]); + + return l1 <= l2 ? c1 : c2; +} + +- (BOOL) isValid:(ZXResultPoint *)p { + return [p x] >= 0 && [p x] < self.image.width && [p y] > 0 && [p y] < self.image.height; +} + +- (int)distance:(ZXResultPoint *)a b:(ZXResultPoint *)b { + return [ZXMathUtils round:[ZXResultPoint distance:a pattern2:b]]; +} + +/** + * Increments the Integer associated with a key by one. + */ +- (void)increment:(NSMutableDictionary *)table key:(ZXResultPoint *)key { + NSNumber *value = table[key]; + table[key] = value == nil ? @1 : @([value intValue] + 1); +} + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)image + topLeft:(ZXResultPoint *)topLeft + bottomLeft:(ZXResultPoint *)bottomLeft + bottomRight:(ZXResultPoint *)bottomRight + topRight:(ZXResultPoint *)topRight + dimensionX:(int)dimensionX + dimensionY:(int)dimensionY + error:(NSError **)error { + ZXGridSampler *sampler = [ZXGridSampler instance]; + return [sampler sampleGrid:image + dimensionX:dimensionX dimensionY:dimensionY + p1ToX:0.5f p1ToY:0.5f + p2ToX:dimensionX - 0.5f p2ToY:0.5f + p3ToX:dimensionX - 0.5f p3ToY:dimensionY - 0.5f + p4ToX:0.5f p4ToY:dimensionY - 0.5f + p1FromX:[topLeft x] p1FromY:[topLeft y] + p2FromX:[topRight x] p2FromY:[topRight y] + p3FromX:[bottomRight x] p3FromY:[bottomRight y] + p4FromX:[bottomLeft x] p4FromY:[bottomLeft y] + error:error]; +} + +/** + * Counts the number of black/white transitions between two points, using something like Bresenham's algorithm. + */ +- (ZXResultPointsAndTransitions *)transitionsBetween:(ZXResultPoint *)from to:(ZXResultPoint *)to { + int fromX = (int)[from x]; + int fromY = (int)[from y]; + int toX = (int)[to x]; + int toY = (int)[to y]; + BOOL steep = abs(toY - fromY) > abs(toX - fromX); + if (steep) { + int temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + + int dx = abs(toX - fromX); + int dy = abs(toY - fromY); + int error = -dx / 2; + int ystep = fromY < toY ? 1 : -1; + int xstep = fromX < toX ? 1 : -1; + int transitions = 0; + BOOL inBlack = [self.image getX:steep ? fromY : fromX y:steep ? fromX : fromY]; + for (int x = fromX, y = fromY; x != toX; x += xstep) { + BOOL isBlack = [self.image getX:steep ? y : x y:steep ? x : y]; + if (isBlack != inBlack) { + transitions++; + inBlack = isBlack; + } + error += dy; + if (error > 0) { + if (y == toY) { + break; + } + y += ystep; + error -= dx; + } + } + return [[ZXResultPointsAndTransitions alloc] initWithFrom:from to:to transitions:transitions]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.h new file mode 100644 index 0000000..86ab58b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoder.h" + +@interface ZXDataMatrixASCIIEncoder : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.m new file mode 100644 index 0000000..9673c3f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.m @@ -0,0 +1,79 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixASCIIEncoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" + +@implementation ZXDataMatrixASCIIEncoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder asciiEncodation]; +} + +- (void)encode:(ZXDataMatrixEncoderContext *)context { + //step B + int n = [ZXDataMatrixHighLevelEncoder determineConsecutiveDigitCount:context.message startpos:context.pos]; + if (n >= 2) { + [context writeCodeword:[self encodeASCIIDigits:[context.message characterAtIndex:context.pos] + digit2:[context.message characterAtIndex:context.pos + 1]]]; + context.pos += 2; + } else { + unichar c = [context currentChar]; + int newMode = [ZXDataMatrixHighLevelEncoder lookAheadTest:context.message startpos:context.pos currentMode:[self encodingMode]]; + if (newMode != [self encodingMode]) { + if (newMode == [ZXDataMatrixHighLevelEncoder base256Encodation]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder latchToBase256]]; + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder base256Encodation]]; + return; + } else if (newMode == [ZXDataMatrixHighLevelEncoder c40Encodation]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder latchToC40]]; + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder c40Encodation]]; + return; + } else if (newMode == [ZXDataMatrixHighLevelEncoder x12Encodation]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder latchToAnsiX12]]; + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder x12Encodation]]; + } else if (newMode == [ZXDataMatrixHighLevelEncoder textEncodation]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder latchToText]]; + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder textEncodation]]; + } else if (newMode == [ZXDataMatrixHighLevelEncoder edifactEncodation]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder latchToEdifact]]; + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder edifactEncodation]]; + } else { + @throw [NSException exceptionWithName:@"IllegalStateException" reason:@"Illegal mode" userInfo:nil]; + } + } else if ([ZXDataMatrixHighLevelEncoder isExtendedASCII:c]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder upperShift]]; + [context writeCodeword:(unichar)(c - 128 + 1)]; + context.pos++; + } else { + [context writeCodeword:(unichar)(c + 1)]; + context.pos++; + } + } +} + +- (unichar)encodeASCIIDigits:(unichar)digit1 digit2:(unichar)digit2 { + if ([ZXDataMatrixHighLevelEncoder isDigit:digit1] && [ZXDataMatrixHighLevelEncoder isDigit:digit2]) { + int num = (digit1 - 48) * 10 + (digit2 - 48); + return (unichar) (num + 130); + } + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"not digits: %C %C", digit1, digit2] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.h new file mode 100644 index 0000000..b5f73b3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoder.h" + +@interface ZXDataMatrixBase256Encoder : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.m new file mode 100644 index 0000000..ede8fa9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.m @@ -0,0 +1,78 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixBase256Encoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" + +@implementation ZXDataMatrixBase256Encoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder base256Encodation]; +} + +- (void)encode:(ZXDataMatrixEncoderContext *)context { + NSMutableString *buffer = [NSMutableString string]; + [buffer appendString:@"\0"]; //Initialize length field + while ([context hasMoreCharacters]) { + unichar c = [context currentChar]; + [buffer appendFormat:@"%C", c]; + + context.pos++; + + int newMode = [ZXDataMatrixHighLevelEncoder lookAheadTest:context.message startpos:context.pos currentMode:[self encodingMode]]; + if (newMode != [self encodingMode]) { + [context signalEncoderChange:newMode]; + break; + } + } + int dataCount = (int)buffer.length - 1; + int lengthFieldSize = 1; + int currentSize = [context codewordCount] + dataCount + lengthFieldSize; + [context updateSymbolInfoWithLength:currentSize]; + BOOL mustPad = (context.symbolInfo.dataCapacity - currentSize) > 0; + if ([context hasMoreCharacters] || mustPad) { + if (dataCount <= 249) { + [buffer replaceCharactersInRange:NSMakeRange(0, 1) + withString:[NSString stringWithFormat:@"%C", (unichar) dataCount]]; + } else if (dataCount > 249 && dataCount <= 1555) { + [buffer replaceCharactersInRange:NSMakeRange(0, 1) + withString:[NSString stringWithFormat:@"%C", (unichar) ((dataCount / 250) + 249)]]; + [buffer insertString:[NSString stringWithFormat:@"%C", (unichar) (dataCount % 250)] + atIndex:1]; + } else { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:[NSString stringWithFormat:@"Message length not in valid ranges: %d", dataCount] + userInfo:nil]; + } + } + for (int i = 0, c = (int)buffer.length; i < c; i++) { + [context writeCodeword:[self randomize255State:[buffer characterAtIndex:i] codewordPosition:context.codewordCount + 1]]; + } +} + +- (unichar)randomize255State:(unichar)ch codewordPosition:(int)codewordPosition { + int pseudoRandom = ((149 * codewordPosition) % 255) + 1; + int tempVariable = ch + pseudoRandom; + if (tempVariable <= 255) { + return (unichar) tempVariable; + } else { + return (unichar) (tempVariable - 256); + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.h new file mode 100644 index 0000000..edc98ae --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.h @@ -0,0 +1,25 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoder.h" + +@interface ZXDataMatrixC40Encoder : NSObject + +- (int)encodeChar:(unichar)c buffer:(NSMutableString *)sb; +- (void)writeNextTriplet:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer; +- (void)handleEOD:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.m new file mode 100644 index 0000000..4a72603 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.m @@ -0,0 +1,181 @@ +/* + * Copyright 2013 9 authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixC40Encoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" + +@implementation ZXDataMatrixC40Encoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder c40Encodation]; +} + +- (void)encode:(ZXDataMatrixEncoderContext *)context { + //step C + NSMutableString *buffer = [NSMutableString string]; + while ([context hasMoreCharacters]) { + unichar c = [context currentChar]; + context.pos++; + + int lastCharSize = [self encodeChar:c buffer:buffer]; + + int unwritten = ((int)buffer.length / 3) * 2; + + int curCodewordCount = context.codewordCount + unwritten; + [context updateSymbolInfoWithLength:curCodewordCount]; + int available = context.symbolInfo.dataCapacity - curCodewordCount; + + if (![context hasMoreCharacters]) { + //Avoid having a single C40 value in the last triplet + NSMutableString *removed = [NSMutableString string]; + if ((buffer.length % 3) == 2) { + if (available < 2 || available > 2) { + lastCharSize = [self backtrackOneCharacter:context buffer:buffer removed:removed lastCharSize:lastCharSize]; + } + } + while ((buffer.length % 3) == 1 + && ((lastCharSize <= 3 && available != 1) || lastCharSize > 3)) { + lastCharSize = [self backtrackOneCharacter:context buffer:buffer removed:removed lastCharSize:lastCharSize]; + } + break; + } + + NSUInteger count = buffer.length; + if ((count % 3) == 0) { + int newMode = [ZXDataMatrixHighLevelEncoder lookAheadTest:context.message startpos:context.pos currentMode:[self encodingMode]]; + if (newMode != [self encodingMode]) { + [context signalEncoderChange:newMode]; + break; + } + } + } + [self handleEOD:context buffer:buffer]; +} + +- (int)backtrackOneCharacter:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer + removed:(NSMutableString *)removed lastCharSize:(int)lastCharSize { + NSUInteger count = buffer.length; + [buffer deleteCharactersInRange:NSMakeRange(count - lastCharSize, lastCharSize)]; + context.pos--; + unichar c = context.currentChar; + lastCharSize = [self encodeChar:c buffer:removed]; + [context resetSymbolInfo]; //Deal with possible reduction in symbol size + return lastCharSize; +} + +- (void)writeNextTriplet:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer { + [context writeCodewords:[self encodeToCodewords:buffer startpos:0]]; + [buffer deleteCharactersInRange:NSMakeRange(0, 3)]; +} + +/** + * Handle "end of data" situations + */ +- (void)handleEOD:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer { + int unwritten = ((int)buffer.length / 3) * 2; + int rest = buffer.length % 3; + + int curCodewordCount = context.codewordCount + unwritten; + [context updateSymbolInfoWithLength:curCodewordCount]; + int available = context.symbolInfo.dataCapacity - curCodewordCount; + + if (rest == 2) { + [buffer appendString:@"\0"]; //Shift 1 + while (buffer.length >= 3) { + [self writeNextTriplet:context buffer:buffer]; + } + if ([context hasMoreCharacters]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder c40Unlatch]]; + } + } else if (available == 1 && rest == 1) { + while (buffer.length >= 3) { + [self writeNextTriplet:context buffer:buffer]; + } + if ([context hasMoreCharacters]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder c40Unlatch]]; + } + // else no latch + context.pos--; + } else if (rest == 0) { + while (buffer.length >= 3) { + [self writeNextTriplet:context buffer:buffer]; + } + if (available > 0 || [context hasMoreCharacters]) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder c40Unlatch]]; + } + } else { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:@"Unexpected case. Please report!" + userInfo:nil]; + } + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder asciiEncodation]]; +} + +- (int)encodeChar:(unichar)c buffer:(NSMutableString *)sb { + if (c == ' ') { + [sb appendString:@"\3"]; + return 1; + } else if (c >= '0' && c <= '9') { + [sb appendFormat:@"%C", (unichar) (c - 48 + 4)]; + return 1; + } else if (c >= 'A' && c <= 'Z') { + [sb appendFormat:@"%C", (unichar) (c - 65 + 14)]; + return 1; + } else if (c >= '\0' && c <= (unichar)0x001f) { + [sb appendString:@"\0"]; //Shift 1 Set + [sb appendFormat:@"%C", c]; + return 2; + } else if (c >= '!' && c <= '/') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 33)]; + return 2; + } else if (c >= ':' && c <= '@') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 58 + 15)]; + return 2; + } else if (c >= '[' && c <= '_') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 91 + 22)]; + return 2; + } else if (c >= '\u0060' && c <= (unichar)0x007f) { + [sb appendString:@"\2"]; //Shift 3 Set + [sb appendFormat:@"%C", (unichar) (c - 96)]; + return 2; + } else if (c >= (unichar)0x0080) { + [sb appendFormat:@"\1%C", (unichar)0x001e]; //Shift 2, Upper Shift + int len = 2; + len += [self encodeChar:(unichar) (c - 128) buffer:sb]; + return len; + } else { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:[NSString stringWithFormat:@"Illegal character: %C", c] + userInfo:nil]; + } +} + +- (NSString *)encodeToCodewords:(NSString *)sb startpos:(int)startPos { + unichar c1 = [sb characterAtIndex:startPos]; + unichar c2 = [sb characterAtIndex:startPos + 1]; + unichar c3 = [sb characterAtIndex:startPos + 2]; + int v = (1600 * c1) + (40 * c2) + c3 + 1; + unichar cw1 = (unichar) (v / 256); + unichar cw2 = (unichar) (v % 256); + return [NSString stringWithFormat:@"%C%C", cw1, cw2]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.h new file mode 100644 index 0000000..a7e0fc7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.h @@ -0,0 +1,41 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Symbol Character Placement Program. Adapted from Annex M.1 in ISO/IEC 16022:2000(E). + */ +@interface ZXDataMatrixDefaultPlacement : NSObject + +@property (nonatomic, copy, readonly) NSString *codewords; +@property (nonatomic, assign, readonly) int numrows; +@property (nonatomic, assign, readonly) int numcols; +@property (nonatomic, assign, readonly) int8_t *bits; +@property (nonatomic, assign, readonly) int bitsLen; + +/** + * Main constructor + * + * @param codewords the codewords to place + * @param numcols the number of columns + * @param numrows the number of rows + */ +- (id)initWithCodewords:(NSString *)codewords numcols:(int)numcols numrows:(int)numrows; +- (BOOL)bitAtCol:(int)col row:(int)row; +- (void)setBitAtCol:(int)col row:(int)row bit:(BOOL)bit; +- (BOOL)hasBitAtCol:(int)col row:(int)row; +- (void)place; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.m new file mode 100644 index 0000000..5e1be92 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.m @@ -0,0 +1,181 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixDefaultPlacement.h" + +@implementation ZXDataMatrixDefaultPlacement + +- (id)initWithCodewords:(NSString *)codewords numcols:(int)numcols numrows:(int)numrows { + if (self = [super init]) { + _codewords = [codewords copy]; + _numcols = numcols; + _numrows = numrows; + _bitsLen = numcols * numrows; + _bits = (int8_t *)malloc(_bitsLen * sizeof(int8_t)); + memset(_bits, -1, _bitsLen); //Initialize with "not set" value + } + + return self; +} + +- (void)dealloc { + if (_bits != NULL) { + free(_bits); + _bits = NULL; + } +} + +- (BOOL)bitAtCol:(int)col row:(int)row { + return self.bits[row * self.numcols + col] == 1; +} + +- (void)setBitAtCol:(int)col row:(int)row bit:(BOOL)bit { + self.bits[row * self.numcols + col] = bit ? (int8_t) 1 : (int8_t) 0; +} + +- (BOOL)hasBitAtCol:(int)col row:(int)row { + return self.bits[row * self.numcols + col] >= 0; +} + +- (void)place { + int pos = 0; + int row = 4; + int col = 0; + + do { + /* repeatedly first check for one of the special corner cases, then... */ + if ((row == self.numrows) && (col == 0)) { + [self corner1:pos++]; + } + if ((row == self.numrows - 2) && (col == 0) && ((self.numcols % 4) != 0)) { + [self corner2:pos++]; + } + if ((row == self.numrows - 2) && (col == 0) && (self.numcols % 8 == 4)) { + [self corner3:pos++]; + } + if ((row == self.numrows + 4) && (col == 2) && ((self.numcols % 8) == 0)) { + [self corner4:pos++]; + } + /* sweep upward diagonally, inserting successive characters... */ + do { + if ((row < self.numrows) && (col >= 0) && ![self hasBitAtCol:col row:row]) { + [self utahAtRow:row col:col pos:pos++]; + } + row -= 2; + col += 2; + } while (row >= 0 && (col < self.numcols)); + row++; + col += 3; + + /* and then sweep downward diagonally, inserting successive characters, ... */ + do { + if ((row >= 0) && (col < self.numcols) && ![self hasBitAtCol:col row:row]) { + [self utahAtRow:row col:col pos:pos++]; + } + row += 2; + col -= 2; + } while ((row < self.numrows) && (col >= 0)); + row += 3; + col++; + + /* ...until the entire array is scanned */ + } while ((row < self.numrows) || (col < self.numcols)); + + /* Lastly, if the lower righthand corner is untouched, fill in fixed pattern */ + if (![self hasBitAtCol:self.numcols - 1 row:self.numrows - 1]) { + [self setBitAtCol:self.numcols - 1 row:self.numrows - 1 bit:YES]; + [self setBitAtCol:self.numcols - 2 row:self.numrows - 2 bit:YES]; + } +} + +- (void)moduleAtRow:(int)row col:(int)col pos:(int)pos bit:(int)bit { + if (row < 0) { + row += self.numrows; + col += 4 - ((self.numrows + 4) % 8); + } + if (col < 0) { + col += self.numcols; + row += 4 - ((self.numcols + 4) % 8); + } + // Note the conversion: + int v = [self.codewords characterAtIndex:pos]; + v &= 1 << (8 - bit); + [self setBitAtCol:col row:row bit:v != 0]; +} + +/** + * Places the 8 bits of a utah-shaped symbol character in ECC200. + * + * @param row the row + * @param col the column + * @param pos character position + */ +- (void)utahAtRow:(int)row col:(int)col pos:(int)pos { + [self moduleAtRow:row - 2 col:col - 2 pos:pos bit:1]; + [self moduleAtRow:row - 2 col:col - 1 pos:pos bit:2]; + [self moduleAtRow:row - 1 col:col - 2 pos:pos bit:3]; + [self moduleAtRow:row - 1 col:col - 1 pos:pos bit:4]; + [self moduleAtRow:row - 1 col:col pos:pos bit:5]; + [self moduleAtRow:row col:col - 2 pos:pos bit:6]; + [self moduleAtRow:row col:col - 1 pos:pos bit:7]; + [self moduleAtRow:row col:col pos:pos bit:8]; +} + +- (void)corner1:(int)pos { + [self moduleAtRow:self.numrows - 1 col:0 pos:pos bit:1]; + [self moduleAtRow:self.numrows - 1 col:1 pos:pos bit:2]; + [self moduleAtRow:self.numrows - 1 col:2 pos:pos bit:3]; + [self moduleAtRow:0 col:self.numcols - 2 pos:pos bit:4]; + [self moduleAtRow:0 col:self.numcols - 1 pos:pos bit:5]; + [self moduleAtRow:1 col:self.numcols - 1 pos:pos bit:6]; + [self moduleAtRow:2 col:self.numcols - 1 pos:pos bit:7]; + [self moduleAtRow:3 col:self.numcols - 1 pos:pos bit:8]; +} + +- (void)corner2:(int)pos { + [self moduleAtRow:self.numrows - 3 col:0 pos:pos bit:1]; + [self moduleAtRow:self.numrows - 2 col:0 pos:pos bit:2]; + [self moduleAtRow:self.numrows - 1 col:0 pos:pos bit:3]; + [self moduleAtRow:0 col:self.numcols - 4 pos:pos bit:4]; + [self moduleAtRow:0 col:self.numcols - 3 pos:pos bit:5]; + [self moduleAtRow:0 col:self.numcols - 2 pos:pos bit:6]; + [self moduleAtRow:0 col:self.numcols - 1 pos:pos bit:7]; + [self moduleAtRow:1 col:self.numcols - 1 pos:pos bit:8]; +} + +- (void)corner3:(int)pos { + [self moduleAtRow:self.numrows - 3 col:0 pos:pos bit:1]; + [self moduleAtRow:self.numrows - 2 col:0 pos:pos bit:2]; + [self moduleAtRow:self.numrows - 1 col:0 pos:pos bit:3]; + [self moduleAtRow:0 col:self.numcols - 2 pos:pos bit:4]; + [self moduleAtRow:0 col:self.numcols - 1 pos:pos bit:5]; + [self moduleAtRow:1 col:self.numcols - 1 pos:pos bit:6]; + [self moduleAtRow:2 col:self.numcols - 1 pos:pos bit:7]; + [self moduleAtRow:3 col:self.numcols - 1 pos:pos bit:8]; +} + +- (void)corner4:(int)pos { + [self moduleAtRow:self.numrows - 1 col:0 pos:pos bit:1]; + [self moduleAtRow:self.numrows - 1 col:self.numcols - 1 pos:pos bit:2]; + [self moduleAtRow:0 col:self.numcols - 3 pos:pos bit:3]; + [self moduleAtRow:0 col:self.numcols - 2 pos:pos bit:4]; + [self moduleAtRow:0 col:self.numcols - 1 pos:pos bit:5]; + [self moduleAtRow:1 col:self.numcols - 3 pos:pos bit:6]; + [self moduleAtRow:1 col:self.numcols - 2 pos:pos bit:7]; + [self moduleAtRow:1 col:self.numcols - 1 pos:pos bit:8]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.h new file mode 100644 index 0000000..20eea46 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoder.h" + +@interface ZXDataMatrixEdifactEncoder : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.m new file mode 100644 index 0000000..81c5009 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.m @@ -0,0 +1,142 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEdifactEncoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" + +@implementation ZXDataMatrixEdifactEncoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder edifactEncodation]; +} + +- (void)encode:(ZXDataMatrixEncoderContext *)context { + //step F + NSMutableString *buffer = [NSMutableString string]; + while ([context hasMoreCharacters]) { + unichar c = [context currentChar]; + [self encodeChar:c buffer:buffer]; + context.pos++; + + NSUInteger count = buffer.length; + if (count >= 4) { + [context writeCodewords:[self encodeToCodewords:buffer startpos:0]]; + [buffer deleteCharactersInRange:NSMakeRange(0, 4)]; + + int newMode = [ZXDataMatrixHighLevelEncoder lookAheadTest:context.message startpos:context.pos currentMode:[self encodingMode]]; + if (newMode != [self encodingMode]) { + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder asciiEncodation]]; + break; + } + } + } + [buffer appendFormat:@"%C", (unichar) 31]; //Unlatch + [self handleEOD:context buffer:buffer]; +} + +/** + * Handle "end of data" situations + * + * @param context the encoder context + * @param buffer the buffer with the remaining encoded characters + */ +- (void)handleEOD:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer { + @try { + NSUInteger count = buffer.length; + if (count == 0) { + return; //Already finished + } + if (count == 1) { + //Only an unlatch at the end + [context updateSymbolInfo]; + int available = context.symbolInfo.dataCapacity - context.codewordCount; + int remaining = [context remainingCharacters]; + if (remaining == 0 && available <= 2) { + return; //No unlatch + } + } + + if (count > 4) { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:@"Count must not exceed 4" + userInfo:nil]; + } + int restChars = (int)count - 1; + NSString *encoded = [self encodeToCodewords:buffer startpos:0]; + BOOL endOfSymbolReached = ![context hasMoreCharacters]; + BOOL restInAscii = endOfSymbolReached && restChars <= 2; + + if (restChars <= 2) { + [context updateSymbolInfoWithLength:context.codewordCount + restChars]; + int available = context.symbolInfo.dataCapacity - context.codewordCount; + if (available >= 3) { + restInAscii = NO; + [context updateSymbolInfoWithLength:context.codewordCount + (int)encoded.length]; + //available = context.symbolInfo.dataCapacity - context.codewordCount; + } + } + + if (restInAscii) { + [context resetSymbolInfo]; + context.pos -= restChars; + } else { + [context writeCodewords:encoded]; + } + } @finally { + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder asciiEncodation]]; + } +} + +- (void)encodeChar:(unichar)c buffer:(NSMutableString *)sb { + if (c >= ' ' && c <= '?') { + [sb appendFormat:@"%C", c]; + } else if (c >= '@' && c <= '^') { + [sb appendFormat:@"%C", (unichar) (c - 64)]; + } else { + [ZXDataMatrixHighLevelEncoder illegalCharacter:c]; + } +} + +- (NSString *)encodeToCodewords:(NSMutableString *)sb startpos:(int)startPos { + int len = (int)sb.length - startPos; + if (len == 0) { + @throw [NSException exceptionWithName:@"IllegalStateException" + reason:@"Buffer must not be empty" + userInfo:nil]; + } + unichar c1 = [sb characterAtIndex:startPos]; + unichar c2 = len >= 2 ? [sb characterAtIndex:startPos + 1] : 0; + unichar c3 = len >= 3 ? [sb characterAtIndex:startPos + 2] : 0; + unichar c4 = len >= 4 ? [sb characterAtIndex:startPos + 3] : 0; + + int v = (c1 << 18) + (c2 << 12) + (c3 << 6) + c4; + unichar cw1 = (unichar) ((v >> 16) & 255); + unichar cw2 = (unichar) ((v >> 8) & 255); + unichar cw3 = (unichar) (v & 255); + NSMutableString *res = [NSMutableString stringWithCapacity:3]; + [res appendFormat:@"%C", cw1]; + if (len >= 2) { + [res appendFormat:@"%C", cw2]; + } + if (len >= 3) { + [res appendFormat:@"%C", cw3]; + } + return [NSString stringWithString:res]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoder.h new file mode 100644 index 0000000..4d3c63d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoder.h @@ -0,0 +1,24 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXDataMatrixEncoderContext; + +@protocol ZXDataMatrixEncoder + +- (int)encodingMode; +- (void)encode:(ZXDataMatrixEncoderContext *)context; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.h new file mode 100644 index 0000000..719a97d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.h @@ -0,0 +1,48 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +@class ZXDataMatrixSymbolInfo, ZXDimension; + +@interface ZXDataMatrixEncoderContext : NSObject + +@property (nonatomic, copy, readonly) NSMutableString *codewords; +@property (nonatomic, copy, readonly) NSString *message; +@property (nonatomic, assign) int newEncoding; +@property (nonatomic, assign) int pos; +@property (nonatomic, assign) int skipAtEnd; +@property (nonatomic, assign) ZXDataMatrixSymbolShapeHint symbolShape; +@property (nonatomic, strong) ZXDataMatrixSymbolInfo *symbolInfo; + +- (id)initWithMessage:(NSString *)msg; +- (void)setSizeConstraints:(ZXDimension *)minSize maxSize:(ZXDimension *)maxSize; +- (void)setSkipAtEnd:(int)count; +- (unichar)currentChar; +- (unichar)current; +- (void)writeCodewords:(NSString *)codewords; +- (void)writeCodeword:(unichar)codeword; +- (int)codewordCount; +- (void)signalEncoderChange:(int)encoding; +- (void)resetEncoderSignal; +- (BOOL)hasMoreCharacters; +- (int)totalMessageCharCount; +- (int)remainingCharacters; +- (void)updateSymbolInfo; +- (void)updateSymbolInfoWithLength:(int)len; +- (void)resetSymbolInfo; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.m new file mode 100644 index 0000000..5e699af --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.m @@ -0,0 +1,111 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixSymbolInfo.h" + +@interface ZXDataMatrixEncoderContext () + +@property (nonatomic, strong) ZXDimension *maxSize; +@property (nonatomic, strong) ZXDimension *minSize; + +@end + +@implementation ZXDataMatrixEncoderContext + +- (id)initWithMessage:(NSString *)msg { + if (self = [super init]) { + //From this point on Strings are not Unicode anymore! + NSData *msgData = [msg dataUsingEncoding:NSISOLatin1StringEncoding]; + if (!msgData) { + [NSException raise:NSInvalidArgumentException format:@"Message contains characters outside ISO-8859-1 encoding."]; + } + const char *msgBinary = [msgData bytes]; + NSMutableString *sb = [NSMutableString string]; + for (int i = 0, c = (int)msg.length; i < c; i++) { + unichar ch = (unichar) (msgBinary[i] & 0xff); + [sb appendFormat:@"%C", ch]; + } + + _message = [[NSString alloc] initWithString:sb]; + _symbolShape = ZXDataMatrixSymbolShapeHintForceNone; + _codewords = [[NSMutableString alloc] initWithCapacity:msg.length]; + _newEncoding = -1; + } + + return self; +} + +- (void)setSizeConstraints:(ZXDimension *)minSize maxSize:(ZXDimension *)maxSize { + self.minSize = minSize; + self.maxSize = maxSize; +} + +- (unichar)currentChar { + return [self.message characterAtIndex:self.pos]; +} + +- (unichar)current { + return [self.message characterAtIndex:self.pos]; +} + +- (void)writeCodewords:(NSString *)codewords { + [self.codewords appendString:codewords]; +} + +- (void)writeCodeword:(unichar)codeword { + [self.codewords appendFormat:@"%C", codeword]; +} + +- (int)codewordCount { + return (int)self.codewords.length; +} + +- (void)signalEncoderChange:(int)encoding { + self.newEncoding = encoding; +} + +- (void)resetEncoderSignal { + self.newEncoding = -1; +} + +- (BOOL)hasMoreCharacters { + return self.pos < [self totalMessageCharCount]; +} + +- (int)totalMessageCharCount { + return (int)self.message.length - self.skipAtEnd; +} + +- (int)remainingCharacters { + return [self totalMessageCharCount] - self.pos; +} + +- (void)updateSymbolInfo { + [self updateSymbolInfoWithLength:[self codewordCount]]; +} + +- (void)updateSymbolInfoWithLength:(int)len { + if (self.symbolInfo == nil || len > self.symbolInfo.dataCapacity) { + self.symbolInfo = [ZXDataMatrixSymbolInfo lookup:len shape:self.symbolShape minSize:self.minSize maxSize:self.maxSize fail:YES]; + } +} + +- (void)resetSymbolInfo { + self.symbolInfo = nil; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.h new file mode 100644 index 0000000..d93d3fd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.h @@ -0,0 +1,33 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXDataMatrixSymbolInfo; + +/** + * Error Correction Code for ECC200. + */ +@interface ZXDataMatrixErrorCorrection : NSObject + +/** + * Creates the ECC200 error correction for an encoded message. + * + * @param codewords the codewords + * @param symbolInfo information about the symbol to be encoded + * @return the codewords with interleaved error correction. + */ ++ (NSString *)encodeECC200:(NSString *)codewords symbolInfo:(ZXDataMatrixSymbolInfo *)symbolInfo; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.m new file mode 100644 index 0000000..6c9f658 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.m @@ -0,0 +1,171 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixErrorCorrection.h" +#import "ZXDataMatrixSymbolInfo.h" + +/** + * Lookup table which factors to use for which number of error correction codewords. + * See FACTORS. + */ +const int ZX_FACTOR_SETS[] = {5, 7, 10, 11, 12, 14, 18, 20, 24, 28, 36, 42, 48, 56, 62, 68}; + +/** + * Precomputed polynomial factors for ECC 200. + */ +const int ZX_FACTORS[16][68] = { + {228, 48, 15, 111, 62}, + {23, 68, 144, 134, 240, 92, 254}, + {28, 24, 185, 166, 223, 248, 116, 255, 110, 61}, + {175, 138, 205, 12, 194, 168, 39, 245, 60, 97, 120}, + {41, 153, 158, 91, 61, 42, 142, 213, 97, 178, 100, 242}, + {156, 97, 192, 252, 95, 9, 157, 119, 138, 45, 18, 186, 83, 185}, + {83, 195, 100, 39, 188, 75, 66, 61, 241, 213, 109, 129, 94, 254, 225, 48, 90, 188}, + {15, 195, 244, 9, 233, 71, 168, 2, 188, 160, 153, 145, 253, 79, 108, 82, 27, 174, 186, 172}, + {52, 190, 88, 205, 109, 39, 176, 21, 155, 197, 251, 223, 155, 21, 5, 172, + 254, 124, 12, 181, 184, 96, 50, 193}, + {211, 231, 43, 97, 71, 96, 103, 174, 37, 151, 170, 53, 75, 34, 249, 121, + 17, 138, 110, 213, 141, 136, 120, 151, 233, 168, 93, 255}, + {245, 127, 242, 218, 130, 250, 162, 181, 102, 120, 84, 179, 220, 251, 80, 182, + 229, 18, 2, 4, 68, 33, 101, 137, 95, 119, 115, 44, 175, 184, 59, 25, + 225, 98, 81, 112}, + {77, 193, 137, 31, 19, 38, 22, 153, 247, 105, 122, 2, 245, 133, 242, 8, + 175, 95, 100, 9, 167, 105, 214, 111, 57, 121, 21, 1, 253, 57, 54, 101, + 248, 202, 69, 50, 150, 177, 226, 5, 9, 5}, + {245, 132, 172, 223, 96, 32, 117, 22, 238, 133, 238, 231, 205, 188, 237, 87, + 191, 106, 16, 147, 118, 23, 37, 90, 170, 205, 131, 88, 120, 100, 66, 138, + 186, 240, 82, 44, 176, 87, 187, 147, 160, 175, 69, 213, 92, 253, 225, 19}, + {175, 9, 223, 238, 12, 17, 220, 208, 100, 29, 175, 170, 230, 192, 215, 235, + 150, 159, 36, 223, 38, 200, 132, 54, 228, 146, 218, 234, 117, 203, 29, 232, + 144, 238, 22, 150, 201, 117, 62, 207, 164, 13, 137, 245, 127, 67, 247, 28, + 155, 43, 203, 107, 233, 53, 143, 46}, + {242, 93, 169, 50, 144, 210, 39, 118, 202, 188, 201, 189, 143, 108, 196, 37, + 185, 112, 134, 230, 245, 63, 197, 190, 250, 106, 185, 221, 175, 64, 114, 71, + 161, 44, 147, 6, 27, 218, 51, 63, 87, 10, 40, 130, 188, 17, 163, 31, + 176, 170, 4, 107, 232, 7, 94, 166, 224, 124, 86, 47, 11, 204}, + {220, 228, 173, 89, 251, 149, 159, 56, 89, 33, 147, 244, 154, 36, 73, 127, + 213, 136, 248, 180, 234, 197, 158, 177, 68, 122, 93, 213, 15, 160, 227, 236, + 66, 139, 153, 185, 202, 167, 179, 25, 220, 232, 96, 210, 231, 136, 223, 239, + 181, 241, 59, 52, 172, 25, 49, 232, 211, 189, 64, 54, 108, 153, 132, 63, + 96, 103, 82, 186}}; + +const int ZX_MODULO_VALUE = 0x12D; + +static int ZX_LOG[256], ZX_ALOG[256]; + +@implementation ZXDataMatrixErrorCorrection + ++ (void)initialize { + if ([self class] != [ZXDataMatrixErrorCorrection class]) return; + + //Create log and antilog table + int p = 1; + for (int i = 0; i < 255; i++) { + ZX_ALOG[i] = p; + ZX_LOG[p] = i; + p *= 2; + if (p >= 256) { + p ^= ZX_MODULO_VALUE; + } + } +} + ++ (NSString *)encodeECC200:(NSString *)codewords symbolInfo:(ZXDataMatrixSymbolInfo *)symbolInfo { + if (codewords.length != symbolInfo.dataCapacity) { + [NSException raise:NSInvalidArgumentException format:@"The number of codewords does not match the selected symbol"]; + } + NSUInteger capacity = symbolInfo.dataCapacity + symbolInfo.errorCodewords; + NSMutableString *sb = [NSMutableString stringWithCapacity:capacity]; + [sb appendString:codewords]; + int blockCount = symbolInfo.interleavedBlockCount; + if (blockCount == 1) { + NSString *ecc = [self createECCBlock:codewords numECWords:symbolInfo.errorCodewords]; + [sb appendString:ecc]; + } else { + if (sb.length > capacity) { + [sb deleteCharactersInRange:NSMakeRange(capacity, sb.length - capacity)]; + } + while (sb.length < capacity) { + [sb appendFormat:@"%C", (unichar)0]; + } + int dataSizes[blockCount]; + int errorSizes[blockCount]; + int startPos[blockCount]; + for (int i = 0; i < blockCount; i++) { + dataSizes[i] = [symbolInfo dataLengthForInterleavedBlock:i + 1]; + errorSizes[i] = [symbolInfo errorLengthForInterleavedBlock:i + 1]; + startPos[i] = 0; + if (i > 0) { + startPos[i] = startPos[i - 1] + dataSizes[i]; + } + } + for (int block = 0; block < blockCount; block++) { + NSMutableString *temp = [NSMutableString stringWithCapacity:dataSizes[block]]; + for (int d = block; d < symbolInfo.dataCapacity; d += blockCount) { + [temp appendFormat:@"%c", [codewords characterAtIndex:d]]; + } + NSString *ecc = [self createECCBlock:temp numECWords:errorSizes[block]]; + int pos = 0; + for (int e = block; e < errorSizes[block] * blockCount; e += blockCount) { + [sb replaceCharactersInRange:NSMakeRange(symbolInfo.dataCapacity + e, 1) + withString:[ecc substringWithRange:NSMakeRange(pos++, 1)]]; + } + } + } + return [NSString stringWithString:sb]; +} + ++ (NSString *)createECCBlock:(NSString *)codewords numECWords:(int)numECWords { + return [self createECCBlock:codewords start:0 len:(int)codewords.length numECWords:numECWords]; +} + ++ (NSString *)createECCBlock:(NSString *)codewords start:(int)start len:(int)len numECWords:(int)numECWords { + int table = -1; + for (int i = 0; i < sizeof(ZX_FACTOR_SETS) / sizeof(int); i++) { + if (ZX_FACTOR_SETS[i] == numECWords) { + table = i; + break; + } + } + if (table < 0) { + [NSException raise:NSInvalidArgumentException format:@"Illegal number of error correction codewords specified: %d", numECWords]; + } + int *poly = (int *)ZX_FACTORS[table]; + unichar ecc[numECWords]; + memset(ecc, 0, numECWords * sizeof(unichar)); + for (int i = start; i < start + len; i++) { + int m = ecc[numECWords - 1] ^ [codewords characterAtIndex:i]; + for (int k = numECWords - 1; k > 0; k--) { + if (m != 0 && poly[k] != 0) { + ecc[k] = (unichar) (ecc[k - 1] ^ ZX_ALOG[(ZX_LOG[m] + ZX_LOG[poly[k]]) % 255]); + } else { + ecc[k] = ecc[k - 1]; + } + } + if (m != 0 && poly[0] != 0) { + ecc[0] = (unichar) ZX_ALOG[(ZX_LOG[m] + ZX_LOG[poly[0]]) % 255]; + } else { + ecc[0] = 0; + } + } + unichar eccReversed[numECWords]; + for (int i = 0; i < numECWords; i++) { + eccReversed[i] = ecc[numECWords - i - 1]; + } + return [NSString stringWithCharacters:eccReversed length:numECWords]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.h new file mode 100644 index 0000000..1273030 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.h @@ -0,0 +1,135 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +@class ZXDimension; + +/** + * DataMatrix ECC 200 data encoder following the algorithm described in ISO/IEC 16022:200(E) in + * annex S. + */ +@interface ZXDataMatrixHighLevelEncoder : NSObject + +/** + * mode latch to C40 encodation mode + */ ++ (unichar)latchToC40; + +/** + * mode latch to Base 256 encodation mode + */ ++ (unichar)latchToBase256; + +/** + * Upper Shift + */ ++ (unichar)upperShift; + +/** + * 05 Macro + */ ++ (unichar)macro05; + +/** + * 06 Macro + */ ++ (unichar)macro06; + +/** + * mode latch to ANSI X.12 encodation mode + */ ++ (unichar)latchToAnsiX12; + +/** + * mode latch to Text encodation mode + */ + ++ (unichar)latchToText; + +/** + * mode latch to EDIFACT encodation mode + */ ++ (unichar)latchToEdifact; + +/** + * Unlatch from C40 encodation + */ ++ (unichar)c40Unlatch; + +/** + * Unlatch from X12 encodation + */ ++ (unichar)x12Unlatch; + ++ (int)asciiEncodation; ++ (int)c40Encodation; ++ (int)textEncodation; ++ (int)x12Encodation; ++ (int)edifactEncodation; ++ (int)base256Encodation; + +/* + * Converts the message to a byte array using the default encoding (cp437) as defined by the + * specification + * + * @param msg the message + * @return the byte array of the message + */ + +/* ++ (int8_t *)bytesForMessage:(NSString *)msg; +*/ + +/** + * Performs message encoding of a DataMatrix message using the algorithm described in annex P + * of ISO/IEC 16022:2000(E). + * + * @param msg the message + * @return the encoded message (the char values range from 0 to 255) + */ ++ (NSString *)encodeHighLevel:(NSString *)msg; + +/** + * Performs message encoding of a DataMatrix message using the algorithm described in annex P + * of ISO/IEC 16022:2000(E). + * + * @param msg the message + * @param shape requested shape. May be {@code SymbolShapeHint.FORCE_NONE}, + * {@code SymbolShapeHint.FORCE_SQUARE} or {@code SymbolShapeHint.FORCE_RECTANGLE}. + * @param minSize the minimum symbol size constraint or null for no constraint + * @param maxSize the maximum symbol size constraint or null for no constraint + * @return the encoded message (the char values range from 0 to 255) + */ ++ (NSString *)encodeHighLevel:(NSString *)msg shape:(ZXDataMatrixSymbolShapeHint)shape + minSize:(ZXDimension *)minSize maxSize:(ZXDimension *)maxSize; + ++ (int)lookAheadTest:(NSString *)msg startpos:(int)startpos currentMode:(int)currentMode; + +/** + * Determines the number of consecutive characters that are encodable using numeric compaction. + * + * @param msg the message + * @param startpos the start position within the message + * @return the requested character count + */ ++ (int)determineConsecutiveDigitCount:(NSString *)msg startpos:(int)startpos; + ++ (BOOL)isDigit:(unichar)ch; ++ (BOOL)isExtendedASCII:(unichar)ch; ++ (void)illegalCharacter:(unichar)c; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.m new file mode 100644 index 0000000..b323d23 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.m @@ -0,0 +1,431 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixASCIIEncoder.h" +#import "ZXDataMatrixBase256Encoder.h" +#import "ZXDataMatrixC40Encoder.h" +#import "ZXDataMatrixEdifactEncoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixTextEncoder.h" +#import "ZXDataMatrixX12Encoder.h" + +/** + * Padding character + */ +const unichar PAD_CHAR = 129; + +/** + * 05 Macro header + */ +static NSString *MACRO_05_HEADER = nil; + +/** + * 06 Macro header + */ +static NSString *MACRO_06_HEADER = nil; + +/** + * Macro trailer + */ +static NSString *MACRO_TRAILER = nil; + +@implementation ZXDataMatrixHighLevelEncoder + ++ (void)initialize { + if ([self class] != [ZXDataMatrixHighLevelEncoder class]) return; + + MACRO_05_HEADER = [[NSString alloc] initWithFormat:@"[)>%C05%C", (unichar)0x001E, (unichar)0x001D]; + MACRO_06_HEADER = [[NSString alloc] initWithFormat:@"[)>%C06%C", (unichar)0x001E, (unichar)0x001D]; + MACRO_TRAILER = [[NSString alloc] initWithFormat:@"%C%C", (unichar)0x001E, (unichar)0x0004]; +} + ++ (unichar)latchToC40 { + return 230; +} + ++ (unichar)latchToBase256 { + return 231; +} + ++ (unichar)upperShift { + return 235; +} + ++ (unichar)macro05 { + return 236; +} + ++ (unichar)macro06 { + return 237; +} + ++ (unichar)latchToAnsiX12 { + return 238; +} + ++ (unichar)latchToText { + return 239; +} + ++ (unichar)latchToEdifact { + return 240; +} + ++ (unichar)c40Unlatch { + return 254; +} + ++ (unichar)x12Unlatch { + return 254; +} + ++ (int)asciiEncodation { + return 0; +} + ++ (int)c40Encodation { + return 1; +} + ++ (int)textEncodation { + return 2; +} + ++ (int)x12Encodation { + return 3; +} + ++ (int)edifactEncodation { + return 4; +} + ++ (int)base256Encodation { + return 5; +} + +/* ++ (int8_t *)bytesForMessage:(NSString *)msg { + return (int8_t *)[[msg dataUsingEncoding:(NSStringEncoding) 0x80000400] bytes]; //See 4.4.3 and annex B of ISO/IEC 15438:2001(E) +} +*/ + ++ (unichar)randomize253State:(unichar)ch codewordPosition:(int)codewordPosition { + int pseudoRandom = ((149 * codewordPosition) % 253) + 1; + int tempVariable = ch + pseudoRandom; + return tempVariable <= 254 ? (unichar) tempVariable : (unichar) (tempVariable - 254); +} + ++ (NSString *)encodeHighLevel:(NSString *)msg { + return [self encodeHighLevel:msg shape:ZXDataMatrixSymbolShapeHintForceNone minSize:nil maxSize:nil]; +} + ++ (NSString *)encodeHighLevel:(NSString *)msg shape:(ZXDataMatrixSymbolShapeHint)shape + minSize:(ZXDimension *)minSize maxSize:(ZXDimension *)maxSize { + //the codewords 0..255 are encoded as Unicode characters + NSArray *encoders = @[[[ZXDataMatrixASCIIEncoder alloc] init], + [[ZXDataMatrixC40Encoder alloc] init], + [[ZXDataMatrixTextEncoder alloc] init], + [[ZXDataMatrixX12Encoder alloc] init], + [[ZXDataMatrixEdifactEncoder alloc] init], + [[ZXDataMatrixBase256Encoder alloc] init]]; + + ZXDataMatrixEncoderContext *context = [[ZXDataMatrixEncoderContext alloc] initWithMessage:msg]; + context.symbolShape = shape; + [context setSizeConstraints:minSize maxSize:maxSize]; + + if ([msg hasPrefix:MACRO_05_HEADER] && [msg hasSuffix:MACRO_TRAILER]) { + [context writeCodeword:[self macro05]]; + [context setSkipAtEnd:2]; + context.pos += (int)MACRO_05_HEADER.length; + } else if ([msg hasPrefix:MACRO_06_HEADER] && [msg hasSuffix:MACRO_TRAILER]) { + [context writeCodeword:[self macro06]]; + [context setSkipAtEnd:2]; + context.pos += (int)MACRO_06_HEADER.length; + } + + int encodingMode = [self asciiEncodation]; //Default mode + while ([context hasMoreCharacters]) { + [encoders[encodingMode] encode:context]; + if (context.newEncoding >= 0) { + encodingMode = context.newEncoding; + [context resetEncoderSignal]; + } + } + NSUInteger len = context.codewords.length; + [context updateSymbolInfo]; + int capacity = context.symbolInfo.dataCapacity; + if (len < capacity) { + if (encodingMode != [self asciiEncodation] && encodingMode != [self base256Encodation]) { + [context writeCodeword:(unichar)0x00fe]; //Unlatch (254) + } + } + //Padding + NSMutableString *codewords = context.codewords; + if (codewords.length < capacity) { + [codewords appendFormat:@"%C", PAD_CHAR]; + } + while (codewords.length < capacity) { + [codewords appendFormat:@"%C", [self randomize253State:PAD_CHAR codewordPosition:(int)codewords.length + 1]]; + } + + return [NSString stringWithString:context.codewords]; +} + ++ (int)lookAheadTest:(NSString *)msg startpos:(int)startpos currentMode:(int)currentMode { + if (startpos >= msg.length) { + return currentMode; + } + float charCounts[6]; + //step J + if (currentMode == [self asciiEncodation]) { + charCounts[0] = 0; + charCounts[1] = 1; + charCounts[2] = 1; + charCounts[3] = 1; + charCounts[4] = 1; + charCounts[5] = 1.25f; + } else { + charCounts[0] = 1; + charCounts[1] = 2; + charCounts[2] = 2; + charCounts[3] = 2; + charCounts[4] = 2; + charCounts[5] = 2.25f; + charCounts[currentMode] = 0; + } + + int charsProcessed = 0; + while (YES) { + //step K + if ((startpos + charsProcessed) == msg.length) { + int min = INT_MAX; + int8_t mins[6]; + int intCharCounts[6]; + min = [self findMinimums:charCounts intCharCounts:intCharCounts min:min mins:mins]; + int minCount = [self minimumCount:mins]; + + if (intCharCounts[[self asciiEncodation]] == min) { + return [self asciiEncodation]; + } + if (minCount == 1 && mins[[self base256Encodation]] > 0) { + return [self base256Encodation]; + } + if (minCount == 1 && mins[[self edifactEncodation]] > 0) { + return [self edifactEncodation]; + } + if (minCount == 1 && mins[[self textEncodation]] > 0) { + return [self textEncodation]; + } + if (minCount == 1 && mins[[self x12Encodation]] > 0) { + return [self x12Encodation]; + } + return [self c40Encodation]; + } + + unichar c = [msg characterAtIndex:startpos + charsProcessed]; + charsProcessed++; + + //step L + if ([self isDigit:c]) { + charCounts[[self asciiEncodation]] += 0.5; + } else if ([self isExtendedASCII:c]) { + charCounts[[self asciiEncodation]] = (int) ceil(charCounts[[self asciiEncodation]]); + charCounts[[self asciiEncodation]] += 2; + } else { + charCounts[[self asciiEncodation]] = (int) ceil(charCounts[[self asciiEncodation]]); + charCounts[[self asciiEncodation]]++; + } + + //step M + if ([self isNativeC40:c]) { + charCounts[[self c40Encodation]] += 2.0f / 3.0f; + } else if ([self isExtendedASCII:c]) { + charCounts[[self c40Encodation]] += 8.0f / 3.0f; + } else { + charCounts[[self c40Encodation]] += 4.0f / 3.0f; + } + + //step N + if ([self isNativeText:c]) { + charCounts[[self textEncodation]] += 2.0f / 3.0f; + } else if ([self isExtendedASCII:c]) { + charCounts[[self textEncodation]] += 8.0f / 3.0f; + } else { + charCounts[[self textEncodation]] += 4.0f / 3.0f; + } + + //step O + if ([self isNativeX12:c]) { + charCounts[[self x12Encodation]] += 2.0f / 3.0f; + } else if ([self isExtendedASCII:c]) { + charCounts[[self x12Encodation]] += 13.0f / 3.0f; + } else { + charCounts[[self x12Encodation]] += 10.0f / 3.0f; + } + + //step P + if ([self isNativeEDIFACT:c]) { + charCounts[[self edifactEncodation]] += 3.0f / 4.0f; + } else if ([self isExtendedASCII:c]) { + charCounts[[self edifactEncodation]] += 17.0f / 4.0f; + } else { + charCounts[[self edifactEncodation]] += 13.0f / 4.0f; + } + + // step Q + if ([self isSpecialB256:c]) { + charCounts[[self base256Encodation]] += 4; + } else { + charCounts[[self base256Encodation]]++; + } + + //step R + if (charsProcessed >= 4) { + int intCharCounts[6]; + int8_t mins[6]; + [self findMinimums:charCounts intCharCounts:intCharCounts min:INT_MAX mins:mins]; + int minCount = [self minimumCount:mins]; + + if (intCharCounts[[self asciiEncodation]] < intCharCounts[[self base256Encodation]] + && intCharCounts[[self asciiEncodation]] < intCharCounts[[self c40Encodation]] + && intCharCounts[[self asciiEncodation]] < intCharCounts[[self textEncodation]] + && intCharCounts[[self asciiEncodation]] < intCharCounts[[self x12Encodation]] + && intCharCounts[[self asciiEncodation]] < intCharCounts[[self edifactEncodation]]) { + return [self asciiEncodation]; + } + if (intCharCounts[[self base256Encodation]] < intCharCounts[[self asciiEncodation]] + || (mins[[self c40Encodation]] + mins[[self textEncodation]] + mins[[self x12Encodation]] + mins[[self edifactEncodation]]) == 0) { + return [self base256Encodation]; + } + if (minCount == 1 && mins[[self edifactEncodation]] > 0) { + return [self edifactEncodation]; + } + if (minCount == 1 && mins[[self textEncodation]] > 0) { + return [self textEncodation]; + } + if (minCount == 1 && mins[[self x12Encodation]] > 0) { + return [self x12Encodation]; + } + if (intCharCounts[[self c40Encodation]] + 1 < intCharCounts[[self asciiEncodation]] + && intCharCounts[[self c40Encodation]] + 1 < intCharCounts[[self base256Encodation]] + && intCharCounts[[self c40Encodation]] + 1 < intCharCounts[[self edifactEncodation]] + && intCharCounts[[self c40Encodation]] + 1 < intCharCounts[[self textEncodation]]) { + if (intCharCounts[[self c40Encodation]] < intCharCounts[[self x12Encodation]]) { + return [self c40Encodation]; + } + if (intCharCounts[[self c40Encodation]] == intCharCounts[[self x12Encodation]]) { + int p = startpos + charsProcessed + 1; + while (p < msg.length) { + char tc = [msg characterAtIndex:p]; + if ([self isX12TermSep:tc]) { + return [self x12Encodation]; + } + if (![self isNativeX12:tc]) { + break; + } + p++; + } + return [self c40Encodation]; + } + } + } + } +} + ++ (int)findMinimums:(float *)charCounts intCharCounts:(int *)intCharCounts min:(int)min mins:(int8_t *)mins { + memset(mins, 0, 6); + for (int i = 0; i < 6; i++) { + intCharCounts[i] = (int) ceil(charCounts[i]); + int current = intCharCounts[i]; + if (min > current) { + min = current; + memset(mins, 0, 6); + } + if (min == current) { + mins[i]++; + } + } + return min; +} + ++ (int)minimumCount:(int8_t *)mins { + int minCount = 0; + for (int i = 0; i < 6; i++) { + minCount += mins[i]; + } + return minCount; +} + ++ (BOOL)isDigit:(unichar)ch { + return ch >= '0' && ch <= '9'; +} + ++ (BOOL)isExtendedASCII:(unichar)ch { + return ch >= 128 && ch <= 255; +} + ++ (BOOL)isNativeC40:(unichar)ch { + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} + ++ (BOOL)isNativeText:(unichar)ch { + return (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'); +} + ++ (BOOL)isNativeX12:(unichar)ch { + return [self isX12TermSep:ch] || (ch == ' ') || (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z'); +} + ++ (BOOL)isX12TermSep:(unichar)ch { + return (ch == '\r') //CR + || (ch == '*') + || (ch == '>'); +} + ++ (BOOL)isNativeEDIFACT:(unichar)ch { + return ch >= ' ' && ch <= '^'; +} + ++ (BOOL)isSpecialB256:(unichar)ch { + return NO; //TODO NOT IMPLEMENTED YET!!! +} + ++ (int)determineConsecutiveDigitCount:(NSString *)msg startpos:(int)startpos { + int count = 0; + NSUInteger len = msg.length; + int idx = startpos; + if (idx < len) { + unichar ch = [msg characterAtIndex:idx]; + while ([self isDigit:ch] && idx < len) { + count++; + idx++; + if (idx < len) { + ch = [msg characterAtIndex:idx]; + } + } + } + return count; +} + ++ (void)illegalCharacter:(unichar)c { + NSString *hex = [NSString stringWithFormat:@"%x", c]; + hex = [[@"0000" substringWithRange:NSMakeRange(0, hex.length)] stringByAppendingString:hex]; + [NSException raise:NSInvalidArgumentException format:@"Illegal character: %C (0x%@)", c, hex]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.h new file mode 100644 index 0000000..aa85076 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.h @@ -0,0 +1,63 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +@class ZXDimension; + +/** + * Symbol info table for DataMatrix. + */ +@interface ZXDataMatrixSymbolInfo : NSObject + +@property (nonatomic, assign, readonly) BOOL rectangular; +@property (nonatomic, assign, readonly) int errorCodewords; +@property (nonatomic, assign, readonly) int dataCapacity; +@property (nonatomic, assign, readonly) int dataRegions; +@property (nonatomic, assign, readonly) int matrixWidth; +@property (nonatomic, assign, readonly) int matrixHeight; +@property (nonatomic, assign, readonly) int rsBlockData; +@property (nonatomic, assign, readonly) int rsBlockError; + +/** + * Overrides the symbol info set used by this class. Used for testing purposes. + * + * @param override the symbol info set to use + */ ++ (void)overrideSymbolSet:(NSArray *)override; ++ (NSArray *)prodSymbols; +- (id)initWithRectangular:(BOOL)rectangular dataCapacity:(int)dataCapacity errorCodewords:(int)errorCodewords + matrixWidth:(int)matrixWidth matrixHeight:(int)matrixHeight dataRegions:(int)dataRegions; +- (id)initWithRectangular:(BOOL)rectangular dataCapacity:(int)dataCapacity errorCodewords:(int)errorCodewords + matrixWidth:(int)matrixWidth matrixHeight:(int)matrixHeight dataRegions:(int)dataRegions + rsBlockData:(int)rsBlockData rsBlockError:(int)rsBlockError; ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords; ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape; ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords allowRectangular:(BOOL)allowRectangular fail:(BOOL)fail; ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape fail:(BOOL)fail; ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape minSize:(ZXDimension *)minSize maxSize:(ZXDimension *)maxSize fail:(BOOL)fail; +- (int)horizontalDataRegions; +- (int)verticalDataRegions; +- (int)symbolDataWidth; +- (int)symbolDataHeight; +- (int)symbolWidth; +- (int)symbolHeight; +- (int)codewordCount; +- (int)interleavedBlockCount; +- (int)dataLengthForInterleavedBlock:(int)index; +- (int)errorLengthForInterleavedBlock:(int)index; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.m new file mode 100644 index 0000000..45d3c50 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.m @@ -0,0 +1,220 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixSymbolInfo144.h" +#import "ZXDimension.h" + +static NSArray *PROD_SYMBOLS = nil; +static NSArray *symbols = nil; + +@implementation ZXDataMatrixSymbolInfo + ++ (void)initialize { + if ([self class] != [ZXDataMatrixSymbolInfo class]) return; + + PROD_SYMBOLS = @[[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:3 errorCodewords:5 matrixWidth:8 matrixHeight:8 dataRegions:1], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:5 errorCodewords:7 matrixWidth:10 matrixHeight:10 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:5 errorCodewords:7 matrixWidth:16 matrixHeight:6 dataRegions:1], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:8 errorCodewords:10 matrixWidth:12 matrixHeight:12 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:10 errorCodewords:11 matrixWidth:14 matrixHeight:6 dataRegions:2], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:12 errorCodewords:12 matrixWidth:14 matrixHeight:14 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:16 errorCodewords:14 matrixWidth:24 matrixHeight:10 dataRegions:1], + + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:18 errorCodewords:14 matrixWidth:16 matrixHeight:16 dataRegions:1], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:22 errorCodewords:18 matrixWidth:18 matrixHeight:18 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:22 errorCodewords:18 matrixWidth:16 matrixHeight:10 dataRegions:2], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:30 errorCodewords:20 matrixWidth:20 matrixHeight:20 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:32 errorCodewords:24 matrixWidth:16 matrixHeight:14 dataRegions:2], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:36 errorCodewords:24 matrixWidth:22 matrixHeight:22 dataRegions:1], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:44 errorCodewords:28 matrixWidth:24 matrixHeight:24 dataRegions:1], + /*rect*/[[ZXDataMatrixSymbolInfo alloc] initWithRectangular:YES dataCapacity:49 errorCodewords:28 matrixWidth:22 matrixHeight:14 dataRegions:2], + + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:62 errorCodewords:36 matrixWidth:14 matrixHeight:14 dataRegions:4], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:86 errorCodewords:42 matrixWidth:16 matrixHeight:16 dataRegions:4], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:114 errorCodewords:48 matrixWidth:18 matrixHeight:18 dataRegions:4], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:144 errorCodewords:56 matrixWidth:20 matrixHeight:20 dataRegions:4], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:174 errorCodewords:68 matrixWidth:22 matrixHeight:22 dataRegions:4], + + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:204 errorCodewords:84 matrixWidth:24 matrixHeight:24 dataRegions:4 rsBlockData:102 rsBlockError:42], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:280 errorCodewords:112 matrixWidth:14 matrixHeight:14 dataRegions:16 rsBlockData:140 rsBlockError:56], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:368 errorCodewords:144 matrixWidth:16 matrixHeight:16 dataRegions:16 rsBlockData:92 rsBlockError:36], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:456 errorCodewords:192 matrixWidth:18 matrixHeight:18 dataRegions:16 rsBlockData:114 rsBlockError:48], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:576 errorCodewords:224 matrixWidth:20 matrixHeight:20 dataRegions:16 rsBlockData:144 rsBlockError:56], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:696 errorCodewords:272 matrixWidth:22 matrixHeight:22 dataRegions:16 rsBlockData:174 rsBlockError:68], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:816 errorCodewords:336 matrixWidth:24 matrixHeight:24 dataRegions:16 rsBlockData:136 rsBlockError:56], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:1050 errorCodewords:408 matrixWidth:18 matrixHeight:18 dataRegions:36 rsBlockData:175 rsBlockError:68], + [[ZXDataMatrixSymbolInfo alloc] initWithRectangular:NO dataCapacity:1304 errorCodewords:496 matrixWidth:20 matrixHeight:20 dataRegions:36 rsBlockData:163 rsBlockError:62], + [[ZXDataMatrixSymbolInfo144 alloc] init]]; + symbols = PROD_SYMBOLS; +} + ++ (NSArray *)prodSymbols { + return PROD_SYMBOLS; +} + ++ (void)overrideSymbolSet:(NSArray *)override { + symbols = override; +} + +- (id)initWithRectangular:(BOOL)rectangular dataCapacity:(int)dataCapacity errorCodewords:(int)errorCodewords + matrixWidth:(int)matrixWidth matrixHeight:(int)matrixHeight dataRegions:(int)dataRegions { + return [self initWithRectangular:rectangular dataCapacity:dataCapacity errorCodewords:errorCodewords + matrixWidth:matrixWidth matrixHeight:matrixHeight dataRegions:dataRegions + rsBlockData:dataCapacity rsBlockError:errorCodewords]; +} + +- (id)initWithRectangular:(BOOL)rectangular dataCapacity:(int)dataCapacity errorCodewords:(int)errorCodewords + matrixWidth:(int)matrixWidth matrixHeight:(int)matrixHeight dataRegions:(int)dataRegions + rsBlockData:(int)rsBlockData rsBlockError:(int)rsBlockError { + if (self = [super init]) { + _rectangular = rectangular; + _dataCapacity = dataCapacity; + _errorCodewords = errorCodewords; + _matrixWidth = matrixWidth; + _matrixHeight = matrixHeight; + _dataRegions = dataRegions; + _rsBlockData = rsBlockData; + _rsBlockError = rsBlockError; + } + + return self; +} + ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords { + return [self lookup:dataCodewords shape:ZXDataMatrixSymbolShapeHintForceNone fail:YES]; +} + ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape { + return [self lookup:dataCodewords shape:shape fail:YES]; +} + ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords allowRectangular:(BOOL)allowRectangular fail:(BOOL)fail { + ZXDataMatrixSymbolShapeHint shape = allowRectangular + ? ZXDataMatrixSymbolShapeHintForceNone : ZXDataMatrixSymbolShapeHintForceSquare; + return [self lookup:dataCodewords shape:shape fail:fail]; +} + ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape fail:(BOOL)fail { + return [self lookup:dataCodewords shape:shape minSize:nil maxSize:nil fail:fail]; +} + ++ (ZXDataMatrixSymbolInfo *)lookup:(int)dataCodewords shape:(ZXDataMatrixSymbolShapeHint)shape minSize:(ZXDimension *)minSize + maxSize:(ZXDimension *)maxSize fail:(BOOL)fail { + for (ZXDataMatrixSymbolInfo *symbol in symbols) { + if (shape == ZXDataMatrixSymbolShapeHintForceSquare && symbol.rectangular) { + continue; + } + if (shape == ZXDataMatrixSymbolShapeHintForceRectangle && !symbol.rectangular) { + continue; + } + if (minSize != nil + && ([symbol symbolWidth] < minSize.width + || [symbol symbolHeight] < minSize.height)) { + continue; + } + if (maxSize != nil + && ([symbol symbolWidth] > maxSize.width + || [symbol symbolHeight] > maxSize.height)) { + continue; + } + if (dataCodewords <= symbol.dataCapacity) { + return symbol; + } + } + if (fail) { + [NSException raise:NSInvalidArgumentException format:@"Can't find a symbol arrangement that matches the message. Data codewords: %d", dataCodewords]; + } + return nil; +} + +- (int)horizontalDataRegions { + switch (_dataRegions) { + case 1: + return 1; + case 2: + return 2; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Cannot handle this number of data regions" userInfo:nil]; + } +} + +- (int)verticalDataRegions { + switch (_dataRegions) { + case 1: + return 1; + case 2: + return 1; + case 4: + return 2; + case 16: + return 4; + case 36: + return 6; + default: + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Cannot handle this number of data regions" userInfo:nil]; + } +} + +- (int)symbolDataWidth { + return [self horizontalDataRegions] * _matrixWidth; +} + +- (int)symbolDataHeight { + return [self verticalDataRegions] * _matrixHeight; +} + +- (int)symbolWidth { + return [self symbolDataWidth] + ([self horizontalDataRegions] * 2); +} + +- (int)symbolHeight { + return [self symbolDataHeight] + ([self verticalDataRegions] * 2); +} + +- (int)codewordCount { + return _dataCapacity + _errorCodewords; +} + +- (int)interleavedBlockCount { + return _dataCapacity / _rsBlockData; +} + +- (int)dataLengthForInterleavedBlock:(int)index { + return _rsBlockData; +} + +- (int)errorLengthForInterleavedBlock:(int)index { + return _rsBlockError; +} + +- (NSString *)description { + NSMutableString *sb = [NSMutableString string]; + [sb appendString:_rectangular ? @"Rectangular Symbol:" : @"Square Symbol:"]; + [sb appendFormat:@" data region %dx%d", _matrixWidth, _matrixHeight]; + [sb appendFormat:@", symbol size %dx%d", [self symbolWidth], [self symbolHeight]]; + [sb appendFormat:@", symbol data size %dx%d", [self symbolDataWidth], [self symbolDataHeight]]; + [sb appendFormat:@", codewords %d+%d", _dataCapacity, _errorCodewords]; + return [NSString stringWithString:sb]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.h new file mode 100644 index 0000000..e9f82b5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixSymbolInfo.h" + +@interface ZXDataMatrixSymbolInfo144 : ZXDataMatrixSymbolInfo + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.m new file mode 100644 index 0000000..fa5af67 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.m @@ -0,0 +1,33 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixSymbolInfo144.h" + +@implementation ZXDataMatrixSymbolInfo144 + +- (id)init { + return [super initWithRectangular:NO dataCapacity:1558 errorCodewords:620 matrixWidth:22 matrixHeight:22 dataRegions:36 rsBlockData:-1 rsBlockError:62]; +} + +- (int)interleavedBlockCount { + return 10; +} + +- (int)dataLengthForInterleavedBlock:(int)index { + return (index <= 8) ? 156 : 155; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.h new file mode 100644 index 0000000..4f82605 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixC40Encoder.h" + +@interface ZXDataMatrixTextEncoder : ZXDataMatrixC40Encoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.m new file mode 100644 index 0000000..d766c5d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.m @@ -0,0 +1,84 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixTextEncoder.h" + +@implementation ZXDataMatrixTextEncoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder textEncodation]; +} + +- (int)encodeChar:(unichar)c buffer:(NSMutableString *)sb { + if (c == ' ') { + [sb appendString:@"\3"]; + return 1; + } + if (c >= '0' && c <= '9') { + [sb appendFormat:@"%C", (unichar) (c - 48 + 4)]; + return 1; + } + if (c >= 'a' && c <= 'z') { + [sb appendFormat:@"%C", (unichar) (c - 97 + 14)]; + return 1; + } + if (c >= '\0' && c <= (unichar)0x001f) { + [sb appendString:@"\0"]; //Shift 1 Set + [sb appendFormat:@"%C", c]; + return 2; + } + if (c >= '!' && c <= '/') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 33)]; + return 2; + } + if (c >= ':' && c <= '@') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 58 + 15)]; + return 2; + } + if (c >= '[' && c <= '_') { + [sb appendString:@"\1"]; //Shift 2 Set + [sb appendFormat:@"%C", (unichar) (c - 91 + 22)]; + return 2; + } + if (c == '\u0060') { + [sb appendString:@"\2"]; //Shift 3 Set + [sb appendFormat:@"%C", (unichar) (c - 96)]; + return 2; + } + if (c >= 'A' && c <= 'Z') { + [sb appendString:@"\2"]; //Shift 3 Set + [sb appendFormat:@"%C", (unichar) (c - 65 + 1)]; + return 2; + } + if (c >= '{' && c <= (unichar)0x007f) { + [sb appendString:@"\2"]; //Shift 3 Set + [sb appendFormat:@"%C", (unichar) (c - 123 + 27)]; + return 2; + } + if (c >= (unichar)0x0080) { + [sb appendFormat:@"\1%C", (unichar)0x001e]; //Shift 2, Upper Shift + int len = 2; + len += [self encodeChar:(unichar) (c - 128) buffer:sb]; + return len; + } + [ZXDataMatrixHighLevelEncoder illegalCharacter:c]; + return -1; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.h new file mode 100644 index 0000000..2c5dfea --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixC40Encoder.h" + +@interface ZXDataMatrixX12Encoder : ZXDataMatrixC40Encoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.m new file mode 100644 index 0000000..b377531 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.m @@ -0,0 +1,84 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixX12Encoder.h" + +@implementation ZXDataMatrixX12Encoder + +- (int)encodingMode { + return [ZXDataMatrixHighLevelEncoder x12Encodation]; +} + +- (void)encode:(ZXDataMatrixEncoderContext *)context { + //step C + NSMutableString *buffer = [NSMutableString string]; + while ([context hasMoreCharacters]) { + unichar c = [context currentChar]; + context.pos++; + + [self encodeChar:c buffer:buffer]; + + NSUInteger count = buffer.length; + if ((count % 3) == 0) { + [self writeNextTriplet:context buffer:buffer]; + + int newMode = [ZXDataMatrixHighLevelEncoder lookAheadTest:context.message startpos:context.pos currentMode:[self encodingMode]]; + if (newMode != [self encodingMode]) { + [context signalEncoderChange:newMode]; + break; + } + } + } + [self handleEOD:context buffer:buffer]; +} + +- (int)encodeChar:(unichar)c buffer:(NSMutableString *)sb { + if (c == '\r') { + [sb appendString:@"\0"]; + } else if (c == '*') { + [sb appendString:@"\1"]; + } else if (c == '>') { + [sb appendString:@"\2"]; + } else if (c == ' ') { + [sb appendString:@"\3"]; + } else if (c >= '0' && c <= '9') { + [sb appendFormat:@"%C", (unichar) (c - 48 + 4)]; + } else if (c >= 'A' && c <= 'Z') { + [sb appendFormat:@"%C", (unichar) (c - 65 + 14)]; + } else { + [ZXDataMatrixHighLevelEncoder illegalCharacter:c]; + } + return 1; +} + +- (void)handleEOD:(ZXDataMatrixEncoderContext *)context buffer:(NSMutableString *)buffer { + [context updateSymbolInfo]; + int available = context.symbolInfo.dataCapacity - [context codewordCount]; + int count = (int)buffer.length; + context.pos -= count; + if (context.remainingCharacters > 1 || available > 1 || + context.remainingCharacters != available) { + [context writeCodeword:[ZXDataMatrixHighLevelEncoder x12Unlatch]]; + } + if (context.newEncoding < 0) { + [context signalEncoderChange:[ZXDataMatrixHighLevelEncoder asciiEncodation]]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.h new file mode 100644 index 0000000..27f42b0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXBinaryBitmap, ZXDecodeHints, ZXResult; + +/** + * This implementation can detect and decode a MaxiCode in an image. + */ +@interface ZXMaxiCodeReader : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.m new file mode 100644 index 0000000..9bf2546 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.m @@ -0,0 +1,128 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinaryBitmap.h" +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXMaxiCodeDecoder.h" +#import "ZXMaxiCodeReader.h" +#import "ZXResult.h" + +const int ZX_MATRIX_WIDTH = 30; +const int ZX_MATRIX_HEIGHT = 33; + +@interface ZXMaxiCodeReader () + +@property (nonatomic, strong, readonly) ZXMaxiCodeDecoder *decoder; + +@end + +@implementation ZXMaxiCodeReader + +- (id)init { + if (self = [super init]) { + _decoder = [[ZXMaxiCodeDecoder alloc] init]; + } + + return self; +} + +/** + * Locates and decodes a MaxiCode in an image. + * + * @return a String representing the content encoded by the MaxiCode + * @return nil if a MaxiCode cannot be found + * @return nil if a MaxiCode cannot be decoded + * @return nil if error correction fails + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXDecoderResult *decoderResult; + if (hints != nil && hints.pureBarcode) { + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + ZXBitMatrix *bits = [self extractPureBits:matrix]; + if (!bits) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + decoderResult = [self.decoder decode:bits hints:hints error:error]; + if (!decoderResult) { + return nil; + } + } else { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSArray *points = @[]; + ZXResult *result = [ZXResult resultWithText:decoderResult.text + rawBytes:decoderResult.rawBytes + resultPoints:points + format:kBarcodeFormatMaxiCode]; + + NSString *ecLevel = decoderResult.ecLevel; + if (ecLevel != nil) { + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:ecLevel]; + } + return result; +} + +- (void)reset { + // do nothing +} + +/** + * This method detects a code in a "pure" image -- that is, pure monochrome image + * which contains only an unrotated, unskewed, image of a code, with some white border + * around it. This is a specialized method that works exceptionally fast in this special + * case. + */ +- (ZXBitMatrix *)extractPureBits:(ZXBitMatrix *)image { + ZXIntArray *enclosingRectangle = image.enclosingRectangle; + if (enclosingRectangle == nil) { + return nil; + } + + int left = enclosingRectangle.array[0]; + int top = enclosingRectangle.array[1]; + int width = enclosingRectangle.array[2]; + int height = enclosingRectangle.array[3]; + + // Now just read off the bits + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithWidth:ZX_MATRIX_WIDTH height:ZX_MATRIX_HEIGHT]; + for (int y = 0; y < ZX_MATRIX_HEIGHT; y++) { + int iy = top + (y * height + height / 2) / ZX_MATRIX_HEIGHT; + for (int x = 0; x < ZX_MATRIX_WIDTH; x++) { + int ix = left + (x * width + width / 2 + (y & 0x01) * width / 2) / ZX_MATRIX_WIDTH; + if ([image getX:ix y:iy]) { + [bits setX:x y:y]; + } + } + } + + return bits; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXingObjCMaxiCode.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXingObjCMaxiCode.h new file mode 100644 index 0000000..34b12ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/ZXingObjCMaxiCode.h @@ -0,0 +1,24 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ZXINGOBJC_MAXICODE_ + +#define _ZXINGOBJC_MAXICODE_ + +#import "ZXMaxiCodeDecoder.h" +#import "ZXMaxiCodeReader.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.h new file mode 100644 index 0000000..da287f9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXByteArray; + +@interface ZXMaxiCodeBitMatrixParser : NSObject + +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error; +- (ZXByteArray *)readCodewords; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.m new file mode 100644 index 0000000..0ec8de9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.m @@ -0,0 +1,90 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXErrors.h" +#import "ZXMaxiCodeBitMatrixParser.h" + +const int ZX_BITNR[33][30] = { + {121,120,127,126,133,132,139,138,145,144,151,150,157,156,163,162,169,168,175,174,181,180,187,186,193,192,199,198, -2, -2}, + {123,122,129,128,135,134,141,140,147,146,153,152,159,158,165,164,171,170,177,176,183,182,189,188,195,194,201,200,816, -3}, + {125,124,131,130,137,136,143,142,149,148,155,154,161,160,167,166,173,172,179,178,185,184,191,190,197,196,203,202,818,817}, + {283,282,277,276,271,270,265,264,259,258,253,252,247,246,241,240,235,234,229,228,223,222,217,216,211,210,205,204,819, -3}, + {285,284,279,278,273,272,267,266,261,260,255,254,249,248,243,242,237,236,231,230,225,224,219,218,213,212,207,206,821,820}, + {287,286,281,280,275,274,269,268,263,262,257,256,251,250,245,244,239,238,233,232,227,226,221,220,215,214,209,208,822, -3}, + {289,288,295,294,301,300,307,306,313,312,319,318,325,324,331,330,337,336,343,342,349,348,355,354,361,360,367,366,824,823}, + {291,290,297,296,303,302,309,308,315,314,321,320,327,326,333,332,339,338,345,344,351,350,357,356,363,362,369,368,825, -3}, + {293,292,299,298,305,304,311,310,317,316,323,322,329,328,335,334,341,340,347,346,353,352,359,358,365,364,371,370,827,826}, + {409,408,403,402,397,396,391,390, 79, 78, -2, -2, 13, 12, 37, 36, 2, -1, 44, 43,109,108,385,384,379,378,373,372,828, -3}, + {411,410,405,404,399,398,393,392, 81, 80, 40, -2, 15, 14, 39, 38, 3, -1, -1, 45,111,110,387,386,381,380,375,374,830,829}, + {413,412,407,406,401,400,395,394, 83, 82, 41, -3, -3, -3, -3, -3, 5, 4, 47, 46,113,112,389,388,383,382,377,376,831, -3}, + {415,414,421,420,427,426,103,102, 55, 54, 16, -3, -3, -3, -3, -3, -3, -3, 20, 19, 85, 84,433,432,439,438,445,444,833,832}, + {417,416,423,422,429,428,105,104, 57, 56, -3, -3, -3, -3, -3, -3, -3, -3, 22, 21, 87, 86,435,434,441,440,447,446,834, -3}, + {419,418,425,424,431,430,107,106, 59, 58, -3, -3, -3, -3, -3, -3, -3, -3, -3, 23, 89, 88,437,436,443,442,449,448,836,835}, + {481,480,475,474,469,468, 48, -2, 30, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 0, 53, 52,463,462,457,456,451,450,837, -3}, + {483,482,477,476,471,470, 49, -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -1,465,464,459,458,453,452,839,838}, + {485,484,479,478,473,472, 51, 50, 31, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, 1, -2, 42,467,466,461,460,455,454,840, -3}, + {487,486,493,492,499,498, 97, 96, 61, 60, -3, -3, -3, -3, -3, -3, -3, -3, -3, 26, 91, 90,505,504,511,510,517,516,842,841}, + {489,488,495,494,501,500, 99, 98, 63, 62, -3, -3, -3, -3, -3, -3, -3, -3, 28, 27, 93, 92,507,506,513,512,519,518,843, -3}, + {491,490,497,496,503,502,101,100, 65, 64, 17, -3, -3, -3, -3, -3, -3, -3, 18, 29, 95, 94,509,508,515,514,521,520,845,844}, + {559,558,553,552,547,546,541,540, 73, 72, 32, -3, -3, -3, -3, -3, -3, 10, 67, 66,115,114,535,534,529,528,523,522,846, -3}, + {561,560,555,554,549,548,543,542, 75, 74, -2, -1, 7, 6, 35, 34, 11, -2, 69, 68,117,116,537,536,531,530,525,524,848,847}, + {563,562,557,556,551,550,545,544, 77, 76, -2, 33, 9, 8, 25, 24, -1, -2, 71, 70,119,118,539,538,533,532,527,526,849, -3}, + {565,564,571,570,577,576,583,582,589,588,595,594,601,600,607,606,613,612,619,618,625,624,631,630,637,636,643,642,851,850}, + {567,566,573,572,579,578,585,584,591,590,597,596,603,602,609,608,615,614,621,620,627,626,633,632,639,638,645,644,852, -3}, + {569,568,575,574,581,580,587,586,593,592,599,598,605,604,611,610,617,616,623,622,629,628,635,634,641,640,647,646,854,853}, + {727,726,721,720,715,714,709,708,703,702,697,696,691,690,685,684,679,678,673,672,667,666,661,660,655,654,649,648,855, -3}, + {729,728,723,722,717,716,711,710,705,704,699,698,693,692,687,686,681,680,675,674,669,668,663,662,657,656,651,650,857,856}, + {731,730,725,724,719,718,713,712,707,706,701,700,695,694,689,688,683,682,677,676,671,670,665,664,659,658,653,652,858, -3}, + {733,732,739,738,745,744,751,750,757,756,763,762,769,768,775,774,781,780,787,786,793,792,799,798,805,804,811,810,860,859}, + {735,734,741,740,747,746,753,752,759,758,765,764,771,770,777,776,783,782,789,788,795,794,801,800,807,806,813,812,861, -3}, + {737,736,743,742,749,748,755,754,761,760,767,766,773,772,779,778,785,784,791,790,797,796,803,802,809,808,815,814,863,862} +}; + +@interface ZXMaxiCodeBitMatrixParser () + +@property (nonatomic, strong, readonly) ZXBitMatrix *bitMatrix; + +@end + +@implementation ZXMaxiCodeBitMatrixParser + +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error { + if (self = [super init]) { + _bitMatrix = bitMatrix; + } + + return self; +} + +- (ZXByteArray *)readCodewords { + ZXByteArray *result = [[ZXByteArray alloc] initWithLength:144]; + int height = self.bitMatrix.height; + int width = self.bitMatrix.width; + for (int y = 0; y < height; y++) { + int *bitnrRow = (int *)ZX_BITNR[y]; + for (int x = 0; x < width; x++) { + int bit = bitnrRow[x]; + if (bit >= 0 && [self.bitMatrix getX:x y:y]) { + result.array[bit / 6] |= (int8_t) (1 << (5 - (bit % 6))); + } + } + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.h new file mode 100644 index 0000000..6e824b9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXDecoderResult; + +/** + * MaxiCodes can encode text or structured information as bits in one of several modes, + * with multiple character sets in one code. This class decodes the bits back into text. + */ +@interface ZXMaxiCodeDecodedBitStreamParser : NSObject + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes mode:(int)mode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.m new file mode 100644 index 0000000..d2d95b6 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.m @@ -0,0 +1,203 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXMaxiCodeDecodedBitStreamParser.h" + +const unichar SHIFTA = 0xFFF0; +const unichar SHIFTB = 0xFFF1; +const unichar SHIFTC = 0xFFF2; +const unichar SHIFTD = 0xFFF3; +const unichar SHIFTE = 0xFFF4; +const unichar TWOSHIFTA = 0xFFF5; +const unichar THREESHIFTA = 0xFFF6; +const unichar LATCHA = 0xFFF7; +const unichar LATCHB = 0xFFF8; +const unichar LOCK = 0xFFF9; +const unichar ECI = 0xFFFA; +const unichar NS = 0xFFFB; +const unichar PAD = 0xFFFC; +const unichar FS = 0x001C; +const unichar GS = 0x001D; +const unichar RS = 0x001E; + +const unichar SETS[1][383] = { + '\n', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', ECI, FS, GS, RS, NS, ' ', PAD, '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', + '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', SHIFTB, SHIFTC, SHIFTD, SHIFTE, LATCHB, + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' , 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', ECI, FS, GS, RS, NS, '{', PAD, '}', '~', 0x007F, ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', ' ', + ',', '.', '/', ':', '@', '!', '|', PAD, TWOSHIFTA, THREESHIFTA, PAD, SHIFTA, SHIFTC, SHIFTD, SHIFTE, LATCHA, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, + 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, ECI, FS, GS, RS, 0x00DB, + 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00AA, 0x00AC, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BA, 0x00BC, 0x00BD, 0x00BE, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, LATCHA, ' ', LOCK, SHIFTD, SHIFTE, LATCHB, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, + 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, ECI, FS, GS, RS, NS, + 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x00A1, 0x00A8, 0x00AB, 0x00AF, 0x00B0, 0x00B4, 0x00B7, 0x00B8, 0x00BB, 0x00BF, + 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, LATCHA, ' ', SHIFTC, LOCK, SHIFTE, + LATCHB, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, '\n', 0x000B, 0x000C, '\r', + 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, ECI, PAD, PAD, + 0x001B, NS, FS, GS, RS, 0x001F, 0x009F, 0x00A0, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A9, 0x00AD, 0x00AE, + 0x00B6, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, LATCHA, ' ', SHIFTC, SHIFTD, LOCK, + LATCHB, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, '\n', 0x000B, 0x000C, '\r', + 0x000E, 0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, + 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, '"', 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, + 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, + 0x003B, 0x003C, 0x003D, 0x003E, 0x003F +}; + +@implementation ZXMaxiCodeDecodedBitStreamParser + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes mode:(int)mode { + NSMutableString *result = [NSMutableString stringWithCapacity:144]; + switch (mode) { + case 2: + case 3: { + NSString *postcode; + if (mode == 2) { + int pc = [self postCode2:bytes]; + postcode = [NSString stringWithFormat:@"%9d", pc]; + } else { + postcode = [self postCode3:bytes]; + } + NSString *country = [NSString stringWithFormat:@"%3d", [self country:bytes]]; + NSString *service = [NSString stringWithFormat:@"%3d", [self serviceClass:bytes]]; + [result appendString:[self message:bytes start:10 len:84]]; + if ([result hasPrefix:[NSString stringWithFormat:@"[)>%C01%C", RS, GS]]) { + [result insertString:[NSString stringWithFormat:@"%@%C%@%C%@%C", postcode, GS, country, GS, service, GS] atIndex:9]; + } else { + [result insertString:[NSString stringWithFormat:@"%@%C%@%C%@%C", postcode, GS, country, GS, service, GS] atIndex:0]; + } + break; + } + case 4: + [result appendString:[self message:bytes start:1 len:93]]; + break; + case 5: + [result appendString:[self message:bytes start:1 len:77]]; + break; + } + return [[ZXDecoderResult alloc] initWithRawBytes:bytes + text:result + byteSegments:nil + ecLevel:[NSString stringWithFormat:@"%d", mode]]; +} + ++ (int)bit:(int)bit bytes:(ZXByteArray *)bytes { + bit--; + return (bytes.array[bit / 6] & (1 << (5 - (bit % 6)))) == 0 ? 0 : 1; +} + ++ (int)integer:(ZXByteArray *)bytes x:(ZXByteArray *)x { + int val = 0; + for (int i = 0; i < x.length; i++) { + val += [self bit:x.array[i] bytes:bytes] << (x.length - i - 1); + } + return val; +} + ++ (int)country:(ZXByteArray *)bytes { + return [self integer:bytes x:[[ZXByteArray alloc] initWithBytes:53, 54, 43, 44, 45, 46, 47, 48, 37, 38, -1]]; +} + ++ (int)serviceClass:(ZXByteArray *)bytes { + return [self integer:bytes x:[[ZXByteArray alloc] initWithBytes:55, 56, 57, 58, 59, 60, 49, 50, 51, 52, -1]]; +} + ++ (int)postCode2Length:(ZXByteArray *)bytes { + return [self integer:bytes x:[[ZXByteArray alloc] initWithBytes:39, 40, 41, 42, 31, 32, -1]]; +} + ++ (int)postCode2:(ZXByteArray *)bytes { + return [self integer:bytes x:[[ZXByteArray alloc] initWithBytes:33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 19, + 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2, -1]]; +} + ++ (NSString *)postCode3:(ZXByteArray *)bytes { + return [NSString stringWithFormat:@"%C%C%C%C%C%C", + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes:39, 40, 41, 42, 31, 32, -1]]], + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes:33, 34, 35, 36, 25, 26, -1]]], + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes:27, 28, 29, 30, 19, 20, -1]]], + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes:21, 22, 23, 24, 13, 14, -1]]], + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes:15, 16, 17, 18, 7, 8, -1]]], + SETS[0][[self integer:bytes x:[[ZXByteArray alloc] initWithBytes: 9, 10, 11, 12, 1, 2, -1]]]]; +} + ++ (NSString *)message:(ZXByteArray *)bytes start:(int)start len:(int)len { + NSMutableString *sb = [NSMutableString string]; + int shift = -1; + int set = 0; + int lastset = 0; + for (int i = start; i < start + len; i++) { + unichar c = SETS[set][bytes.array[i]]; + switch (c) { + case LATCHA: + set = 0; + shift = -1; + break; + case LATCHB: + set = 1; + shift = -1; + break; + case SHIFTA: + case SHIFTB: + case SHIFTC: + case SHIFTD: + case SHIFTE: + lastset = set; + set = c - SHIFTA; + shift = 1; + break; + case TWOSHIFTA: + lastset = set; + set = 0; + shift = 2; + break; + case THREESHIFTA: + lastset = set; + set = 0; + shift = 3; + break; + case NS: { + int nsval1 = bytes.array[++i] << 24; + int nsval2 = bytes.array[++i] << 18; + int nsval3 = bytes.array[++i] << 12; + int nsval4 = bytes.array[++i] << 6; + int nsval5 = bytes.array[++i]; + int nsval = nsval1 + nsval2 + nsval3 + nsval4 + nsval5; + [sb appendFormat:@"%9d", nsval]; + break; + } + case LOCK: + shift = -1; + break; + default: + [sb appendFormat:@"%C", c]; + } + if (shift-- == 0) { + set = lastset; + } + } + while (sb.length > 0 && [sb characterAtIndex:sb.length - 1] == PAD) { + [sb deleteCharactersInRange:NSMakeRange(sb.length - 1, 1)]; + } + return sb; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.h new file mode 100644 index 0000000..53f1e13 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDecodeHints, ZXDecoderResult; + +/** + * The main class which implements MaxiCode decoding -- as opposed to locating and extracting + * the MaxiCode from an image. + */ +@interface ZXMaxiCodeDecoder : NSObject + +- (ZXDecoderResult *)decode:(ZXBitMatrix *)bits error:(NSError **)error; +- (ZXDecoderResult *)decode:(ZXBitMatrix *)bits hints:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.m new file mode 100644 index 0000000..a74de8c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.m @@ -0,0 +1,134 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXMaxiCodeBitMatrixParser.h" +#import "ZXMaxiCodeDecodedBitStreamParser.h" +#import "ZXMaxiCodeDecoder.h" +#import "ZXReedSolomonDecoder.h" + +const int ZX_MAXI_CODE_ALL = 0; +const int ZX_MAXI_CODE_EVEN = 1; +const int ZX_MAXI_CODE_ODD = 2; + +@interface ZXMaxiCodeDecoder () + +@property (nonatomic, strong, readonly) ZXReedSolomonDecoder *rsDecoder; + +@end + +@implementation ZXMaxiCodeDecoder + +- (id)init { + if (self = [super init]) { + _rsDecoder = [[ZXReedSolomonDecoder alloc] initWithField:[ZXGenericGF MaxiCodeField64]]; + } + + return self; +} + +- (ZXDecoderResult *)decode:(ZXBitMatrix *)bits error:(NSError **)error { + return [self decode:bits hints:nil error:error]; +} + +- (ZXDecoderResult *)decode:(ZXBitMatrix *)bits hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXMaxiCodeBitMatrixParser *parser = [[ZXMaxiCodeBitMatrixParser alloc] initWithBitMatrix:bits error:error]; + if (!parser) { + return nil; + } + ZXByteArray *codewords = [parser readCodewords]; + + if (![self correctErrors:codewords start:0 dataCodewords:10 ecCodewords:10 mode:ZX_MAXI_CODE_ALL error:error]) { + return nil; + } + int mode = codewords.array[0] & 0x0F; + ZXByteArray *datawords; + switch (mode) { + case 2: + case 3: + case 4: + if (![self correctErrors:codewords start:20 dataCodewords:84 ecCodewords:40 mode:ZX_MAXI_CODE_EVEN error:error]) { + return nil; + } + if (![self correctErrors:codewords start:20 dataCodewords:84 ecCodewords:40 mode:ZX_MAXI_CODE_ODD error:error]) { + return nil; + } + datawords = [[ZXByteArray alloc] initWithLength:94]; + break; + case 5: + if (![self correctErrors:codewords start:20 dataCodewords:68 ecCodewords:56 mode:ZX_MAXI_CODE_EVEN error:error]) { + return nil; + } + if (![self correctErrors:codewords start:20 dataCodewords:68 ecCodewords:56 mode:ZX_MAXI_CODE_ODD error:error]) { + return nil; + } + datawords = [[ZXByteArray alloc] initWithLength:78]; + break; + default: + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + for (int i = 0; i < 10; i++) { + datawords.array[i] = codewords.array[i]; + } + for (int i = 20; i < datawords.length + 10; i++) { + datawords.array[i - 10] = codewords.array[i]; + } + + return [ZXMaxiCodeDecodedBitStreamParser decode:datawords mode:mode]; +} + +- (BOOL)correctErrors:(ZXByteArray *)codewordBytes start:(int)start dataCodewords:(int)dataCodewords + ecCodewords:(int)ecCodewords mode:(int)mode error:(NSError **)error { + int codewords = dataCodewords + ecCodewords; + + // in EVEN or ODD mode only half the codewords + int divisor = mode == ZX_MAXI_CODE_ALL ? 1 : 2; + + // First read into an array of ints + ZXIntArray *codewordsInts = [[ZXIntArray alloc] initWithLength:codewords / divisor]; + for (int i = 0; i < codewords; i++) { + if ((mode == ZX_MAXI_CODE_ALL) || (i % 2 == (mode - 1))) { + codewordsInts.array[i / divisor] = codewordBytes.array[i + start] & 0xFF; + } + } + + NSError *decodeError = nil; + if (![self.rsDecoder decode:codewordsInts twoS:ecCodewords / divisor error:&decodeError]) { + if (decodeError.code == ZXReedSolomonError && error) { + *error = ZXChecksumErrorInstance(); + } + return NO; + } + // Copy back into array of bytes -- only need to worry about the bytes that were data + // We don't care about errors in the error-correction codewords + for (int i = 0; i < dataCodewords; i++) { + if ((mode == ZX_MAXI_CODE_ALL) || (i % 2 == (mode - 1))) { + codewordBytes.array[i + start] = (int8_t) codewordsInts.array[i / divisor]; + } + } + + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.h new file mode 100644 index 0000000..8de8442 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +/** + * This class attempts to decode a barcode from an image, not by scanning the whole image, + * but by scanning subsets of the image. This is important when there may be multiple barcodes in + * an image, and detecting a barcode may find parts of multiple barcode and fail to decode + * (e.g. QR Codes). Instead this scans the four quadrants of the image -- and also the center + * 'quadrant' to cover the case where a barcode is found in the center. + */ +@interface ZXByQuadrantReader : NSObject + +- (id)initWithDelegate:(id)delegate; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.m new file mode 100644 index 0000000..22f009f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.m @@ -0,0 +1,121 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinaryBitmap.h" +#import "ZXByQuadrantReader.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +@interface ZXByQuadrantReader () + +@property (nonatomic, weak, readonly) id delegate; + +@end + +@implementation ZXByQuadrantReader + +- (id)initWithDelegate:(id)delegate { + if (self = [super init]) { + _delegate = delegate; + } + + return self; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + int width = image.width; + int height = image.height; + int halfWidth = width / 2; + int halfHeight = height / 2; + + // No need to call makeAbsolute as results will be relative to original top left here + NSError *decodeError = nil; + ZXResult *result = [self.delegate decode:[image crop:0 top:0 width:halfWidth height:halfHeight] + hints:hints + error:&decodeError]; + if (result) { + return result; + } else if (decodeError.code != ZXNotFoundError) { + if (error) *error = decodeError; + return nil; + } + + decodeError = nil; + result = [self.delegate decode:[image crop:halfWidth top:0 width:halfWidth height:halfHeight] + hints:hints + error:&decodeError]; + if (result) { + [self makeAbsolute:result.resultPoints leftOffset:halfWidth topOffset:0]; + return result; + } else if (decodeError.code != ZXNotFoundError) { + if (error) *error = decodeError; + return nil; + } + + decodeError = nil; + result = [self.delegate decode:[image crop:0 top:halfHeight width:halfWidth height:halfHeight] + hints:hints + error:&decodeError]; + if (result) { + [self makeAbsolute:result.resultPoints leftOffset:0 topOffset:halfHeight]; + return result; + } else if (decodeError.code != ZXNotFoundError) { + if (error) *error = decodeError; + return nil; + } + + decodeError = nil; + result = [self.delegate decode:[image crop:halfWidth top:halfHeight width:halfWidth height:halfHeight] + hints:hints + error:&decodeError]; + if (result) { + [self makeAbsolute:result.resultPoints leftOffset:halfWidth topOffset:halfHeight]; + return result; + } else if (decodeError.code != ZXNotFoundError) { + if (error) *error = decodeError; + return nil; + } + + int quarterWidth = halfWidth / 2; + int quarterHeight = halfHeight / 2; + ZXBinaryBitmap *center = [image crop:quarterWidth top:quarterHeight width:halfWidth height:halfHeight]; + result = [self.delegate decode:center hints:hints error:error]; + if (result) { + [self makeAbsolute:result.resultPoints leftOffset:quarterWidth topOffset:quarterHeight]; + } + return result; +} + +- (void)reset { + [self.delegate reset]; +} + +- (void)makeAbsolute:(NSMutableArray *)points leftOffset:(int)leftOffset topOffset:(int)topOffset { + if (points) { + for (int i = 0; i < points.count; i++) { + ZXResultPoint *relative = points[i]; + points[i] = [[ZXResultPoint alloc] initWithX:relative.x + leftOffset y:relative.y + topOffset]; + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.h new file mode 100644 index 0000000..68ed611 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.h @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXMultipleBarcodeReader.h" + +@protocol ZXReader; + +/** + * Attempts to locate multiple barcodes in an image by repeatedly decoding portion of the image. + * After one barcode is found, the areas left, above, right and below the barcode's + * ZXResultPoints are scanned, recursively. + * + * A caller may want to also employ ZXByQuadrantReader when attempting to find multiple + * 2D barcodes, like QR Codes, in an image, where the presence of multiple barcodes might prevent + * detecting any one of them. + * + * That is, instead of passing an ZXReader a caller might pass + * [[ZXByQuadrantReader alloc] initWithDelegate:reader]. + */ +@interface ZXGenericMultipleBarcodeReader : NSObject + +- (id)initWithDelegate:(id)delegate; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.m new file mode 100644 index 0000000..3c2680c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.m @@ -0,0 +1,140 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXGenericMultipleBarcodeReader.h" +#import "ZXReader.h" +#import "ZXResultPoint.h" + +const int ZX_MIN_DIMENSION_TO_RECUR = 100; +const int ZX_MAX_DEPTH = 4; + +@interface ZXGenericMultipleBarcodeReader () + +@property (nonatomic, weak, readonly) id delegate; + +@end + +@implementation ZXGenericMultipleBarcodeReader + +- (id)initWithDelegate:(id)delegate { + if (self = [super init]) { + _delegate = delegate; + } + + return self; +} + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decodeMultiple:image hints:nil error:error]; +} + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + NSMutableArray *results = [NSMutableArray array]; + if (![self doDecodeMultiple:image hints:hints results:results xOffset:0 yOffset:0 currentDepth:0 error:error]) { + return nil; + } else if (results.count == 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return results; +} + +- (BOOL)doDecodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints results:(NSMutableArray *)results + xOffset:(int)xOffset yOffset:(int)yOffset currentDepth:(int)currentDepth error:(NSError **)error { + if (currentDepth > ZX_MAX_DEPTH) { + return YES; + } + + ZXResult *result = [self.delegate decode:image hints:hints error:error]; + if (!result) { + return NO; + } + + BOOL alreadyFound = NO; + for (ZXResult *existingResult in results) { + if ([[existingResult text] isEqualToString:[result text]]) { + alreadyFound = YES; + break; + } + } + if (!alreadyFound) { + [results addObject:[self translateResultPoints:result xOffset:xOffset yOffset:yOffset]]; + } + NSMutableArray *resultPoints = [result resultPoints]; + if (resultPoints == nil || [resultPoints count] == 0) { + return YES; + } + int width = [image width]; + int height = [image height]; + float minX = width; + float minY = height; + float maxX = 0.0f; + float maxY = 0.0f; + for (ZXResultPoint *point in resultPoints) { + if ((id)point == [NSNull null]) { + continue; + } + float x = [point x]; + float y = [point y]; + if (x < minX) { + minX = x; + } + if (y < minY) { + minY = y; + } + if (x > maxX) { + maxX = x; + } + if (y > maxY) { + maxY = y; + } + } + + if (minX > ZX_MIN_DIMENSION_TO_RECUR) { + return [self doDecodeMultiple:[image crop:0 top:0 width:(int)minX height:height] hints:hints results:results xOffset:xOffset yOffset:yOffset currentDepth:currentDepth + 1 error:error]; + } + if (minY > ZX_MIN_DIMENSION_TO_RECUR) { + return [self doDecodeMultiple:[image crop:0 top:0 width:width height:(int)minY] hints:hints results:results xOffset:xOffset yOffset:yOffset currentDepth:currentDepth + 1 error:error]; + } + if (maxX < width - ZX_MIN_DIMENSION_TO_RECUR) { + return [self doDecodeMultiple:[image crop:(int)maxX top:0 width:width - (int)maxX height:height] hints:hints results:results xOffset:xOffset + (int)maxX yOffset:yOffset currentDepth:currentDepth + 1 error:error]; + } + if (maxY < height - ZX_MIN_DIMENSION_TO_RECUR) { + return [self doDecodeMultiple:[image crop:0 top:(int)maxY width:width height:height - (int)maxY] hints:hints results:results xOffset:xOffset yOffset:yOffset + (int)maxY currentDepth:currentDepth + 1 error:error]; + } + + return YES; +} + +- (ZXResult *)translateResultPoints:(ZXResult *)result xOffset:(int)xOffset yOffset:(int)yOffset { + NSArray *oldResultPoints = [result resultPoints]; + if (oldResultPoints == nil) { + return result; + } + NSMutableArray *newResultPoints = [NSMutableArray arrayWithCapacity:[oldResultPoints count]]; + for (ZXResultPoint *oldPoint in oldResultPoints) { + if ((id)oldPoint != [NSNull null]) { + [newResultPoints addObject:[[ZXResultPoint alloc] initWithX:[oldPoint x] + xOffset y:[oldPoint y] + yOffset]]; + } + } + + ZXResult *newResult = [ZXResult resultWithText:result.text rawBytes:result.rawBytes resultPoints:newResultPoints format:result.barcodeFormat]; + [newResult putAllMetadata:result.resultMetadata]; + return newResult; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXMultipleBarcodeReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXMultipleBarcodeReader.h new file mode 100644 index 0000000..b7766f3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/multi/ZXMultipleBarcodeReader.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinaryBitmap.h" +#import "ZXResult.h" + +@class ZXDecodeHints; + +/** + * Implementation of this interface attempt to read several barcodes from one image. + */ +@protocol ZXMultipleBarcodeReader + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error; +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.h new file mode 100644 index 0000000..cda00d1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +extern const int ZX_CODA_ALPHABET_LEN; +extern const unichar ZX_CODA_ALPHABET[]; +extern const int ZX_CODA_CHARACTER_ENCODINGS[]; + +@class ZXBitArray, ZXDecodeHints, ZXResult; + +/** + * Decodes Codabar barcodes. + */ +@interface ZXCodaBarReader : ZXOneDReader + ++ (BOOL)arrayContains:(const unichar *)array length:(unsigned int)length key:(unichar)key; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.m new file mode 100644 index 0000000..0c3b001 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.m @@ -0,0 +1,367 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXCodaBarReader.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +// These values are critical for determining how permissive the decoding +// will be. All stripe sizes must be within the window these define, as +// compared to the average stripe size. +static float ZX_CODA_MAX_ACCEPTABLE = 2.0f; +static float ZX_CODA_PADDING = 1.5f; + +const unichar ZX_CODA_ALPHABET[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '-', '$', ':', '/', '.', '+', 'A', 'B', 'C', 'D', 'T', 'N'}; +const int ZX_CODA_ALPHABET_LEN = sizeof(ZX_CODA_ALPHABET) / sizeof(unichar); + +/** + * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of + * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. + */ +const int ZX_CODA_CHARACTER_ENCODINGS[] = { + 0x003, 0x006, 0x009, 0x060, 0x012, 0x042, 0x021, 0x024, 0x030, 0x048, // 0-9 + 0x00c, 0x018, 0x045, 0x051, 0x054, 0x015, 0x01A, 0x029, 0x00B, 0x00E, // -$:/.+ABCD +}; + +// minimal number of characters that should be present (inclusing start and stop characters) +// under normal circumstances this should be set to 3, but can be set higher +// as a last-ditch attempt to reduce false positives. +const int ZX_CODA_MIN_CHARACTER_LENGTH = 3; + +// official start and end patterns +const unichar ZX_CODA_STARTEND_ENCODING[] = {'A', 'B', 'C', 'D'}; + +// some codabar generator allow the codabar string to be closed by every +// character. This will cause lots of false positives! + +// some industries use a checksum standard but this is not part of the original codabar standard +// for more information see : http://www.mecsw.com/specs/codabar.html + +@interface ZXCodaBarReader () + +@property (nonatomic, strong) NSMutableString *decodeRowResult; +@property (nonatomic, strong) ZXIntArray *counters; +@property (nonatomic, assign) int counterLength; + +@end + +@implementation ZXCodaBarReader + +- (id)init { + if (self = [super init]) { + _decodeRowResult = [NSMutableString stringWithCapacity:20]; + _counters = [[ZXIntArray alloc] initWithLength:80]; + _counterLength = 0; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + [self.counters clear]; + + if (![self setCountersWithRow:row]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + int startOffset = [self findStartPattern]; + if (startOffset == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + int nextStart = startOffset; + + self.decodeRowResult = [NSMutableString string]; + do { + int charOffset = [self toNarrowWidePattern:nextStart]; + if (charOffset == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + // Hack: We store the position in the alphabet table into a + // NSMutableString, so that we can access the decoded patterns in + // validatePattern. We'll translate to the actual characters later. + [self.decodeRowResult appendFormat:@"%C", (unichar)charOffset]; + nextStart += 8; + // Stop as soon as we see the end character. + if (self.decodeRowResult.length > 1 && + [ZXCodaBarReader arrayContains:ZX_CODA_STARTEND_ENCODING + length:sizeof(ZX_CODA_STARTEND_ENCODING) / sizeof(unichar) + key:ZX_CODA_ALPHABET[charOffset]]) { + break; + } + } while (nextStart < self.counterLength); // no fixed end pattern so keep on reading while data is available + + // Look for whitespace after pattern: + int trailingWhitespace = self.counters.array[nextStart - 1]; + int lastPatternSize = 0; + for (int i = -8; i < -1; i++) { + lastPatternSize += self.counters.array[nextStart + i]; + } + + // We need to see whitespace equal to 50% of the last pattern size, + // otherwise this is probably a false positive. The exception is if we are + // at the end of the row. (I.e. the barcode barely fits.) + if (nextStart < self.counterLength && trailingWhitespace < lastPatternSize / 2) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if (![self validatePattern:startOffset]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // Translate character table offsets to actual characters. + for (int i = 0; i < self.decodeRowResult.length; i++) { + [self.decodeRowResult replaceCharactersInRange:NSMakeRange(i, 1) withString:[NSString stringWithFormat:@"%c", ZX_CODA_ALPHABET[[self.decodeRowResult characterAtIndex:i]]]]; + } + // Ensure a valid start and end character + unichar startchar = [self.decodeRowResult characterAtIndex:0]; + if (![ZXCodaBarReader arrayContains:ZX_CODA_STARTEND_ENCODING + length:sizeof(ZX_CODA_STARTEND_ENCODING) / sizeof(unichar) + key:startchar]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + unichar endchar = [self.decodeRowResult characterAtIndex:self.decodeRowResult.length - 1]; + if (![ZXCodaBarReader arrayContains:ZX_CODA_STARTEND_ENCODING + length:sizeof(ZX_CODA_STARTEND_ENCODING) / sizeof(unichar) + key:endchar]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // remove stop/start characters character and check if a long enough string is contained + if (self.decodeRowResult.length <= ZX_CODA_MIN_CHARACTER_LENGTH) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if (!hints.returnCodaBarStartEnd) { + [self.decodeRowResult deleteCharactersInRange:NSMakeRange(self.decodeRowResult.length - 1, 1)]; + [self.decodeRowResult deleteCharactersInRange:NSMakeRange(0, 1)]; + } + + int runningCount = 0; + for (int i = 0; i < startOffset; i++) { + runningCount += self.counters.array[i]; + } + float left = (float) runningCount; + for (int i = startOffset; i < nextStart - 1; i++) { + runningCount += self.counters.array[i]; + } + float right = (float) runningCount; + return [ZXResult resultWithText:self.decodeRowResult + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:left y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:right y:(float)rowNumber]] + format:kBarcodeFormatCodabar]; +} + +- (BOOL)validatePattern:(int)start { + // First, sum up the total size of our four categories of stripe sizes; + int sizes[4] = {0, 0, 0, 0}; + int counts[4] = {0, 0, 0, 0}; + int end = (int)self.decodeRowResult.length - 1; + + // We break out of this loop in the middle, in order to handle + // inter-character spaces properly. + int pos = start; + for (int i = 0; true; i++) { + int pattern = ZX_CODA_CHARACTER_ENCODINGS[[self.decodeRowResult characterAtIndex:i]]; + for (int j = 6; j >= 0; j--) { + // Even j = bars, while odd j = spaces. Categories 2 and 3 are for + // long stripes, while 0 and 1 are for short stripes. + int category = (j & 1) + (pattern & 1) * 2; + sizes[category] += self.counters.array[pos + j]; + counts[category]++; + pattern >>= 1; + } + if (i >= end) { + break; + } + // We ignore the inter-character space - it could be of any size. + pos += 8; + } + + // Calculate our allowable size thresholds using fixed-point math. + float maxes[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + float mins[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + // Define the threshold of acceptability to be the midpoint between the + // average small stripe and the average large stripe. No stripe lengths + // should be on the "wrong" side of that line. + for (int i = 0; i < 2; i++) { + mins[i] = 0.0f; // Accept arbitrarily small "short" stripes. + mins[i + 2] = ((float) sizes[i] / counts[i] + (float) sizes[i + 2] / counts[i + 2]) / 2.0f; + maxes[i] = mins[i + 2]; + maxes[i + 2] = (sizes[i + 2] * ZX_CODA_MAX_ACCEPTABLE + ZX_CODA_PADDING) / counts[i + 2]; + } + + // Now verify that all of the stripes are within the thresholds. + pos = start; + for (int i = 0; true; i++) { + int pattern = ZX_CODA_CHARACTER_ENCODINGS[[self.decodeRowResult characterAtIndex:i]]; + for (int j = 6; j >= 0; j--) { + // Even j = bars, while odd j = spaces. Categories 2 and 3 are for + // long stripes, while 0 and 1 are for short stripes. + int category = (j & 1) + (pattern & 1) * 2; + int size = self.counters.array[pos + j]; + if (size < mins[category] || size > maxes[category]) { + return NO; + } + pattern >>= 1; + } + if (i >= end) { + break; + } + pos += 8; + } + + return YES; +} + +/** + * Records the size of all runs of white and black pixels, starting with white. + * This is just like recordPattern, except it records all the counters, and + * uses our builtin "counters" member for storage. + */ +- (BOOL)setCountersWithRow:(ZXBitArray *)row { + self.counterLength = 0; + // Start from the first white bit. + int i = [row nextUnset:0]; + int end = row.size; + if (i >= end) { + return NO; + } + BOOL isWhite = YES; + int count = 0; + while (i < end) { + if ([row get:i] ^ isWhite) { // that is, exactly one is true + count++; + } else { + [self counterAppend:count]; + count = 1; + isWhite = !isWhite; + } + i++; + } + [self counterAppend:count]; + return YES; +} + +- (void)counterAppend:(int)e { + self.counters.array[self.counterLength] = e; + self.counterLength++; + if (self.counterLength >= self.counters.length) { + ZXIntArray *temp = [[ZXIntArray alloc] initWithLength:self.counterLength * 2]; + memcpy(temp.array, self.counters.array, self.counters.length * sizeof(int32_t)); + self.counters = temp; + } +} + +- (int)findStartPattern { + for (int i = 1; i < self.counterLength; i += 2) { + int charOffset = [self toNarrowWidePattern:i]; + if (charOffset != -1 && [[self class] arrayContains:ZX_CODA_STARTEND_ENCODING + length:sizeof(ZX_CODA_STARTEND_ENCODING) / sizeof(unichar) + key:ZX_CODA_ALPHABET[charOffset]]) { + // Look for whitespace before start pattern, >= 50% of width of start pattern + // We make an exception if the whitespace is the first element. + int patternSize = 0; + for (int j = i; j < i + 7; j++) { + patternSize += self.counters.array[j]; + } + if (i == 1 || self.counters.array[i-1] >= patternSize / 2) { + return i; + } + } + } + + return -1; +} + ++ (BOOL)arrayContains:(const unichar *)array length:(unsigned int)length key:(unichar)key { + if (array != nil) { + for (int i = 0; i < length; i++) { + if (array[i] == key) { + return YES; + } + } + } + return NO; +} + +// Assumes that counters[position] is a bar. +- (int)toNarrowWidePattern:(int)position { + int32_t *array = self.counters.array; + int end = position + 7; + if (end >= self.counterLength) { + return -1; + } + + int maxBar = 0; + int minBar = INT_MAX; + for (int j = position; j < end; j += 2) { + int currentCounter = array[j]; + if (currentCounter < minBar) { + minBar = currentCounter; + } + if (currentCounter > maxBar) { + maxBar = currentCounter; + } + } + int thresholdBar = (minBar + maxBar) / 2; + + int maxSpace = 0; + int minSpace = INT_MAX; + for (int j = position + 1; j < end; j += 2) { + int currentCounter = array[j]; + if (currentCounter < minSpace) { + minSpace = currentCounter; + } + if (currentCounter > maxSpace) { + maxSpace = currentCounter; + } + } + int thresholdSpace = (minSpace + maxSpace) / 2; + + int bitmask = 1 << 7; + int pattern = 0; + for (int i = 0; i < 7; i++) { + int threshold = (i & 1) == 0 ? thresholdBar : thresholdSpace; + bitmask >>= 1; + if (array[position + i] > threshold) { + pattern |= bitmask; + } + } + + for (int i = 0; i < sizeof(ZX_CODA_CHARACTER_ENCODINGS) / sizeof(int); i++) { + if (ZX_CODA_CHARACTER_ENCODINGS[i] == pattern) { + return i; + } + } + return -1; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.h new file mode 100644 index 0000000..c28a007 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDimensionalCodeWriter.h" + +/** + * This class renders CodaBar as ZXBoolArray. + */ +@interface ZXCodaBarWriter : ZXOneDimensionalCodeWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.m new file mode 100644 index 0000000..20f5d9b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.m @@ -0,0 +1,140 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBoolArray.h" +#import "ZXCodaBarReader.h" +#import "ZXCodaBarWriter.h" + +const unichar ZX_CODA_START_END_CHARS[] = {'A', 'B', 'C', 'D'}; +const unichar ZX_CODA_ALT_START_END_CHARS[] = {'T', 'N', '*', 'E'}; +const unichar ZX_CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED[] = {'/', ':', '+', '.'}; +static unichar ZX_CODA_DEFAULT_GUARD; + +@implementation ZXCodaBarWriter + ++ (void)initialize { + if ([self class] != [ZXCodaBarWriter class]) return; + + ZX_CODA_DEFAULT_GUARD = ZX_CODA_START_END_CHARS[0]; +} + +- (ZXBoolArray *)encode:(NSString *)contents { + if ([contents length] < 2) { + // Can't have a start/end guard, so tentatively add default guards + contents = [NSString stringWithFormat:@"%C%@%C", ZX_CODA_DEFAULT_GUARD, contents, ZX_CODA_DEFAULT_GUARD]; + } else { + // Verify input and calculate decoded length. + unichar firstChar = [[contents uppercaseString] characterAtIndex:0]; + unichar lastChar = [[contents uppercaseString] characterAtIndex:contents.length - 1]; + BOOL startsNormal = [ZXCodaBarReader arrayContains:ZX_CODA_START_END_CHARS length:sizeof(ZX_CODA_START_END_CHARS) / sizeof(unichar) key:firstChar]; + BOOL endsNormal = [ZXCodaBarReader arrayContains:ZX_CODA_START_END_CHARS length:sizeof(ZX_CODA_START_END_CHARS) / sizeof(unichar) key:lastChar]; + BOOL startsAlt = [ZXCodaBarReader arrayContains:ZX_CODA_ALT_START_END_CHARS length:sizeof(ZX_CODA_ALT_START_END_CHARS) / sizeof(unichar) key:firstChar]; + BOOL endsAlt = [ZXCodaBarReader arrayContains:ZX_CODA_ALT_START_END_CHARS length:sizeof(ZX_CODA_ALT_START_END_CHARS) / sizeof(unichar) key:lastChar]; + if (startsNormal) { + if (!endsNormal) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Invalid start/end guards: %@", contents] + userInfo:nil]; + } + // else already has valid start/end + } else if (startsAlt) { + if (!endsAlt) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Invalid start/end guards: %@", contents] + userInfo:nil]; + } + // else already has valid start/end + } else { + // Doesn't start with a guard + if (endsNormal || endsAlt) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Invalid start/end guards: %@", contents] + userInfo:nil]; + } + // else doesn't end with guard either, so add a default + contents = [NSString stringWithFormat:@"%C%@%C", ZX_CODA_DEFAULT_GUARD, contents, ZX_CODA_DEFAULT_GUARD]; + } + } + + // The start character and the end character are decoded to 10 length each. + int resultLength = 20; + for (int i = 1; i < contents.length - 1; i++) { + if (([contents characterAtIndex:i] >= '0' && [contents characterAtIndex:i] <= '9') || + [contents characterAtIndex:i] == '-' || [contents characterAtIndex:i] == '$') { + resultLength += 9; + } else if ([ZXCodaBarReader arrayContains:ZX_CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED length:4 key:[contents characterAtIndex:i]]) { + resultLength += 10; + } else { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Cannot encode : '%C'", [contents characterAtIndex:i]] + userInfo:nil]; + } + } + // A blank is placed between each character. + resultLength += contents.length - 1; + + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:resultLength]; + int position = 0; + for (int index = 0; index < contents.length; index++) { + unichar c = [[contents uppercaseString] characterAtIndex:index]; + if (index == 0 || index == contents.length - 1) { + // The start/end chars are not in the CodaBarReader.ALPHABET. + switch (c) { + case 'T': + c = 'A'; + break; + case 'N': + c = 'B'; + break; + case '*': + c = 'C'; + break; + case 'E': + c = 'D'; + break; + } + } + int code = 0; + for (int i = 0; i < ZX_CODA_ALPHABET_LEN; i++) { + // Found any, because I checked above. + if (c == ZX_CODA_ALPHABET[i]) { + code = ZX_CODA_CHARACTER_ENCODINGS[i]; + break; + } + } + BOOL color = YES; + int counter = 0; + int bit = 0; + while (bit < 7) { // A character consists of 7 digit. + result.array[position] = color; + position++; + if (((code >> (6 - bit)) & 1) == 0 || counter == 1) { + color = !color; // Flip the color. + bit++; + counter = 0; + } else { + counter++; + } + } + if (index < contents.length - 1) { + result.array[position] = NO; + position++; + } + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.h new file mode 100644 index 0000000..ff0a0c8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.h @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +extern const int ZX_CODE128_CODE_PATTERNS[][7]; + +extern const int ZX_CODE128_CODE_START_B; +extern const int ZX_CODE128_CODE_START_C; +extern const int ZX_CODE128_CODE_CODE_B; +extern const int ZX_CODE128_CODE_CODE_C; +extern const int ZX_CODE128_CODE_STOP; + +extern const int ZX_CODE128_CODE_FNC_1; +extern const int ZX_CODE128_CODE_FNC_2; +extern const int ZX_CODE128_CODE_FNC_3; +extern const int ZX_CODE128_CODE_FNC_4_A; +extern const int ZX_CODE128_CODE_FNC_4_B; + +@class ZXDecodeHints, ZXResult; + +/** + * Decodes Code 128 barcodes. + */ +@interface ZXCode128Reader : ZXOneDReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.m new file mode 100644 index 0000000..90d2574 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.m @@ -0,0 +1,534 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXByteArray.h" +#import "ZXCode128Reader.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXOneDReader.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +const int ZX_CODE128_CODE_PATTERNS_LEN = 107; +const int ZX_CODE128_CODE_PATTERNS[ZX_CODE128_CODE_PATTERNS_LEN][7] = { + {2, 1, 2, 2, 2, 2}, // 0 + {2, 2, 2, 1, 2, 2}, + {2, 2, 2, 2, 2, 1}, + {1, 2, 1, 2, 2, 3}, + {1, 2, 1, 3, 2, 2}, + {1, 3, 1, 2, 2, 2}, // 5 + {1, 2, 2, 2, 1, 3}, + {1, 2, 2, 3, 1, 2}, + {1, 3, 2, 2, 1, 2}, + {2, 2, 1, 2, 1, 3}, + {2, 2, 1, 3, 1, 2}, // 10 + {2, 3, 1, 2, 1, 2}, + {1, 1, 2, 2, 3, 2}, + {1, 2, 2, 1, 3, 2}, + {1, 2, 2, 2, 3, 1}, + {1, 1, 3, 2, 2, 2}, // 15 + {1, 2, 3, 1, 2, 2}, + {1, 2, 3, 2, 2, 1}, + {2, 2, 3, 2, 1, 1}, + {2, 2, 1, 1, 3, 2}, + {2, 2, 1, 2, 3, 1}, // 20 + {2, 1, 3, 2, 1, 2}, + {2, 2, 3, 1, 1, 2}, + {3, 1, 2, 1, 3, 1}, + {3, 1, 1, 2, 2, 2}, + {3, 2, 1, 1, 2, 2}, // 25 + {3, 2, 1, 2, 2, 1}, + {3, 1, 2, 2, 1, 2}, + {3, 2, 2, 1, 1, 2}, + {3, 2, 2, 2, 1, 1}, + {2, 1, 2, 1, 2, 3}, // 30 + {2, 1, 2, 3, 2, 1}, + {2, 3, 2, 1, 2, 1}, + {1, 1, 1, 3, 2, 3}, + {1, 3, 1, 1, 2, 3}, + {1, 3, 1, 3, 2, 1}, // 35 + {1, 1, 2, 3, 1, 3}, + {1, 3, 2, 1, 1, 3}, + {1, 3, 2, 3, 1, 1}, + {2, 1, 1, 3, 1, 3}, + {2, 3, 1, 1, 1, 3}, // 40 + {2, 3, 1, 3, 1, 1}, + {1, 1, 2, 1, 3, 3}, + {1, 1, 2, 3, 3, 1}, + {1, 3, 2, 1, 3, 1}, + {1, 1, 3, 1, 2, 3}, // 45 + {1, 1, 3, 3, 2, 1}, + {1, 3, 3, 1, 2, 1}, + {3, 1, 3, 1, 2, 1}, + {2, 1, 1, 3, 3, 1}, + {2, 3, 1, 1, 3, 1}, // 50 + {2, 1, 3, 1, 1, 3}, + {2, 1, 3, 3, 1, 1}, + {2, 1, 3, 1, 3, 1}, + {3, 1, 1, 1, 2, 3}, + {3, 1, 1, 3, 2, 1}, // 55 + {3, 3, 1, 1, 2, 1}, + {3, 1, 2, 1, 1, 3}, + {3, 1, 2, 3, 1, 1}, + {3, 3, 2, 1, 1, 1}, + {3, 1, 4, 1, 1, 1}, // 60 + {2, 2, 1, 4, 1, 1}, + {4, 3, 1, 1, 1, 1}, + {1, 1, 1, 2, 2, 4}, + {1, 1, 1, 4, 2, 2}, + {1, 2, 1, 1, 2, 4}, // 65 + {1, 2, 1, 4, 2, 1}, + {1, 4, 1, 1, 2, 2}, + {1, 4, 1, 2, 2, 1}, + {1, 1, 2, 2, 1, 4}, + {1, 1, 2, 4, 1, 2}, // 70 + {1, 2, 2, 1, 1, 4}, + {1, 2, 2, 4, 1, 1}, + {1, 4, 2, 1, 1, 2}, + {1, 4, 2, 2, 1, 1}, + {2, 4, 1, 2, 1, 1}, // 75 + {2, 2, 1, 1, 1, 4}, + {4, 1, 3, 1, 1, 1}, + {2, 4, 1, 1, 1, 2}, + {1, 3, 4, 1, 1, 1}, + {1, 1, 1, 2, 4, 2}, // 80 + {1, 2, 1, 1, 4, 2}, + {1, 2, 1, 2, 4, 1}, + {1, 1, 4, 2, 1, 2}, + {1, 2, 4, 1, 1, 2}, + {1, 2, 4, 2, 1, 1}, // 85 + {4, 1, 1, 2, 1, 2}, + {4, 2, 1, 1, 1, 2}, + {4, 2, 1, 2, 1, 1}, + {2, 1, 2, 1, 4, 1}, + {2, 1, 4, 1, 2, 1}, // 90 + {4, 1, 2, 1, 2, 1}, + {1, 1, 1, 1, 4, 3}, + {1, 1, 1, 3, 4, 1}, + {1, 3, 1, 1, 4, 1}, + {1, 1, 4, 1, 1, 3}, // 95 + {1, 1, 4, 3, 1, 1}, + {4, 1, 1, 1, 1, 3}, + {4, 1, 1, 3, 1, 1}, + {1, 1, 3, 1, 4, 1}, + {1, 1, 4, 1, 3, 1}, // 100 + {3, 1, 1, 1, 4, 1}, + {4, 1, 1, 1, 3, 1}, + {2, 1, 1, 4, 1, 2}, + {2, 1, 1, 2, 1, 4}, + {2, 1, 1, 2, 3, 2}, // 105 + {2, 3, 3, 1, 1, 1, 2} +}; + +static float ZX_CODE128_MAX_AVG_VARIANCE = 0.25f; +static float ZX_CODE128_MAX_INDIVIDUAL_VARIANCE = 0.7f; + +const int ZX_CODE128_CODE_SHIFT = 98; +const int ZX_CODE128_CODE_CODE_C = 99; +const int ZX_CODE128_CODE_CODE_B = 100; +const int ZX_CODE128_CODE_CODE_A = 101; +const int ZX_CODE128_CODE_FNC_1 = 102; +const int ZX_CODE128_CODE_FNC_2 = 97; +const int ZX_CODE128_CODE_FNC_3 = 96; +const int ZX_CODE128_CODE_FNC_4_A = 101; +const int ZX_CODE128_CODE_FNC_4_B = 100; +const int ZX_CODE128_CODE_START_A = 103; +const int ZX_CODE128_CODE_START_B = 104; +const int ZX_CODE128_CODE_START_C = 105; +const int ZX_CODE128_CODE_STOP = 106; + +@implementation ZXCode128Reader + +- (ZXIntArray *)findStartPattern:(ZXBitArray *)row { + int width = row.size; + int rowOffset = [row nextSet:0]; + + int counterPosition = 0; + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:6]; + int32_t *array = counters.array; + int patternStart = rowOffset; + BOOL isWhite = NO; + int patternLength = (int)counters.length; + + for (int i = rowOffset; i < width; i++) { + if ([row get:i] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + float bestVariance = ZX_CODE128_MAX_AVG_VARIANCE; + int bestMatch = -1; + for (int startCode = ZX_CODE128_CODE_START_A; startCode <= ZX_CODE128_CODE_START_C; startCode++) { + float variance = [ZXOneDReader patternMatchVariance:counters pattern:ZX_CODE128_CODE_PATTERNS[startCode] maxIndividualVariance:ZX_CODE128_MAX_INDIVIDUAL_VARIANCE]; + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = startCode; + } + } + // Look for whitespace before start pattern, >= 50% of width of start pattern + if (bestMatch >= 0 && + [row isRange:MAX(0, patternStart - (i - patternStart) / 2) end:patternStart value:NO]) { + return [[ZXIntArray alloc] initWithInts:patternStart, i, bestMatch, -1]; + } + patternStart += array[0] + array[1]; + for (int y = 2; y < patternLength; y++) { + array[y - 2] = array[y]; + } + array[patternLength - 2] = 0; + array[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + return nil; +} + +- (int)decodeCode:(ZXBitArray *)row counters:(ZXIntArray *)counters rowOffset:(int)rowOffset { + if (![ZXOneDReader recordPattern:row start:rowOffset counters:counters]) { + return -1; + } + float bestVariance = ZX_CODE128_MAX_AVG_VARIANCE; + int bestMatch = -1; + + for (int d = 0; d < ZX_CODE128_CODE_PATTERNS_LEN; d++) { + float variance = [ZXOneDReader patternMatchVariance:counters pattern:ZX_CODE128_CODE_PATTERNS[d] maxIndividualVariance:ZX_CODE128_MAX_INDIVIDUAL_VARIANCE]; + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = d; + } + } + + if (bestMatch >= 0) { + return bestMatch; + } else { + return -1; + } +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + BOOL convertFNC1 = hints && hints.assumeGS1; + + ZXIntArray *startPatternInfo = [self findStartPattern:row]; + if (!startPatternInfo) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + int startCode = startPatternInfo.array[2]; + int codeSet; + + NSMutableArray *rawCodes = [NSMutableArray arrayWithObject:@(startCode)]; + + switch (startCode) { + case ZX_CODE128_CODE_START_A: + codeSet = ZX_CODE128_CODE_CODE_A; + break; + case ZX_CODE128_CODE_START_B: + codeSet = ZX_CODE128_CODE_CODE_B; + break; + case ZX_CODE128_CODE_START_C: + codeSet = ZX_CODE128_CODE_CODE_C; + break; + default: + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + BOOL done = NO; + BOOL isNextShifted = NO; + + NSMutableString *result = [NSMutableString stringWithCapacity:20]; + + int lastStart = startPatternInfo.array[0]; + int nextStart = startPatternInfo.array[1]; + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:6]; + + int lastCode = 0; + int code = 0; + int checksumTotal = startCode; + int multiplier = 0; + BOOL lastCharacterWasPrintable = YES; + BOOL upperMode = NO; + BOOL shiftUpperMode = NO; + + while (!done) { + BOOL unshift = isNextShifted; + isNextShifted = NO; + + // Save off last code + lastCode = code; + + // Decode another code from image + code = [self decodeCode:row counters:counters rowOffset:nextStart]; + if (code == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + [rawCodes addObject:@(code)]; + + // Remember whether the last code was printable or not (excluding ZX_CODE128_CODE_STOP) + if (code != ZX_CODE128_CODE_STOP) { + lastCharacterWasPrintable = YES; + } + + // Add to checksum computation (if not ZX_CODE128_CODE_STOP of course) + if (code != ZX_CODE128_CODE_STOP) { + multiplier++; + checksumTotal += multiplier * code; + } + + // Advance to where the next code will to start + lastStart = nextStart; + nextStart += [counters sum]; + + // Take care of illegal start codes + switch (code) { + case ZX_CODE128_CODE_START_A: + case ZX_CODE128_CODE_START_B: + case ZX_CODE128_CODE_START_C: + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + switch (codeSet) { + case ZX_CODE128_CODE_CODE_A: + if (code < 64) { + if (shiftUpperMode == upperMode) { + [result appendFormat:@"%C", (unichar)(' ' + code)]; + } else { + [result appendFormat:@"%C", (unichar)(' ' + code + 128)]; + } + shiftUpperMode = NO; + } else if (code < 96) { + if (shiftUpperMode == upperMode) { + [result appendFormat:@"%C", (unichar)(code - 64)]; + } else { + [result appendFormat:@"%C", (unichar)(code + 64)]; + } + shiftUpperMode = NO; + } else { + // Don't let CODE_STOP, which always appears, affect whether whether we think the last + // code was printable or not. + if (code != ZX_CODE128_CODE_STOP) { + lastCharacterWasPrintable = NO; + } + + switch (code) { + case ZX_CODE128_CODE_FNC_1: + if (convertFNC1) { + if (result.length == 0) { + // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code + // is FNC1 then this is GS1-128. We add the symbology identifier. + [result appendString:@"]C1"]; + } else { + // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) + [result appendFormat:@"%C", (unichar) 29]; + } + } + break; + case ZX_CODE128_CODE_FNC_2: + case ZX_CODE128_CODE_FNC_3: + // do nothing? + break; + case ZX_CODE128_CODE_FNC_4_A: + if (!upperMode && shiftUpperMode) { + upperMode = YES; + shiftUpperMode = NO; + } else if (upperMode && shiftUpperMode) { + upperMode = NO; + shiftUpperMode = NO; + } else { + shiftUpperMode = YES; + } + break; + case ZX_CODE128_CODE_SHIFT: + isNextShifted = YES; + codeSet = ZX_CODE128_CODE_CODE_B; + break; + case ZX_CODE128_CODE_CODE_B: + codeSet = ZX_CODE128_CODE_CODE_B; + break; + case ZX_CODE128_CODE_CODE_C: + codeSet = ZX_CODE128_CODE_CODE_C; + break; + case ZX_CODE128_CODE_STOP: + done = YES; + break; + } + } + break; + case ZX_CODE128_CODE_CODE_B: + if (code < 96) { + if (shiftUpperMode == upperMode) { + [result appendFormat:@"%C", (unichar)(' ' + code)]; + } else { + [result appendFormat:@"%C", (unichar)(' ' + code + 128)]; + } + shiftUpperMode = NO; + } else { + if (code != ZX_CODE128_CODE_STOP) { + lastCharacterWasPrintable = NO; + } + + switch (code) { + case ZX_CODE128_CODE_FNC_1: + if (convertFNC1) { + if (result.length == 0) { + // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code + // is FNC1 then this is GS1-128. We add the symbology identifier. + [result appendString:@"]C1"]; + } else { + // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) + [result appendFormat:@"%C", (unichar) 29]; + } + } + break; + case ZX_CODE128_CODE_FNC_2: + case ZX_CODE128_CODE_FNC_3: + // do nothing? + break; + case ZX_CODE128_CODE_FNC_4_B: + if (!upperMode && shiftUpperMode) { + upperMode = YES; + shiftUpperMode = NO; + } else if (upperMode && shiftUpperMode) { + upperMode = NO; + shiftUpperMode = NO; + } else { + shiftUpperMode = YES; + } + break; + case ZX_CODE128_CODE_SHIFT: + isNextShifted = YES; + codeSet = ZX_CODE128_CODE_CODE_A; + break; + case ZX_CODE128_CODE_CODE_A: + codeSet = ZX_CODE128_CODE_CODE_A; + break; + case ZX_CODE128_CODE_CODE_C: + codeSet = ZX_CODE128_CODE_CODE_C; + break; + case ZX_CODE128_CODE_STOP: + done = YES; + break; + } + } + break; + case ZX_CODE128_CODE_CODE_C: + if (code < 100) { + if (code < 10) { + [result appendString:@"0"]; + } + [result appendFormat:@"%d", code]; + } else { + if (code != ZX_CODE128_CODE_STOP) { + lastCharacterWasPrintable = NO; + } + + switch (code) { + case ZX_CODE128_CODE_FNC_1: + if (convertFNC1) { + if (result.length == 0) { + // GS1 specification 5.4.3.7. and 5.4.6.4. If the first char after the start code + // is FNC1 then this is GS1-128. We add the symbology identifier. + [result appendString:@"]C1"]; + } else { + // GS1 specification 5.4.7.5. Every subsequent FNC1 is returned as ASCII 29 (GS) + [result appendFormat:@"%C", (unichar) 29]; + } + } + break; + case ZX_CODE128_CODE_CODE_A: + codeSet = ZX_CODE128_CODE_CODE_A; + break; + case ZX_CODE128_CODE_CODE_B: + codeSet = ZX_CODE128_CODE_CODE_B; + break; + case ZX_CODE128_CODE_STOP: + done = YES; + break; + } + } + break; + } + + // Unshift back to another code set if we were shifted + if (unshift) { + codeSet = codeSet == ZX_CODE128_CODE_CODE_A ? ZX_CODE128_CODE_CODE_B : ZX_CODE128_CODE_CODE_A; + } + } + + int lastPatternSize = nextStart - lastStart; + + // Check for ample whitespace following pattern, but, to do this we first need to remember that + // we fudged decoding CODE_STOP since it actually has 7 bars, not 6. There is a black bar left + // to read off. Would be slightly better to properly read. Here we just skip it: + nextStart = [row nextUnset:nextStart]; + if (![row isRange:nextStart end:MIN(row.size, nextStart + (nextStart - lastStart) / 2) value:NO]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // Pull out from sum the value of the penultimate check code + checksumTotal -= multiplier * lastCode; + // lastCode is the checksum then: + if (checksumTotal % 103 != lastCode) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + + // Need to pull out the check digits from string + NSUInteger resultLength = [result length]; + if (resultLength == 0) { + // false positive + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + // Only bother if the result had at least one character, and if the checksum digit happened to + // be a printable character. If it was just interpreted as a control code, nothing to remove. + if (resultLength > 0 && lastCharacterWasPrintable) { + if (codeSet == ZX_CODE128_CODE_CODE_C) { + [result deleteCharactersInRange:NSMakeRange(resultLength - 2, 2)]; + } else { + [result deleteCharactersInRange:NSMakeRange(resultLength - 1, 1)]; + } + } + + float left = (float)(startPatternInfo.array[1] + startPatternInfo.array[0]) / 2.0f; + float right = lastStart + lastPatternSize / 2.0f; + + NSUInteger rawCodesSize = [rawCodes count]; + ZXByteArray *rawBytes = [[ZXByteArray alloc] initWithLength:(unsigned int)rawCodesSize]; + for (int i = 0; i < rawCodesSize; i++) { + rawBytes.array[i] = (int8_t)[rawCodes[i] intValue]; + } + + return [ZXResult resultWithText:result + rawBytes:rawBytes + resultPoints:@[[[ZXResultPoint alloc] initWithX:left y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:right y:(float)rowNumber]] + format:kBarcodeFormatCode128]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.h new file mode 100644 index 0000000..61a3949 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDimensionalCodeWriter.h" + +/** + * This object renders a CODE128 code as a ZXBitMatrix. + */ +@interface ZXCode128Writer : ZXOneDimensionalCodeWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.m new file mode 100644 index 0000000..77656c7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.m @@ -0,0 +1,188 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBoolArray.h" +#import "ZXCode128Reader.h" +#import "ZXCode128Writer.h" + +// Dummy characters used to specify control characters in input +const unichar ZX_CODE128_ESCAPE_FNC_1 = L'\u00f1'; +const unichar ZX_CODE128_ESCAPE_FNC_2 = L'\u00f2'; +const unichar ZX_CODE128_ESCAPE_FNC_3 = L'\u00f3'; +const unichar ZX_CODE128_ESCAPE_FNC_4 = L'\u00f4'; + +@implementation ZXCode128Writer + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatCode128) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode CODE_128"]; + } + return [super encode:contents format:format width:width height:height hints:hints error:error]; +} + +- (ZXBoolArray *)encode:(NSString *)contents { + int length = (int)[contents length]; + // Check length + if (length < 1 || length > 80) { + [NSException raise:NSInvalidArgumentException format:@"Contents length should be between 1 and 80 characters, but got %d", length]; + } + // Check content + for (int i = 0; i < length; i++) { + unichar c = [contents characterAtIndex:i]; + if (c < ' ' || c > '~') { + switch (c) { + case ZX_CODE128_ESCAPE_FNC_1: + case ZX_CODE128_ESCAPE_FNC_2: + case ZX_CODE128_ESCAPE_FNC_3: + case ZX_CODE128_ESCAPE_FNC_4: + break; + default: + [NSException raise:NSInvalidArgumentException format:@"Bad character in input: %C", c]; + } + } + } + + NSMutableArray *patterns = [NSMutableArray array]; // temporary storage for patterns + int checkSum = 0; + int checkWeight = 1; + int codeSet = 0; // selected code (CODE_CODE_B or CODE_CODE_C) + int position = 0; // position in contents + + while (position < length) { + //Select code to use + int requiredDigitCount = codeSet == ZX_CODE128_CODE_CODE_C ? 2 : 4; + int newCodeSet; + if ([self isDigits:contents start:position length:requiredDigitCount]) { + newCodeSet = ZX_CODE128_CODE_CODE_C; + } else { + newCodeSet = ZX_CODE128_CODE_CODE_B; + } + + //Get the pattern index + int patternIndex; + if (newCodeSet == codeSet) { + // Encode the current character + // First handle escapes + switch ([contents characterAtIndex:position]) { + case ZX_CODE128_ESCAPE_FNC_1: + patternIndex = ZX_CODE128_CODE_FNC_1; + break; + case ZX_CODE128_ESCAPE_FNC_2: + patternIndex = ZX_CODE128_CODE_FNC_2; + break; + case ZX_CODE128_ESCAPE_FNC_3: + patternIndex = ZX_CODE128_CODE_FNC_3; + break; + case ZX_CODE128_ESCAPE_FNC_4: + patternIndex = ZX_CODE128_CODE_FNC_4_B; // FIXME if this ever outputs Code A + break; + default: + // Then handle normal characters otherwise + if (codeSet == ZX_CODE128_CODE_CODE_B) { + patternIndex = [contents characterAtIndex:position] - ' '; + } else { // CODE_CODE_C + patternIndex = [[contents substringWithRange:NSMakeRange(position, 2)] intValue]; + position++; // Also incremented below + } + } + position++; + } else { + // Should we change the current code? + // Do we have a code set? + if (codeSet == 0) { + // No, we don't have a code set + if (newCodeSet == ZX_CODE128_CODE_CODE_B) { + patternIndex = ZX_CODE128_CODE_START_B; + } else { + // CODE_CODE_C + patternIndex = ZX_CODE128_CODE_START_C; + } + } else { + // Yes, we have a code set + patternIndex = newCodeSet; + } + codeSet = newCodeSet; + } + + // Get the pattern + NSMutableArray *pattern = [NSMutableArray array]; + for (int i = 0; i < sizeof(ZX_CODE128_CODE_PATTERNS[patternIndex]) / sizeof(int); i++) { + [pattern addObject:@(ZX_CODE128_CODE_PATTERNS[patternIndex][i])]; + } + [patterns addObject:pattern]; + + // Compute checksum + checkSum += patternIndex * checkWeight; + if (position != 0) { + checkWeight++; + } + } + + // Compute and append checksum + checkSum %= 103; + NSMutableArray *pattern = [NSMutableArray array]; + for (int i = 0; i < sizeof(ZX_CODE128_CODE_PATTERNS[checkSum]) / sizeof(int); i++) { + [pattern addObject:@(ZX_CODE128_CODE_PATTERNS[checkSum][i])]; + } + [patterns addObject:pattern]; + + // Append stop code + pattern = [NSMutableArray array]; + for (int i = 0; i < sizeof(ZX_CODE128_CODE_PATTERNS[ZX_CODE128_CODE_STOP]) / sizeof(int); i++) { + [pattern addObject:@(ZX_CODE128_CODE_PATTERNS[ZX_CODE128_CODE_STOP][i])]; + } + [patterns addObject:pattern]; + + // Compute code width + int codeWidth = 0; + for (pattern in patterns) { + for (int i = 0; i < pattern.count; i++) { + codeWidth += [pattern[i] intValue]; + } + } + + // Compute result + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:codeWidth]; + int pos = 0; + for (NSArray *patternArray in patterns) { + int patternLen = (int)[patternArray count]; + int pattern[patternLen]; + for (int i = 0; i < patternLen; i++) { + pattern[i] = [patternArray[i] intValue]; + } + + pos += [self appendPattern:result pos:pos pattern:pattern patternLen:patternLen startColor:YES]; + } + + return result; +} + +- (BOOL)isDigits:(NSString *)value start:(int)start length:(unsigned int)length { + int end = start + length; + int last = (int)[value length]; + for (int i = start; i < end && i < last; i++) { + unichar c = [value characterAtIndex:i]; + if (c < '0' || c > '9') { + if (c != ZX_CODE128_ESCAPE_FNC_1) { + return NO; + } + end++; // ignore FNC_1 + } + } + return end <= last; // end > last if we've run out of string +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.h new file mode 100644 index 0000000..d621148 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.h @@ -0,0 +1,57 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +extern unichar ZX_CODE39_ALPHABET[]; +extern NSString *ZX_CODE39_ALPHABET_STRING; +extern const int ZX_CODE39_CHARACTER_ENCODINGS[]; + +@class ZXDecodeHints, ZXResult; + +/** + * Decodes Code 39 barcodes. This does not support "Full ASCII Code 39" yet. + */ +@interface ZXCode39Reader : ZXOneDReader + +/** + * Creates a reader that assumes all encoded data is data, and does not treat the final + * character as a check digit. It will not decoded "extended Code 39" sequences. + */ +- (id)init; + +/** + * Creates a reader that can be configured to check the last character as a check digit. + * It will not decoded "extended Code 39" sequences. + * + * @param usingCheckDigit if true, treat the last data character as a check digit, not + * data, and verify that the checksum passes. + */ +- (id)initUsingCheckDigit:(BOOL)usingCheckDigit; + +/** + * Creates a reader that can be configured to check the last character as a check digit, + * or optionally attempt to decode "extended Code 39" sequences that are used to encode + * the full ASCII character set. + * + * @param usingCheckDigit if true, treat the last data character as a check digit, not + * data, and verify that the checksum passes. + * @param extendedMode if true, will attempt to decode extended Code 39 sequences in the + * text. + */ +- (id)initUsingCheckDigit:(BOOL)usingCheckDigit extendedMode:(BOOL)extendedMode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.m new file mode 100644 index 0000000..944a390 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.m @@ -0,0 +1,310 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXCode39Reader.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +unichar ZX_CODE39_ALPHABET[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'}; +NSString *ZX_CODE39_ALPHABET_STRING = nil; + + +/** + * These represent the encodings of characters, as patterns of wide and narrow bars. + * The 9 least-significant bits of each int correspond to the pattern of wide and narrow, + * with 1s representing "wide" and 0s representing narrow. + */ +const int ZX_CODE39_CHARACTER_ENCODINGS[] = { + 0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, // 0-9 + 0x109, 0x049, 0x148, 0x019, 0x118, 0x058, 0x00D, 0x10C, 0x04C, 0x01C, // A-J + 0x103, 0x043, 0x142, 0x013, 0x112, 0x052, 0x007, 0x106, 0x046, 0x016, // K-T + 0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x085, 0x184, 0x0C4, 0x094, // U-* + 0x0A8, 0x0A2, 0x08A, 0x02A // $-% +}; + +const int ZX_CODE39_ASTERISK_ENCODING = 0x094; + +@interface ZXCode39Reader () + +@property (nonatomic, assign, readonly) BOOL extendedMode; +@property (nonatomic, assign, readonly) BOOL usingCheckDigit; +@property (nonatomic, strong, readonly) ZXIntArray *counters; + +@end + +@implementation ZXCode39Reader + ++ (void)load { + ZX_CODE39_ALPHABET_STRING = [[NSString alloc] initWithCharacters:ZX_CODE39_ALPHABET + length:sizeof(ZX_CODE39_ALPHABET) / sizeof(unichar)]; +} + +- (id)init { + return [self initUsingCheckDigit:NO extendedMode:NO]; +} + +- (id)initUsingCheckDigit:(BOOL)isUsingCheckDigit { + return [self initUsingCheckDigit:isUsingCheckDigit extendedMode:NO]; +} + +- (id)initUsingCheckDigit:(BOOL)usingCheckDigit extendedMode:(BOOL)extendedMode { + if (self = [super init]) { + _usingCheckDigit = usingCheckDigit; + _extendedMode = extendedMode; + _counters = [[ZXIntArray alloc] initWithLength:9]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXIntArray *theCounters = self.counters; + [theCounters clear]; + NSMutableString *result = [NSMutableString stringWithCapacity:20]; + + ZXIntArray *start = [self findAsteriskPattern:row counters:theCounters]; + if (!start) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + // Read off white space + int nextStart = [row nextSet:start.array[1]]; + int end = [row size]; + + unichar decodedChar; + int lastStart; + do { + if (![ZXOneDReader recordPattern:row start:nextStart counters:theCounters]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + int pattern = [self toNarrowWidePattern:theCounters]; + if (pattern < 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + decodedChar = [self patternToChar:pattern]; + if (decodedChar == 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + [result appendFormat:@"%C", decodedChar]; + lastStart = nextStart; + for (int i = 0; i < theCounters.length; i++) { + nextStart += theCounters.array[i]; + } + // Read off white space + nextStart = [row nextSet:nextStart]; + } while (decodedChar != '*'); + [result deleteCharactersInRange:NSMakeRange([result length] - 1, 1)]; + + int lastPatternSize = 0; + for (int i = 0; i < theCounters.length; i++) { + lastPatternSize += theCounters.array[i]; + } + int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; + if (nextStart != end && (whiteSpaceAfterEnd * 2) < lastPatternSize) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if (self.usingCheckDigit) { + int max = (int)[result length] - 1; + int total = 0; + for (int i = 0; i < max; i++) { + total += [ZX_CODE39_ALPHABET_STRING rangeOfString:[result substringWithRange:NSMakeRange(i, 1)]].location; + } + if ([result characterAtIndex:max] != ZX_CODE39_ALPHABET[total % 43]) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + [result deleteCharactersInRange:NSMakeRange(max, 1)]; + } + + if ([result length] == 0) { + // false positive + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSString *resultString; + if (self.extendedMode) { + resultString = [self decodeExtended:result]; + if (!resultString) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else { + resultString = result; + } + + float left = (float) (start.array[1] + start.array[0]) / 2.0f; + float right = (lastStart + lastPatternSize) / 2.0f; + + return [ZXResult resultWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:left y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:right y:(float)rowNumber]] + format:kBarcodeFormatCode39]; +} + +- (ZXIntArray *)findAsteriskPattern:(ZXBitArray *)row counters:(ZXIntArray *)counters { + int width = row.size; + int rowOffset = [row nextSet:0]; + + int counterPosition = 0; + int patternStart = rowOffset; + BOOL isWhite = NO; + int patternLength = counters.length; + int32_t *array = counters.array; + + for (int i = rowOffset; i < width; i++) { + if ([row get:i] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if ([self toNarrowWidePattern:counters] == ZX_CODE39_ASTERISK_ENCODING && + [row isRange:MAX(0, patternStart - ((i - patternStart) / 2)) end:patternStart value:NO]) { + return [[ZXIntArray alloc] initWithInts:patternLength, i, -1]; + } + patternStart += array[0] + array[1]; + for (int y = 2; y < counters.length; y++) { + array[y - 2] = array[y]; + } + array[patternLength - 2] = 0; + array[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + return nil; +} + +- (int)toNarrowWidePattern:(ZXIntArray *)counters { + int numCounters = counters.length; + int maxNarrowCounter = 0; + int wideCounters; + do { + int minCounter = INT_MAX; + int32_t *array = counters.array; + for (int i = 0; i < numCounters; i++) { + int counter = array[i]; + if (counter < minCounter && counter > maxNarrowCounter) { + minCounter = counter; + } + } + maxNarrowCounter = minCounter; + wideCounters = 0; + int totalWideCountersWidth = 0; + int pattern = 0; + for (int i = 0; i < numCounters; i++) { + int counter = array[i]; + if (array[i] > maxNarrowCounter) { + pattern |= 1 << (numCounters - 1 - i); + wideCounters++; + totalWideCountersWidth += counter; + } + } + if (wideCounters == 3) { + for (int i = 0; i < numCounters && wideCounters > 0; i++) { + int counter = array[i]; + if (array[i] > maxNarrowCounter) { + wideCounters--; + if ((counter * 2) >= totalWideCountersWidth) { + return -1; + } + } + } + return pattern; + } + } while (wideCounters > 3); + return -1; +} + +- (unichar)patternToChar:(int)pattern { + for (int i = 0; i < sizeof(ZX_CODE39_CHARACTER_ENCODINGS) / sizeof(int); i++) { + if (ZX_CODE39_CHARACTER_ENCODINGS[i] == pattern) { + return ZX_CODE39_ALPHABET[i]; + } + } + return 0; +} + +- (NSString *)decodeExtended:(NSMutableString *)encoded { + NSUInteger length = [encoded length]; + NSMutableString *decoded = [NSMutableString stringWithCapacity:length]; + + for (int i = 0; i < length; i++) { + unichar c = [encoded characterAtIndex:i]; + if (c == '+' || c == '$' || c == '%' || c == '/') { + unichar next = [encoded characterAtIndex:i + 1]; + unichar decodedChar = '\0'; + + switch (c) { + case '+': + if (next >= 'A' && next <= 'Z') { + decodedChar = (unichar)(next + 32); + } else { + return nil; + } + break; + case '$': + if (next >= 'A' && next <= 'Z') { + decodedChar = (unichar)(next - 64); + } else { + return nil; + } + break; + case '%': + if (next >= 'A' && next <= 'E') { + decodedChar = (unichar)(next - 38); + } else if (next >= 'F' && next <= 'W') { + decodedChar = (unichar)(next - 11); + } else { + return nil; + } + break; + case '/': + if (next >= 'A' && next <= 'O') { + decodedChar = (unichar)(next - 32); + } else if (next == 'Z') { + decodedChar = ':'; + } else { + return nil; + } + break; + } + [decoded appendFormat:@"%C", decodedChar]; + i++; + } else { + [decoded appendFormat:@"%C", c]; + } + } + + return decoded; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.h new file mode 100644 index 0000000..c7b30d7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDimensionalCodeWriter.h" + +/** + * This object renders a CODE39 code as a ZXBitMatrix. + */ +@interface ZXCode39Writer : ZXOneDimensionalCodeWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.m new file mode 100644 index 0000000..6a15037 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.m @@ -0,0 +1,74 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXCode39Reader.h" +#import "ZXCode39Writer.h" +#import "ZXIntArray.h" + +@implementation ZXCode39Writer + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatCode39) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode CODE_39."]; + } + return [super encode:contents format:format width:width height:height hints:hints error:error]; +} + +- (ZXBoolArray *)encode:(NSString *)contents { + int length = (int)[contents length]; + if (length > 80) { + [NSException raise:NSInvalidArgumentException + format:@"Requested contents should be less than 80 digits long, but got %d", length]; + } + + ZXIntArray *widths = [[ZXIntArray alloc] initWithLength:9]; + int codeWidth = 24 + 1 + length; + for (int i = 0; i < length; i++) { + NSUInteger indexInString = [ZX_CODE39_ALPHABET_STRING rangeOfString:[contents substringWithRange:NSMakeRange(i, 1)]].location; + if (indexInString == NSNotFound) { + [NSException raise:NSInvalidArgumentException format:@"Bad contents: %@", contents]; + } + [self toIntArray:ZX_CODE39_CHARACTER_ENCODINGS[indexInString] toReturn:widths]; + codeWidth += [widths sum]; + } + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:codeWidth]; + [self toIntArray:ZX_CODE39_CHARACTER_ENCODINGS[39] toReturn:widths]; + int pos = [self appendPattern:result pos:0 pattern:widths.array patternLen:widths.length startColor:YES]; + ZXIntArray *narrowWhite = [[ZXIntArray alloc] initWithInts:1, -1]; + pos += [self appendPattern:result pos:pos pattern:narrowWhite.array patternLen:narrowWhite.length startColor:NO]; + //append next character to byte matrix + for (int i = 0; i < length; i++) { + NSUInteger indexInString = [ZX_CODE39_ALPHABET_STRING rangeOfString:[contents substringWithRange:NSMakeRange(i, 1)]].location; + [self toIntArray:ZX_CODE39_CHARACTER_ENCODINGS[indexInString] toReturn:widths]; + pos += [self appendPattern:result pos:pos pattern:widths.array patternLen:widths.length startColor:YES]; + pos += [self appendPattern:result pos:pos pattern:narrowWhite.array patternLen:narrowWhite.length startColor:NO]; + } + + [self toIntArray:ZX_CODE39_CHARACTER_ENCODINGS[39] toReturn:widths]; + [self appendPattern:result pos:pos pattern:widths.array patternLen:widths.length startColor:YES]; + return result; +} + +- (void)toIntArray:(int)a toReturn:(ZXIntArray *)toReturn { + for (int i = 0; i < 9; i++) { + int temp = a & (1 << (8 - i)); + toReturn.array[i] = temp == 0 ? 1 : 2; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.h new file mode 100644 index 0000000..e3368f4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +/** + * Decodes Code 93 barcodes. + */ +@interface ZXCode93Reader : ZXOneDReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.m new file mode 100644 index 0000000..7d8be27 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.m @@ -0,0 +1,291 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXCode93Reader.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +NSString *ZX_CODE93_ALPHABET_STRING = nil; +const unichar ZX_CODE93_ALPHABET[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%', 'a', 'b', 'c', 'd', '*'}; + +/** + * These represent the encodings of characters, as patterns of wide and narrow bars. + * The 9 least-significant bits of each int correspond to the pattern of wide and narrow. + */ +const int ZX_CODE93_CHARACTER_ENCODINGS[] = { + 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 + 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J + 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T + 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z + 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % + 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-* +}; + +const int ZX_CODE93_ASTERISK_ENCODING = 0x15E; + +@interface ZXCode93Reader () + +@property (nonatomic, strong, readonly) ZXIntArray *counters; + +@end + +@implementation ZXCode93Reader + ++ (void)initialize { + if ([self class] != [ZXCode93Reader class]) return; + + ZX_CODE93_ALPHABET_STRING = [[NSString alloc] initWithCharacters:ZX_CODE93_ALPHABET + length:sizeof(ZX_CODE93_ALPHABET) / sizeof(unichar)]; +} + +- (id)init { + if (self = [super init]) { + _counters = [[ZXIntArray alloc] initWithLength:6]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXIntArray *start = [self findAsteriskPattern:row]; + if (!start) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + // Read off white space + int nextStart = [row nextSet:start.array[1]]; + int end = row.size; + + ZXIntArray *theCounters = self.counters; + memset(theCounters.array, 0, theCounters.length * sizeof(int32_t)); + NSMutableString *result = [NSMutableString string]; + + unichar decodedChar; + int lastStart; + do { + if (![ZXOneDReader recordPattern:row start:nextStart counters:theCounters]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + int pattern = [self toPattern:theCounters]; + if (pattern < 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + decodedChar = [self patternToChar:pattern]; + if (decodedChar == 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + [result appendFormat:@"%C", decodedChar]; + lastStart = nextStart; + for (int i = 0; i < theCounters.length; i++) { + nextStart += theCounters.array[i]; + } + // Read off white space + nextStart = [row nextSet:nextStart]; + } while (decodedChar != '*'); + [result deleteCharactersInRange:NSMakeRange([result length] - 1, 1)]; // remove asterisk + + int lastPatternSize = [theCounters sum]; + + // Should be at least one more black module + if (nextStart == end || ![row get:nextStart]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if ([result length] < 2) { + // false positive -- need at least 2 checksum digits + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + if (![self checkChecksums:result error:error]) { + return nil; + } + [result deleteCharactersInRange:NSMakeRange([result length] - 2, 2)]; + + NSString *resultString = [self decodeExtended:result]; + if (!resultString) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + float left = (float) (start.array[1] + start.array[0]) / 2.0f; + float right = lastStart + lastPatternSize / 2.0f; + return [ZXResult resultWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:left y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:right y:(float)rowNumber]] + format:kBarcodeFormatCode93]; +} + +- (ZXIntArray *)findAsteriskPattern:(ZXBitArray *)row { + int width = row.size; + int rowOffset = [row nextSet:0]; + + [self.counters clear]; + ZXIntArray *theCounters = self.counters; + int patternStart = rowOffset; + BOOL isWhite = NO; + int patternLength = theCounters.length; + + int counterPosition = 0; + for (int i = rowOffset; i < width; i++) { + if ([row get:i] ^ isWhite) { + theCounters.array[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if ([self toPattern:theCounters] == ZX_CODE93_ASTERISK_ENCODING) { + return [[ZXIntArray alloc] initWithInts:patternStart, i, -1]; + } + patternStart += theCounters.array[0] + theCounters.array[1]; + for (int y = 2; y < patternLength; y++) { + theCounters.array[y - 2] = theCounters.array[y]; + } + theCounters.array[patternLength - 2] = 0; + theCounters.array[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + theCounters.array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + return nil; +} + +- (int)toPattern:(ZXIntArray *)counters { + int max = counters.length; + int sum = [counters sum]; + int32_t *array = counters.array; + int pattern = 0; + for (int i = 0; i < max; i++) { + int scaled = round(array[i] * 9.0f / sum); + if (scaled < 1 || scaled > 4) { + return -1; + } + if ((i & 0x01) == 0) { + for (int j = 0; j < scaled; j++) { + pattern = (pattern << 1) | 0x01; + } + } else { + pattern <<= scaled; + } + } + return pattern; +} + +- (unichar)patternToChar:(int)pattern { + for (int i = 0; i < sizeof(ZX_CODE93_CHARACTER_ENCODINGS) / sizeof(int); i++) { + if (ZX_CODE93_CHARACTER_ENCODINGS[i] == pattern) { + return ZX_CODE93_ALPHABET[i]; + } + } + + return -1; +} + +- (NSString *)decodeExtended:(NSMutableString *)encoded { + NSUInteger length = [encoded length]; + NSMutableString *decoded = [NSMutableString stringWithCapacity:length]; + for (int i = 0; i < length; i++) { + unichar c = [encoded characterAtIndex:i]; + if (c >= 'a' && c <= 'd') { + if (i >= length - 1) { + return nil; + } + unichar next = [encoded characterAtIndex:i + 1]; + unichar decodedChar = '\0'; + switch (c) { + case 'd': + if (next >= 'A' && next <= 'Z') { + decodedChar = (unichar)(next + 32); + } else { + return nil; + } + break; + case 'a': + if (next >= 'A' && next <= 'Z') { + decodedChar = (unichar)(next - 64); + } else { + return nil; + } + break; + case 'b': + if (next >= 'A' && next <= 'E') { + decodedChar = (unichar)(next - 38); + } else if (next >= 'F' && next <= 'W') { + decodedChar = (unichar)(next - 11); + } else { + return nil; + } + break; + case 'c': + if (next >= 'A' && next <= 'O') { + decodedChar = (unichar)(next - 32); + } else if (next == 'Z') { + decodedChar = ':'; + } else { + return nil; + } + break; + } + [decoded appendFormat:@"%C", decodedChar]; + i++; + } else { + [decoded appendFormat:@"%C", c]; + } + } + + return decoded; +} + +- (BOOL)checkChecksums:(NSMutableString *)result error:(NSError **)error { + NSUInteger length = [result length]; + if (![self checkOneChecksum:result checkPosition:(int)length - 2 weightMax:20 error:error]) { + return NO; + } + return [self checkOneChecksum:result checkPosition:(int)length - 1 weightMax:15 error:error]; +} + +- (BOOL)checkOneChecksum:(NSMutableString *)result checkPosition:(int)checkPosition weightMax:(int)weightMax error:(NSError **)error { + int weight = 1; + int total = 0; + + for (int i = checkPosition - 1; i >= 0; i--) { + total += weight * [ZX_CODE93_ALPHABET_STRING rangeOfString:[NSString stringWithFormat:@"%C", [result characterAtIndex:i]]].location; + if (++weight > weightMax) { + weight = 1; + } + } + + if ([result characterAtIndex:checkPosition] != ZX_CODE93_ALPHABET[total % 47]) { + if (error) *error = ZXChecksumErrorInstance(); + return NO; + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.h new file mode 100644 index 0000000..f94ecd5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANReader.h" + +extern const int ZX_EAN13_FIRST_DIGIT_ENCODINGS[]; + +/** + * Implements decoding of the EAN-13 format. + */ +@interface ZXEAN13Reader : ZXUPCEANReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.m new file mode 100644 index 0000000..fed8b7c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.m @@ -0,0 +1,146 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXEAN13Reader.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" + +// For an EAN-13 barcode, the first digit is represented by the parities used +// to encode the next six digits, according to the table below. For example, +// if the barcode is 5 123456 789012 then the value of the first digit is +// signified by using odd for '1', even for '2', even for '3', odd for '4', +// odd for '5', and even for '6'. See http://en.wikipedia.org/wiki/EAN-13 +// +// Parity of next 6 digits +// Digit 0 1 2 3 4 5 +// 0 Odd Odd Odd Odd Odd Odd +// 1 Odd Odd Even Odd Even Even +// 2 Odd Odd Even Even Odd Even +// 3 Odd Odd Even Even Even Odd +// 4 Odd Even Odd Odd Even Even +// 5 Odd Even Even Odd Odd Even +// 6 Odd Even Even Even Odd Odd +// 7 Odd Even Odd Even Odd Even +// 8 Odd Even Odd Even Even Odd +// 9 Odd Even Even Odd Even Odd +// +// Note that the encoding for '0' uses the same parity as a UPC barcode. Hence +// a UPC barcode can be converted to an EAN-13 barcode by prepending a 0. +// +// The encoding is represented by the following array, which is a bit pattern +// using Odd = 0 and Even = 1. For example, 5 is represented by: +// +// Odd Even Even Odd Odd Even +// in binary: +// 0 1 1 0 0 1 == 0x19 +// +const int ZX_EAN13_FIRST_DIGIT_ENCODINGS[] = { + 0x00, 0x0B, 0x0D, 0xE, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A +}; + +@interface ZXEAN13Reader () + +@property (nonatomic, strong, readonly) ZXIntArray *decodeMiddleCounters; + +@end + +@implementation ZXEAN13Reader + +- (id)init { + if (self = [super init]) { + _decodeMiddleCounters = [[ZXIntArray alloc] initWithLength:4]; + } + return self; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + ZXIntArray *counters = self.decodeMiddleCounters; + [counters clear]; + int end = row.size; + int rowOffset = (int)NSMaxRange(startRange); + + int lgPatternFound = 0; + + for (int x = 0; x < 6 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch % 10)]; + rowOffset += [counters sum]; + if (bestMatch >= 10) { + lgPatternFound |= 1 << (5 - x); + } + } + + if (![self determineFirstDigit:result lgPatternFound:lgPatternFound]) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + + NSRange middleRange = [[self class] findGuardPattern:row + rowOffset:rowOffset + whiteFirst:YES + pattern:ZX_UPC_EAN_MIDDLE_PATTERN + patternLen:ZX_UPC_EAN_MIDDLE_PATTERN_LEN + error:error]; + if (middleRange.location == NSNotFound) { + return -1; + } + rowOffset = (int)NSMaxRange(middleRange); + + for (int x = 0; x < 6 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row + counters:counters + rowOffset:rowOffset + patternType:ZX_UPC_EAN_PATTERNS_L_PATTERNS + error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch)]; + rowOffset += [counters sum]; + } + + return rowOffset; +} + +- (ZXBarcodeFormat)barcodeFormat { + return kBarcodeFormatEan13; +} + +/** + * Based on pattern of odd-even ('L' and 'G') patterns used to encoded the explicitly-encoded + * digits in a barcode, determines the implicitly encoded first digit and adds it to the + * result string. + * + * @param resultString string to insert decoded first digit into + * @param lgPatternFound int whose bits indicates the pattern of odd/even L/G patterns used to + * encode digits + * @return NO if first digit cannot be determined + */ +- (BOOL)determineFirstDigit:(NSMutableString *)resultString lgPatternFound:(int)lgPatternFound { + for (int d = 0; d < 10; d++) { + if (lgPatternFound == ZX_EAN13_FIRST_DIGIT_ENCODINGS[d]) { + [resultString insertString:[NSString stringWithFormat:@"%C", (unichar)('0' + d)] atIndex:0]; + return YES; + } + } + return NO; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.h new file mode 100644 index 0000000..6dc59d8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANWriter.h" + +/** + * This object renders an EAN13 code as a ZXBitMatrix. + */ +@interface ZXEAN13Writer : ZXUPCEANWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.m new file mode 100644 index 0000000..b9ad4bd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.m @@ -0,0 +1,78 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBoolArray.h" +#import "ZXEAN13Reader.h" +#import "ZXEAN13Writer.h" +#import "ZXUPCEANReader.h" + +const int ZX_EAN13_CODE_WIDTH = 3 + // start guard + (7 * 6) + // left bars + 5 + // middle guard + (7 * 6) + // right bars + 3; // end guard + +@implementation ZXEAN13Writer + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatEan13) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Can only encode EAN_13, but got %d", format] + userInfo:nil]; + } + + return [super encode:contents format:format width:width height:height hints:hints error:error]; +} + +- (ZXBoolArray *)encode:(NSString *)contents { + if ([contents length] != 13) { + [NSException raise:NSInvalidArgumentException + format:@"Requested contents should be 13 digits long, but got %d", (int)[contents length]]; + } + + if (![ZXUPCEANReader checkStandardUPCEANChecksum:contents]) { + [NSException raise:NSInvalidArgumentException + format:@"Contents do not pass checksum"]; + } + + int firstDigit = [[contents substringToIndex:1] intValue]; + int parities = ZX_EAN13_FIRST_DIGIT_ENCODINGS[firstDigit]; + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:ZX_EAN13_CODE_WIDTH]; + int pos = 0; + + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_START_END_PATTERN patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN startColor:YES]; + + for (int i = 1; i <= 6; i++) { + int digit = [[contents substringWithRange:NSMakeRange(i, 1)] intValue]; + if ((parities >> (6 - i) & 1) == 1) { + digit += 10; + } + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_L_AND_G_PATTERNS[digit] patternLen:ZX_UPC_EAN_L_PATTERNS_SUB_LEN startColor:FALSE]; + } + + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_MIDDLE_PATTERN patternLen:ZX_UPC_EAN_MIDDLE_PATTERN_LEN startColor:FALSE]; + + for (int i = 7; i <= 12; i++) { + int digit = [[contents substringWithRange:NSMakeRange(i, 1)] intValue]; + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_L_PATTERNS[digit] patternLen:ZX_UPC_EAN_L_PATTERNS_SUB_LEN startColor:YES]; + } + [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_START_END_PATTERN patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN startColor:YES]; + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.h new file mode 100644 index 0000000..886ce3b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANReader.h" + +/** + * Implements decoding of the EAN-8 format. + */ +@interface ZXEAN8Reader : ZXUPCEANReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.m new file mode 100644 index 0000000..eb1538a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.m @@ -0,0 +1,74 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXEAN8Reader.h" +#import "ZXIntArray.h" + +@interface ZXEAN8Reader () + +@property (nonatomic, strong, readonly) ZXIntArray *decodeMiddleCounters; + +@end + +@implementation ZXEAN8Reader + +- (id)init { + if (self = [super init]) { + _decodeMiddleCounters = [[ZXIntArray alloc] initWithLength:4]; + } + + return self; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + ZXIntArray *counters = self.decodeMiddleCounters; + [counters clear]; + int end = row.size; + int rowOffset = (int)NSMaxRange(startRange); + + for (int x = 0; x < 4 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch)]; + rowOffset += [counters sum]; + } + + NSRange middleRange = [[self class] findGuardPattern:row rowOffset:rowOffset whiteFirst:YES pattern:ZX_UPC_EAN_MIDDLE_PATTERN patternLen:ZX_UPC_EAN_MIDDLE_PATTERN_LEN error:error]; + if (middleRange.location == NSNotFound) { + return -1; + } + rowOffset = (int)NSMaxRange(middleRange); + + for (int x = 0; x < 4 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch)]; + rowOffset += [counters sum]; + } + + return rowOffset; +} + +- (ZXBarcodeFormat)barcodeFormat { + return kBarcodeFormatEan8; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.h new file mode 100644 index 0000000..5171806 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANWriter.h" + +/** + * This object renders an EAN8 code as a ZXBitMatrix. + */ +@interface ZXEAN8Writer : ZXUPCEANWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.m new file mode 100644 index 0000000..7307bd1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.m @@ -0,0 +1,63 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBoolArray.h" +#import "ZXEAN8Writer.h" +#import "ZXUPCEANReader.h" + +const int ZX_EAN8_CODE_WIDTH = 3 + (7 * 4) + 5 + (7 * 4) + 3; + +@implementation ZXEAN8Writer + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatEan8) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode EAN_8"]; + } + return [super encode:contents format:format width:width height:height hints:hints error:error]; +} + +/** + * Returns a byte array of horizontal pixels (FALSE = white, TRUE = black) + */ +- (ZXBoolArray *)encode:(NSString *)contents { + if ([contents length] != 8) { + [NSException raise:NSInvalidArgumentException format:@"Requested contents should be 8 digits long, but got %d", (int)[contents length]]; + } + + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:ZX_EAN8_CODE_WIDTH]; + int pos = 0; + + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_START_END_PATTERN patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN startColor:YES]; + + for (int i = 0; i <= 3; i++) { + int digit = [[contents substringWithRange:NSMakeRange(i, 1)] intValue]; + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_L_PATTERNS[digit] patternLen:ZX_UPC_EAN_L_PATTERNS_SUB_LEN startColor:FALSE]; + } + + pos += [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_MIDDLE_PATTERN patternLen:ZX_UPC_EAN_MIDDLE_PATTERN_LEN startColor:FALSE]; + + for (int i = 4; i <= 7; i++) { + int digit = [[contents substringWithRange:NSMakeRange(i, 1)] intValue]; + pos += [super appendPattern:result pos:pos pattern:ZX_UPC_EAN_L_PATTERNS[digit] patternLen:ZX_UPC_EAN_L_PATTERNS_SUB_LEN startColor:YES]; + } + + [self appendPattern:result pos:pos pattern:ZX_UPC_EAN_START_END_PATTERN patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN startColor:YES]; + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.h new file mode 100644 index 0000000..60b385a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Records EAN prefix to GS1 Member Organization, where the member organization + * correlates strongly with a country. This is an imperfect means of identifying + * a country of origin by EAN-13 barcode value. See + * http://en.wikipedia.org/wiki/List_of_GS1_country_codes + */ +@interface ZXEANManufacturerOrgSupport : NSObject + +- (NSString *)lookupCountryIdentifier:(NSString *)productCode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.m new file mode 100644 index 0000000..3bdac20 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.m @@ -0,0 +1,178 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEANManufacturerOrgSupport.h" + +@interface ZXEANManufacturerOrgSupport () + +@property (nonatomic, strong, readonly) NSMutableArray *countryIdentifiers; +@property (nonatomic, strong, readonly) NSMutableArray *ranges; + +@end + +@implementation ZXEANManufacturerOrgSupport + +- (id)init { + if (self = [super init]) { + _ranges = [NSMutableArray array]; + _countryIdentifiers = [NSMutableArray array]; + } + + return self; +} + +- (NSString *)lookupCountryIdentifier:(NSString *)productCode { + [self initIfNeeded]; + + int prefix = [[productCode substringToIndex:3] intValue]; + NSUInteger max = self.ranges.count; + + for (int i = 0; i < max; i++) { + NSArray *range = self.ranges[i]; + int start = [range[0] intValue]; + if (prefix < start) { + return nil; + } + int end = [range count] == 1 ? start : [range[1] intValue]; + if (prefix <= end) { + return self.countryIdentifiers[i]; + } + } + + return nil; +} + +- (void)add:(NSArray *)range identifier:(NSString *)identifier { + [self.ranges addObject:range]; + [self.countryIdentifiers addObject:identifier]; +} + +- (void)initIfNeeded { + @synchronized (self.ranges) { + if ([self.ranges count] > 0) { + return; + } + + [self add:@[@0, @19] identifier:@"US/CA"]; + [self add:@[@30, @39] identifier:@"US"]; + [self add:@[@60, @139] identifier:@"US/CA"]; + [self add:@[@300, @379] identifier:@"FR"]; + [self add:@[@380] identifier:@"BG"]; + [self add:@[@383] identifier:@"SI"]; + [self add:@[@385] identifier:@"HR"]; + [self add:@[@387] identifier:@"BA"]; + [self add:@[@400, @440] identifier:@"DE"]; + [self add:@[@450, @459] identifier:@"JP"]; + [self add:@[@460, @469] identifier:@"RU"]; + [self add:@[@471] identifier:@"TW"]; + [self add:@[@474] identifier:@"EE"]; + [self add:@[@475] identifier:@"LV"]; + [self add:@[@476] identifier:@"AZ"]; + [self add:@[@477] identifier:@"LT"]; + [self add:@[@478] identifier:@"UZ"]; + [self add:@[@479] identifier:@"LK"]; + [self add:@[@480] identifier:@"PH"]; + [self add:@[@481] identifier:@"BY"]; + [self add:@[@482] identifier:@"UA"]; + [self add:@[@484] identifier:@"MD"]; + [self add:@[@485] identifier:@"AM"]; + [self add:@[@486] identifier:@"GE"]; + [self add:@[@487] identifier:@"KZ"]; + [self add:@[@489] identifier:@"HK"]; + [self add:@[@490, @499] identifier:@"JP"]; + [self add:@[@500, @509] identifier:@"GB"]; + [self add:@[@520] identifier:@"GR"]; + [self add:@[@528] identifier:@"LB"]; + [self add:@[@529] identifier:@"CY"]; + [self add:@[@531] identifier:@"MK"]; + [self add:@[@535] identifier:@"MT"]; + [self add:@[@539] identifier:@"IE"]; + [self add:@[@540, @549] identifier:@"BE/LU"]; + [self add:@[@560] identifier:@"PT"]; + [self add:@[@569] identifier:@"IS"]; + [self add:@[@570, @579] identifier:@"DK"]; + [self add:@[@590] identifier:@"PL"]; + [self add:@[@594] identifier:@"RO"]; + [self add:@[@599] identifier:@"HU"]; + [self add:@[@600, @601] identifier:@"ZA"]; + [self add:@[@603] identifier:@"GH"]; + [self add:@[@608] identifier:@"BH"]; + [self add:@[@609] identifier:@"MU"]; + [self add:@[@611] identifier:@"MA"]; + [self add:@[@613] identifier:@"DZ"]; + [self add:@[@616] identifier:@"KE"]; + [self add:@[@618] identifier:@"CI"]; + [self add:@[@619] identifier:@"TN"]; + [self add:@[@621] identifier:@"SY"]; + [self add:@[@622] identifier:@"EG"]; + [self add:@[@624] identifier:@"LY"]; + [self add:@[@625] identifier:@"JO"]; + [self add:@[@626] identifier:@"IR"]; + [self add:@[@627] identifier:@"KW"]; + [self add:@[@628] identifier:@"SA"]; + [self add:@[@629] identifier:@"AE"]; + [self add:@[@640, @649] identifier:@"FI"]; + [self add:@[@690, @695] identifier:@"CN"]; + [self add:@[@700, @709] identifier:@"NO"]; + [self add:@[@729] identifier:@"IL"]; + [self add:@[@730, @739] identifier:@"SE"]; + [self add:@[@740] identifier:@"GT"]; + [self add:@[@741] identifier:@"SV"]; + [self add:@[@742] identifier:@"HN"]; + [self add:@[@743] identifier:@"NI"]; + [self add:@[@744] identifier:@"CR"]; + [self add:@[@745] identifier:@"PA"]; + [self add:@[@746] identifier:@"DO"]; + [self add:@[@750] identifier:@"MX"]; + [self add:@[@754, @755] identifier:@"CA"]; + [self add:@[@759] identifier:@"VE"]; + [self add:@[@760, @769] identifier:@"CH"]; + [self add:@[@770] identifier:@"CO"]; + [self add:@[@773] identifier:@"UY"]; + [self add:@[@775] identifier:@"PE"]; + [self add:@[@777] identifier:@"BO"]; + [self add:@[@779] identifier:@"AR"]; + [self add:@[@780] identifier:@"CL"]; + [self add:@[@784] identifier:@"PY"]; + [self add:@[@785] identifier:@"PE"]; + [self add:@[@786] identifier:@"EC"]; + [self add:@[@789, @790] identifier:@"BR"]; + [self add:@[@800, @839] identifier:@"IT"]; + [self add:@[@840, @849] identifier:@"ES"]; + [self add:@[@850] identifier:@"CU"]; + [self add:@[@858] identifier:@"SK"]; + [self add:@[@859] identifier:@"CZ"]; + [self add:@[@860] identifier:@"YU"]; + [self add:@[@865] identifier:@"MN"]; + [self add:@[@867] identifier:@"KP"]; + [self add:@[@868, @869] identifier:@"TR"]; + [self add:@[@870, @879] identifier:@"NL"]; + [self add:@[@880] identifier:@"KR"]; + [self add:@[@885] identifier:@"TH"]; + [self add:@[@888] identifier:@"SG"]; + [self add:@[@890] identifier:@"IN"]; + [self add:@[@893] identifier:@"VN"]; + [self add:@[@896] identifier:@"PK"]; + [self add:@[@899] identifier:@"ID"]; + [self add:@[@900, @919] identifier:@"AT"]; + [self add:@[@930, @939] identifier:@"AU"]; + [self add:@[@940, @949] identifier:@"AZ"]; + [self add:@[@955] identifier:@"MY"]; + [self add:@[@958] identifier:@"MO"]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.h new file mode 100644 index 0000000..bc145f4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +extern const int ZX_ITF_PATTERNS[][5]; + +/** + * Implements decoding of the ITF format, or Interleaved Two of Five. + * + * This Reader will scan ITF barcodes of certain lengths only. + * At the moment it reads length 6, 8, 10, 12, 14, 16, 18, 20, 24, and 44 as these have appeared "in the wild". Not all + * lengths are scanned, especially shorter ones, to avoid false positives. This in turn is due to a lack of + * required checksum function. + * + * The checksum is optional and is not applied by this Reader. The consumer of the decoded + * value will have to apply a checksum if required. + * + * http://en.wikipedia.org/wiki/Interleaved_2_of_5 is a great reference for Interleaved 2 of 5 information. + */ +@interface ZXITFReader : ZXOneDReader + +- (ZXIntArray *)decodeStart:(ZXBitArray *)row; +- (ZXIntArray *)decodeEnd:(ZXBitArray *)row; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.m new file mode 100644 index 0000000..c9b41d0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.m @@ -0,0 +1,356 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXITFReader.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +static float ZX_ITF_MAX_AVG_VARIANCE = 0.38f; +static float ZX_ITF_MAX_INDIVIDUAL_VARIANCE = 0.78f; + +static const int ZX_ITF_W = 3; // Pixel width of a wide line +static const int ZX_ITF_N = 1; // Pixel width of a narrow line + +/** Valid ITF lengths. Anything longer than the largest value is also allowed. */ +const int ZX_ITF_DEFAULT_ALLOWED_LENGTHS[] = { 6, 8, 10, 12, 14 }; + +/** + * Start/end guard pattern. + * + * Note: The end pattern is reversed because the row is reversed before + * searching for the END_PATTERN + */ +const int ZX_ITF_ITF_START_PATTERN[] = {ZX_ITF_N, ZX_ITF_N, ZX_ITF_N, ZX_ITF_N}; +const int ZX_ITF_END_PATTERN_REVERSED[] = {ZX_ITF_N, ZX_ITF_N, ZX_ITF_W}; + +/** + * Patterns of Wide / Narrow lines to indicate each digit + */ +const int ZX_ITF_PATTERNS_LEN = 10; +const int ZX_ITF_PATTERNS[ZX_ITF_PATTERNS_LEN][5] = { + {ZX_ITF_N, ZX_ITF_N, ZX_ITF_W, ZX_ITF_W, ZX_ITF_N}, // 0 + {ZX_ITF_W, ZX_ITF_N, ZX_ITF_N, ZX_ITF_N, ZX_ITF_W}, // 1 + {ZX_ITF_N, ZX_ITF_W, ZX_ITF_N, ZX_ITF_N, ZX_ITF_W}, // 2 + {ZX_ITF_W, ZX_ITF_W, ZX_ITF_N, ZX_ITF_N, ZX_ITF_N}, // 3 + {ZX_ITF_N, ZX_ITF_N, ZX_ITF_W, ZX_ITF_N, ZX_ITF_W}, // 4 + {ZX_ITF_W, ZX_ITF_N, ZX_ITF_W, ZX_ITF_N, ZX_ITF_N}, // 5 + {ZX_ITF_N, ZX_ITF_W, ZX_ITF_W, ZX_ITF_N, ZX_ITF_N}, // 6 + {ZX_ITF_N, ZX_ITF_N, ZX_ITF_N, ZX_ITF_W, ZX_ITF_W}, // 7 + {ZX_ITF_W, ZX_ITF_N, ZX_ITF_N, ZX_ITF_W, ZX_ITF_N}, // 8 + {ZX_ITF_N, ZX_ITF_W, ZX_ITF_N, ZX_ITF_W, ZX_ITF_N} // 9 +}; + +@interface ZXITFReader () + +@property (nonatomic, assign) int narrowLineWidth; + +@end + +@implementation ZXITFReader + +- (id)init { + if (self = [super init]) { + _narrowLineWidth = -1; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + // Find out where the Middle section (payload) starts & ends + ZXIntArray *startRange = [self decodeStart:row]; + ZXIntArray *endRange = [self decodeEnd:row]; + if (!startRange || !endRange) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSMutableString *resultString = [NSMutableString stringWithCapacity:20]; + if (![self decodeMiddle:row payloadStart:startRange.array[1] payloadEnd:endRange.array[0] resultString:resultString]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSArray *allowedLengths = nil; + if (hints != nil) { + allowedLengths = hints.allowedLengths; + } + if (allowedLengths == nil) { + NSMutableArray *temp = [NSMutableArray array]; + for (int i = 0; i < sizeof(ZX_ITF_DEFAULT_ALLOWED_LENGTHS) / sizeof(int); i++) { + [temp addObject:@(ZX_ITF_DEFAULT_ALLOWED_LENGTHS[i])]; + } + allowedLengths = [NSArray arrayWithArray:temp]; + } + + // To avoid false positives with 2D barcodes (and other patterns), make + // an assumption that the decoded string must be a 'standard' length if it's short + NSUInteger length = [resultString length]; + BOOL lengthOK = NO; + int maxAllowedLength = 0; + for (NSNumber *i in allowedLengths) { + int allowedLength = [i intValue]; + if (length == allowedLength) { + lengthOK = YES; + break; + } + if (allowedLength > maxAllowedLength) { + maxAllowedLength = allowedLength; + } + } + if (!lengthOK && length > maxAllowedLength) { + lengthOK = YES; + } + if (!lengthOK) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + return [ZXResult resultWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:startRange.array[1] y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:endRange.array[0] y:(float)rowNumber]] + format:kBarcodeFormatITF]; +} + +/** + * @param row row of black/white values to search + * @param payloadStart offset of start pattern + * @param resultString NSMutableString to append decoded chars to + * @return NO if decoding could not complete successfully + */ +- (BOOL)decodeMiddle:(ZXBitArray *)row payloadStart:(int)payloadStart payloadEnd:(int)payloadEnd resultString:(NSMutableString *)resultString { + // Digits are interleaved in pairs - 5 black lines for one digit, and the + // 5 + // interleaved white lines for the second digit. + // Therefore, need to scan 10 lines and then + // split these into two arrays + ZXIntArray *counterDigitPair = [[ZXIntArray alloc] initWithLength:10]; + ZXIntArray *counterBlack = [[ZXIntArray alloc] initWithLength:5]; + ZXIntArray *counterWhite = [[ZXIntArray alloc] initWithLength:5]; + + while (payloadStart < payloadEnd) { + // Get 10 runs of black/white. + if (![ZXOneDReader recordPattern:row start:payloadStart counters:counterDigitPair]) { + return NO; + } + // Split them into each array + for (int k = 0; k < 5; k++) { + int twoK = 2 * k; + counterBlack.array[k] = counterDigitPair.array[twoK]; + counterWhite.array[k] = counterDigitPair.array[twoK + 1]; + } + + int bestMatch = [self decodeDigit:counterBlack]; + if (bestMatch == -1) { + return NO; + } + [resultString appendFormat:@"%C", (unichar)('0' + bestMatch)]; + bestMatch = [self decodeDigit:counterWhite]; + if (bestMatch == -1) { + return NO; + } + [resultString appendFormat:@"%C", (unichar)('0' + bestMatch)]; + + for (int i = 0; i < counterDigitPair.length; i++) { + payloadStart += counterDigitPair.array[i]; + } + } + return YES; +} + +/** + * Identify where the start of the middle / payload section starts. + * + * @param row row of black/white values to search + * @return Array, containing index of start of 'start block' and end of + * 'start block' + */ +- (ZXIntArray *)decodeStart:(ZXBitArray *)row { + int endStart = [self skipWhiteSpace:row]; + if (endStart == -1) { + return nil; + } + ZXIntArray *startPattern = [self findGuardPattern:row rowOffset:endStart pattern:ZX_ITF_ITF_START_PATTERN patternLen:sizeof(ZX_ITF_ITF_START_PATTERN)/sizeof(int)]; + if (!startPattern) { + return nil; + } + + self.narrowLineWidth = (startPattern.array[1] - startPattern.array[0]) / 4; + + if (![self validateQuietZone:row startPattern:startPattern.array[0]]) { + return nil; + } + + return startPattern; +} + +/** + * The start & end patterns must be pre/post fixed by a quiet zone. This + * zone must be at least 10 times the width of a narrow line. Scan back until + * we either get to the start of the barcode or match the necessary number of + * quiet zone pixels. + * + * Note: Its assumed the row is reversed when using this method to find + * quiet zone after the end pattern. + * + * ref: http://www.barcode-1.net/i25code.html + * + * @param row bit array representing the scanned barcode. + * @param startPattern index into row of the start or end pattern. + * @return NO if the quiet zone cannot be found, a ReaderException is thrown. + */ +- (BOOL)validateQuietZone:(ZXBitArray *)row startPattern:(int)startPattern { + int quietCount = self.narrowLineWidth * 10; + + // if there are not so many pixel at all let's try as many as possible + quietCount = quietCount < startPattern ? quietCount : startPattern; + + for (int i = startPattern - 1; quietCount > 0 && i >= 0; i--) { + if ([row get:i]) { + break; + } + quietCount--; + } + if (quietCount != 0) { + return NO; + } + return YES; +} + +/** + * Skip all whitespace until we get to the first black line. + * + * @param row row of black/white values to search + * @return index of the first black line or -1 if no black lines are found in the row + */ +- (int)skipWhiteSpace:(ZXBitArray *)row { + int width = [row size]; + int endStart = [row nextSet:0]; + if (endStart == width) { + return -1; + } + return endStart; +} + +/** + * Identify where the end of the middle / payload section ends. + * + * @param row row of black/white values to search + * @return Array, containing index of start of 'end block' and end of 'end + * block' + */ +- (ZXIntArray *)decodeEnd:(ZXBitArray *)row { + [row reverse]; + + int endStart = [self skipWhiteSpace:row]; + if (endStart == -1) { + [row reverse]; + return nil; + } + ZXIntArray *endPattern = [self findGuardPattern:row rowOffset:endStart pattern:ZX_ITF_END_PATTERN_REVERSED patternLen:sizeof(ZX_ITF_END_PATTERN_REVERSED)/sizeof(int)]; + if (!endPattern) { + [row reverse]; + return nil; + } + if (![self validateQuietZone:row startPattern:endPattern.array[0]]) { + [row reverse]; + return nil; + } + int temp = endPattern.array[0]; + endPattern.array[0] = [row size] - endPattern.array[1]; + endPattern.array[1] = [row size] - temp; + [row reverse]; + return endPattern; +} + +/** + * @param row row of black/white values to search + * @param rowOffset position to start search + * @param pattern pattern of counts of number of black and white pixels that are + * being searched for as a pattern + * @return start/end horizontal offset of guard pattern, as an array of two + * ints or nil if pattern is not found + */ +- (ZXIntArray *)findGuardPattern:(ZXBitArray *)row rowOffset:(int)rowOffset pattern:(const int[])pattern patternLen:(int)patternLen { + int patternLength = patternLen; + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:patternLength]; + int32_t *array = counters.array; + int width = row.size; + BOOL isWhite = NO; + + int counterPosition = 0; + int patternStart = rowOffset; + for (int x = rowOffset; x < width; x++) { + if ([row get:x] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if ([ZXOneDReader patternMatchVariance:counters pattern:pattern maxIndividualVariance:ZX_ITF_MAX_INDIVIDUAL_VARIANCE] < ZX_ITF_MAX_AVG_VARIANCE) { + return [[ZXIntArray alloc] initWithInts:patternStart, x, -1]; + } + patternStart += array[0] + array[1]; + for (int y = 2; y < patternLength; y++) { + array[y - 2] = array[y]; + } + array[patternLength - 2] = 0; + array[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + return nil; +} + +/** + * Attempts to decode a sequence of ITF black/white lines into single + * digit. + * + * @param counters the counts of runs of observed black/white/black/... values + * @return The decoded digit or -1 if digit cannot be decoded + */ +- (int)decodeDigit:(ZXIntArray *)counters { + float bestVariance = ZX_ITF_MAX_AVG_VARIANCE; // worst variance we'll accept + int bestMatch = -1; + int max = ZX_ITF_PATTERNS_LEN; + for (int i = 0; i < max; i++) { + int pattern[counters.length]; + for (int ind = 0; ind < counters.length; ind++){ + pattern[ind] = ZX_ITF_PATTERNS[i][ind]; + } + float variance = [ZXOneDReader patternMatchVariance:counters pattern:pattern maxIndividualVariance:ZX_ITF_MAX_INDIVIDUAL_VARIANCE]; + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = i; + } + } + if (bestMatch >= 0) { + return bestMatch; + } else { + return -1; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.h new file mode 100644 index 0000000..6b02789 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDimensionalCodeWriter.h" + +/** + * This object renders a ITF code as a ZXBitMatrix. + */ +@interface ZXITFWriter : ZXOneDimensionalCodeWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.m new file mode 100644 index 0000000..5a58048 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.m @@ -0,0 +1,62 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBoolArray.h" +#import "ZXITFReader.h" +#import "ZXITFWriter.h" + +const int ZX_ITF_WRITER_START_PATTERN[] = {1, 1, 1, 1}; +const int ZX_ITF_WRITER_END_PATTERN[] = {3, 1, 1}; + +@implementation ZXITFWriter + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatITF) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode ITF"]; + } + + return [super encode:contents format:format width:width height:height hints:hints error:error]; +} + +- (ZXBoolArray *)encode:(NSString *)contents { + int length = (int)[contents length]; + if (length % 2 != 0) { + [NSException raise:NSInvalidArgumentException format:@"The length of the input should be even"]; + } + if (length > 80) { + [NSException raise:NSInvalidArgumentException format:@"Requested contents should be less than 80 digits long, but got %d", length]; + } + + ZXBoolArray *result = [[ZXBoolArray alloc] initWithLength:9 + 9 * length]; + int pos = [self appendPattern:result pos:0 pattern:ZX_ITF_WRITER_START_PATTERN patternLen:sizeof(ZX_ITF_WRITER_START_PATTERN)/sizeof(int) startColor:YES]; + for (int i = 0; i < length; i += 2) { + int one = [[contents substringWithRange:NSMakeRange(i, 1)] intValue]; + int two = [[contents substringWithRange:NSMakeRange(i + 1, 1)] intValue]; + const int encodingLen = 18; + int encoding[encodingLen]; + memset(encoding, 0, encodingLen * sizeof(int)); + for (int j = 0; j < 5; j++) { + encoding[2 * j] = ZX_ITF_PATTERNS[one][j]; + encoding[2 * j + 1] = ZX_ITF_PATTERNS[two][j]; + } + pos += [super appendPattern:result pos:pos pattern:encoding patternLen:encodingLen startColor:YES]; + } + [self appendPattern:result pos:pos pattern:ZX_ITF_WRITER_END_PATTERN patternLen:sizeof(ZX_ITF_WRITER_END_PATTERN)/sizeof(int) startColor:YES]; + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.h new file mode 100644 index 0000000..71a4eb2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +@class ZXDecodeHints; + +@interface ZXMultiFormatOneDReader : ZXOneDReader + +- (id)initWithHints:(ZXDecodeHints *)hints; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.m new file mode 100644 index 0000000..d47e2b2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.m @@ -0,0 +1,111 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXCodaBarReader.h" +#import "ZXCode128Reader.h" +#import "ZXCode39Reader.h" +#import "ZXCode93Reader.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXITFReader.h" +#import "ZXMultiFormatOneDReader.h" +#import "ZXMultiFormatUPCEANReader.h" +#import "ZXRSS14Reader.h" +#import "ZXRSSExpandedReader.h" + +@interface ZXMultiFormatOneDReader () + +@property (nonatomic, strong, readonly) NSMutableArray *readers; + +@end + +@implementation ZXMultiFormatOneDReader + +- (id)initWithHints:(ZXDecodeHints *)hints { + if (self = [super init]) { + BOOL useCode39CheckDigit = hints != nil && hints.assumeCode39CheckDigit; + _readers = [NSMutableArray array]; + if (hints != nil) { + if ([hints containsFormat:kBarcodeFormatEan13] || + [hints containsFormat:kBarcodeFormatUPCA] || + [hints containsFormat:kBarcodeFormatEan8] || + [hints containsFormat:kBarcodeFormatUPCE]) { + [_readers addObject:[[ZXMultiFormatUPCEANReader alloc] initWithHints:hints]]; + } + + if ([hints containsFormat:kBarcodeFormatCode39]) { + [_readers addObject:[[ZXCode39Reader alloc] initUsingCheckDigit:useCode39CheckDigit]]; + } + + if ([hints containsFormat:kBarcodeFormatCode93]) { + [_readers addObject:[[ZXCode93Reader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatCode128]) { + [_readers addObject:[[ZXCode128Reader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatITF]) { + [_readers addObject:[[ZXITFReader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatCodabar]) { + [_readers addObject:[[ZXCodaBarReader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatRSS14]) { + [_readers addObject:[[ZXRSS14Reader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatRSSExpanded]) { + [_readers addObject:[[ZXRSSExpandedReader alloc] init]]; + } + } + + if ([_readers count] == 0) { + [_readers addObject:[[ZXMultiFormatUPCEANReader alloc] initWithHints:hints]]; + [_readers addObject:[[ZXCode39Reader alloc] init]]; + [_readers addObject:[[ZXCodaBarReader alloc] init]]; + [_readers addObject:[[ZXCode93Reader alloc] init]]; + [_readers addObject:[[ZXCode128Reader alloc] init]]; + [_readers addObject:[[ZXITFReader alloc] init]]; + [_readers addObject:[[ZXRSS14Reader alloc] init]]; + [_readers addObject:[[ZXRSSExpandedReader alloc] init]]; + } + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + for (ZXOneDReader *reader in self.readers) { + ZXResult *result = [reader decodeRow:rowNumber row:row hints:hints error:error]; + if (result) { + return result; + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +- (void)reset { + for (id reader in self.readers) { + [reader reset]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.h new file mode 100644 index 0000000..4fcc093 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +@class ZXDecodeHints; + +/** + * A reader that can read all available UPC/EAN formats. If a caller wants to try to + * read all such formats, it is most efficient to use this implementation rather than invoke + * individual readers. + */ +@interface ZXMultiFormatUPCEANReader : ZXOneDReader + +- (id)initWithHints:(ZXDecodeHints *)hints; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.m new file mode 100644 index 0000000..fbbee67 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.m @@ -0,0 +1,112 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDecodeHints.h" +#import "ZXEAN8Reader.h" +#import "ZXEAN13Reader.h" +#import "ZXErrors.h" +#import "ZXMultiFormatUPCEANReader.h" +#import "ZXReader.h" +#import "ZXResult.h" +#import "ZXUPCAReader.h" +#import "ZXUPCEReader.h" + +@interface ZXMultiFormatUPCEANReader () + +@property (nonatomic, strong, readonly) NSMutableArray *readers; + +@end + +@implementation ZXMultiFormatUPCEANReader + +- (id)initWithHints:(ZXDecodeHints *)hints { + if (self = [super init]) { + _readers = [NSMutableArray array]; + + if (hints != nil) { + if ([hints containsFormat:kBarcodeFormatEan13]) { + [_readers addObject:[[ZXEAN13Reader alloc] init]]; + } else if ([hints containsFormat:kBarcodeFormatUPCA]) { + [_readers addObject:[[ZXUPCAReader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatEan8]) { + [_readers addObject:[[ZXEAN8Reader alloc] init]]; + } + + if ([hints containsFormat:kBarcodeFormatUPCE]) { + [_readers addObject:[[ZXUPCEReader alloc] init]]; + } + } + + if ([_readers count] == 0) { + [_readers addObject:[[ZXEAN13Reader alloc] init]]; + [_readers addObject:[[ZXEAN8Reader alloc] init]]; + [_readers addObject:[[ZXUPCEReader alloc] init]]; + } + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + NSRange startGuardPattern = [ZXUPCEANReader findStartGuardPattern:row error:error]; + if (startGuardPattern.location == NSNotFound) { + return nil; + } + for (ZXUPCEANReader *reader in self.readers) { + ZXResult *result = [reader decodeRow:rowNumber row:row startGuardRange:startGuardPattern hints:hints error:error]; + if (!result) { + continue; + } + + // Special case: a 12-digit code encoded in UPC-A is identical to a "0" + // followed by those 12 digits encoded as EAN-13. Each will recognize such a code, + // UPC-A as a 12-digit string and EAN-13 as a 13-digit string starting with "0". + // Individually these are correct and their readers will both read such a code + // and correctly call it EAN-13, or UPC-A, respectively. + // + // In this case, if we've been looking for both types, we'd like to call it + // a UPC-A code. But for efficiency we only run the EAN-13 decoder to also read + // UPC-A. So we special case it here, and convert an EAN-13 result to a UPC-A + // result if appropriate. + // + // But, don't return UPC-A if UPC-A was not a requested format! + BOOL ean13MayBeUPCA = kBarcodeFormatEan13 == result.barcodeFormat && [result.text characterAtIndex:0] == '0'; + BOOL canReturnUPCA = hints == nil || [hints numberOfPossibleFormats] == 0 || [hints containsFormat:kBarcodeFormatUPCA]; + if (ean13MayBeUPCA && canReturnUPCA) { + // Transfer the metdata across + ZXResult *resultUPCA = [ZXResult resultWithText:[result.text substringFromIndex:1] + rawBytes:result.rawBytes + resultPoints:result.resultPoints + format:kBarcodeFormatUPCA]; + [resultUPCA putAllMetadata:result.resultMetadata]; + return resultUPCA; + } + return result; + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +- (void)reset { + for (id reader in self.readers) { + [reader reset]; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.h new file mode 100644 index 0000000..9b77421 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXBitArray, ZXDecodeHints, ZXIntArray, ZXResult; + +/** + * Encapsulates functionality and implementation that is common to all families + * of one-dimensional barcodes. + */ +@interface ZXOneDReader : NSObject + ++ (BOOL)recordPattern:(ZXBitArray *)row start:(int)start counters:(ZXIntArray *)counters; ++ (BOOL)recordPatternInReverse:(ZXBitArray *)row start:(int)start counters:(ZXIntArray *)counters; ++ (float)patternMatchVariance:(ZXIntArray *)counters pattern:(const int[])pattern maxIndividualVariance:(float)maxIndividualVariance; +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.m new file mode 100644 index 0000000..7e4f685 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.m @@ -0,0 +1,267 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBinaryBitmap.h" +#import "ZXBitArray.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXOneDReader.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +@implementation ZXOneDReader + +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +// Note that we don't try rotation without the try harder flag, even if rotation was supported. +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + NSError *decodeError = nil; + ZXResult *result = [self doDecode:image hints:hints error:&decodeError]; + if (result) { + return result; + } else if (decodeError.code == ZXNotFoundError) { + BOOL tryHarder = hints != nil && hints.tryHarder; + if (tryHarder && [image rotateSupported]) { + ZXBinaryBitmap *rotatedImage = [image rotateCounterClockwise]; + ZXResult *result = [self doDecode:rotatedImage hints:hints error:error]; + if (!result) { + return nil; + } + // Record that we found it rotated 90 degrees CCW / 270 degrees CW + NSMutableDictionary *metadata = [result resultMetadata]; + int orientation = 270; + if (metadata != nil && metadata[@(kResultMetadataTypeOrientation)]) { + // But if we found it reversed in doDecode(), add in that result here: + orientation = (orientation + [((NSNumber *)metadata[@(kResultMetadataTypeOrientation)]) intValue]) % 360; + } + [result putMetadata:kResultMetadataTypeOrientation value:@(orientation)]; + // Update result points + NSMutableArray *points = [result resultPoints]; + if (points != nil) { + int height = [rotatedImage height]; + for (int i = 0; i < [points count]; i++) { + points[i] = [[ZXResultPoint alloc] initWithX:height - [(ZXResultPoint *)points[i] y] + y:[(ZXResultPoint *)points[i] x]]; + } + } + return result; + } + } + + if (error) *error = decodeError; + return nil; +} + +- (void)reset { + // do nothing +} + +/** + * We're going to examine rows from the middle outward, searching alternately above and below the + * middle, and farther out each time. rowStep is the number of rows between each successive + * attempt above and below the middle. So we'd scan row middle, then middle - rowStep, then + * middle + rowStep, then middle - (2 * rowStep), etc. + * rowStep is bigger as the image is taller, but is always at least 1. We've somewhat arbitrarily + * decided that moving up and down by about 1/16 of the image is pretty good; we try more of the + * image if "trying harder". + * + * @param image The image to decode + * @param hints Any hints that were requested + * @return The contents of the decoded barcode or nil if an error occurs + */ +- (ZXResult *)doDecode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + int width = image.width; + int height = image.height; + ZXBitArray *row = [[ZXBitArray alloc] initWithSize:width]; + int middle = height >> 1; + BOOL tryHarder = hints != nil && hints.tryHarder; + int rowStep = MAX(1, height >> (tryHarder ? 8 : 5)); + int maxLines; + if (tryHarder) { + maxLines = height; + } else { + maxLines = 15; + } + + for (int x = 0; x < maxLines; x++) { + int rowStepsAboveOrBelow = (x + 1) / 2; + BOOL isAbove = (x & 0x01) == 0; + int rowNumber = middle + rowStep * (isAbove ? rowStepsAboveOrBelow : -rowStepsAboveOrBelow); + if (rowNumber < 0 || rowNumber >= height) { + break; + } + + NSError *rowError = nil; + row = [image blackRow:rowNumber row:row error:&rowError]; + if (!row && rowError.code == ZXNotFoundError) { + continue; + } else if (!row) { + if (error) *error = rowError; + return nil; + } + + for (int attempt = 0; attempt < 2; attempt++) { + if (attempt == 1) { + [row reverse]; + if (hints != nil && hints.resultPointCallback) { + hints = [hints copy]; + hints.resultPointCallback = nil; + } + } + + ZXResult *result = [self decodeRow:rowNumber row:row hints:hints error:nil]; + if (result) { + if (attempt == 1) { + [result putMetadata:kResultMetadataTypeOrientation value:@180]; + NSMutableArray *points = [result resultPoints]; + if (points != nil) { + points[0] = [[ZXResultPoint alloc] initWithX:width - [(ZXResultPoint *)points[0] x] + y:[(ZXResultPoint *)points[0] y]]; + points[1] = [[ZXResultPoint alloc] initWithX:width - [(ZXResultPoint *)points[1] x] + y:[(ZXResultPoint *)points[1] y]]; + } + } + return result; + } + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +/** + * Records the size of successive runs of white and black pixels in a row, starting at a given point. + * The values are recorded in the given array, and the number of runs recorded is equal to the size + * of the array. If the row starts on a white pixel at the given start point, then the first count + * recorded is the run of white pixels starting from that point; likewise it is the count of a run + * of black pixels if the row begin on a black pixels at that point. + * + * @param row row to count from + * @param start offset into row to start at + * @param counters array into which to record counts or nil if counters cannot be filled entirely + * from row before running out of pixels + */ ++ (BOOL)recordPattern:(ZXBitArray *)row start:(int)start counters:(ZXIntArray *)counters { + int numCounters = counters.length; + [counters clear]; + int32_t *array = counters.array; + int end = row.size; + if (start >= end) { + return NO; + } + BOOL isWhite = ![row get:start]; + int counterPosition = 0; + int i = start; + + while (i < end) { + if ([row get:i] ^ isWhite) { + array[counterPosition]++; + } else { + counterPosition++; + if (counterPosition == numCounters) { + break; + } else { + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + i++; + } + + if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) { + return NO; + } + return YES; +} + ++ (BOOL)recordPatternInReverse:(ZXBitArray *)row start:(int)start counters:(ZXIntArray *)counters { + int numTransitionsLeft = counters.length; + BOOL last = [row get:start]; + while (start > 0 && numTransitionsLeft >= 0) { + if ([row get:--start] != last) { + numTransitionsLeft--; + last = !last; + } + } + + if (numTransitionsLeft >= 0 || ![self recordPattern:row start:start + 1 counters:counters]) { + return NO; + } + return YES; +} + +/** + * Determines how closely a set of observed counts of runs of black/white values matches a given + * target pattern. This is reported as the ratio of the total variance from the expected pattern + * proportions across all pattern elements, to the length of the pattern. + * + * @param counters observed counters + * @param pattern expected pattern + * @param maxIndividualVariance The most any counter can differ before we give up + * @return ratio of total variance between counters and pattern compared to total pattern size + */ ++ (float)patternMatchVariance:(ZXIntArray *)counters pattern:(const int[])pattern maxIndividualVariance:(float)maxIndividualVariance { + int numCounters = counters.length; + int total = 0; + int patternLength = 0; + + int32_t *array = counters.array; + for (int i = 0; i < numCounters; i++) { + total += array[i]; + patternLength += pattern[i]; + } + + if (total < patternLength || patternLength == 0) { + return FLT_MAX; + } + float unitBarWidth = (float) total / patternLength; + maxIndividualVariance *= unitBarWidth; + + float totalVariance = 0.0f; + for (int x = 0; x < numCounters; x++) { + int counter = array[x]; + float scaledPattern = pattern[x] * unitBarWidth; + float variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { + return FLT_MAX; + } + totalVariance += variance; + } + + return totalVariance / total; +} + +/** + * Attempts to decode a one-dimensional barcode format given a single row of + * an image. + * + * @param rowNumber row number from top of the row + * @param row the black/white pixel data of the row + * @param hints decode hints + * @return ZXResult containing encoded string and start/end of barcode or nil + * if an error occurs or barcode cannot be found + */ +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.h new file mode 100644 index 0000000..170e00d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +@class ZXBoolArray; + +/** + * Encapsulates functionality and implementation that is common to one-dimensional barcodes. + */ +@interface ZXOneDimensionalCodeWriter : NSObject + +- (ZXBoolArray *)encode:(NSString *)contents; +- (int)appendPattern:(ZXBoolArray *)target pos:(int)pos pattern:(const int[])pattern patternLen:(int)patternLen startColor:(BOOL)startColor; +- (int)defaultMargin; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.m new file mode 100644 index 0000000..eb69f84 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.m @@ -0,0 +1,115 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXEncodeHints.h" +#import "ZXOneDimensionalCodeWriter.h" + +@implementation ZXOneDimensionalCodeWriter + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +/** + * Encode the contents following specified format. + * width and height are required size. This method may return bigger size + * ZXBitMatrix when specified size is too small. The user can set both {width and + * height to zero to get minimum size barcode. If negative value is set to width + * or height, IllegalArgumentException is thrown. + */ +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height + hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (contents.length == 0) { + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Found empty contents" userInfo:nil]; + } + + if (width < 0 || height < 0) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Negative size is not allowed. Input: %dx%d", width, height] + userInfo:nil]; + } + + int sidesMargin = [self defaultMargin]; + if (hints && hints.margin) { + sidesMargin = hints.margin.intValue; + } + + ZXBoolArray *code = [self encode:contents]; + return [self renderResult:code width:width height:height sidesMargin:sidesMargin]; +} + +/** + * @return a byte array of horizontal pixels (0 = white, 1 = black) + */ +- (ZXBitMatrix *)renderResult:(ZXBoolArray *)code width:(int)width height:(int)height sidesMargin:(int)sidesMargin { + int inputWidth = code.length; + // Add quiet zone on both sides. + int fullWidth = inputWidth + sidesMargin; + int outputWidth = MAX(width, fullWidth); + int outputHeight = MAX(1, height); + + int multiple = outputWidth / fullWidth; + int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; + + ZXBitMatrix *output = [[ZXBitMatrix alloc] initWithWidth:outputWidth height:outputHeight]; + for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { + if (code.array[inputX]) { + [output setRegionAtLeft:outputX top:0 width:multiple height:outputHeight]; + } + } + return output; +} + +/** + * Appends the given pattern to the target array starting at pos. + * + * @param startColor starting color - false for white, true for black + * @return the number of elements added to target. + */ +- (int)appendPattern:(ZXBoolArray *)target pos:(int)pos pattern:(const int[])pattern patternLen:(int)patternLen startColor:(BOOL)startColor { + BOOL color = startColor; + int numAdded = 0; + for (int i = 0; i < patternLen; i++) { + for (int j = 0; j < pattern[i]; j++) { + target.array[pos++] = color; + } + numAdded += pattern[i]; + color = !color; // flip color after each segment + } + return numAdded; +} + +- (int)defaultMargin { + // CodaBar spec requires a side margin to be more than ten times wider than narrow space. + // This seems like a decent idea for a default for all formats. + return 10; +} + +/** + * Encode the contents to boolean array expression of one-dimensional barcode. + * Start code and end code should be included in result, and side margins should not be included. + * + * @return a ZXBoolArray of horizontal pixels (false = white, true = black) + */ +- (ZXBoolArray *)encode:(NSString *)contents { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.h new file mode 100644 index 0000000..097443c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANReader.h" + +/** + * Implements decoding of the UPC-A format. + */ +@interface ZXUPCAReader : ZXUPCEANReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.m new file mode 100644 index 0000000..659a71e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.m @@ -0,0 +1,114 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEAN13Reader.h" +#import "ZXErrors.h" +#import "ZXResult.h" +#import "ZXUPCAReader.h" + +@interface ZXUPCAReader () + +@property (nonatomic, strong, readonly) ZXUPCEANReader *ean13Reader; + +@end + +@implementation ZXUPCAReader + +- (id)init { + if (self = [super init]) { + _ean13Reader = [[ZXEAN13Reader alloc] init]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row startGuardRange:(NSRange)startGuardRange hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXResult *result = [self.ean13Reader decodeRow:rowNumber row:row startGuardRange:startGuardRange hints:hints error:error]; + if (result) { + result = [self maybeReturnResult:result]; + if (!result) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + return result; + } else { + return nil; + } +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXResult *result = [self.ean13Reader decodeRow:rowNumber row:row hints:hints error:error]; + if (result) { + result = [self maybeReturnResult:result]; + if (!result) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + return result; + } else { + return nil; + } +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + ZXResult *result = [self.ean13Reader decode:image error:error]; + if (result) { + result = [self maybeReturnResult:result]; + if (!result) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + return result; + } else { + return nil; + } +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXResult *result = [self.ean13Reader decode:image hints:hints error:error]; + if (result) { + result = [self maybeReturnResult:result]; + if (!result) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + return result; + } else { + return nil; + } +} + +- (ZXBarcodeFormat)barcodeFormat { + return kBarcodeFormatUPCA; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + return [self.ean13Reader decodeMiddle:row startRange:startRange result:result error:error]; +} + +- (ZXResult *)maybeReturnResult:(ZXResult *)result { + NSString *text = result.text; + if ([text characterAtIndex:0] == '0') { + return [ZXResult resultWithText:[text substringFromIndex:1] + rawBytes:nil + resultPoints:result.resultPoints + format:kBarcodeFormatUPCA]; + } else { + return nil; + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.h new file mode 100644 index 0000000..0011de8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +/** + * This object renders a UPC-A code as a ZXBitMatrix. + */ +@interface ZXUPCAWriter : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.m new file mode 100644 index 0000000..6cbc3d1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.m @@ -0,0 +1,67 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEAN13Writer.h" +#import "ZXUPCAWriter.h" + +@implementation ZXUPCAWriter + +- (ZXEAN13Writer *)subWriter { + static ZXEAN13Writer *subWriter = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + subWriter = [[ZXEAN13Writer alloc] init]; + }); + + return subWriter; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatUPCA) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Can only encode UPC-A, but got %d", format] + userInfo:nil]; + } + return [self.subWriter encode:[self preencode:contents] format:kBarcodeFormatEan13 width:width height:height hints:hints error:error]; +} + +/** + * Transform a UPC-A code into the equivalent EAN-13 code, and add a check digit if it is not + * already present. + */ +- (NSString *)preencode:(NSString *)contents { + NSUInteger length = [contents length]; + if (length == 11) { + int sum = 0; + + for (int i = 0; i < 11; ++i) { + sum += ([contents characterAtIndex:i] - '0') * (i % 2 == 0 ? 3 : 1); + } + + contents = [contents stringByAppendingFormat:@"%d", (1000 - sum) % 10]; + } else if (length != 12) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:[NSString stringWithFormat:@"Requested contents should be 11 or 12 digits long, but got %ld", (unsigned long)[contents length]] + userInfo:nil]; + } + return [NSString stringWithFormat:@"0%@", contents]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.h new file mode 100644 index 0000000..c185589 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXResult; + +/** + * @see UPCEANExtension5Support + */ +@interface ZXUPCEANExtension2Support : NSObject + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row extensionStartRange:(NSRange)extensionStartRange error:(NSError **)error; +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.m new file mode 100644 index 0000000..4188518 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.m @@ -0,0 +1,114 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultMetadataType.h" +#import "ZXResultPoint.h" +#import "ZXUPCEANExtension2Support.h" +#import "ZXUPCEANReader.h" + +@interface ZXUPCEANExtension2Support () + +@property (nonatomic, strong, readonly) ZXIntArray *decodeMiddleCounters; + +@end + +@implementation ZXUPCEANExtension2Support + +- (id)init { + if (self = [super init]) { + _decodeMiddleCounters = [[ZXIntArray alloc] initWithLength:4]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row extensionStartRange:(NSRange)extensionStartRange error:(NSError **)error { + NSMutableString *resultString = [NSMutableString string]; + int end = [self decodeMiddle:row startRange:extensionStartRange result:resultString error:error]; + if (end == -1) { + return nil; + } + + NSMutableDictionary *extensionData = [self parseExtensionString:resultString]; + + ZXResult *extensionResult = [[ZXResult alloc] initWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:(extensionStartRange.location + NSMaxRange(extensionStartRange)) / 2.0f y:rowNumber], + [[ZXResultPoint alloc] initWithX:end y:rowNumber]] + format:kBarcodeFormatUPCEANExtension]; + if (extensionData != nil) { + [extensionResult putAllMetadata:extensionData]; + } + return extensionResult; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + ZXIntArray *counters = self.decodeMiddleCounters; + [counters clear]; + int end = [row size]; + int rowOffset = (int)NSMaxRange(startRange); + + int checkParity = 0; + + for (int x = 0; x < 2 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch % 10)]; + rowOffset += [counters sum]; + if (bestMatch >= 10) { + checkParity |= 1 << (1 - x); + } + if (x != 1) { + // Read off separator if not last + rowOffset = [row nextSet:rowOffset]; + rowOffset = [row nextUnset:rowOffset]; + } + } + + if (result.length != 2) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + + if ([result intValue] % 4 != checkParity) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + + return rowOffset; +} + +/** + * @param raw raw content of extension + * @return formatted interpretation of raw content as a NSDictionary mapping + * one ZXResultMetadataType to appropriate value, or nil if not known + */ +- (NSMutableDictionary *)parseExtensionString:(NSString *)raw { + if (raw.length != 2) { + return nil; + } + return [NSMutableDictionary dictionaryWithObject:@([raw intValue]) + forKey:@(kResultMetadataTypeIssueNumber)]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.h new file mode 100644 index 0000000..fed1545 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXResult; + +/** + * @see UPCEANExtension2Support + */ +@interface ZXUPCEANExtension5Support : NSObject + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row extensionStartRange:(NSRange)extensionStartRange error:(NSError **)error; +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.m new file mode 100644 index 0000000..081372a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.m @@ -0,0 +1,183 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultMetadataType.h" +#import "ZXResultPoint.h" +#import "ZXUPCEANExtension5Support.h" +#import "ZXUPCEANReader.h" + +const int ZX_UPCEAN_CHECK_DIGIT_ENCODINGS[] = { + 0x18, 0x14, 0x12, 0x11, 0x0C, 0x06, 0x03, 0x0A, 0x09, 0x05 +}; + +@interface ZXUPCEANExtension5Support () + +@property (nonatomic, strong, readonly) ZXIntArray *decodeMiddleCounters; + +@end + +@implementation ZXUPCEANExtension5Support + +- (id)init { + if (self = [super init]) { + _decodeMiddleCounters = [[ZXIntArray alloc] initWithLength:4]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row extensionStartRange:(NSRange)extensionStartRange error:(NSError **)error { + NSMutableString *resultString = [NSMutableString string]; + int end = [self decodeMiddle:row startRange:extensionStartRange result:resultString error:error]; + if (end == -1) { + return nil; + } + + NSMutableDictionary *extensionData = [self parseExtensionString:resultString]; + + ZXResult *extensionResult = [[ZXResult alloc] initWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:(extensionStartRange.location + NSMaxRange(extensionStartRange)) / 2.0f y:rowNumber], + [[ZXResultPoint alloc] initWithX:end y:rowNumber]] + format:kBarcodeFormatUPCEANExtension]; + if (extensionData != nil) { + [extensionResult putAllMetadata:extensionData]; + } + return extensionResult; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + ZXIntArray *counters = self.decodeMiddleCounters; + [counters clear]; + + int end = [row size]; + int rowOffset = (int)NSMaxRange(startRange); + + int lgPatternFound = 0; + + for (int x = 0; x < 5 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch % 10)]; + rowOffset += [counters sum]; + if (bestMatch >= 10) { + lgPatternFound |= 1 << (4 - x); + } + if (x != 4) { + // Read off separator if not last + rowOffset = [row nextSet:rowOffset]; + rowOffset = [row nextUnset:rowOffset]; + } + } + + if (result.length != 5) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + + int checkDigit = [self determineCheckDigit:lgPatternFound]; + if (checkDigit == -1) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } else if ([self extensionChecksum:result] != checkDigit) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + + return rowOffset; +} + +- (int)extensionChecksum:(NSString *)s { + int length = (int)[s length]; + int sum = 0; + for (int i = length - 2; i >= 0; i -= 2) { + sum += (int)[s characterAtIndex:i] - (int)'0'; + } + sum *= 3; + for (int i = length - 1; i >= 0; i -= 2) { + sum += (int)[s characterAtIndex:i] - (int)'0'; + } + sum *= 3; + return sum % 10; +} + +- (int)determineCheckDigit:(int)lgPatternFound { + for (int d = 0; d < 10; d++) { + if (lgPatternFound == ZX_UPCEAN_CHECK_DIGIT_ENCODINGS[d]) { + return d; + } + } + return -1; +} + +/** + * @param raw raw content of extension + * @return formatted interpretation of raw content as a NSDictionary mapping + * one ZXResultMetadataType to appropriate value, or nil if not known + */ +- (NSMutableDictionary *)parseExtensionString:(NSString *)raw { + if (raw.length != 5) { + return nil; + } + id value = [self parseExtension5String:raw]; + if (value) { + return [NSMutableDictionary dictionaryWithObject:value forKey:@(kResultMetadataTypeSuggestedPrice)]; + } else { + return nil; + } +} + +- (NSString *)parseExtension5String:(NSString *)raw { + NSString *currency; + switch ([raw characterAtIndex:0]) { + case '0': + currency = @"£"; + break; + case '5': + currency = @"$"; + break; + case '9': + if ([@"90000" isEqualToString:raw]) { + return nil; + } + if ([@"99991" isEqualToString:raw]) { + return @"0.00"; + } + if ([@"99990" isEqualToString:raw]) { + return @"Used"; + } + currency = @""; + break; + default: + currency = @""; + break; + } + int rawAmount = [[raw substringFromIndex:1] intValue]; + NSString *unitsString = [@(rawAmount / 100) stringValue]; + int hundredths = rawAmount % 100; + NSString *hundredthsString = hundredths < 10 ? + [NSString stringWithFormat:@"0%d", hundredths] : [@(hundredths) stringValue]; + return [NSString stringWithFormat:@"%@%@.%@", currency, unitsString, hundredthsString]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.h new file mode 100644 index 0000000..b94101c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXResult; + +@interface ZXUPCEANExtensionSupport : NSObject + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row rowOffset:(int)rowOffset error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.m new file mode 100644 index 0000000..affe80b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.m @@ -0,0 +1,62 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXUPCEANExtensionSupport.h" +#import "ZXUPCEANExtension2Support.h" +#import "ZXUPCEANExtension5Support.h" +#import "ZXUPCEANReader.h" + +const int ZX_UPCEAN_EXTENSION_START_PATTERN[] = {1,1,2}; + +@interface ZXUPCEANExtensionSupport () + +@property (nonatomic, strong, readonly) ZXUPCEANExtension2Support *twoSupport; +@property (nonatomic, strong, readonly) ZXUPCEANExtension5Support *fiveSupport; + +@end + +@implementation ZXUPCEANExtensionSupport + +- (id)init { + if (self = [super init]) { + _twoSupport = [[ZXUPCEANExtension2Support alloc] init]; + _fiveSupport = [[ZXUPCEANExtension5Support alloc] init]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row rowOffset:(int)rowOffset error:(NSError **)error { + NSRange extensionStartRange = [ZXUPCEANReader findGuardPattern:row + rowOffset:rowOffset + whiteFirst:NO + pattern:ZX_UPCEAN_EXTENSION_START_PATTERN + patternLen:sizeof(ZX_UPCEAN_EXTENSION_START_PATTERN)/sizeof(int) + error:error]; + + if (extensionStartRange.location == NSNotFound) { + return nil; + } + + ZXResult *result = [self.fiveSupport decodeRow:rowNumber row:row extensionStartRange:extensionStartRange error:error]; + if (!result) { + result = [self.twoSupport decodeRow:rowNumber row:row extensionStartRange:extensionStartRange error:error]; + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.h new file mode 100644 index 0000000..535640b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.h @@ -0,0 +1,116 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXOneDReader.h" + +typedef enum { + ZX_UPC_EAN_PATTERNS_L_PATTERNS = 0, + ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS +} ZX_UPC_EAN_PATTERNS; + +extern const int ZX_UPC_EAN_START_END_PATTERN_LEN; +extern const int ZX_UPC_EAN_START_END_PATTERN[]; +extern const int ZX_UPC_EAN_MIDDLE_PATTERN_LEN; +extern const int ZX_UPC_EAN_MIDDLE_PATTERN[]; +extern const int ZX_UPC_EAN_L_PATTERNS_LEN; +extern const int ZX_UPC_EAN_L_PATTERNS_SUB_LEN; +extern const int ZX_UPC_EAN_L_PATTERNS[][4]; +extern const int ZX_UPC_EAN_L_AND_G_PATTERNS_LEN; +extern const int ZX_UPC_EAN_L_AND_G_PATTERNS_SUB_LEN; +extern const int ZX_UPC_EAN_L_AND_G_PATTERNS[][4]; + +@class ZXDecodeHints, ZXEANManufacturerOrgSupport, ZXIntArray, ZXResult, ZXUPCEANExtensionSupport; + +/** + * Encapsulates functionality and implementation that is common to UPC and EAN families + * of one-dimensional barcodes. + */ +@interface ZXUPCEANReader : ZXOneDReader + ++ (NSRange)findStartGuardPattern:(ZXBitArray *)row error:(NSError **)error; + +/** + * Like decodeRow:row:hints:, but allows caller to inform method about where the UPC/EAN start pattern is + * found. This allows this to be computed once and reused across many implementations. + */ +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row startGuardRange:(NSRange)startGuardRange hints:(ZXDecodeHints *)hints error:(NSError **)error; + +/** + * @return checkStandardUPCEANChecksum: + */ +- (BOOL)checkChecksum:(NSString *)s error:(NSError **)error; + +/** + * Computes the UPC/EAN checksum on a string of digits, and reports + * whether the checksum is correct or not. + * + * @param s string of digits to check + * @return YES iff string of digits passes the UPC/EAN checksum algorithm + * @return NO if the string does not contain only digits + */ ++ (BOOL)checkStandardUPCEANChecksum:(NSString *)s; + +- (NSRange)decodeEnd:(ZXBitArray *)row endStart:(int)endStart error:(NSError **)error; + ++ (NSRange)findGuardPattern:(ZXBitArray *)row rowOffset:(int)rowOffset whiteFirst:(BOOL)whiteFirst pattern:(const int[])pattern patternLen:(int)patternLen error:(NSError **)error; + +/** + * @param row row of black/white values to search + * @param rowOffset position to start search + * @param whiteFirst if true, indicates that the pattern specifies white/black/white/... + * pixel counts, otherwise, it is interpreted as black/white/black/... + * @param pattern pattern of counts of number of black and white pixels that are being + * searched for as a pattern + * @param counters array of counters, as long as pattern, to re-use + * @return start/end horizontal offset of guard pattern, as an array of two ints + */ ++ (NSRange)findGuardPattern:(ZXBitArray *)row rowOffset:(int)rowOffset whiteFirst:(BOOL)whiteFirst pattern:(const int[])pattern patternLen:(int)patternLen counters:(ZXIntArray *)counters error:(NSError **)error; + +/** + * Attempts to decode a single UPC/EAN-encoded digit. + * + * @param row row of black/white values to decode + * @param counters the counts of runs of observed black/white/black/... values + * @param rowOffset horizontal offset to start decoding from + * @param patterns the set of patterns to use to decode -- sometimes different encodings + * for the digits 0-9 are used, and this indicates the encodings for 0 to 9 that should + * be used + * @return horizontal offset of first pixel beyond the decoded digit + * @return -1 if digit cannot be decoded + */ ++ (int)decodeDigit:(ZXBitArray *)row counters:(ZXIntArray *)counters rowOffset:(int)rowOffset patternType:(ZX_UPC_EAN_PATTERNS)patternType error:(NSError **)error; + +/** + * Get the format of this decoder. + * + * @return The 1D format. + */ +- (ZXBarcodeFormat)barcodeFormat; + +/** + * Subclasses override this to decode the portion of a barcode between the start + * and end guard patterns. + * + * @param row row of black/white values to search + * @param startRange start/end offset of start guard pattern + * @param resultString NSMutableString to append decoded chars to + * @return horizontal offset of first pixel after the "middle" that was decoded + * @return -1 if decoding could not complete successfully + */ +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.m new file mode 100644 index 0000000..1c6edf0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.m @@ -0,0 +1,385 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXDecodeHints.h" +#import "ZXEANManufacturerOrgSupport.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" +#import "ZXResultPointCallback.h" +#import "ZXUPCEANReader.h" +#import "ZXUPCEANExtensionSupport.h" + +static float ZX_UPC_EAN_MAX_AVG_VARIANCE = 0.48f; +static float ZX_UPC_EAN_MAX_INDIVIDUAL_VARIANCE = 0.7f; + +/** + * Start/end guard pattern. + */ +const int ZX_UPC_EAN_START_END_PATTERN_LEN = 3; +const int ZX_UPC_EAN_START_END_PATTERN[ZX_UPC_EAN_START_END_PATTERN_LEN] = {1, 1, 1}; + +/** + * Pattern marking the middle of a UPC/EAN pattern, separating the two halves. + */ +const int ZX_UPC_EAN_MIDDLE_PATTERN_LEN = 5; +const int ZX_UPC_EAN_MIDDLE_PATTERN[ZX_UPC_EAN_MIDDLE_PATTERN_LEN] = {1, 1, 1, 1, 1}; + +/** + * "Odd", or "L" patterns used to encode UPC/EAN digits. + */ +const int ZX_UPC_EAN_L_PATTERNS_LEN = 10; +const int ZX_UPC_EAN_L_PATTERNS_SUB_LEN = 4; +const int ZX_UPC_EAN_L_PATTERNS[ZX_UPC_EAN_L_PATTERNS_LEN][ZX_UPC_EAN_L_PATTERNS_SUB_LEN] = { + {3, 2, 1, 1}, // 0 + {2, 2, 2, 1}, // 1 + {2, 1, 2, 2}, // 2 + {1, 4, 1, 1}, // 3 + {1, 1, 3, 2}, // 4 + {1, 2, 3, 1}, // 5 + {1, 1, 1, 4}, // 6 + {1, 3, 1, 2}, // 7 + {1, 2, 1, 3}, // 8 + {3, 1, 1, 2} // 9 +}; + +/** + * As above but also including the "even", or "G" patterns used to encode UPC/EAN digits. + */ +const int ZX_UPC_EAN_L_AND_G_PATTERNS_LEN = 20; +const int ZX_UPC_EAN_L_AND_G_PATTERNS_SUB_LEN = 4; +const int ZX_UPC_EAN_L_AND_G_PATTERNS[ZX_UPC_EAN_L_AND_G_PATTERNS_LEN][ZX_UPC_EAN_L_AND_G_PATTERNS_SUB_LEN] = { + {3, 2, 1, 1}, // 0 + {2, 2, 2, 1}, // 1 + {2, 1, 2, 2}, // 2 + {1, 4, 1, 1}, // 3 + {1, 1, 3, 2}, // 4 + {1, 2, 3, 1}, // 5 + {1, 1, 1, 4}, // 6 + {1, 3, 1, 2}, // 7 + {1, 2, 1, 3}, // 8 + {3, 1, 1, 2}, // 9 + {1, 1, 2, 3}, // 10 reversed 0 + {1, 2, 2, 2}, // 11 reversed 1 + {2, 2, 1, 2}, // 12 reversed 2 + {1, 1, 4, 1}, // 13 reversed 3 + {2, 3, 1, 1}, // 14 reversed 4 + {1, 3, 2, 1}, // 15 reversed 5 + {4, 1, 1, 1}, // 16 reversed 6 + {2, 1, 3, 1}, // 17 reversed 7 + {3, 1, 2, 1}, // 18 reversed 8 + {2, 1, 1, 3} // 19 reversed 9 +}; + +@interface ZXUPCEANReader () + +@property (nonatomic, strong, readonly) NSMutableString *decodeRowNSMutableString; +@property (nonatomic, strong, readonly) ZXUPCEANExtensionSupport *extensionReader; +@property (nonatomic, strong, readonly) ZXEANManufacturerOrgSupport *eanManSupport; + +@end + +@implementation ZXUPCEANReader + +- (id)init { + if (self = [super init]) { + _decodeRowNSMutableString = [NSMutableString stringWithCapacity:20]; + _extensionReader = [[ZXUPCEANExtensionSupport alloc] init]; + _eanManSupport = [[ZXEANManufacturerOrgSupport alloc] init]; + } + + return self; +} + ++ (NSRange)findStartGuardPattern:(ZXBitArray *)row error:(NSError **)error { + BOOL foundStart = NO; + NSRange startRange = NSMakeRange(NSNotFound, 0); + int nextStart = 0; + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:ZX_UPC_EAN_START_END_PATTERN_LEN]; + while (!foundStart) { + [counters clear]; + startRange = [self findGuardPattern:row rowOffset:nextStart + whiteFirst:NO + pattern:ZX_UPC_EAN_START_END_PATTERN + patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN + counters:counters + error:error]; + if (startRange.location == NSNotFound) { + return startRange; + } + int start = (int)startRange.location; + nextStart = (int)NSMaxRange(startRange); + // Make sure there is a quiet zone at least as big as the start pattern before the barcode. + // If this check would run off the left edge of the image, do not accept this barcode, + // as it is very likely to be a false positive. + int quietStart = start - (nextStart - start); + if (quietStart >= 0) { + foundStart = [row isRange:quietStart end:start value:NO]; + } + } + return startRange; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + return [self decodeRow:rowNumber row:row startGuardRange:[[self class] findStartGuardPattern:row error:error] hints:hints error:error]; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row startGuardRange:(NSRange)startGuardRange hints:(ZXDecodeHints *)hints error:(NSError **)error { + id resultPointCallback = hints == nil ? nil : hints.resultPointCallback; + + if (resultPointCallback != nil) { + [resultPointCallback foundPossibleResultPoint:[[ZXResultPoint alloc] initWithX:(startGuardRange.location + NSMaxRange(startGuardRange)) / 2.0f y:rowNumber]]; + } + + NSMutableString *result = [NSMutableString string]; + int endStart = [self decodeMiddle:row startRange:startGuardRange result:result error:error]; + if (endStart == -1) { + return nil; + } + + if (resultPointCallback != nil) { + [resultPointCallback foundPossibleResultPoint:[[ZXResultPoint alloc] initWithX:endStart y:rowNumber]]; + } + + NSRange endRange = [self decodeEnd:row endStart:endStart error:error]; + if (endRange.location == NSNotFound) { + return nil; + } + + if (resultPointCallback != nil) { + [resultPointCallback foundPossibleResultPoint:[[ZXResultPoint alloc] initWithX:(endRange.location + NSMaxRange(endRange)) / 2.0f y:rowNumber]]; + } + + // Make sure there is a quiet zone at least as big as the end pattern after the barcode. The + // spec might want more whitespace, but in practice this is the maximum we can count on. + int end = (int)NSMaxRange(endRange); + int quietEnd = end + (end - (int)endRange.location); + if (quietEnd >= [row size] || ![row isRange:end end:quietEnd value:NO]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSString *resultString = [result description]; + // UPC/EAN should never be less than 8 chars anyway + if ([resultString length] < 8) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + if (![self checkChecksum:resultString error:error]) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + + float left = (float)(NSMaxRange(startGuardRange) + startGuardRange.location) / 2.0f; + float right = (float)(NSMaxRange(endRange) + endRange.location) / 2.0f; + ZXBarcodeFormat format = [self barcodeFormat]; + + ZXResult *decodeResult = [ZXResult resultWithText:resultString + rawBytes:nil + resultPoints:@[[[ZXResultPoint alloc] initWithX:left y:(float)rowNumber], [[ZXResultPoint alloc] initWithX:right y:(float)rowNumber]] + format:format]; + + int extensionLength = 0; + + ZXResult *extensionResult = [self.extensionReader decodeRow:rowNumber row:row rowOffset:(int)NSMaxRange(endRange) error:error]; + if (extensionResult) { + [decodeResult putMetadata:kResultMetadataTypeUPCEANExtension value:extensionResult.text]; + [decodeResult putAllMetadata:[extensionResult resultMetadata]]; + [decodeResult addResultPoints:[extensionResult resultPoints]]; + extensionLength = (int)[extensionResult.text length]; + } + + ZXIntArray *allowedExtensions = hints == nil ? nil : hints.allowedEANExtensions; + if (allowedExtensions != nil) { + BOOL valid = NO; + for (int i = 0; i < allowedExtensions.length; i++) { + if (extensionLength == allowedExtensions.array[i]) { + valid = YES; + break; + } + } + if (!valid) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + } + + if (format == kBarcodeFormatEan13 || format == kBarcodeFormatUPCA) { + NSString *countryID = [self.eanManSupport lookupCountryIdentifier:resultString]; + if (countryID != nil) { + [decodeResult putMetadata:kResultMetadataTypePossibleCountry value:countryID]; + } + } + return decodeResult; +} + +- (BOOL)checkChecksum:(NSString *)s error:(NSError **)error { + if ([[self class] checkStandardUPCEANChecksum:s]) { + return YES; + } else { + if (error) *error = ZXFormatErrorInstance(); + return NO; + } +} + ++ (BOOL)checkStandardUPCEANChecksum:(NSString *)s { + int length = (int)[s length]; + if (length == 0) { + return NO; + } + int sum = 0; + + for (int i = length - 2; i >= 0; i -= 2) { + int digit = (int)[s characterAtIndex:i] - (int)'0'; + if (digit < 0 || digit > 9) { + return NO; + } + sum += digit; + } + + sum *= 3; + + for (int i = length - 1; i >= 0; i -= 2) { + int digit = (int)[s characterAtIndex:i] - (int)'0'; + if (digit < 0 || digit > 9) { + return NO; + } + sum += digit; + } + + return sum % 10 == 0; +} + +- (NSRange)decodeEnd:(ZXBitArray *)row endStart:(int)endStart error:(NSError **)error { + return [[self class] findGuardPattern:row + rowOffset:endStart + whiteFirst:NO + pattern:ZX_UPC_EAN_START_END_PATTERN + patternLen:ZX_UPC_EAN_START_END_PATTERN_LEN + error:error]; +} + ++ (NSRange)findGuardPattern:(ZXBitArray *)row rowOffset:(int)rowOffset whiteFirst:(BOOL)whiteFirst pattern:(const int[])pattern patternLen:(int)patternLen error:(NSError **)error { + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:patternLen]; + return [self findGuardPattern:row rowOffset:rowOffset whiteFirst:whiteFirst pattern:pattern patternLen:patternLen counters:counters error:error]; +} + ++ (NSRange)findGuardPattern:(ZXBitArray *)row rowOffset:(int)rowOffset whiteFirst:(BOOL)whiteFirst pattern:(const int[])pattern patternLen:(int)patternLen counters:(ZXIntArray *)counters error:(NSError **)error { + int patternLength = patternLen; + int width = row.size; + BOOL isWhite = whiteFirst; + rowOffset = whiteFirst ? [row nextUnset:rowOffset] : [row nextSet:rowOffset]; + int counterPosition = 0; + int patternStart = rowOffset; + int32_t *array = counters.array; + for (int x = rowOffset; x < width; x++) { + if ([row get:x] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if ([self patternMatchVariance:counters pattern:pattern maxIndividualVariance:ZX_UPC_EAN_MAX_INDIVIDUAL_VARIANCE] < ZX_UPC_EAN_MAX_AVG_VARIANCE) { + return NSMakeRange(patternStart, x - patternStart); + } + patternStart += array[0] + array[1]; + + for (int y = 2; y < patternLength; y++) { + array[y - 2] = array[y]; + } + + array[patternLength - 2] = 0; + array[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return NSMakeRange(NSNotFound, 0); +} + +/** + * Attempts to decode a single UPC/EAN-encoded digit. + */ ++ (int)decodeDigit:(ZXBitArray *)row counters:(ZXIntArray *)counters rowOffset:(int)rowOffset patternType:(ZX_UPC_EAN_PATTERNS)patternType error:(NSError **)error { + if (![self recordPattern:row start:rowOffset counters:counters]) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + float bestVariance = ZX_UPC_EAN_MAX_AVG_VARIANCE; + int bestMatch = -1; + int max = 0; + switch (patternType) { + case ZX_UPC_EAN_PATTERNS_L_PATTERNS: + max = ZX_UPC_EAN_L_PATTERNS_LEN; + for (int i = 0; i < max; i++) { + int pattern[counters.length]; + for (int j = 0; j < counters.length; j++){ + pattern[j] = ZX_UPC_EAN_L_PATTERNS[i][j]; + } + + float variance = [self patternMatchVariance:counters pattern:pattern maxIndividualVariance:ZX_UPC_EAN_MAX_INDIVIDUAL_VARIANCE]; + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = i; + } + } + break; + case ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS: + max = ZX_UPC_EAN_L_AND_G_PATTERNS_LEN; + for (int i = 0; i < max; i++) { + int pattern[counters.length]; + for (int j = 0; j< counters.length; j++){ + pattern[j] = ZX_UPC_EAN_L_AND_G_PATTERNS[i][j]; + } + + float variance = [self patternMatchVariance:counters pattern:pattern maxIndividualVariance:ZX_UPC_EAN_MAX_INDIVIDUAL_VARIANCE]; + if (variance < bestVariance) { + bestVariance = variance; + bestMatch = i; + } + } + break; + default: + break; + } + + if (bestMatch >= 0) { + return bestMatch; + } else { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } +} + +- (ZXBarcodeFormat)barcodeFormat { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.h new file mode 100644 index 0000000..ce78196 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDimensionalCodeWriter.h" + +/** + * Encapsulates functionality and implementation that is common to UPC and EAN families + * of one-dimensional barcodes. + */ +@interface ZXUPCEANWriter : ZXOneDimensionalCodeWriter + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.m new file mode 100644 index 0000000..27ba383 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.m @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBitMatrix.h" +#import "ZXUPCEANReader.h" +#import "ZXUPCEANWriter.h" + +@implementation ZXUPCEANWriter + +- (int)defaultMargin { + // Use a different default more appropriate for UPC/EAN + return ZX_UPC_EAN_START_END_PATTERN_LEN; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.h new file mode 100644 index 0000000..7553319 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXUPCEANReader.h" + +/** + * Implements decoding of the UPC-E format. + * + * http://www.barcodeisland.com/upce.phtml is a great reference for UPC-E information. + */ +@interface ZXUPCEReader : ZXUPCEANReader + ++ (NSString *)convertUPCEtoUPCA:(NSString *)upce; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.m new file mode 100644 index 0000000..949861b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.m @@ -0,0 +1,154 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXUPCEReader.h" + +/** + * The pattern that marks the middle, and end, of a UPC-E pattern. + * There is no "second half" to a UPC-E barcode. + */ +const int ZX_UCPE_MIDDLE_END_PATTERN[] = {1, 1, 1, 1, 1, 1}; + +/** + * See ZX_UCPE_L_AND_G_PATTERNS; these values similarly represent patterns of + * even-odd parity encodings of digits that imply both the number system (0 or 1) + * used, and the check digit. + */ +const int ZX_UCPE_NUMSYS_AND_CHECK_DIGIT_PATTERNS[][10] = { + {0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25}, + {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} +}; + +@interface ZXUPCEReader () + +@property (nonatomic, strong, readonly) ZXIntArray *decodeMiddleCounters; + +@end + +@implementation ZXUPCEReader + +- (id)init { + if (self = [super init]) { + _decodeMiddleCounters = [[ZXIntArray alloc] initWithLength:4]; + } + + return self; +} + +- (int)decodeMiddle:(ZXBitArray *)row startRange:(NSRange)startRange result:(NSMutableString *)result error:(NSError **)error { + ZXIntArray *counters = self.decodeMiddleCounters; + [counters clear]; + + int end = [row size]; + int rowOffset = (int)NSMaxRange(startRange); + int lgPatternFound = 0; + + for (int x = 0; x < 6 && rowOffset < end; x++) { + int bestMatch = [ZXUPCEANReader decodeDigit:row counters:counters rowOffset:rowOffset patternType:ZX_UPC_EAN_PATTERNS_L_AND_G_PATTERNS error:error]; + if (bestMatch == -1) { + return -1; + } + [result appendFormat:@"%C", (unichar)('0' + bestMatch % 10)]; + + rowOffset += [counters sum]; + + if (bestMatch >= 10) { + lgPatternFound |= 1 << (5 - x); + } + } + + if (![self determineNumSysAndCheckDigit:result lgPatternFound:lgPatternFound]) { + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + return rowOffset; +} + +- (NSRange)decodeEnd:(ZXBitArray *)row endStart:(int)endStart error:(NSError **)error { + return [ZXUPCEANReader findGuardPattern:row + rowOffset:endStart + whiteFirst:YES + pattern:ZX_UCPE_MIDDLE_END_PATTERN + patternLen:sizeof(ZX_UCPE_MIDDLE_END_PATTERN) / sizeof(int) + error:error]; +} + +- (BOOL)checkChecksum:(NSString *)s error:(NSError **)error { + return [super checkChecksum:[ZXUPCEReader convertUPCEtoUPCA:s] error:error]; +} + +- (BOOL)determineNumSysAndCheckDigit:(NSMutableString *)resultString lgPatternFound:(int)lgPatternFound { + for (int numSys = 0; numSys <= 1; numSys++) { + for (int d = 0; d < 10; d++) { + if (lgPatternFound == ZX_UCPE_NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { + [resultString insertString:[NSString stringWithFormat:@"%C", (unichar)('0' + numSys)] atIndex:0]; + [resultString appendFormat:@"%C", (unichar)('0' + d)]; + return YES; + } + } + } + + return NO; +} + +- (ZXBarcodeFormat)barcodeFormat { + return kBarcodeFormatUPCE; +} + +/** + * Expands a UPC-E value back into its full, equivalent UPC-A code value. + * + * @param upce UPC-E code as string of digits + * @return equivalent UPC-A code as string of digits + */ ++ (NSString *)convertUPCEtoUPCA:(NSString *)upce { + NSString *upceChars = [upce substringWithRange:NSMakeRange(1, 6)]; + NSMutableString *result = [NSMutableString stringWithCapacity:12]; + [result appendFormat:@"%C", [upce characterAtIndex:0]]; + unichar lastChar = [upceChars characterAtIndex:5]; + switch (lastChar) { + case '0': + case '1': + case '2': + [result appendString:[upceChars substringToIndex:2]]; + [result appendFormat:@"%C", lastChar]; + [result appendString:@"0000"]; + [result appendString:[upceChars substringWithRange:NSMakeRange(2, 3)]]; + break; + case '3': + [result appendString:[upceChars substringToIndex:3]]; + [result appendString:@"00000"]; + [result appendString:[upceChars substringWithRange:NSMakeRange(3, 2)]]; + break; + case '4': + [result appendString:[upceChars substringToIndex:4]]; + [result appendString:@"00000"]; + [result appendString:[upceChars substringWithRange:NSMakeRange(4, 1)]]; + break; + default: + [result appendString:[upceChars substringToIndex:5]]; + [result appendString:@"0000"]; + [result appendFormat:@"%C", lastChar]; + break; + } + [result appendFormat:@"%C", [upce characterAtIndex:7]]; + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXingObjCOneD.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXingObjCOneD.h new file mode 100644 index 0000000..205b3e1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/ZXingObjCOneD.h @@ -0,0 +1,92 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ZXINGOBJC_ONED_ + +#define _ZXINGOBJC_ONED_ + +// OneD + +#import "ZXAbstractExpandedDecoder.h" +#import "ZXAbstractRSSReader.h" +#import "ZXCodaBarReader.h" +#import "ZXCodaBarWriter.h" +#import "ZXCode128Reader.h" +#import "ZXCode128Writer.h" +#import "ZXCode39Reader.h" +#import "ZXCode39Writer.h" +#import "ZXCode93Reader.h" +#import "ZXEAN13Reader.h" +#import "ZXEAN13Writer.h" +#import "ZXEAN8Reader.h" +#import "ZXEAN8Writer.h" +#import "ZXITFReader.h" +#import "ZXITFWriter.h" +#import "ZXMultiFormatOneDReader.h" +#import "ZXMultiFormatUPCEANReader.h" +#import "ZXOneDimensionalCodeWriter.h" +#import "ZXOneDReader.h" +#import "ZXRSS14Reader.h" +#import "ZXRSSDataCharacter.h" +#import "ZXRSSExpandedReader.h" +#import "ZXRSSFinderPattern.h" +#import "ZXRSSUtils.h" +#import "ZXUPCAReader.h" +#import "ZXUPCAWriter.h" +#import "ZXUPCEANReader.h" +#import "ZXUPCEANWriter.h" +#import "ZXUPCEReader.h" + +// Result Parsers + +#import "ZXAddressBookAUResultParser.h" +#import "ZXAddressBookDoCoMoResultParser.h" +#import "ZXAddressBookParsedResult.h" +#import "ZXBizcardResultParser.h" +#import "ZXBookmarkDoCoMoResultParser.h" +#import "ZXCalendarParsedResult.h" +#import "ZXEmailAddressParsedResult.h" +#import "ZXEmailAddressResultParser.h" +#import "ZXEmailDoCoMoResultParser.h" +#import "ZXExpandedProductParsedResult.h" +#import "ZXExpandedProductResultParser.h" +#import "ZXGeoParsedResult.h" +#import "ZXGeoResultParser.h" +#import "ZXISBNParsedResult.h" +#import "ZXISBNResultParser.h" +#import "ZXParsedResult.h" +#import "ZXParsedResultType.h" +#import "ZXProductParsedResult.h" +#import "ZXProductResultParser.h" +#import "ZXResultParser.h" +#import "ZXSMSMMSResultParser.h" +#import "ZXSMSParsedResult.h" +#import "ZXSMSTOMMSTOResultParser.h" +#import "ZXSMTPResultParser.h" +#import "ZXTelParsedResult.h" +#import "ZXTelResultParser.h" +#import "ZXTextParsedResult.h" +#import "ZXURIParsedResult.h" +#import "ZXURIResultParser.h" +#import "ZXURLTOResultParser.h" +#import "ZXVCardResultParser.h" +#import "ZXVEventResultParser.h" +#import "ZXVINParsedResult.h" +#import "ZXVINResultParser.h" +#import "ZXWifiParsedResult.h" +#import "ZXWifiResultParser.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.h new file mode 100644 index 0000000..4723841 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.h @@ -0,0 +1,43 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXOneDReader.h" + +@class ZXIntArray; + +typedef enum { + ZX_RSS_PATTERNS_RSS14_PATTERNS = 0, + ZX_RSS_PATTERNS_RSS_EXPANDED_PATTERNS +} ZX_RSS_PATTERNS; + +@interface ZXAbstractRSSReader : ZXOneDReader + +@property (nonatomic, strong, readonly) ZXIntArray *decodeFinderCounters; +@property (nonatomic, strong, readonly) ZXIntArray *dataCharacterCounters; +@property (nonatomic, assign, readonly) float *oddRoundingErrors; +@property (nonatomic, assign, readonly) unsigned int oddRoundingErrorsLen; +@property (nonatomic, assign, readonly) float *evenRoundingErrors; +@property (nonatomic, assign, readonly) unsigned int evenRoundingErrorsLen; +@property (nonatomic, strong, readonly) ZXIntArray *oddCounts; +@property (nonatomic, strong, readonly) ZXIntArray *evenCounts; + ++ (int)parseFinderValue:(ZXIntArray *)counters finderPatternType:(ZX_RSS_PATTERNS)finderPatternType; ++ (int)count:(ZXIntArray *)array; ++ (void)increment:(ZXIntArray *)array errors:(float *)errors; ++ (void)decrement:(ZXIntArray *)array errors:(float *)errors; ++ (BOOL)isFinderPattern:(ZXIntArray *)counters; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.m new file mode 100644 index 0000000..66bb065 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.m @@ -0,0 +1,161 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractRSSReader.h" +#import "ZXIntArray.h" + +static float ZX_RSS_MAX_AVG_VARIANCE = 0.2f; +static float ZX_RSS_MAX_INDIVIDUAL_VARIANCE = 0.45f; + +float const ZX_RSS_MIN_FINDER_PATTERN_RATIO = 9.5f / 12.0f; +float const ZX_RSS_MAX_FINDER_PATTERN_RATIO = 12.5f / 14.0f; + +#define ZX_RSS14_FINDER_PATTERNS_LEN 9 +#define ZX_RSS14_FINDER_PATTERNS_SUB_LEN 4 +const int ZX_RSS14_FINDER_PATTERNS[ZX_RSS14_FINDER_PATTERNS_LEN][ZX_RSS14_FINDER_PATTERNS_SUB_LEN] = { + {3,8,2,1}, + {3,5,5,1}, + {3,3,7,1}, + {3,1,9,1}, + {2,7,4,1}, + {2,5,6,1}, + {2,3,8,1}, + {1,5,7,1}, + {1,3,9,1}, +}; + +#define ZX_RSS_EXPANDED_FINDER_PATTERNS_LEN 6 +#define ZX_RSS_EXPANDED_FINDER_PATTERNS_SUB_LEN 4 +const int ZX_RSS_EXPANDED_FINDER_PATTERNS[ZX_RSS_EXPANDED_FINDER_PATTERNS_LEN][ZX_RSS_EXPANDED_FINDER_PATTERNS_SUB_LEN] = { + {1,8,4,1}, // A + {3,6,4,1}, // B + {3,4,6,1}, // C + {3,2,8,1}, // D + {2,6,5,1}, // E + {2,2,9,1} // F +}; + +@implementation ZXAbstractRSSReader + +- (id)init { + if (self = [super init]) { + _decodeFinderCounters = [[ZXIntArray alloc] initWithLength:4]; + _dataCharacterCounters = [[ZXIntArray alloc] initWithLength:8]; + + _oddRoundingErrorsLen = 4; + _oddRoundingErrors = (float *)malloc(_oddRoundingErrorsLen * sizeof(float)); + memset(_oddRoundingErrors, 0, _oddRoundingErrorsLen * sizeof(float)); + + _evenRoundingErrorsLen = 4; + _evenRoundingErrors = (float *)malloc(_evenRoundingErrorsLen * sizeof(float)); + memset(_evenRoundingErrors, 0, _evenRoundingErrorsLen * sizeof(float)); + + _oddCounts = [[ZXIntArray alloc] initWithLength:_dataCharacterCounters.length / 2]; + _evenCounts = [[ZXIntArray alloc] initWithLength:_dataCharacterCounters.length / 2]; + } + + return self; +} + +- (void)dealloc { + if (_oddRoundingErrors != NULL) { + free(_oddRoundingErrors); + _oddRoundingErrors = NULL; + } + + if (_evenRoundingErrors != NULL) { + free(_evenRoundingErrors); + _evenRoundingErrors = NULL; + } +} + ++ (int)parseFinderValue:(ZXIntArray *)counters finderPatternType:(ZX_RSS_PATTERNS)finderPatternType { + switch (finderPatternType) { + case ZX_RSS_PATTERNS_RSS14_PATTERNS: + for (int value = 0; value < ZX_RSS14_FINDER_PATTERNS_LEN; value++) { + if ([self patternMatchVariance:counters pattern:ZX_RSS14_FINDER_PATTERNS[value] maxIndividualVariance:ZX_RSS_MAX_INDIVIDUAL_VARIANCE] < ZX_RSS_MAX_AVG_VARIANCE) { + return value; + } + } + break; + + case ZX_RSS_PATTERNS_RSS_EXPANDED_PATTERNS: + for (int value = 0; value < ZX_RSS_EXPANDED_FINDER_PATTERNS_LEN; value++) { + if ([self patternMatchVariance:counters pattern:ZX_RSS_EXPANDED_FINDER_PATTERNS[value] maxIndividualVariance:ZX_RSS_MAX_INDIVIDUAL_VARIANCE] < ZX_RSS_MAX_AVG_VARIANCE) { + return value; + } + } + break; + + default: + break; + } + + return -1; +} + ++ (int)count:(ZXIntArray *)array { + return [array sum]; +} + ++ (void)increment:(ZXIntArray *)array errors:(float *)errors { + int index = 0; + float biggestError = errors[0]; + for (int i = 1; i < array.length; i++) { + if (errors[i] > biggestError) { + biggestError = errors[i]; + index = i; + } + } + array.array[index]++; +} + ++ (void)decrement:(ZXIntArray *)array errors:(float *)errors { + int index = 0; + float biggestError = errors[0]; + for (int i = 1; i < array.length; i++) { + if (errors[i] < biggestError) { + biggestError = errors[i]; + index = i; + } + } + array.array[index]--; +} + ++ (BOOL)isFinderPattern:(ZXIntArray *)counters { + int32_t *array = counters.array; + int firstTwoSum = array[0] + array[1]; + int sum = firstTwoSum + array[2] + array[3]; + float ratio = (float)firstTwoSum / (float)sum; + if (ratio >= ZX_RSS_MIN_FINDER_PATTERN_RATIO && ratio <= ZX_RSS_MAX_FINDER_PATTERN_RATIO) { + int minCounter = INT_MAX; + int maxCounter = INT_MIN; + for (int i = 0; i < counters.length; i++) { + int counter = array[i]; + if (counter > maxCounter) { + maxCounter = counter; + } + if (counter < minCounter) { + minCounter = counter; + } + } + + return maxCounter < 10 * minCounter; + } + return NO; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.h new file mode 100644 index 0000000..49db392 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractRSSReader.h" + +@class ZXDecodeHints, ZXResult; + +/** + * Decodes RSS-14, including truncated and stacked variants. See ISO/IEC 24724:2006. + */ +@interface ZXRSS14Reader : ZXAbstractRSSReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.m new file mode 100644 index 0000000..0653bf3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.m @@ -0,0 +1,440 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXBarcodeFormat.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXResultPointCallback.h" +#import "ZXRSS14Reader.h" +#import "ZXRSSFinderPattern.h" +#import "ZXRSSPair.h" +#import "ZXRSSUtils.h" + +const int ZX_RSS14_OUTSIDE_EVEN_TOTAL_SUBSET[5] = {1,10,34,70,126}; +const int ZX_RSS14_INSIDE_ODD_TOTAL_SUBSET[4] = {4,20,48,81}; +const int ZX_RSS14_OUTSIDE_GSUM[5] = {0,161,961,2015,2715}; +const int ZX_RSS14_INSIDE_GSUM[4] = {0,336,1036,1516}; +const int ZX_RSS14_OUTSIDE_ODD_WIDEST[5] = {8,6,4,3,1}; +const int ZX_RSS14_INSIDE_ODD_WIDEST[4] = {2,4,6,8}; + +@interface ZXRSS14Reader () + +@property (nonatomic, strong, readonly) NSMutableArray *possibleLeftPairs; +@property (nonatomic, strong, readonly) NSMutableArray *possibleRightPairs; + +@end + +@implementation ZXRSS14Reader + +- (id)init { + if (self = [super init]) { + _possibleLeftPairs = [NSMutableArray array]; + _possibleRightPairs = [NSMutableArray array]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXRSSPair *leftPair = [self decodePair:row right:NO rowNumber:rowNumber hints:hints]; + [self addOrTally:self.possibleLeftPairs pair:leftPair]; + [row reverse]; + ZXRSSPair *rightPair = [self decodePair:row right:YES rowNumber:rowNumber hints:hints]; + [self addOrTally:self.possibleRightPairs pair:rightPair]; + [row reverse]; + + for (ZXRSSPair *left in self.possibleLeftPairs) { + if ([left count] > 1) { + for (ZXRSSPair *right in self.possibleRightPairs) { + if ([right count] > 1) { + if ([self checkChecksum:left rightPair:right]) { + return [self constructResult:left rightPair:right]; + } + } + } + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +- (void)addOrTally:(NSMutableArray *)possiblePairs pair:(ZXRSSPair *)pair { + if (pair == nil) { + return; + } + BOOL found = NO; + for (ZXRSSPair *other in possiblePairs) { + if (other.value == pair.value) { + [other incrementCount]; + found = YES; + break; + } + } + + if (!found) { + [possiblePairs addObject:pair]; + } +} + +- (void)reset { + [self.possibleLeftPairs removeAllObjects]; + [self.possibleRightPairs removeAllObjects]; +} + +- (ZXResult *)constructResult:(ZXRSSPair *)leftPair rightPair:(ZXRSSPair *)rightPair { + long long symbolValue = 4537077LL * leftPair.value + rightPair.value; + NSString *text = [@(symbolValue) stringValue]; + NSMutableString *buffer = [NSMutableString stringWithCapacity:14]; + + for (int i = 13 - (int)[text length]; i > 0; i--) { + [buffer appendString:@"0"]; + } + + [buffer appendString:text]; + int checkDigit = 0; + + for (int i = 0; i < 13; i++) { + int digit = [buffer characterAtIndex:i] - '0'; + checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; + } + + checkDigit = 10 - (checkDigit % 10); + if (checkDigit == 10) { + checkDigit = 0; + } + [buffer appendFormat:@"%d", checkDigit]; + NSArray *leftPoints = [[leftPair finderPattern] resultPoints]; + NSArray *rightPoints = [[rightPair finderPattern] resultPoints]; + return [ZXResult resultWithText:buffer + rawBytes:nil + resultPoints:@[leftPoints[0], leftPoints[1], rightPoints[0], rightPoints[1]] + format:kBarcodeFormatRSS14]; +} + +- (BOOL)checkChecksum:(ZXRSSPair *)leftPair rightPair:(ZXRSSPair *)rightPair { +// int leftFPValue = leftPair.finderPattern.value; +// int rightFPValue = rightPair.finderPattern.value; +// if ((leftFPValue == 0 && rightFPValue == 8) || (leftFPValue == 8 && rightFPValue == 0)) { +// } + int checkValue = (leftPair.checksumPortion + 16 * rightPair.checksumPortion) % 79; + int targetCheckValue = 9 * leftPair.finderPattern.value + rightPair.finderPattern.value; + if (targetCheckValue > 72) { + targetCheckValue--; + } + if (targetCheckValue > 8) { + targetCheckValue--; + } + return checkValue == targetCheckValue; +} + +- (ZXRSSPair *)decodePair:(ZXBitArray *)row right:(BOOL)right rowNumber:(int)rowNumber hints:(ZXDecodeHints *)hints { + ZXIntArray *startEnd = [self findFinderPattern:row rowOffset:0 rightFinderPattern:right]; + if (!startEnd) { + return nil; + } + ZXRSSFinderPattern *pattern = [self parseFoundFinderPattern:row rowNumber:rowNumber right:right startEnd:startEnd]; + if (!pattern) { + return nil; + } + id resultPointCallback = hints == nil ? nil : hints.resultPointCallback; + if (resultPointCallback != nil) { + float center = (startEnd.array[0] + startEnd.array[1]) / 2.0f; + if (right) { + center = [row size] - 1 - center; + } + [resultPointCallback foundPossibleResultPoint:[[ZXResultPoint alloc] initWithX:center y:rowNumber]]; + } + ZXRSSDataCharacter *outside = [self decodeDataCharacter:row pattern:pattern outsideChar:YES]; + ZXRSSDataCharacter *inside = [self decodeDataCharacter:row pattern:pattern outsideChar:NO]; + if (!outside || !inside) { + return nil; + } + return [[ZXRSSPair alloc] initWithValue:1597 * outside.value + inside.value + checksumPortion:outside.checksumPortion + 4 * inside.checksumPortion + finderPattern:pattern]; +} + +- (ZXRSSDataCharacter *)decodeDataCharacter:(ZXBitArray *)row pattern:(ZXRSSFinderPattern *)pattern outsideChar:(BOOL)outsideChar { + ZXIntArray *counters = self.dataCharacterCounters; + [counters clear]; + int32_t *array = counters.array; + + if (outsideChar) { + if (![ZXOneDReader recordPatternInReverse:row start:[pattern startEnd].array[0] counters:counters]) { + return nil; + } + } else { + if (![ZXOneDReader recordPattern:row start:[pattern startEnd].array[1] counters:counters]) { + return nil; + } + + for (int i = 0, j = counters.length - 1; i < j; i++, j--) { + int temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + } + + int numModules = outsideChar ? 16 : 15; + float elementWidth = (float)[ZXAbstractRSSReader count:counters] / (float)numModules; + + for (int i = 0; i < counters.length; i++) { + float value = (float) array[i] / elementWidth; + int count = (int)(value + 0.5f); + if (count < 1) { + count = 1; + } else if (count > 8) { + count = 8; + } + int offset = i / 2; + if ((i & 0x01) == 0) { + self.oddCounts.array[offset] = count; + self.oddRoundingErrors[offset] = value - count; + } else { + self.evenCounts.array[offset] = count; + self.evenRoundingErrors[offset] = value - count; + } + } + + if (![self adjustOddEvenCounts:outsideChar numModules:numModules]) { + return nil; + } + + int oddSum = 0; + int oddChecksumPortion = 0; + for (int i = self.oddCounts.length - 1; i >= 0; i--) { + oddChecksumPortion *= 9; + oddChecksumPortion += self.oddCounts.array[i]; + oddSum += self.oddCounts.array[i]; + } + int evenChecksumPortion = 0; + int evenSum = 0; + for (int i = self.evenCounts.length - 1; i >= 0; i--) { + evenChecksumPortion *= 9; + evenChecksumPortion += self.evenCounts.array[i]; + evenSum += self.evenCounts.array[i]; + } + int checksumPortion = oddChecksumPortion + 3 * evenChecksumPortion; + + if (outsideChar) { + if ((oddSum & 0x01) != 0 || oddSum > 12 || oddSum < 4) { + return nil; + } + int group = (12 - oddSum) / 2; + int oddWidest = ZX_RSS14_OUTSIDE_ODD_WIDEST[group]; + int evenWidest = 9 - oddWidest; + int vOdd = [ZXRSSUtils rssValue:self.oddCounts maxWidth:oddWidest noNarrow:NO]; + int vEven = [ZXRSSUtils rssValue:self.evenCounts maxWidth:evenWidest noNarrow:YES]; + int tEven = ZX_RSS14_OUTSIDE_EVEN_TOTAL_SUBSET[group]; + int gSum = ZX_RSS14_OUTSIDE_GSUM[group]; + return [[ZXRSSDataCharacter alloc] initWithValue:vOdd * tEven + vEven + gSum checksumPortion:checksumPortion]; + } else { + if ((evenSum & 0x01) != 0 || evenSum > 10 || evenSum < 4) { + return nil; + } + int group = (10 - evenSum) / 2; + int oddWidest = ZX_RSS14_INSIDE_ODD_WIDEST[group]; + int evenWidest = 9 - oddWidest; + int vOdd = [ZXRSSUtils rssValue:self.oddCounts maxWidth:oddWidest noNarrow:YES]; + int vEven = [ZXRSSUtils rssValue:self.evenCounts maxWidth:evenWidest noNarrow:NO]; + int tOdd = ZX_RSS14_INSIDE_ODD_TOTAL_SUBSET[group]; + int gSum = ZX_RSS14_INSIDE_GSUM[group]; + return [[ZXRSSDataCharacter alloc] initWithValue:vEven * tOdd + vOdd + gSum checksumPortion:checksumPortion]; + } +} + +- (ZXIntArray *)findFinderPattern:(ZXBitArray *)row rowOffset:(int)rowOffset rightFinderPattern:(BOOL)rightFinderPattern { + ZXIntArray *counters = self.decodeFinderCounters; + [counters clear]; + int32_t *array = counters.array; + + int width = row.size; + BOOL isWhite = NO; + while (rowOffset < width) { + isWhite = ![row get:rowOffset]; + if (rightFinderPattern == isWhite) { + break; + } + rowOffset++; + } + + int counterPosition = 0; + int patternStart = rowOffset; + for (int x = rowOffset; x < width; x++) { + if ([row get:x] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == 3) { + if ([ZXAbstractRSSReader isFinderPattern:counters]) { + return [[ZXIntArray alloc] initWithInts:patternStart, x, -1]; + } + patternStart += array[0] + array[1]; + array[0] = array[2]; + array[1] = array[3]; + array[2] = 0; + array[3] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + + return nil; +} + +- (ZXRSSFinderPattern *)parseFoundFinderPattern:(ZXBitArray *)row rowNumber:(int)rowNumber right:(BOOL)right startEnd:(ZXIntArray *)startEnd { + BOOL firstIsBlack = [row get:startEnd.array[0]]; + int firstElementStart = startEnd.array[0] - 1; + + while (firstElementStart >= 0 && firstIsBlack ^ [row get:firstElementStart]) { + firstElementStart--; + } + + firstElementStart++; + int firstCounter = startEnd.array[0] - firstElementStart; + + ZXIntArray *counters = self.decodeFinderCounters; + int32_t *array = counters.array; + for (int i = counters.length - 1; i > 0; i--) { + array[i] = array[i-1]; + } + array[0] = firstCounter; + int value = [ZXAbstractRSSReader parseFinderValue:counters finderPatternType:ZX_RSS_PATTERNS_RSS14_PATTERNS]; + if (value == -1) { + return nil; + } + int start = firstElementStart; + int end = startEnd.array[1]; + if (right) { + start = [row size] - 1 - start; + end = [row size] - 1 - end; + } + return [[ZXRSSFinderPattern alloc] initWithValue:value + startEnd:[[ZXIntArray alloc] initWithInts:firstElementStart, startEnd.array[1], -1] + start:start + end:end + rowNumber:rowNumber]; +} + +- (BOOL)adjustOddEvenCounts:(BOOL)outsideChar numModules:(int)numModules { + int oddSum = [ZXAbstractRSSReader count:self.oddCounts]; + int evenSum = [ZXAbstractRSSReader count:self.evenCounts]; + int mismatch = oddSum + evenSum - numModules; + BOOL oddParityBad = (oddSum & 0x01) == (outsideChar ? 1 : 0); + BOOL evenParityBad = (evenSum & 0x01) == 1; + + BOOL incrementOdd = NO; + BOOL decrementOdd = NO; + BOOL incrementEven = NO; + BOOL decrementEven = NO; + + if (outsideChar) { + if (oddSum > 12) { + decrementOdd = YES; + } else if (oddSum < 4) { + incrementOdd = YES; + } + if (evenSum > 12) { + decrementEven = YES; + } else if (evenSum < 4) { + incrementEven = YES; + } + } else { + if (oddSum > 11) { + decrementOdd = YES; + } else if (oddSum < 5) { + incrementOdd = YES; + } + if (evenSum > 10) { + decrementEven = YES; + } else if (evenSum < 4) { + incrementEven = YES; + } + } + + if (mismatch == 1) { + if (oddParityBad) { + if (evenParityBad) { + return NO; + } + decrementOdd = YES; + } else { + if (!evenParityBad) { + return NO; + } + decrementEven = YES; + } + } else if (mismatch == -1) { + if (oddParityBad) { + if (evenParityBad) { + return NO; + } + incrementOdd = YES; + } else { + if (!evenParityBad) { + return NO; + } + incrementEven = YES; + } + } else if (mismatch == 0) { + if (oddParityBad) { + if (!evenParityBad) { + return NO; + } + if (oddSum < evenSum) { + incrementOdd = YES; + decrementEven = YES; + } else { + decrementOdd = YES; + incrementEven = YES; + } + } else { + if (evenParityBad) { + return NO; + } + } + } else { + return NO; + } + if (incrementOdd) { + if (decrementOdd) { + return NO; + } + [ZXAbstractRSSReader increment:self.oddCounts errors:self.oddRoundingErrors]; + } + if (decrementOdd) { + [ZXAbstractRSSReader decrement:self.oddCounts errors:self.oddRoundingErrors]; + } + if (incrementEven) { + if (decrementEven) { + return NO; + } + [ZXAbstractRSSReader increment:self.evenCounts errors:self.oddRoundingErrors]; + } + if (decrementEven) { + [ZXAbstractRSSReader decrement:self.evenCounts errors:self.evenRoundingErrors]; + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.h new file mode 100644 index 0000000..78a9901 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXRSSDataCharacter : NSObject + +@property (nonatomic, assign, readonly) int value; +@property (nonatomic, assign, readonly) int checksumPortion; + +- (id)initWithValue:(int)value checksumPortion:(int)checksumPortion; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.m new file mode 100644 index 0000000..c862338 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.m @@ -0,0 +1,47 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSDataCharacter.h" + +@implementation ZXRSSDataCharacter + +- (id)initWithValue:(int)value checksumPortion:(int)checksumPortion { + if (self = [super init]) { + _value = value; + _checksumPortion = checksumPortion; + } + + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%d(%d)", self.value, self.checksumPortion]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[ZXRSSDataCharacter class]]) { + return NO; + } + + ZXRSSDataCharacter *that = (ZXRSSDataCharacter *)object; + return (self.value == that.value) && (self.checksumPortion == that.checksumPortion); +} + +- (NSUInteger)hash { + return self.value ^ self.checksumPortion; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.h new file mode 100644 index 0000000..f10eb1e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultPoint.h" + +@class ZXIntArray; + +@interface ZXRSSFinderPattern : NSObject + +@property (nonatomic, assign, readonly) int value; +@property (nonatomic, strong, readonly) ZXIntArray *startEnd; +@property (nonatomic, strong, readonly) NSMutableArray *resultPoints; + +- (id)initWithValue:(int)value startEnd:(ZXIntArray *)startEnd start:(int)start end:(int)end rowNumber:(int)rowNumber; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.m new file mode 100644 index 0000000..97af13c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.m @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSFinderPattern.h" + +@implementation ZXRSSFinderPattern + +- (id)initWithValue:(int)value startEnd:(ZXIntArray *)startEnd start:(int)start end:(int)end rowNumber:(int)rowNumber { + if (self = [super init]) { + _value = value; + _startEnd = startEnd; + _resultPoints = [@[[[ZXResultPoint alloc] initWithX:(float)start y:(float)rowNumber], + [[ZXResultPoint alloc] initWithX:(float)end y:(float)rowNumber]] mutableCopy]; + } + + return self; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[ZXRSSFinderPattern class]]) { + return NO; + } + + ZXRSSFinderPattern *that = (ZXRSSFinderPattern *)object; + return self.value == that.value; +} + +- (NSUInteger)hash { + return self.value; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.h new file mode 100644 index 0000000..2815220 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSDataCharacter.h" + +@class ZXRSSFinderPattern; + +@interface ZXRSSPair : ZXRSSDataCharacter + +@property (nonatomic, assign, readonly) int count; +@property (nonatomic, strong, readonly) ZXRSSFinderPattern *finderPattern; + +- (id)initWithValue:(int)value checksumPortion:(int)checksumPortion finderPattern:(ZXRSSFinderPattern *)finderPattern; +- (void)incrementCount; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.m new file mode 100644 index 0000000..ee2b8f9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.m @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSFinderPattern.h" +#import "ZXRSSPair.h" + +@interface ZXRSSPair () + +@property (nonatomic, assign) int count; + +@end + +@implementation ZXRSSPair + +- (id)initWithValue:(int)value checksumPortion:(int)checksumPortion finderPattern:(ZXRSSFinderPattern *)finderPattern { + if (self = [super initWithValue:value checksumPortion:checksumPortion]) { + _finderPattern = finderPattern; + } + + return self; +} + +- (void)incrementCount { + self.count++; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.h new file mode 100644 index 0000000..03b7105 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXIntArray; + +/** + * Adapted from listings in ISO/IEC 24724 Appendix B and Appendix G. + */ +@interface ZXRSSUtils : NSObject + +//+ (NSArray *)rssWidths:(int)val n:(int)n elements:(int)elements maxWidth:(int)maxWidth noNarrow:(BOOL)noNarrow; ++ (int)rssValue:(ZXIntArray *)widths maxWidth:(int)maxWidth noNarrow:(BOOL)noNarrow; +//+ (NSArray *)elements:(NSArray *)eDist N:(int)N K:(int)K; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.m new file mode 100644 index 0000000..aa46919 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.m @@ -0,0 +1,156 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXRSSUtils.h" + +@implementation ZXRSSUtils + +/* ++ (NSArray *)rssWidths:(int)val n:(int)n elements:(int)elements maxWidth:(int)maxWidth noNarrow:(BOOL)noNarrow { + NSMutableArray *widths = [NSMutableArray arrayWithCapacity:elements]; + int bar; + int narrowMask = 0; + for (bar = 0; bar < elements - 1; bar++) { + narrowMask |= 1 << bar; + int elmWidth = 1; + int subVal; + while (YES) { + subVal = [self combins:n - elmWidth - 1 r:elements - bar - 2]; + if (noNarrow && (narrowMask == 0) && (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= [self combins:n - elmWidth - (elements - bar) r:elements - bar - 2]; + } + if (elements - bar - 1 > 1) { + int lessVal = 0; + for (int mxwElement = n - elmWidth - (elements - bar - 2); mxwElement > maxWidth; mxwElement--) { + lessVal += [self combins:n - elmWidth - mxwElement - 1 r:elements - bar - 3]; + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val -= subVal; + if (val < 0) { + break; + } + elmWidth++; + narrowMask &= ~(1 << bar); + } + val += subVal; + n -= elmWidth; + [widths addObject:@(elmWidth)]; + } + + [widths addObject:@(n)]; + return widths; +} +*/ + ++ (int)rssValue:(ZXIntArray *)widths maxWidth:(int)maxWidth noNarrow:(BOOL)noNarrow { + int elements = widths.length; + int n = 0; + for (int i = 0; i < elements; i++) { + n += widths.array[i]; + } + int val = 0; + int narrowMask = 0; + for (int bar = 0; bar < elements - 1; bar++) { + int elmWidth; + for (elmWidth = 1, narrowMask |= 1 << bar; + elmWidth < widths.array[bar]; + elmWidth++, narrowMask &= ~(1 << bar)) { + int subVal = [self combins:n - elmWidth - 1 r:elements - bar - 2]; + if (noNarrow && (narrowMask == 0) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= [self combins:n - elmWidth - (elements - bar) + r:elements - bar - 2]; + } + if (elements - bar - 1 > 1) { + int lessVal = 0; + for (int mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; mxwElement--) { + lessVal += [self combins:n - elmWidth - mxwElement - 1 + r:elements - bar - 3]; + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val += subVal; + } + n -= elmWidth; + } + return val; +} + ++ (int)combins:(int)n r:(int)r { + int maxDenom; + int minDenom; + if (n - r > r) { + minDenom = r; + maxDenom = n - r; + } else { + minDenom = n - r; + maxDenom = r; + } + int val = 1; + int j = 1; + for (int i = n; i > maxDenom; i--) { + val *= i; + if (j <= minDenom) { + val /= j; + j++; + } + } + while (j <= minDenom) { + val /= j; + j++; + } + return val; +} + +/* ++ (NSArray *)elements:(NSArray *)eDist N:(int)N K:(int)K { + NSMutableArray *widths = [NSMutableArray arrayWithCapacity:[eDist count] + 2]; + int twoK = 2 * K; + [widths addObject:@1]; + int i; + int minEven = 10; + int barSum = 1; + for (i = 1; i < twoK - 2; i += 2) { + [widths addObject:@([eDist[i - 1] intValue] - [widths[i - 1] intValue])]; + [widths addObject:@([eDist[i] intValue] - [widths[i] intValue])]; + barSum += [widths[i] intValue] + [widths[i + 1] intValue]; + if ([widths[i] intValue] < minEven) { + minEven = [widths[i] intValue]; + } + } + + [widths addObject:@(N - barSum)]; + if ([widths[twoK - 1] intValue] < minEven) { + minEven = [widths[twoK - 1] intValue]; + } + if (minEven > 1) { + for (i = 0; i < twoK; i += 2) { + widths[i] = @([widths[i] intValue] + minEven - 1); + widths[i + 1] = @([widths[i + 1] intValue] - minEven - 1); + } + } + return widths; +} +*/ + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.h new file mode 100644 index 0000000..058b7cb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray; + +@interface ZXBitArrayBuilder : NSObject + ++ (ZXBitArray *)buildBitArray:(NSArray *)pairs; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.m new file mode 100644 index 0000000..c8ff3b0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.m @@ -0,0 +1,70 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXBitArrayBuilder.h" +#import "ZXRSSDataCharacter.h" +#import "ZXRSSExpandedPair.h" + +@implementation ZXBitArrayBuilder + ++ (ZXBitArray *)buildBitArray:(NSArray *)pairs { + int charNumber = ((int)[pairs count] * 2) - 1; + if ([pairs[pairs.count - 1] rightChar] == nil) { + charNumber -= 1; + } + + int size = 12 * charNumber; + + ZXBitArray *binary = [[ZXBitArray alloc] initWithSize:size]; + int accPos = 0; + + ZXRSSExpandedPair *firstPair = pairs[0]; + int firstValue = [[firstPair rightChar] value]; + for (int i = 11; i >= 0; --i) { + if ((firstValue & (1 << i)) != 0) { + [binary set:accPos]; + } + accPos++; + } + + for (int i = 1; i < [pairs count]; ++i) { + ZXRSSExpandedPair *currentPair = pairs[i]; + int leftValue = [[currentPair leftChar] value]; + + for (int j = 11; j >= 0; --j) { + if ((leftValue & (1 << j)) != 0) { + [binary set:accPos]; + } + accPos++; + } + + if ([currentPair rightChar] != nil) { + int rightValue = [[currentPair rightChar] value]; + + for (int j = 11; j >= 0; --j) { + if ((rightValue & (1 << j)) != 0) { + [binary set:accPos]; + } + accPos++; + } + } + } + + return binary; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.h new file mode 100644 index 0000000..58c9047 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXRSSDataCharacter, ZXRSSFinderPattern; + +@interface ZXRSSExpandedPair : NSObject + +@property (nonatomic, strong, readonly) ZXRSSDataCharacter *leftChar; +@property (nonatomic, strong, readonly) ZXRSSDataCharacter *rightChar; +@property (nonatomic, strong, readonly) ZXRSSFinderPattern *finderPattern; +@property (nonatomic, assign, readonly) BOOL mayBeLast; +@property (nonatomic, assign, readonly) BOOL mustBeLast; + +- (id)initWithLeftChar:(ZXRSSDataCharacter *)leftChar rightChar:(ZXRSSDataCharacter *)rightChar finderPattern:(ZXRSSFinderPattern *)finderPattern mayBeLast:(BOOL)mayBeLast; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.m new file mode 100644 index 0000000..879abe5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.m @@ -0,0 +1,67 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSDataCharacter.h" +#import "ZXRSSExpandedPair.h" +#import "ZXRSSFinderPattern.h" + +@implementation ZXRSSExpandedPair + +- (id)initWithLeftChar:(ZXRSSDataCharacter *)leftChar rightChar:(ZXRSSDataCharacter *)rightChar + finderPattern:(ZXRSSFinderPattern *)finderPattern mayBeLast:(BOOL)mayBeLast { + if (self = [super init]) { + _leftChar = leftChar; + _rightChar = rightChar; + _finderPattern = finderPattern; + _mayBeLast = mayBeLast; + } + + return self; +} + +- (BOOL)mustBeLast { + return self.rightChar == nil; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"[ %@, %@ : %@ ]", + self.leftChar, self.rightChar, + self.finderPattern == nil ? @"null" : [NSString stringWithFormat:@"%d", self.finderPattern.value]]; +} + +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[ZXRSSExpandedPair class]]) { + return NO; + } + ZXRSSExpandedPair *that = (ZXRSSExpandedPair *)object; + return [ZXRSSExpandedPair isEqualOrNil:self.leftChar toObject:that.leftChar] && + [ZXRSSExpandedPair isEqualOrNil:self.rightChar toObject:that.rightChar] && + [ZXRSSExpandedPair isEqualOrNil:self.finderPattern toObject:that.finderPattern]; +} + ++ (BOOL)isEqualOrNil:(id)o1 toObject:(id)o2 { + return o1 == nil ? o2 == nil : [o1 isEqual:o2]; +} + +- (NSUInteger)hash { + return [self hashNotNil:self.leftChar] ^ [self hashNotNil:self.rightChar] ^ [self hashNotNil:self.finderPattern]; +} + +- (NSUInteger)hashNotNil:(NSObject *)o { + return o == nil ? 0 : o.hash; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.h new file mode 100644 index 0000000..73541f7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractRSSReader.h" + +@class ZXRSSDataCharacter, ZXRSSFinderPattern; + +@interface ZXRSSExpandedReader : ZXAbstractRSSReader + +@property (nonatomic, strong, readonly) NSMutableArray *rows; + +- (ZXRSSDataCharacter *)decodeDataCharacter:(ZXBitArray *)row pattern:(ZXRSSFinderPattern *)pattern isOddPattern:(BOOL)isOddPattern leftChar:(BOOL)leftChar; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.m new file mode 100644 index 0000000..4c680d7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.m @@ -0,0 +1,742 @@ + /* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractExpandedDecoder.h" +#import "ZXBitArray.h" +#import "ZXBitArrayBuilder.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXResult.h" +#import "ZXRSSDataCharacter.h" +#import "ZXRSSExpandedPair.h" +#import "ZXRSSExpandedReader.h" +#import "ZXRSSExpandedRow.h" +#import "ZXRSSFinderPattern.h" +#import "ZXRSSUtils.h" + +const int ZX_SYMBOL_WIDEST[] = {7, 5, 4, 3, 1}; +const int ZX_EVEN_TOTAL_SUBSET[] = {4, 20, 52, 104, 204}; +const int ZX_GSUM[] = {0, 348, 1388, 2948, 3988}; + +const int ZX_WEIGHTS[][8] = { + { 1, 3, 9, 27, 81, 32, 96, 77}, + { 20, 60, 180, 118, 143, 7, 21, 63}, + {189, 145, 13, 39, 117, 140, 209, 205}, + {193, 157, 49, 147, 19, 57, 171, 91}, + { 62, 186, 136, 197, 169, 85, 44, 132}, + {185, 133, 188, 142, 4, 12, 36, 108}, + {113, 128, 173, 97, 80, 29, 87, 50}, + {150, 28, 84, 41, 123, 158, 52, 156}, + { 46, 138, 203, 187, 139, 206, 196, 166}, + { 76, 17, 51, 153, 37, 111, 122, 155}, + { 43, 129, 176, 106, 107, 110, 119, 146}, + { 16, 48, 144, 10, 30, 90, 59, 177}, + {109, 116, 137, 200, 178, 112, 125, 164}, + { 70, 210, 208, 202, 184, 130, 179, 115}, + {134, 191, 151, 31, 93, 68, 204, 190}, + {148, 22, 66, 198, 172, 94, 71, 2}, + { 6, 18, 54, 162, 64, 192,154, 40}, + {120, 149, 25, 75, 14, 42,126, 167}, + { 79, 26, 78, 23, 69, 207,199, 175}, + {103, 98, 83, 38, 114, 131, 182, 124}, + {161, 61, 183, 127, 170, 88, 53, 159}, + { 55, 165, 73, 8, 24, 72, 5, 15}, + { 45, 135, 194, 160, 58, 174, 100, 89} +}; + +const int ZX_FINDER_PAT_A = 0; +const int ZX_FINDER_PAT_B = 1; +const int ZX_FINDER_PAT_C = 2; +const int ZX_FINDER_PAT_D = 3; +const int ZX_FINDER_PAT_E = 4; +const int ZX_FINDER_PAT_F = 5; + +#define ZX_FINDER_PATTERN_SEQUENCES_LEN 10 +#define ZX_FINDER_PATTERN_SEQUENCES_SUBLEN 11 +const int ZX_FINDER_PATTERN_SEQUENCES[ZX_FINDER_PATTERN_SEQUENCES_LEN][ZX_FINDER_PATTERN_SEQUENCES_SUBLEN] = { + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_A }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_B, ZX_FINDER_PAT_B }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_C, ZX_FINDER_PAT_B, ZX_FINDER_PAT_D }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_E, ZX_FINDER_PAT_B, ZX_FINDER_PAT_D, ZX_FINDER_PAT_C }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_E, ZX_FINDER_PAT_B, ZX_FINDER_PAT_D, ZX_FINDER_PAT_D, ZX_FINDER_PAT_F }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_E, ZX_FINDER_PAT_B, ZX_FINDER_PAT_D, ZX_FINDER_PAT_E, ZX_FINDER_PAT_F, ZX_FINDER_PAT_F }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_A, ZX_FINDER_PAT_B, ZX_FINDER_PAT_B, ZX_FINDER_PAT_C, ZX_FINDER_PAT_C, ZX_FINDER_PAT_D, ZX_FINDER_PAT_D }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_A, ZX_FINDER_PAT_B, ZX_FINDER_PAT_B, ZX_FINDER_PAT_C, ZX_FINDER_PAT_C, ZX_FINDER_PAT_D, ZX_FINDER_PAT_E, ZX_FINDER_PAT_E }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_A, ZX_FINDER_PAT_B, ZX_FINDER_PAT_B, ZX_FINDER_PAT_C, ZX_FINDER_PAT_C, ZX_FINDER_PAT_D, ZX_FINDER_PAT_E, ZX_FINDER_PAT_F, ZX_FINDER_PAT_F }, + { ZX_FINDER_PAT_A, ZX_FINDER_PAT_A, ZX_FINDER_PAT_B, ZX_FINDER_PAT_B, ZX_FINDER_PAT_C, ZX_FINDER_PAT_D, ZX_FINDER_PAT_D, ZX_FINDER_PAT_E, ZX_FINDER_PAT_E, ZX_FINDER_PAT_F, ZX_FINDER_PAT_F }, +}; + +@interface ZXRSSExpandedReader () + +@property (nonatomic, strong, readonly) ZXIntArray *startEnd; +@property (nonatomic, strong, readonly) NSMutableArray *pairs; +@property (nonatomic, strong) NSMutableArray *rows; +@property (nonatomic, assign) BOOL startFromEven; + +@end + +@implementation ZXRSSExpandedReader + +- (id)init { + if (self = [super init]) { + _pairs = [NSMutableArray array]; + _rows = [NSMutableArray array]; + _startFromEven = NO; + _startEnd = [[ZXIntArray alloc] initWithLength:2]; + } + + return self; +} + +- (ZXResult *)decodeRow:(int)rowNumber row:(ZXBitArray *)row hints:(ZXDecodeHints *)hints error:(NSError **)error { + // Rows can start with even pattern in case in prev rows there where odd number of patters. + // So lets try twice + [self.pairs removeAllObjects]; + self.startFromEven = NO; + NSMutableArray* pairs = [self decodeRow2pairs:rowNumber row:row error:error]; + if (pairs) { + ZXResult *result = [self constructResult:pairs error:error]; + if (result) { + return result; + } + } + + [self.pairs removeAllObjects]; + self.startFromEven = YES; + pairs = [self decodeRow2pairs:rowNumber row:row error:error]; + if (!pairs) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + return [self constructResult:pairs error:error]; +} + +- (void)reset { + [self.pairs removeAllObjects]; + [self.rows removeAllObjects]; +} + +- (NSMutableArray *)decodeRow2pairs:(int)rowNumber row:(ZXBitArray *)row error:(NSError **)error { + while (YES) { + ZXRSSExpandedPair *nextPair = [self retrieveNextPair:row previousPairs:self.pairs rowNumber:rowNumber]; + if (!nextPair) { + if ([self.pairs count] == 0) { + return nil; + } + break; + } + [self.pairs addObject:nextPair]; + } + + // TODO: verify sequence of finder patterns as in checkPairSequence() + if ([self checkChecksum]) { + return self.pairs; + } + + BOOL tryStackedDecode = [self.rows count] > 0; + BOOL wasReversed = NO; // TODO: deal with reversed rows + [self storeRow:rowNumber wasReversed:wasReversed]; + if (tryStackedDecode) { + // When the image is 180-rotated, then rows are sorted in wrong dirrection. + // Try twice with both the directions. + NSMutableArray *ps = [self checkRows:NO]; + if (ps) { + return ps; + } + ps = [self checkRows:YES]; + if (ps) { + return ps; + } + } + + return nil; +} + +- (NSMutableArray *)checkRows:(BOOL)reverse { + // Limit number of rows we are checking + // We use recursive algorithm with pure complexity and don't want it to take forever + // Stacked barcode can have up to 11 rows, so 25 seems resonable enough + if (self.rows.count > 25) { + [self.rows removeAllObjects]; + return nil; + } + + [self.pairs removeAllObjects]; + if (reverse) { + self.rows = [[[self.rows reverseObjectEnumerator] allObjects] mutableCopy]; + } + + NSMutableArray *ps = [self checkRows:[NSMutableArray array] current:0]; + + if (reverse) { + self.rows = [[[self.rows reverseObjectEnumerator] allObjects] mutableCopy]; + } + + return ps; +} + +// Try to construct a valid rows sequence +// Recursion is used to implement backtracking +- (NSMutableArray *)checkRows:(NSMutableArray *)collectedRows current:(int)currentRow { + for (int i = currentRow; i < [self.rows count]; i++) { + ZXRSSExpandedRow *row = self.rows[i]; + [self.pairs removeAllObjects]; + NSUInteger size = [collectedRows count]; + for (int j = 0; j < size; j++) { + [self.pairs addObjectsFromArray:[collectedRows[j] pairs]]; + } + [self.pairs addObjectsFromArray:row.pairs]; + + if (![self isValidSequence:self.pairs]) { + continue; + } + + if ([self checkChecksum]) { + return self.pairs; + } + + NSMutableArray *rs = [NSMutableArray array]; + [rs addObjectsFromArray:collectedRows]; + [rs addObject:row]; + NSMutableArray *ps = [self checkRows:rs current:i + 1]; + if (ps) { + return ps; + } + } + return nil; +} + +// Whether the pairs form a valid find pattern seqience, +// either complete or a prefix +- (BOOL)isValidSequence:(NSArray *)pairs { + int count = (int)[pairs count]; + for (int i = 0, sz = 2; i < ZX_FINDER_PATTERN_SEQUENCES_LEN; i++, sz++) { + if (count > sz) { + continue; + } + + BOOL stop = YES; + for (int j = 0; j < count; j++) { + if ([[pairs[j] finderPattern] value] != ZX_FINDER_PATTERN_SEQUENCES[i][j]) { + stop = NO; + break; + } + } + + if (stop) { + return YES; + } + } + + return NO; +} + +- (void)storeRow:(int)rowNumber wasReversed:(BOOL)wasReversed { + // Discard if duplicate above or below; otherwise insert in order by row number. + int insertPos = 0; + BOOL prevIsSame = NO; + BOOL nextIsSame = NO; + while (insertPos < [self.rows count]) { + ZXRSSExpandedRow *erow = self.rows[insertPos]; + if (erow.rowNumber > rowNumber) { + nextIsSame = [erow isEquivalent:self.pairs]; + break; + } + prevIsSame = [erow isEquivalent:self.pairs]; + insertPos++; + } + if (nextIsSame || prevIsSame) { + return; + } + + // When the row was partially decoded (e.g. 2 pairs found instead of 3), + // it will prevent us from detecting the barcode. + // Try to merge partial rows + + // Check whether the row is part of an allready detected row + if ([self isPartialRow:self.pairs of:self.rows]) { + return; + } + + [self.rows insertObject:[[ZXRSSExpandedRow alloc] initWithPairs:self.pairs rowNumber:rowNumber wasReversed:wasReversed] atIndex:insertPos]; + + [self removePartialRows:self.pairs from:self.rows]; +} + +// Remove all the rows that contains only specified pairs +- (void)removePartialRows:(NSArray *)pairs from:(NSMutableArray *)rows { + NSMutableArray *toRemove = [NSMutableArray array]; + for (ZXRSSExpandedRow *r in rows) { + if ([r.pairs count] == [pairs count]) { + continue; + } + BOOL allFound = YES; + for (ZXRSSExpandedPair *p in r.pairs) { + BOOL found = NO; + for (ZXRSSExpandedPair *pp in pairs) { + if ([p isEqual:pp]) { + found = YES; + break; + } + } + if (!found) { + allFound = NO; + break; + } + } + if (allFound) { + [toRemove addObject:r]; + } + } + + for (ZXRSSExpandedRow *r in toRemove) { + [rows removeObject:r]; + } +} + +- (BOOL)isPartialRow:(NSArray *)pairs of:(NSArray *)rows { + for (ZXRSSExpandedRow *r in rows) { + BOOL allFound = YES; + for (ZXRSSExpandedPair *p in pairs) { + BOOL found = NO; + for (ZXRSSExpandedPair *pp in r.pairs) { + if ([p isEqual:pp]) { + found = YES; + break; + } + } + if (!found) { + allFound = NO; + break; + } + } + if (allFound) { + // the row 'r' contain all the pairs from 'pairs' + return YES; + } + } + return NO; +} + +- (ZXResult *)constructResult:(NSMutableArray *)pairs error:(NSError **)error { + ZXBitArray *binary = [ZXBitArrayBuilder buildBitArray:pairs]; + + ZXAbstractExpandedDecoder *decoder = [ZXAbstractExpandedDecoder createDecoder:binary]; + NSString *resultingString = [decoder parseInformationWithError:error]; + if (!resultingString) { + return nil; + } + + NSArray *firstPoints = [[((ZXRSSExpandedPair *)_pairs[0]) finderPattern] resultPoints]; + NSArray *lastPoints = [[((ZXRSSExpandedPair *)[_pairs lastObject]) finderPattern] resultPoints]; + + return [ZXResult resultWithText:resultingString + rawBytes:nil + resultPoints:@[firstPoints[0], firstPoints[1], lastPoints[0], lastPoints[1]] + format:kBarcodeFormatRSSExpanded]; +} + +- (BOOL)checkChecksum { + ZXRSSExpandedPair *firstPair = self.pairs[0]; + ZXRSSDataCharacter *checkCharacter = firstPair.leftChar; + ZXRSSDataCharacter *firstCharacter = firstPair.rightChar; + + if (!firstCharacter) { + return NO; + } + + int checksum = [firstCharacter checksumPortion]; + int s = 2; + + for (int i = 1; i < self.pairs.count; ++i) { + ZXRSSExpandedPair *currentPair = self.pairs[i]; + checksum += currentPair.leftChar.checksumPortion; + s++; + ZXRSSDataCharacter *currentRightChar = currentPair.rightChar; + if (currentRightChar != nil) { + checksum += currentRightChar.checksumPortion; + s++; + } + } + + checksum %= 211; + + int checkCharacterValue = 211 * (s - 4) + checksum; + + return checkCharacterValue == checkCharacter.value; +} + +- (int)nextSecondBar:(ZXBitArray *)row initialPos:(int)initialPos { + int currentPos; + if ([row get:initialPos]) { + currentPos = [row nextUnset:initialPos]; + currentPos = [row nextSet:currentPos]; + } else { + currentPos = [row nextSet:initialPos]; + currentPos = [row nextUnset:currentPos]; + } + return currentPos; +} + +- (ZXRSSExpandedPair *)retrieveNextPair:(ZXBitArray *)row previousPairs:(NSMutableArray *)previousPairs rowNumber:(int)rowNumber { + BOOL isOddPattern = [previousPairs count] % 2 == 0; + if (self.startFromEven) { + isOddPattern = !isOddPattern; + } + + ZXRSSFinderPattern *pattern; + + BOOL keepFinding = YES; + int forcedOffset = -1; + do { + if (![self findNextPair:row previousPairs:previousPairs forcedOffset:forcedOffset]) { + return nil; + } + pattern = [self parseFoundFinderPattern:row rowNumber:rowNumber oddPattern:isOddPattern]; + if (pattern == nil) { + forcedOffset = [self nextSecondBar:row initialPos:self.startEnd.array[0]]; + } else { + keepFinding = NO; + } + } while (keepFinding); + + // When stacked symbol is split over multiple rows, there's no way to guess if this pair can be last or not. + // boolean mayBeLast = checkPairSequence(previousPairs, pattern); + + ZXRSSDataCharacter *leftChar = [self decodeDataCharacter:row pattern:pattern isOddPattern:isOddPattern leftChar:YES]; + if (!leftChar) { + return nil; + } + + if (previousPairs.count > 0 && [[previousPairs lastObject] mustBeLast]) { + return nil; + } + + ZXRSSDataCharacter *rightChar = [self decodeDataCharacter:row pattern:pattern isOddPattern:isOddPattern leftChar:NO]; + BOOL mayBeLast = YES; + return [[ZXRSSExpandedPair alloc] initWithLeftChar:leftChar rightChar:rightChar finderPattern:pattern mayBeLast:mayBeLast]; +} + +- (BOOL)findNextPair:(ZXBitArray *)row previousPairs:(NSMutableArray *)previousPairs forcedOffset:(int)forcedOffset { + ZXIntArray *counters = self.decodeFinderCounters; + [counters clear]; + + int width = row.size; + + int rowOffset; + if (forcedOffset >= 0) { + rowOffset = forcedOffset; + } else if ([previousPairs count] == 0) { + rowOffset = 0; + } else { + ZXRSSExpandedPair *lastPair = [previousPairs lastObject]; + rowOffset = [[lastPair finderPattern] startEnd].array[1]; + } + BOOL searchingEvenPair = [previousPairs count] % 2 != 0; + if (self.startFromEven) { + searchingEvenPair = !searchingEvenPair; + } + + BOOL isWhite = NO; + while (rowOffset < width) { + isWhite = ![row get:rowOffset]; + if (!isWhite) { + break; + } + rowOffset++; + } + + int counterPosition = 0; + int patternStart = rowOffset; + int32_t *array = counters.array; + for (int x = rowOffset; x < width; x++) { + if ([row get:x] ^ isWhite) { + array[counterPosition]++; + } else { + if (counterPosition == 3) { + if (searchingEvenPair) { + [self reverseCounters:counters]; + } + + if ([ZXAbstractRSSReader isFinderPattern:counters]) { + self.startEnd.array[0] = patternStart; + self.startEnd.array[1] = x; + return YES; + } + + if (searchingEvenPair) { + [self reverseCounters:counters]; + } + + patternStart += array[0] + array[1]; + array[0] = array[2]; + array[1] = array[3]; + array[2] = 0; + array[3] = 0; + counterPosition--; + } else { + counterPosition++; + } + array[counterPosition] = 1; + isWhite = !isWhite; + } + } + return NO; +} + +- (void)reverseCounters:(ZXIntArray *)counters { + int length = counters.length; + int32_t *array = counters.array; + for (int i = 0; i < length / 2; ++i) { + int tmp = array[i]; + array[i] = array[length - i - 1]; + array[length - i - 1] = tmp; + } +} + +- (ZXRSSFinderPattern *)parseFoundFinderPattern:(ZXBitArray *)row rowNumber:(int)rowNumber oddPattern:(BOOL)oddPattern { + // Actually we found elements 2-5. + int firstCounter; + int start; + int end; + + if (oddPattern) { + // If pattern number is odd, we need to locate element 1 *before *the current block. + + int firstElementStart = self.startEnd.array[0] - 1; + // Locate element 1 + while (firstElementStart >= 0 && ![row get:firstElementStart]) { + firstElementStart--; + } + + firstElementStart++; + firstCounter = self.startEnd.array[0] - firstElementStart; + start = firstElementStart; + end = self.startEnd.array[1]; + } else { + // If pattern number is even, the pattern is reversed, so we need to locate element 1 *after *the current block. + + start = self.startEnd.array[0]; + + end = [row nextUnset:self.startEnd.array[1] + 1]; + firstCounter = end - self.startEnd.array[1]; + } + + // Make 'counters' hold 1-4 + ZXIntArray *counters = [[ZXIntArray alloc] initWithLength:self.decodeFinderCounters.length]; + for (int i = 1; i < counters.length; i++) { + counters.array[i] = self.decodeFinderCounters.array[i - 1]; + } + + counters.array[0] = firstCounter; + memcpy(self.decodeFinderCounters.array, counters.array, counters.length * sizeof(int32_t)); + + int value = [ZXAbstractRSSReader parseFinderValue:counters finderPatternType:ZX_RSS_PATTERNS_RSS_EXPANDED_PATTERNS]; + if (value == -1) { + return nil; + } + return [[ZXRSSFinderPattern alloc] initWithValue:value startEnd:[[ZXIntArray alloc] initWithInts:start, end, -1] start:start end:end rowNumber:rowNumber]; +} + +- (ZXRSSDataCharacter *)decodeDataCharacter:(ZXBitArray *)row pattern:(ZXRSSFinderPattern *)pattern isOddPattern:(BOOL)isOddPattern leftChar:(BOOL)leftChar { + ZXIntArray *counters = self.dataCharacterCounters; + [counters clear]; + + if (leftChar) { + if (![ZXOneDReader recordPatternInReverse:row start:[pattern startEnd].array[0] counters:counters]) { + return nil; + } + } else { + if (![ZXOneDReader recordPattern:row start:[pattern startEnd].array[1] counters:counters]) { + return nil; + } + // reverse it + int32_t *array = counters.array; + for (int i = 0, j = counters.length - 1; i < j; i++, j--) { + int temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + }//counters[] has the pixels of the module + + int numModules = 17; //left and right data characters have all the same length + float elementWidth = (float)[ZXAbstractRSSReader count:counters] / (float)numModules; + + // Sanity check: element width for pattern and the character should match + float expectedElementWidth = (pattern.startEnd.array[1] - pattern.startEnd.array[0]) / 15.0f; + if (fabsf(elementWidth - expectedElementWidth) / expectedElementWidth > 0.3f) { + return nil; + } + + int32_t *array = counters.array; + for (int i = 0; i < counters.length; i++) { + float value = 1.0f * array[i] / elementWidth; + int count = (int)(value + 0.5f); + if (count < 1) { + if (value < 0.3f) { + return nil; + } + count = 1; + } else if (count > 8) { + if (value > 8.7f) { + return nil; + } + count = 8; + } + int offset = i / 2; + if ((i & 0x01) == 0) { + self.oddCounts.array[offset] = count; + self.oddRoundingErrors[offset] = value - count; + } else { + self.evenCounts.array[offset] = count; + self.evenRoundingErrors[offset] = value - count; + } + } + + if (![self adjustOddEvenCounts:numModules]) { + return nil; + } + + int weightRowNumber = 4 * pattern.value + (isOddPattern ? 0 : 2) + (leftChar ? 0 : 1) - 1; + + int oddSum = 0; + int oddChecksumPortion = 0; + for (int i = self.oddCounts.length - 1; i >= 0; i--) { + if ([self isNotA1left:pattern isOddPattern:isOddPattern leftChar:leftChar]) { + int weight = ZX_WEIGHTS[weightRowNumber][2 * i]; + oddChecksumPortion += self.oddCounts.array[i] * weight; + } + oddSum += self.oddCounts.array[i]; + } + int evenChecksumPortion = 0; + //int evenSum = 0; + for (int i = self.evenCounts.length - 1; i >= 0; i--) { + if ([self isNotA1left:pattern isOddPattern:isOddPattern leftChar:leftChar]) { + int weight = ZX_WEIGHTS[weightRowNumber][2 * i + 1]; + evenChecksumPortion += self.evenCounts.array[i] * weight; + } + //evenSum += self.evenCounts[i]; + } + int checksumPortion = oddChecksumPortion + evenChecksumPortion; + + if ((oddSum & 0x01) != 0 || oddSum > 13 || oddSum < 4) { + return nil; + } + + int group = (13 - oddSum) / 2; + int oddWidest = ZX_SYMBOL_WIDEST[group]; + int evenWidest = 9 - oddWidest; + int vOdd = [ZXRSSUtils rssValue:self.oddCounts maxWidth:oddWidest noNarrow:YES]; + int vEven = [ZXRSSUtils rssValue:self.evenCounts maxWidth:evenWidest noNarrow:NO]; + int tEven = ZX_EVEN_TOTAL_SUBSET[group]; + int gSum = ZX_GSUM[group]; + int value = vOdd * tEven + vEven + gSum; + return [[ZXRSSDataCharacter alloc] initWithValue:value checksumPortion:checksumPortion]; +} + +- (BOOL)isNotA1left:(ZXRSSFinderPattern *)pattern isOddPattern:(BOOL)isOddPattern leftChar:(BOOL)leftChar { + return !([pattern value] == 0 && isOddPattern && leftChar); +} + +- (BOOL)adjustOddEvenCounts:(int)numModules { + int oddSum = [ZXAbstractRSSReader count:self.oddCounts]; + int evenSum = [ZXAbstractRSSReader count:self.evenCounts]; + int mismatch = oddSum + evenSum - numModules; + BOOL oddParityBad = (oddSum & 0x01) == 1; + BOOL evenParityBad = (evenSum & 0x01) == 0; + BOOL incrementOdd = NO; + BOOL decrementOdd = NO; + if (oddSum > 13) { + decrementOdd = YES; + } else if (oddSum < 4) { + incrementOdd = YES; + } + BOOL incrementEven = NO; + BOOL decrementEven = NO; + if (evenSum > 13) { + decrementEven = YES; + } else if (evenSum < 4) { + incrementEven = YES; + } + + if (mismatch == 1) { + if (oddParityBad) { + if (evenParityBad) { + return NO; + } + decrementOdd = YES; + } else { + if (!evenParityBad) { + return NO; + } + decrementEven = YES; + } + } else if (mismatch == -1) { + if (oddParityBad) { + if (evenParityBad) { + return NO; + } + incrementOdd = YES; + } else { + if (!evenParityBad) { + return NO; + } + incrementEven = YES; + } + } else if (mismatch == 0) { + if (oddParityBad) { + if (!evenParityBad) { + return NO; + } + if (oddSum < evenSum) { + incrementOdd = YES; + decrementEven = YES; + } else { + decrementOdd = YES; + incrementEven = YES; + } + } else { + if (evenParityBad) { + return NO; + } + } + } else { + return NO; + } + + if (incrementOdd) { + if (decrementOdd) { + return NO; + } + [ZXAbstractRSSReader increment:self.oddCounts errors:self.oddRoundingErrors]; + } + if (decrementOdd) { + [ZXAbstractRSSReader decrement:self.oddCounts errors:self.oddRoundingErrors]; + } + if (incrementEven) { + if (decrementEven) { + return NO; + } + [ZXAbstractRSSReader increment:self.evenCounts errors:self.oddRoundingErrors]; + } + if (decrementEven) { + [ZXAbstractRSSReader decrement:self.evenCounts errors:self.evenRoundingErrors]; + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.h new file mode 100644 index 0000000..d693366 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * One row of an RSS Expanded Stacked symbol, consisting of 1+ expanded pairs. + */ +@interface ZXRSSExpandedRow : NSObject + +@property (nonatomic, strong, readonly) NSArray *pairs; +@property (nonatomic, assign, readonly) int rowNumber; +/** Did this row of the image have to be reversed (mirrored) to recognize the pairs? */ +@property (nonatomic, assign, readonly) BOOL wasReversed; + +- (id)initWithPairs:(NSArray *)pairs rowNumber:(int)rowNumber wasReversed:(BOOL)wasReversed; +- (BOOL)isReversed; +- (BOOL)isEquivalent:(NSArray *)otherPairs; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.m new file mode 100644 index 0000000..3629849 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.m @@ -0,0 +1,58 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedRow.h" + +@implementation ZXRSSExpandedRow + +- (id)initWithPairs:(NSArray *)pairs rowNumber:(int)rowNumber wasReversed:(BOOL)wasReversed { + if (self = [super init]) { + _pairs = [NSArray arrayWithArray:pairs]; + _rowNumber = rowNumber; + _wasReversed = wasReversed; + } + + return self; +} + +- (BOOL)isReversed { + return self.wasReversed; +} + +- (BOOL)isEquivalent:(NSArray *)otherPairs { + return [self.pairs isEqualToArray:otherPairs]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"{%@}", self.pairs]; +} + +/** + * Two rows are equal if they contain the same pairs in the same order. + */ +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[ZXRSSExpandedRow class]]) { + return NO; + } + ZXRSSExpandedRow *that = (ZXRSSExpandedRow *)object; + return [self.pairs isEqual:that.pairs] && (self.wasReversed == that.wasReversed); +} + +- (NSUInteger)hash { + return self.pairs.hash ^ @(self.wasReversed).hash; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.h new file mode 100644 index 0000000..c8b40e7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI013x0xDecoder.h" + +@interface ZXAI013103decoder : ZXAI013x0xDecoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.m new file mode 100644 index 0000000..06ce8d0 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.m @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI013103decoder.h" +#import "ZXBitArray.h" + +@implementation ZXAI013103decoder + +- (void)addWeightCode:(NSMutableString *)buf weight:(int)weight { + [buf appendString:@"(3103)"]; +} + +- (int)checkWeight:(int)weight { + return weight; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.h new file mode 100644 index 0000000..ea1d339 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI013x0xDecoder.h" + +@interface ZXAI01320xDecoder : ZXAI013x0xDecoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.m new file mode 100644 index 0000000..714331c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.m @@ -0,0 +1,36 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01320xDecoder.h" + +@implementation ZXAI01320xDecoder + +- (void)addWeightCode:(NSMutableString *)buf weight:(int)weight { + if (weight < 10000) { + [buf appendString:@"(3202)"]; + } else { + [buf appendString:@"(3203)"]; + } +} + +- (int)checkWeight:(int)weight { + if (weight < 10000) { + return weight; + } + return weight - 10000; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.h new file mode 100644 index 0000000..4ae02cc --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01decoder.h" + +@interface ZXAI01392xDecoder : ZXAI01decoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.m new file mode 100644 index 0000000..6013336 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.m @@ -0,0 +1,42 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01392xDecoder.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXRSSExpandedDecodedInformation.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +const int ZX_AI01392x_HEADER_SIZE = 5 + 1 + 2; +const int ZX_AI01392x_LAST_DIGIT_SIZE = 2; + +@implementation ZXAI01392xDecoder + +- (NSString *)parseInformationWithError:(NSError **)error { + if (self.information.size < ZX_AI01392x_HEADER_SIZE + ZX_AI01_GTIN_SIZE) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSMutableString *buf = [NSMutableString string]; + [self encodeCompressedGtin:buf currentPos:ZX_AI01392x_HEADER_SIZE]; + int lastAIdigit = [self.generalDecoder extractNumericValueFromBitArray:ZX_AI01392x_HEADER_SIZE + ZX_AI01_GTIN_SIZE bits:ZX_AI01392x_LAST_DIGIT_SIZE]; + [buf appendFormat:@"(392%d)", lastAIdigit]; + ZXRSSExpandedDecodedInformation *decodedInformation = [self.generalDecoder decodeGeneralPurposeField:ZX_AI01392x_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI01392x_LAST_DIGIT_SIZE remaining:nil]; + [buf appendString:decodedInformation.theNewString]; + return buf; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.h new file mode 100644 index 0000000..9fac134 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01decoder.h" + +@interface ZXAI01393xDecoder : ZXAI01decoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.m new file mode 100644 index 0000000..fcde532 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.m @@ -0,0 +1,61 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01393xDecoder.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXRSSExpandedDecodedInformation.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +@implementation ZXAI01393xDecoder + +const int ZX_AI01393xDecoder_HEADER_SIZE = 5 + 1 + 2; +const int ZX_AI01393xDecoder_LAST_DIGIT_SIZE = 2; +const int ZX_AI01393xDecoder_FIRST_THREE_DIGITS_SIZE = 10; + +- (NSString *)parseInformationWithError:(NSError **)error { + if (self.information.size < ZX_AI01393xDecoder_HEADER_SIZE + ZX_AI01_GTIN_SIZE) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSMutableString *buf = [NSMutableString string]; + + [self encodeCompressedGtin:buf currentPos:ZX_AI01393xDecoder_HEADER_SIZE]; + + int lastAIdigit = [self.generalDecoder extractNumericValueFromBitArray:ZX_AI01393xDecoder_HEADER_SIZE + ZX_AI01_GTIN_SIZE + bits:ZX_AI01393xDecoder_LAST_DIGIT_SIZE]; + + [buf appendFormat:@"(393%d)", lastAIdigit]; + + int firstThreeDigits = [self.generalDecoder extractNumericValueFromBitArray:ZX_AI01393xDecoder_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI01393xDecoder_LAST_DIGIT_SIZE + bits:ZX_AI01393xDecoder_FIRST_THREE_DIGITS_SIZE]; + if (firstThreeDigits / 100 == 0) { + [buf appendString:@"0"]; + } + if (firstThreeDigits / 10 == 0) { + [buf appendString:@"0"]; + } + [buf appendFormat:@"%d", firstThreeDigits]; + + ZXRSSExpandedDecodedInformation *generalInformation = [self.generalDecoder decodeGeneralPurposeField:ZX_AI01393xDecoder_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI01393xDecoder_LAST_DIGIT_SIZE + ZX_AI01393xDecoder_FIRST_THREE_DIGITS_SIZE + remaining:nil]; + [buf appendString:generalInformation.theNewString]; + + return buf; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.h new file mode 100644 index 0000000..3f2211d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01weightDecoder.h" + +@interface ZXAI013x0x1xDecoder : ZXAI01weightDecoder + +- (id)initWithInformation:(ZXBitArray *)information firstAIdigits:(NSString *)firstAIdigits dateCode:(NSString *)dateCode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.m new file mode 100644 index 0000000..41fe6f2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.m @@ -0,0 +1,90 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI013x0x1xDecoder.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +const int ZX_AI013x0x1x_HEADER_SIZE = 7 + 1; +const int ZX_AI013x0x1x_WEIGHT_SIZE = 20; +const int ZX_AI013x0x1x_DATE_SIZE = 16; + +@interface ZXAI013x0x1xDecoder () + +@property (nonatomic, copy, readonly) NSString *dateCode; +@property (nonatomic, copy, readonly) NSString *firstAIdigits; + +@end + +@implementation ZXAI013x0x1xDecoder + +- (id)initWithInformation:(ZXBitArray *)information firstAIdigits:(NSString *)firstAIdigits dateCode:(NSString *)dateCode { + if (self = [super initWithInformation:information]) { + _dateCode = dateCode; + _firstAIdigits = firstAIdigits; + } + + return self; +} + +- (NSString *)parseInformationWithError:(NSError **)error { + if (self.information.size != ZX_AI013x0x1x_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI013x0x1x_WEIGHT_SIZE + ZX_AI013x0x1x_DATE_SIZE) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSMutableString *buf = [NSMutableString string]; + [self encodeCompressedGtin:buf currentPos:ZX_AI013x0x1x_HEADER_SIZE]; + [self encodeCompressedWeight:buf currentPos:ZX_AI013x0x1x_HEADER_SIZE + ZX_AI01_GTIN_SIZE weightSize:ZX_AI013x0x1x_WEIGHT_SIZE]; + [self encodeCompressedDate:buf currentPos:ZX_AI013x0x1x_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI013x0x1x_WEIGHT_SIZE]; + return buf; +} + +- (void)encodeCompressedDate:(NSMutableString *)buf currentPos:(int)currentPos { + int numericDate = [self.generalDecoder extractNumericValueFromBitArray:currentPos bits:ZX_AI013x0x1x_DATE_SIZE]; + if (numericDate == 38400) { + return; + } + [buf appendFormat:@"(%@)", self.dateCode]; + int day = numericDate % 32; + numericDate /= 32; + int month = numericDate % 12 + 1; + numericDate /= 12; + int year = numericDate; + if (year / 10 == 0) { + [buf appendString:@"0"]; + } + [buf appendFormat:@"%d", year]; + if (month / 10 == 0) { + [buf appendString:@"0"]; + } + [buf appendFormat:@"%d", month]; + if (day / 10 == 0) { + [buf appendString:@"0"]; + } + [buf appendFormat:@"%d", day]; +} + +- (void)addWeightCode:(NSMutableString *)buf weight:(int)weight { + int lastAI = weight / 100000; + [buf appendFormat:@"(%@%d)", self.firstAIdigits, lastAI]; +} + +- (int)checkWeight:(int)weight { + return weight % 100000; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.h new file mode 100644 index 0000000..0f02d6c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01weightDecoder.h" + +@interface ZXAI013x0xDecoder : ZXAI01weightDecoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.m new file mode 100644 index 0000000..6a410c7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.m @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI013x0xDecoder.h" +#import "ZXBitArray.h" +#import "ZXErrors.h" + +const int ZX_AI013x0x_HEADER_SIZE = 4 + 1; +const int ZX_AI013x0x_WEIGHT_SIZE = 15; + +@implementation ZXAI013x0xDecoder + +- (NSString *)parseInformationWithError:(NSError **)error { + if (self.information.size != ZX_AI013x0x_HEADER_SIZE + ZX_AI01_GTIN_SIZE + ZX_AI013x0x_WEIGHT_SIZE) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSMutableString *buf = [NSMutableString string]; + + [self encodeCompressedGtin:buf currentPos:ZX_AI013x0x_HEADER_SIZE]; + [self encodeCompressedWeight:buf currentPos:ZX_AI013x0x_HEADER_SIZE + ZX_AI01_GTIN_SIZE weightSize:ZX_AI013x0x_WEIGHT_SIZE]; + + return buf; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.h new file mode 100644 index 0000000..4299580 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01decoder.h" + +@interface ZXAI01AndOtherAIs : ZXAI01decoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.m new file mode 100644 index 0000000..3b410af --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.m @@ -0,0 +1,37 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01AndOtherAIs.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +const int ZX_AI01_HEADER_SIZE = 1 + 1 + 2; + +@implementation ZXAI01AndOtherAIs + +- (NSString *)parseInformationWithError:(NSError **)error { + NSMutableString *buff = [NSMutableString string]; + + [buff appendString:@"(01)"]; + int initialGtinPosition = (int)[buff length]; + int firstGtinDigit = [self.generalDecoder extractNumericValueFromBitArray:ZX_AI01_HEADER_SIZE bits:4]; + [buff appendFormat:@"%d", firstGtinDigit]; + + [self encodeCompressedGtinWithoutAI:buff currentPos:ZX_AI01_HEADER_SIZE + 4 initialBufferPosition:initialGtinPosition]; + + return [self.generalDecoder decodeAllCodes:buff initialPosition:ZX_AI01_HEADER_SIZE + 44 error:error]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.h new file mode 100644 index 0000000..49117a7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractExpandedDecoder.h" + +extern const int ZX_AI01_GTIN_SIZE; + +@interface ZXAI01decoder : ZXAbstractExpandedDecoder + +- (void)encodeCompressedGtin:(NSMutableString *)buf currentPos:(int)currentPos; +- (void)encodeCompressedGtinWithoutAI:(NSMutableString *)buf currentPos:(int)currentPos initialBufferPosition:(int)initialBufferPosition; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.m new file mode 100644 index 0000000..8696d1c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.m @@ -0,0 +1,63 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01decoder.h" +#import "ZXBitArray.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +const int ZX_AI01_GTIN_SIZE = 40; + +@implementation ZXAI01decoder + +- (void)encodeCompressedGtin:(NSMutableString *)buf currentPos:(int)currentPos { + [buf appendString:@"(01)"]; + int initialPosition = (int)[buf length]; + [buf appendString:@"9"]; + + [self encodeCompressedGtinWithoutAI:buf currentPos:currentPos initialBufferPosition:initialPosition]; +} + +- (void)encodeCompressedGtinWithoutAI:(NSMutableString *)buf currentPos:(int)currentPos initialBufferPosition:(int)initialBufferPosition { + for (int i = 0; i < 4; ++i) { + int currentBlock = [self.generalDecoder extractNumericValueFromBitArray:currentPos + 10 * i bits:10]; + if (currentBlock / 100 == 0) { + [buf appendString:@"0"]; + } + if (currentBlock / 10 == 0) { + [buf appendString:@"0"]; + } + [buf appendFormat:@"%d", currentBlock]; + } + + [self appendCheckDigit:buf currentPos:initialBufferPosition]; +} + +- (void)appendCheckDigit:(NSMutableString *)buf currentPos:(int)currentPos { + int checkDigit = 0; + for (int i = 0; i < 13; i++) { + int digit = [buf characterAtIndex:i + currentPos] - '0'; + checkDigit += (i & 0x01) == 0 ? 3 * digit : digit; + } + + checkDigit = 10 - (checkDigit % 10); + if (checkDigit == 10) { + checkDigit = 0; + } + + [buf appendFormat:@"%d", checkDigit]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.h new file mode 100644 index 0000000..670fa44 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01decoder.h" + +@interface ZXAI01weightDecoder : ZXAI01decoder + +- (void)encodeCompressedWeight:(NSMutableString *)buf currentPos:(int)currentPos weightSize:(int)weightSize; +- (void)addWeightCode:(NSMutableString *)buf weight:(int)weight; +- (int)checkWeight:(int)weight; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.m new file mode 100644 index 0000000..b89bc96 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.m @@ -0,0 +1,51 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAI01weightDecoder.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +@implementation ZXAI01weightDecoder + +- (void)encodeCompressedWeight:(NSMutableString *)buf currentPos:(int)currentPos weightSize:(int)weightSize { + int originalWeightNumeric = [self.generalDecoder extractNumericValueFromBitArray:currentPos bits:weightSize]; + [self addWeightCode:buf weight:originalWeightNumeric]; + + int weightNumeric = [self checkWeight:originalWeightNumeric]; + + int currentDivisor = 100000; + for (int i = 0; i < 5; ++i) { + if (weightNumeric / currentDivisor == 0) { + [buf appendString:@"0"]; + } + currentDivisor /= 10; + } + + [buf appendFormat:@"%d", weightNumeric]; +} + +- (void)addWeightCode:(NSMutableString *)buf weight:(int)weight { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +- (int)checkWeight:(int)weight { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.h new file mode 100644 index 0000000..f272ca2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXRSSExpandedGeneralAppIdDecoder; + +@interface ZXAbstractExpandedDecoder : NSObject + +@property (nonatomic, strong, readonly) ZXRSSExpandedGeneralAppIdDecoder *generalDecoder; +@property (nonatomic, strong, readonly) ZXBitArray *information; + +- (id)initWithInformation:(ZXBitArray *)information; +- (NSString *)parseInformationWithError:(NSError **)error; ++ (ZXAbstractExpandedDecoder *)createDecoder:(ZXBitArray *)information; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.m new file mode 100644 index 0000000..6fe8492 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.m @@ -0,0 +1,95 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractExpandedDecoder.h" +#import "ZXAI013103decoder.h" +#import "ZXAI01320xDecoder.h" +#import "ZXAI01392xDecoder.h" +#import "ZXAI01393xDecoder.h" +#import "ZXAI013x0x1xDecoder.h" +#import "ZXAI01AndOtherAIs.h" +#import "ZXAnyAIDecoder.h" +#import "ZXBitArray.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +@implementation ZXAbstractExpandedDecoder + +- (id)initWithInformation:(ZXBitArray *)information { + if (self = [super init]) { + _information = information; + _generalDecoder = [[ZXRSSExpandedGeneralAppIdDecoder alloc] initWithInformation:information]; + } + + return self; +} + +- (NSString *)parseInformationWithError:(NSError **)error { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + ++ (ZXAbstractExpandedDecoder *)createDecoder:(ZXBitArray *)information { + if ([information get:1]) { + return [[ZXAI01AndOtherAIs alloc] initWithInformation:information]; + } + if (![information get:2]) { + return [[ZXAnyAIDecoder alloc] initWithInformation:information]; + } + + int fourBitEncodationMethod = [ZXRSSExpandedGeneralAppIdDecoder extractNumericValueFromBitArray:information pos:1 bits:4]; + + switch (fourBitEncodationMethod) { + case 4: + return [[ZXAI013103decoder alloc] initWithInformation:information]; + case 5: + return [[ZXAI01320xDecoder alloc] initWithInformation:information]; + } + + int fiveBitEncodationMethod = [ZXRSSExpandedGeneralAppIdDecoder extractNumericValueFromBitArray:information pos:1 bits:5]; + switch (fiveBitEncodationMethod) { + case 12: + return [[ZXAI01392xDecoder alloc] initWithInformation:information]; + case 13: + return [[ZXAI01393xDecoder alloc] initWithInformation:information]; + } + + int sevenBitEncodationMethod = [ZXRSSExpandedGeneralAppIdDecoder extractNumericValueFromBitArray:information pos:1 bits:7]; + switch (sevenBitEncodationMethod) { + case 56: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"310" dateCode:@"11"]; + case 57: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"320" dateCode:@"11"]; + case 58: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"310" dateCode:@"13"]; + case 59: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"320" dateCode:@"13"]; + case 60: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"310" dateCode:@"15"]; + case 61: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"320" dateCode:@"15"]; + case 62: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"310" dateCode:@"17"]; + case 63: + return [[ZXAI013x0x1xDecoder alloc] initWithInformation:information firstAIdigits:@"320" dateCode:@"17"]; + } + + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"unknown decoder: %@", information] + userInfo:nil]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.h new file mode 100644 index 0000000..3dfda95 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAbstractExpandedDecoder.h" + +@interface ZXAnyAIDecoder : ZXAbstractExpandedDecoder + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.m new file mode 100644 index 0000000..ec3fdfc --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.m @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXAnyAIDecoder.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +const int ZX_ANY_AI_HEADER_SIZE = 2 + 1 + 2; + +@implementation ZXAnyAIDecoder + +- (NSString *)parseInformationWithError:(NSError **)error { + NSMutableString *buf = [NSMutableString string]; + return [self.generalDecoder decodeAllCodes:buf initialPosition:ZX_ANY_AI_HEADER_SIZE error:error]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.h new file mode 100644 index 0000000..691ebd7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXRSSExpandedDecodedInformation; + +@interface ZXRSSExpandedBlockParsedResult : NSObject + +@property (nonatomic, strong, readonly) ZXRSSExpandedDecodedInformation *decodedInformation; +@property (nonatomic, assign, readonly) BOOL finished; + +- (id)initWithFinished:(BOOL)finished; +- (id)initWithInformation:(ZXRSSExpandedDecodedInformation *)information finished:(BOOL)finished; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.m new file mode 100644 index 0000000..0b5c6cd --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.m @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedBlockParsedResult.h" +#import "ZXRSSExpandedDecodedInformation.h" + +@implementation ZXRSSExpandedBlockParsedResult + +- (id)initWithFinished:(BOOL)finished { + return [self initWithInformation:nil finished:finished]; +} + +- (id)initWithInformation:(ZXRSSExpandedDecodedInformation *)information finished:(BOOL)finished { + if (self = [super init]) { + _decodedInformation = information; + _finished = finished; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.h new file mode 100644 index 0000000..b4c88c8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXRSSExpandedCurrentParsingState : NSObject + +@property (nonatomic, assign) int position; + +- (BOOL)alpha; +- (BOOL)numeric; +- (BOOL)isoIec646; +- (void)setNumeric; +- (void)setAlpha; +- (void)setIsoIec646; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.m new file mode 100644 index 0000000..c21dedf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.m @@ -0,0 +1,65 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedCurrentParsingState.h" + +enum { + ZX_NUMERIC_STATE, + ZX_ALPHA_STATE, + ZX_ISO_IEC_646_STATE +}; + +@interface ZXRSSExpandedCurrentParsingState () + +@property (nonatomic, assign) int encoding; + +@end + +@implementation ZXRSSExpandedCurrentParsingState + +- (id)init { + if (self = [super init]) { + _position = 0; + _encoding = ZX_NUMERIC_STATE; + } + return self; +} + +- (BOOL)alpha { + return self.encoding == ZX_ALPHA_STATE; +} + +- (BOOL)numeric { + return self.encoding == ZX_NUMERIC_STATE; +} + +- (BOOL)isoIec646 { + return self.encoding == ZX_ISO_IEC_646_STATE; +} + +- (void)setNumeric { + self.encoding = ZX_NUMERIC_STATE; +} + +- (void)setAlpha { + self.encoding = ZX_ALPHA_STATE; +} + +- (void)setIsoIec646 { + self.encoding = ZX_ISO_IEC_646_STATE; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.h new file mode 100644 index 0000000..b879132 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedObject.h" + +extern unichar const ZX_FNC1_CHAR; + +@interface ZXRSSExpandedDecodedChar : ZXRSSExpandedDecodedObject + +@property (nonatomic, assign, readonly) unichar value; + +- (id)initWithNewPosition:(int)newPosition value:(unichar)value; +- (BOOL)fnc1; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.m new file mode 100644 index 0000000..e5fff1d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.m @@ -0,0 +1,35 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedChar.h" + +unichar const ZX_FNC1_CHAR = '$'; // It's not in Alphanumeric neither in ISO/IEC 646 charset + +@implementation ZXRSSExpandedDecodedChar + +- (id)initWithNewPosition:(int)newPosition value:(unichar)value { + if (self = [super initWithNewPosition:newPosition]) { + _value = value; + } + + return self; +} + +- (BOOL)fnc1 { + return self.value == ZX_FNC1_CHAR; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.h new file mode 100644 index 0000000..14ba181 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedObject.h" + +@interface ZXRSSExpandedDecodedInformation : ZXRSSExpandedDecodedObject + +@property (nonatomic, copy, readonly) NSString *theNewString; +@property (nonatomic, assign, readonly) int remainingValue; +@property (nonatomic, assign, readonly) BOOL remaining; + +- (id)initWithNewPosition:(int)newPosition newString:(NSString *)newString; +- (id)initWithNewPosition:(int)newPosition newString:(NSString *)newString remainingValue:(int)remainingValue; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.m new file mode 100644 index 0000000..6111339 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.m @@ -0,0 +1,41 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedInformation.h" + +@implementation ZXRSSExpandedDecodedInformation + +- (id)initWithNewPosition:(int)newPosition newString:(NSString *)newString { + if (self = [super initWithNewPosition:newPosition]) { + _remaining = NO; + _remainingValue = 0; + _theNewString = newString; + } + + return self; +} + +- (id)initWithNewPosition:(int)newPosition newString:(NSString *)newString remainingValue:(int)remainingValue { + if (self = [super initWithNewPosition:newPosition]) { + _remaining = YES; + _remainingValue = remainingValue; + _theNewString = newString; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.h new file mode 100644 index 0000000..576531c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedObject.h" + +extern const int ZX_FNC1_INT; + +@interface ZXRSSExpandedDecodedNumeric : ZXRSSExpandedDecodedObject + +@property (nonatomic, assign, readonly) int firstDigit; +@property (nonatomic, assign, readonly) int secondDigit; +@property (nonatomic, assign, readonly) int value; + +- (id)initWithNewPosition:(int)newPosition firstDigit:(int)firstDigit secondDigit:(int)secondDigit; +- (BOOL)firstDigitFNC1; +- (BOOL)secondDigitFNC1; +- (BOOL)anyFNC1; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.m new file mode 100644 index 0000000..523c83d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.m @@ -0,0 +1,52 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedNumeric.h" + +const int ZX_FNC1_INT = 10; + +@implementation ZXRSSExpandedDecodedNumeric + +- (id)initWithNewPosition:(int)newPosition firstDigit:(int)firstDigit secondDigit:(int)secondDigit { + if (firstDigit < 0 || firstDigit > 10 || secondDigit < 0 || secondDigit > 10) { + return nil; + } + + if (self = [super initWithNewPosition:newPosition]) { + _firstDigit = firstDigit; + _secondDigit = secondDigit; + } + + return self; +} + +- (int)value { + return self.firstDigit * 10 + self.secondDigit; +} + +- (BOOL)firstDigitFNC1 { + return self.firstDigit == ZX_FNC1_INT; +} + +- (BOOL)secondDigitFNC1 { + return self.secondDigit == ZX_FNC1_INT; +} + +- (BOOL)anyFNC1 { + return self.firstDigit == ZX_FNC1_INT || self.secondDigit == ZX_FNC1_INT; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.h new file mode 100644 index 0000000..5dce8c8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.h @@ -0,0 +1,23 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXRSSExpandedDecodedObject : NSObject + +@property (nonatomic, assign, readonly) int theNewPosition; + +- (id)initWithNewPosition:(int)newPosition; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.m new file mode 100644 index 0000000..ea1793e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.m @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXRSSExpandedDecodedObject.h" + +@implementation ZXRSSExpandedDecodedObject + +- (id)initWithNewPosition:(int)newPosition { + if (self = [super init]) { + _theNewPosition = newPosition; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.h new file mode 100644 index 0000000..767bc23 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXRSSExpandedFieldParser : NSObject + ++ (NSString *)parseFieldsInGeneralPurpose:(NSString *)rawInformation error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.m new file mode 100644 index 0000000..f7299f8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.m @@ -0,0 +1,319 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXRSSExpandedFieldParser.h" + +static NSObject *VARIABLE_LENGTH = nil; +static NSArray *TWO_DIGIT_DATA_LENGTH = nil; +static NSArray *THREE_DIGIT_DATA_LENGTH = nil; +static NSArray *THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH = nil; +static NSArray *FOUR_DIGIT_DATA_LENGTH = nil; + +@implementation ZXRSSExpandedFieldParser + ++ (void)initialize { + if ([self class] != [ZXRSSExpandedFieldParser class]) return; + + if (VARIABLE_LENGTH == nil) { + VARIABLE_LENGTH = [[NSObject alloc] init]; + } + + if (TWO_DIGIT_DATA_LENGTH == nil) { + TWO_DIGIT_DATA_LENGTH = @[@[@"00", @18], + @[@"01", @14], + @[@"02", @14], + + @[@"10", VARIABLE_LENGTH, @20], + @[@"11", @6], + @[@"12", @6], + @[@"13", @6], + @[@"15", @6], + @[@"17", @6], + + @[@"20", @2], + @[@"21", VARIABLE_LENGTH, @20], + @[@"22", VARIABLE_LENGTH, @29], + + @[@"30", VARIABLE_LENGTH, @8], + @[@"37", VARIABLE_LENGTH, @8], + + //internal company codes + @[@"90", VARIABLE_LENGTH, @30], + @[@"91", VARIABLE_LENGTH, @30], + @[@"92", VARIABLE_LENGTH, @30], + @[@"93", VARIABLE_LENGTH, @30], + @[@"94", VARIABLE_LENGTH, @30], + @[@"95", VARIABLE_LENGTH, @30], + @[@"96", VARIABLE_LENGTH, @30], + @[@"97", VARIABLE_LENGTH, @30], + @[@"98", VARIABLE_LENGTH, @30], + @[@"99", VARIABLE_LENGTH, @30]]; + } + + if (THREE_DIGIT_DATA_LENGTH == nil) { + THREE_DIGIT_DATA_LENGTH = @[@[@"240", VARIABLE_LENGTH, @30], + @[@"241", VARIABLE_LENGTH, @30], + @[@"242", VARIABLE_LENGTH, @6], + @[@"250", VARIABLE_LENGTH, @30], + @[@"251", VARIABLE_LENGTH, @30], + @[@"253", VARIABLE_LENGTH, @17], + @[@"254", VARIABLE_LENGTH, @20], + + @[@"400", VARIABLE_LENGTH, @30], + @[@"401", VARIABLE_LENGTH, @30], + @[@"402", @17], + @[@"403", VARIABLE_LENGTH, @30], + @[@"410", @13], + @[@"411", @13], + @[@"412", @13], + @[@"413", @13], + @[@"414", @13], + @[@"420", VARIABLE_LENGTH, @20], + @[@"421", VARIABLE_LENGTH, @15], + @[@"422", @3], + @[@"423", VARIABLE_LENGTH, @15], + @[@"424", @3], + @[@"425", @3], + @[@"426", @3]]; + + } + + if (THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH == nil) { + THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH = @[@[@"310", @6], + @[@"311", @6], + @[@"312", @6], + @[@"313", @6], + @[@"314", @6], + @[@"315", @6], + @[@"316", @6], + @[@"320", @6], + @[@"321", @6], + @[@"322", @6], + @[@"323", @6], + @[@"324", @6], + @[@"325", @6], + @[@"326", @6], + @[@"327", @6], + @[@"328", @6], + @[@"329", @6], + @[@"330", @6], + @[@"331", @6], + @[@"332", @6], + @[@"333", @6], + @[@"334", @6], + @[@"335", @6], + @[@"336", @6], + @[@"340", @6], + @[@"341", @6], + @[@"342", @6], + @[@"343", @6], + @[@"344", @6], + @[@"345", @6], + @[@"346", @6], + @[@"347", @6], + @[@"348", @6], + @[@"349", @6], + @[@"350", @6], + @[@"351", @6], + @[@"352", @6], + @[@"353", @6], + @[@"354", @6], + @[@"355", @6], + @[@"356", @6], + @[@"357", @6], + @[@"360", @6], + @[@"361", @6], + @[@"362", @6], + @[@"363", @6], + @[@"364", @6], + @[@"365", @6], + @[@"366", @6], + @[@"367", @6], + @[@"368", @6], + @[@"369", @6], + @[@"390", VARIABLE_LENGTH, @15], + @[@"391", VARIABLE_LENGTH, @18], + @[@"392", VARIABLE_LENGTH, @15], + @[@"393", VARIABLE_LENGTH, @18], + @[@"703", VARIABLE_LENGTH, @30]]; + } + + if (FOUR_DIGIT_DATA_LENGTH == nil) { + FOUR_DIGIT_DATA_LENGTH = @[@[@"7001", @13], + @[@"7002", VARIABLE_LENGTH, @30], + @[@"7003", @10], + + @[@"8001", @14], + @[@"8002", VARIABLE_LENGTH, @20], + @[@"8003", VARIABLE_LENGTH, @30], + @[@"8004", VARIABLE_LENGTH, @30], + @[@"8005", @6], + @[@"8006", @18], + @[@"8007", VARIABLE_LENGTH, @30], + @[@"8008", VARIABLE_LENGTH, @12], + @[@"8018", @18], + @[@"8020", VARIABLE_LENGTH, @25], + @[@"8100", @6], + @[@"8101", @10], + @[@"8102", @2], + @[@"8110", VARIABLE_LENGTH, @70], + @[@"8200", VARIABLE_LENGTH, @70]]; + } +} + ++ (NSString *)parseFieldsInGeneralPurpose:(NSString *)rawInformation error:(NSError **)error { + if ([rawInformation length] == 0) { + return @""; + } + if ([rawInformation length] < 2) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSString *firstTwoDigits = [rawInformation substringWithRange:NSMakeRange(0, 2)]; + + for (int i = 0; i < [TWO_DIGIT_DATA_LENGTH count]; ++i) { + if ([TWO_DIGIT_DATA_LENGTH[i][0] isEqualToString:firstTwoDigits]) { + if ([TWO_DIGIT_DATA_LENGTH[i][1] isEqual:VARIABLE_LENGTH]) { + return [self processVariableAI:2 + variableFieldSize:[TWO_DIGIT_DATA_LENGTH[i][2] intValue] + rawInformation:rawInformation]; + } + NSString *result = [self processFixedAI:2 + fieldSize:[TWO_DIGIT_DATA_LENGTH[i][1] intValue] + rawInformation:rawInformation]; + if (!result) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result; + } + } + + if ([rawInformation length] < 3) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSString *firstThreeDigits = [rawInformation substringWithRange:NSMakeRange(0, 3)]; + + for (int i = 0; i < [THREE_DIGIT_DATA_LENGTH count]; ++i) { + if ([THREE_DIGIT_DATA_LENGTH[i][0] isEqualToString:firstThreeDigits]) { + if ([THREE_DIGIT_DATA_LENGTH[i][1] isEqual:VARIABLE_LENGTH]) { + return [self processVariableAI:3 + variableFieldSize:[THREE_DIGIT_DATA_LENGTH[i][2] intValue] + rawInformation:rawInformation]; + } + NSString *result = [self processFixedAI:3 + fieldSize:[THREE_DIGIT_DATA_LENGTH[i][1] intValue] + rawInformation:rawInformation]; + if (!result) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result; + } + } + + for (int i = 0; i < [THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH count]; ++i) { + if ([THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH[i][0] isEqualToString:firstThreeDigits]) { + if ([THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH[i][1] isEqual:VARIABLE_LENGTH]) { + return [self processVariableAI:4 + variableFieldSize:[THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH[i][2] intValue] + rawInformation:rawInformation]; + } + NSString *result = [self processFixedAI:4 + fieldSize:[THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH[i][1] intValue] + rawInformation:rawInformation]; + if (!result) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result; + } + } + + if ([rawInformation length] < 4) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSString *firstFourDigits = [rawInformation substringWithRange:NSMakeRange(0, 4)]; + + for (int i = 0; i < [FOUR_DIGIT_DATA_LENGTH count]; ++i) { + if ([FOUR_DIGIT_DATA_LENGTH[i][0] isEqualToString:firstFourDigits]) { + if ([FOUR_DIGIT_DATA_LENGTH[i][1] isEqual:VARIABLE_LENGTH]) { + NSString *result = [self processVariableAI:4 + variableFieldSize:[FOUR_DIGIT_DATA_LENGTH[i][2] intValue] + rawInformation:rawInformation]; + if (!result) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result; + } + NSString *result = [self processFixedAI:4 + fieldSize:[FOUR_DIGIT_DATA_LENGTH[i][1] intValue] + rawInformation:rawInformation]; + if (!result) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result; + } + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + ++ (NSString *)processFixedAI:(int)aiSize fieldSize:(int)fieldSize rawInformation:(NSString *)rawInformation { + if ([rawInformation length] < aiSize) { + return nil; + } + + NSString *ai = [rawInformation substringWithRange:NSMakeRange(0, aiSize)]; + if ([rawInformation length] < aiSize + fieldSize) { + return nil; + } + + NSString *field = [rawInformation substringWithRange:NSMakeRange(aiSize, fieldSize)]; + NSString *remaining; + if (aiSize + fieldSize == rawInformation.length) { + remaining = @""; + } else { + remaining = [rawInformation substringFromIndex:aiSize + fieldSize]; + } + + NSString *result = [NSString stringWithFormat:@"(%@)%@", ai, field]; + NSString *parsedAI = [self parseFieldsInGeneralPurpose:remaining error:nil]; + return parsedAI == nil ? result : [result stringByAppendingString:parsedAI]; +} + ++ (NSString *)processVariableAI:(int)aiSize variableFieldSize:(int)variableFieldSize rawInformation:(NSString *)rawInformation { + NSString *ai = [rawInformation substringWithRange:NSMakeRange(0, aiSize)]; + int maxSize; + if ([rawInformation length] < aiSize + variableFieldSize) { + maxSize = (int)[rawInformation length]; + } else { + maxSize = aiSize + variableFieldSize; + } + NSString *field = [rawInformation substringWithRange:NSMakeRange(aiSize, maxSize - aiSize)]; + NSString *remaining = [rawInformation substringFromIndex:maxSize]; + NSString *result = [NSString stringWithFormat:@"(%@)%@", ai, field]; + NSString *parsedAI = [self parseFieldsInGeneralPurpose:remaining error:nil]; + return parsedAI == nil ? result : [result stringByAppendingString:parsedAI]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.h new file mode 100644 index 0000000..451766c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.h @@ -0,0 +1,27 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXRSSExpandedDecodedInformation; + +@interface ZXRSSExpandedGeneralAppIdDecoder : NSObject + +- (id)initWithInformation:(ZXBitArray *)information; +- (NSString *)decodeAllCodes:(NSMutableString *)buff initialPosition:(int)initialPosition error:(NSError **)error; +- (int)extractNumericValueFromBitArray:(int)pos bits:(int)bits; ++ (int)extractNumericValueFromBitArray:(ZXBitArray *)information pos:(int)pos bits:(int)bits; +- (ZXRSSExpandedDecodedInformation *)decodeGeneralPurposeField:(int)pos remaining:(NSString *)remaining; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.m new file mode 100644 index 0000000..710086a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.m @@ -0,0 +1,517 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXErrors.h" +#import "ZXRSSExpandedBlockParsedResult.h" +#import "ZXRSSExpandedCurrentParsingState.h" +#import "ZXRSSExpandedDecodedChar.h" +#import "ZXRSSExpandedDecodedInformation.h" +#import "ZXRSSExpandedDecodedNumeric.h" +#import "ZXRSSExpandedFieldParser.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" + +@interface ZXRSSExpandedGeneralAppIdDecoder () + +@property (nonatomic, strong, readonly) ZXBitArray *information; +@property (nonatomic, strong, readonly) ZXRSSExpandedCurrentParsingState *current; +@property (nonatomic, strong, readonly) NSMutableString *buffer; + +@end + +@implementation ZXRSSExpandedGeneralAppIdDecoder + +- (id)initWithInformation:(ZXBitArray *)information { + if (self = [super init]) { + _current = [[ZXRSSExpandedCurrentParsingState alloc] init]; + _buffer = [NSMutableString string]; + _information = information; + } + + return self; +} + +- (NSString *)decodeAllCodes:(NSMutableString *)buff initialPosition:(int)initialPosition error:(NSError **)error { + int currentPosition = initialPosition; + NSString *remaining = nil; + do { + ZXRSSExpandedDecodedInformation *info = [self decodeGeneralPurposeField:currentPosition remaining:remaining]; + if (!info) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + NSString *parsedFields = [ZXRSSExpandedFieldParser parseFieldsInGeneralPurpose:[info theNewString] error:error]; + if (!parsedFields) { + return nil; + } else if (parsedFields.length > 0) { + [buff appendString:parsedFields]; + } + + if ([info remaining]) { + remaining = [@([info remainingValue]) stringValue]; + } else { + remaining = nil; + } + + if (currentPosition == [info theNewPosition]) {// No step forward! + break; + } + currentPosition = [info theNewPosition]; + } while (YES); + + return buff; +} + +- (BOOL)isStillNumeric:(int)pos { + // It's numeric if it still has 7 positions + // and one of the first 4 bits is "1". + if (pos + 7 > self.information.size) { + return pos + 4 <= self.information.size; + } + + for (int i = pos; i < pos + 3; ++i) { + if ([self.information get:i]) { + return YES; + } + } + + return [self.information get:pos + 3]; +} + +- (ZXRSSExpandedDecodedNumeric *)decodeNumeric:(int)pos { + if (pos + 7 > self.information.size) { + int numeric = [self extractNumericValueFromBitArray:pos bits:4]; + if (numeric == 0) { + return [[ZXRSSExpandedDecodedNumeric alloc] initWithNewPosition:self.information.size + firstDigit:ZX_FNC1_INT + secondDigit:ZX_FNC1_INT]; + } + return [[ZXRSSExpandedDecodedNumeric alloc] initWithNewPosition:self.information.size + firstDigit:numeric - 1 + secondDigit:ZX_FNC1_INT]; + } + int numeric = [self extractNumericValueFromBitArray:pos bits:7]; + + int digit1 = (numeric - 8) / 11; + int digit2 = (numeric - 8) % 11; + + return [[ZXRSSExpandedDecodedNumeric alloc] initWithNewPosition:pos + 7 + firstDigit:digit1 + secondDigit:digit2]; +} + +- (int)extractNumericValueFromBitArray:(int)pos bits:(int)bits { + return [ZXRSSExpandedGeneralAppIdDecoder extractNumericValueFromBitArray:self.information pos:pos bits:bits]; +} + ++ (int)extractNumericValueFromBitArray:(ZXBitArray *)information pos:(int)pos bits:(int)bits { + if (bits > 32) { + [NSException raise:NSInvalidArgumentException format:@"extractNumberValueFromBitArray can't handle more than 32 bits"]; + } + + int value = 0; + for (int i = 0; i < bits; ++i) { + if ([information get:pos + i]) { + value |= 1 << (bits - i - 1); + } + } + + return value; +} + +- (ZXRSSExpandedDecodedInformation *)decodeGeneralPurposeField:(int)pos remaining:(NSString *)remaining { + [self.buffer setString:@""]; + + if (remaining != nil) { + [self.buffer appendString:remaining]; + } + + self.current.position = pos; + + NSError *error; + ZXRSSExpandedDecodedInformation *lastDecoded = [self parseBlocksWithError:&error]; + if (error) { + return nil; + } + + if (lastDecoded != nil && [lastDecoded remaining]) { + return [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer + remainingValue:lastDecoded.remainingValue]; + } + return [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position newString:self.buffer]; +} + +- (ZXRSSExpandedDecodedInformation *)parseBlocksWithError:(NSError **)error { + BOOL isFinished; + ZXRSSExpandedBlockParsedResult *result; + do { + int initialPosition = self.current.position; + + NSError *localError; + if (self.current.alpha) { + result = [self parseAlphaBlock]; + isFinished = result.finished; + } else if (self.current.isoIec646) { + result = [self parseIsoIec646BlockWithError:&localError]; + isFinished = result.finished; + } else { + result = [self parseNumericBlockWithError:&localError]; + isFinished = result.finished; + } + + if (localError) { + if (error) *error = localError; + return nil; + } + + BOOL positionChanged = initialPosition != self.current.position; + if (!positionChanged && !isFinished) { + break; + } + } while (!isFinished); + return result.decodedInformation; +} + +- (ZXRSSExpandedBlockParsedResult *)parseNumericBlockWithError:(NSError **)error { + while ([self isStillNumeric:self.current.position]) { + ZXRSSExpandedDecodedNumeric *numeric = [self decodeNumeric:self.current.position]; + if (!numeric) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + self.current.position = numeric.theNewPosition; + + if ([numeric firstDigitFNC1]) { + ZXRSSExpandedDecodedInformation *information; + if ([numeric secondDigitFNC1]) { + information = [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer]; + } else { + information = [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer + remainingValue:numeric.secondDigit]; + } + return [[ZXRSSExpandedBlockParsedResult alloc] initWithInformation:information finished:YES]; + } + [self.buffer appendFormat:@"%d", numeric.firstDigit]; + + if (numeric.secondDigitFNC1) { + ZXRSSExpandedDecodedInformation *information = [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer]; + return [[ZXRSSExpandedBlockParsedResult alloc] initWithInformation:information finished:YES]; + } + [self.buffer appendFormat:@"%d", numeric.secondDigit]; + } + + if ([self isNumericToAlphaNumericLatch:self.current.position]) { + [self.current setAlpha]; + self.current.position += 4; + } + return [[ZXRSSExpandedBlockParsedResult alloc] initWithFinished:NO]; +} + +- (ZXRSSExpandedBlockParsedResult *)parseIsoIec646BlockWithError:(NSError **)error { + while ([self isStillIsoIec646:self.current.position]) { + ZXRSSExpandedDecodedChar *iso = [self decodeIsoIec646:self.current.position]; + if (!iso) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + self.current.position = iso.theNewPosition; + + if (iso.fnc1) { + ZXRSSExpandedDecodedInformation *information = [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer]; + return [[ZXRSSExpandedBlockParsedResult alloc] initWithInformation:information finished:YES]; + } + [self.buffer appendFormat:@"%C", iso.value]; + } + + if ([self isAlphaOr646ToNumericLatch:self.current.position]) { + self.current.position += 3; + [self.current setNumeric]; + } else if ([self isAlphaTo646ToAlphaLatch:self.current.position]) { + if (self.current.position + 5 < self.information.size) { + self.current.position += 5; + } else { + self.current.position = self.information.size; + } + + [self.current setAlpha]; + } + return [[ZXRSSExpandedBlockParsedResult alloc] initWithFinished:NO]; +} + +- (ZXRSSExpandedBlockParsedResult *)parseAlphaBlock { + while ([self isStillAlpha:self.current.position]) { + ZXRSSExpandedDecodedChar *alpha = [self decodeAlphanumeric:self.current.position]; + self.current.position = alpha.theNewPosition; + + if (alpha.fnc1) { + ZXRSSExpandedDecodedInformation *information = [[ZXRSSExpandedDecodedInformation alloc] initWithNewPosition:self.current.position + newString:self.buffer]; + return [[ZXRSSExpandedBlockParsedResult alloc] initWithInformation:information finished:YES]; + } + + [self.buffer appendFormat:@"%C", alpha.value]; + } + + if ([self isAlphaOr646ToNumericLatch:self.current.position]) { + self.current.position += 3; + [self.current setNumeric]; + } else if ([self isAlphaTo646ToAlphaLatch:self.current.position]) { + if (self.current.position + 5 < self.information.size) { + self.current.position += 5; + } else { + self.current.position = self.information.size; + } + + [self.current setIsoIec646]; + } + return [[ZXRSSExpandedBlockParsedResult alloc] initWithFinished:NO]; +} + +- (BOOL)isStillIsoIec646:(int)pos { + if (pos + 5 > self.information.size) { + return NO; + } + + int fiveBitValue = [self extractNumericValueFromBitArray:pos bits:5]; + if (fiveBitValue >= 5 && fiveBitValue < 16) { + return YES; + } + + if (pos + 7 > self.information.size) { + return NO; + } + + int sevenBitValue = [self extractNumericValueFromBitArray:pos bits:7]; + if (sevenBitValue >= 64 && sevenBitValue < 116) { + return YES; + } + + if (pos + 8 > self.information.size) { + return NO; + } + + int eightBitValue = [self extractNumericValueFromBitArray:pos bits:8]; + return eightBitValue >= 232 && eightBitValue < 253; +} + +- (ZXRSSExpandedDecodedChar *)decodeIsoIec646:(int)pos { + int fiveBitValue = [self extractNumericValueFromBitArray:pos bits:5]; + if (fiveBitValue == 15) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 5 value:ZX_FNC1_CHAR]; + } + + if (fiveBitValue >= 5 && fiveBitValue < 15) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 5 value:(unichar)('0' + fiveBitValue - 5)]; + } + + int sevenBitValue = [self extractNumericValueFromBitArray:pos bits:7]; + + if (sevenBitValue >= 64 && sevenBitValue < 90) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 7 value:(unichar)(sevenBitValue + 1)]; + } + + if (sevenBitValue >= 90 && sevenBitValue < 116) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 7 value:(unichar)(sevenBitValue + 7)]; + } + + int eightBitValue = [self extractNumericValueFromBitArray:pos bits:8]; + unichar c; + switch (eightBitValue) { + case 232: + c = '!'; + break; + case 233: + c = '"'; + break; + case 234: + c ='%'; + break; + case 235: + c = '&'; + break; + case 236: + c = '\''; + break; + case 237: + c = '('; + break; + case 238: + c = ')'; + break; + case 239: + c = '*'; + break; + case 240: + c = '+'; + break; + case 241: + c = ','; + break; + case 242: + c = '-'; + break; + case 243: + c = '.'; + break; + case 244: + c = '/'; + break; + case 245: + c = ':'; + break; + case 246: + c = ';'; + break; + case 247: + c = '<'; + break; + case 248: + c = '='; + break; + case 249: + c = '>'; + break; + case 250: + c = '?'; + break; + case 251: + c = '_'; + break; + case 252: + c = ' '; + break; + default: + return nil; + } + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 8 value:c]; +} + +- (BOOL)isStillAlpha:(int)pos { + if (pos + 5 > self.information.size) { + return NO; + } + + // We now check if it's a valid 5-bit value (0..9 and FNC1) + int fiveBitValue = [self extractNumericValueFromBitArray:pos bits:5]; + if (fiveBitValue >= 5 && fiveBitValue < 16) { + return YES; + } + + if (pos + 6 > self.information.size) { + return NO; + } + + int sixBitValue = [self extractNumericValueFromBitArray:pos bits:6]; + return sixBitValue >= 16 && sixBitValue < 63; // 63 not included +} + +- (ZXRSSExpandedDecodedChar *)decodeAlphanumeric:(int)pos { + int fiveBitValue = [self extractNumericValueFromBitArray:pos bits:5]; + if (fiveBitValue == 15) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 5 value:ZX_FNC1_CHAR]; + } + + if (fiveBitValue >= 5 && fiveBitValue < 15) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 5 value:(unichar)('0' + fiveBitValue - 5)]; + } + + int sixBitValue = [self extractNumericValueFromBitArray:pos bits:6]; + + if (sixBitValue >= 32 && sixBitValue < 58) { + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 6 value:(unichar)(sixBitValue + 33)]; + } + + unichar c; + switch (sixBitValue){ + case 58: + c = '*'; + break; + case 59: + c = ','; + break; + case 60: + c = '-'; + break; + case 61: + c = '.'; + break; + case 62: + c = '/'; + break; + default: + @throw [NSException exceptionWithName:@"RuntimeException" + reason:[NSString stringWithFormat:@"Decoding invalid alphanumeric value: %d", sixBitValue] + userInfo:nil]; + } + + return [[ZXRSSExpandedDecodedChar alloc] initWithNewPosition:pos + 6 value:c]; +} + +- (BOOL)isAlphaTo646ToAlphaLatch:(int)pos { + if (pos + 1 > self.information.size) { + return NO; + } + + for (int i = 0; i < 5 && i + pos < self.information.size; ++i) { + if (i == 2) { + if (![self.information get:pos + 2]) { + return NO; + } + } else if ([self.information get:pos + i]) { + return NO; + } + } + + return YES; +} + +- (BOOL)isAlphaOr646ToNumericLatch:(int)pos { + // Next is alphanumeric if there are 3 positions and they are all zeros + if (pos + 3 > self.information.size) { + return NO; + } + + for (int i = pos; i < pos + 3; ++i) { + if ([self.information get:i]) { + return NO; + } + } + + return YES; +} + +- (BOOL)isNumericToAlphaNumericLatch:(int)pos { + // Next is alphanumeric if there are 4 positions and they are all zeros, or + // if there is a subset of this just before the end of the symbol + if (pos + 1 > self.information.size) { + return NO; + } + + for (int i = 0; i < 4 && i + pos < self.information.size; ++i) { + if ([self.information get:pos + i]) { + return NO; + } + } + + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.h new file mode 100644 index 0000000..62efac2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.h @@ -0,0 +1,42 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define ZX_PDF417_SYMBOL_TABLE_LEN 2787 +extern const int ZX_PDF417_SYMBOL_TABLE[]; + +extern const int ZX_PDF417_NUMBER_OF_CODEWORDS; +extern const int ZX_PDF417_MIN_ROWS_IN_BARCODE; +extern const int ZX_PDF417_MAX_ROWS_IN_BARCODE; +extern const int ZX_PDF417_MAX_CODEWORDS_IN_BARCODE; +extern const int ZX_PDF417_MODULES_IN_CODEWORD; +extern const int ZX_PDF417_MODULES_IN_STOP_PATTERN; +#define ZX_PDF417_BARS_IN_MODULE 8 + +@class ZXIntArray; + +@interface ZXPDF417Common : NSObject + ++ (int)bitCountSum:(NSArray *)moduleBitCount; ++ (ZXIntArray *)toIntArray:(NSArray *)list; + +/** + * Translate the symbol into a codeword. + * + * @return the codeword corresponding to the symbol. + */ ++ (int)codeword:(int)symbol; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.m new file mode 100644 index 0000000..9e94654 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.m @@ -0,0 +1,468 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXPDF417.h" +#import "ZXPDF417Common.h" + +const int ZX_PDF417_NUMBER_OF_CODEWORDS = 929; +// Maximum Codewords (Data + Error). +const int ZX_PDF417_MAX_CODEWORDS_IN_BARCODE = ZX_PDF417_NUMBER_OF_CODEWORDS - 1; +const int ZX_PDF417_MIN_ROWS_IN_BARCODE = 3; +const int ZX_PDF417_MAX_ROWS_IN_BARCODE = 90; +// One left row indication column + max 30 data columns + one right row indicator column +//const int ZX_PDF417_MAX_CODEWORDS_IN_ROW = 32; +const int ZX_PDF417_MODULES_IN_CODEWORD = 17; +const int ZX_PDF417_MODULES_IN_STOP_PATTERN = 18; + +const int ZX_PDF417_COMMON_CODEWORD_TABLE[]; + +@implementation ZXPDF417Common + ++ (int)bitCountSum:(NSArray *)moduleBitCount { + int bitCountSum = 0; + for (NSNumber *count in moduleBitCount) { + bitCountSum += [count intValue]; + } + return bitCountSum; +} + ++ (ZXIntArray *)toIntArray:(NSArray *)list { + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:(unsigned int)[list count]]; + int i = 0; + for (NSNumber *integer in list) { + result.array[i++] = (int32_t)[integer intValue]; + } + return result; +} + ++ (int)codeword:(int)symbol { + int i = [self binarySearch:symbol & 0x3FFFF]; + if (i == -1) { + return -1; + } + return (ZX_PDF417_COMMON_CODEWORD_TABLE[i] - 1) % ZX_PDF417_NUMBER_OF_CODEWORDS; +} + +/** + * Use a binary search to find the index of the codeword corresponding to + * this symbol. + * + * @param symbol the symbol from the barcode. + * @return the index into the codeword table. + */ ++ (int)binarySearch:(int)symbol { + int first = 0; + int upto = ZX_PDF417_SYMBOL_TABLE_LEN; + while (first < upto) { + int mid = (first + upto) / 2; // Compute mid point. + if (symbol < ZX_PDF417_SYMBOL_TABLE[mid]) { + upto = mid; // continue search in bottom half. + } else if (symbol > ZX_PDF417_SYMBOL_TABLE[mid]) { + first = mid + 1; // continue search in top half. + } else { + return mid; // Found it. return position + } + } + return -1; +} + +@end + +/** + * The sorted table of all possible symbols. Extracted from the PDF417 + * specification. The index of a symbol in this table corresponds to the + * index into the codeword table. + */ +const int ZX_PDF417_SYMBOL_TABLE[ZX_PDF417_SYMBOL_TABLE_LEN] = { + 0x1025e, 0x1027a, 0x1029e, 0x102bc, 0x102f2, 0x102f4, 0x1032e, 0x1034e, 0x1035c, 0x10396, 0x103a6, 0x103ac, + 0x10422, 0x10428, 0x10436, 0x10442, 0x10444, 0x10448, 0x10450, 0x1045e, 0x10466, 0x1046c, 0x1047a, 0x10482, + 0x1049e, 0x104a0, 0x104bc, 0x104c6, 0x104d8, 0x104ee, 0x104f2, 0x104f4, 0x10504, 0x10508, 0x10510, 0x1051e, + 0x10520, 0x1053c, 0x10540, 0x10578, 0x10586, 0x1058c, 0x10598, 0x105b0, 0x105be, 0x105ce, 0x105dc, 0x105e2, + 0x105e4, 0x105e8, 0x105f6, 0x1062e, 0x1064e, 0x1065c, 0x1068e, 0x1069c, 0x106b8, 0x106de, 0x106fa, 0x10716, + 0x10726, 0x1072c, 0x10746, 0x1074c, 0x10758, 0x1076e, 0x10792, 0x10794, 0x107a2, 0x107a4, 0x107a8, 0x107b6, + 0x10822, 0x10828, 0x10842, 0x10848, 0x10850, 0x1085e, 0x10866, 0x1086c, 0x1087a, 0x10882, 0x10884, 0x10890, + 0x1089e, 0x108a0, 0x108bc, 0x108c6, 0x108cc, 0x108d8, 0x108ee, 0x108f2, 0x108f4, 0x10902, 0x10908, 0x1091e, + 0x10920, 0x1093c, 0x10940, 0x10978, 0x10986, 0x10998, 0x109b0, 0x109be, 0x109ce, 0x109dc, 0x109e2, 0x109e4, + 0x109e8, 0x109f6, 0x10a08, 0x10a10, 0x10a1e, 0x10a20, 0x10a3c, 0x10a40, 0x10a78, 0x10af0, 0x10b06, 0x10b0c, + 0x10b18, 0x10b30, 0x10b3e, 0x10b60, 0x10b7c, 0x10b8e, 0x10b9c, 0x10bb8, 0x10bc2, 0x10bc4, 0x10bc8, 0x10bd0, + 0x10bde, 0x10be6, 0x10bec, 0x10c2e, 0x10c4e, 0x10c5c, 0x10c62, 0x10c64, 0x10c68, 0x10c76, 0x10c8e, 0x10c9c, + 0x10cb8, 0x10cc2, 0x10cc4, 0x10cc8, 0x10cd0, 0x10cde, 0x10ce6, 0x10cec, 0x10cfa, 0x10d0e, 0x10d1c, 0x10d38, + 0x10d70, 0x10d7e, 0x10d82, 0x10d84, 0x10d88, 0x10d90, 0x10d9e, 0x10da0, 0x10dbc, 0x10dc6, 0x10dcc, 0x10dd8, + 0x10dee, 0x10df2, 0x10df4, 0x10e16, 0x10e26, 0x10e2c, 0x10e46, 0x10e58, 0x10e6e, 0x10e86, 0x10e8c, 0x10e98, + 0x10eb0, 0x10ebe, 0x10ece, 0x10edc, 0x10f0a, 0x10f12, 0x10f14, 0x10f22, 0x10f28, 0x10f36, 0x10f42, 0x10f44, + 0x10f48, 0x10f50, 0x10f5e, 0x10f66, 0x10f6c, 0x10fb2, 0x10fb4, 0x11022, 0x11028, 0x11042, 0x11048, 0x11050, + 0x1105e, 0x1107a, 0x11082, 0x11084, 0x11090, 0x1109e, 0x110a0, 0x110bc, 0x110c6, 0x110cc, 0x110d8, 0x110ee, + 0x110f2, 0x110f4, 0x11102, 0x1111e, 0x11120, 0x1113c, 0x11140, 0x11178, 0x11186, 0x11198, 0x111b0, 0x111be, + 0x111ce, 0x111dc, 0x111e2, 0x111e4, 0x111e8, 0x111f6, 0x11208, 0x1121e, 0x11220, 0x11278, 0x112f0, 0x1130c, + 0x11330, 0x1133e, 0x11360, 0x1137c, 0x1138e, 0x1139c, 0x113b8, 0x113c2, 0x113c8, 0x113d0, 0x113de, 0x113e6, + 0x113ec, 0x11408, 0x11410, 0x1141e, 0x11420, 0x1143c, 0x11440, 0x11478, 0x114f0, 0x115e0, 0x1160c, 0x11618, + 0x11630, 0x1163e, 0x11660, 0x1167c, 0x116c0, 0x116f8, 0x1171c, 0x11738, 0x11770, 0x1177e, 0x11782, 0x11784, + 0x11788, 0x11790, 0x1179e, 0x117a0, 0x117bc, 0x117c6, 0x117cc, 0x117d8, 0x117ee, 0x1182e, 0x11834, 0x1184e, + 0x1185c, 0x11862, 0x11864, 0x11868, 0x11876, 0x1188e, 0x1189c, 0x118b8, 0x118c2, 0x118c8, 0x118d0, 0x118de, + 0x118e6, 0x118ec, 0x118fa, 0x1190e, 0x1191c, 0x11938, 0x11970, 0x1197e, 0x11982, 0x11984, 0x11990, 0x1199e, + 0x119a0, 0x119bc, 0x119c6, 0x119cc, 0x119d8, 0x119ee, 0x119f2, 0x119f4, 0x11a0e, 0x11a1c, 0x11a38, 0x11a70, + 0x11a7e, 0x11ae0, 0x11afc, 0x11b08, 0x11b10, 0x11b1e, 0x11b20, 0x11b3c, 0x11b40, 0x11b78, 0x11b8c, 0x11b98, + 0x11bb0, 0x11bbe, 0x11bce, 0x11bdc, 0x11be2, 0x11be4, 0x11be8, 0x11bf6, 0x11c16, 0x11c26, 0x11c2c, 0x11c46, + 0x11c4c, 0x11c58, 0x11c6e, 0x11c86, 0x11c98, 0x11cb0, 0x11cbe, 0x11cce, 0x11cdc, 0x11ce2, 0x11ce4, 0x11ce8, + 0x11cf6, 0x11d06, 0x11d0c, 0x11d18, 0x11d30, 0x11d3e, 0x11d60, 0x11d7c, 0x11d8e, 0x11d9c, 0x11db8, 0x11dc4, + 0x11dc8, 0x11dd0, 0x11dde, 0x11de6, 0x11dec, 0x11dfa, 0x11e0a, 0x11e12, 0x11e14, 0x11e22, 0x11e24, 0x11e28, + 0x11e36, 0x11e42, 0x11e44, 0x11e50, 0x11e5e, 0x11e66, 0x11e6c, 0x11e82, 0x11e84, 0x11e88, 0x11e90, 0x11e9e, + 0x11ea0, 0x11ebc, 0x11ec6, 0x11ecc, 0x11ed8, 0x11eee, 0x11f1a, 0x11f2e, 0x11f32, 0x11f34, 0x11f4e, 0x11f5c, + 0x11f62, 0x11f64, 0x11f68, 0x11f76, 0x12048, 0x1205e, 0x12082, 0x12084, 0x12090, 0x1209e, 0x120a0, 0x120bc, + 0x120d8, 0x120f2, 0x120f4, 0x12108, 0x1211e, 0x12120, 0x1213c, 0x12140, 0x12178, 0x12186, 0x12198, 0x121b0, + 0x121be, 0x121e2, 0x121e4, 0x121e8, 0x121f6, 0x12204, 0x12210, 0x1221e, 0x12220, 0x12278, 0x122f0, 0x12306, + 0x1230c, 0x12330, 0x1233e, 0x12360, 0x1237c, 0x1238e, 0x1239c, 0x123b8, 0x123c2, 0x123c8, 0x123d0, 0x123e6, + 0x123ec, 0x1241e, 0x12420, 0x1243c, 0x124f0, 0x125e0, 0x12618, 0x1263e, 0x12660, 0x1267c, 0x126c0, 0x126f8, + 0x12738, 0x12770, 0x1277e, 0x12782, 0x12784, 0x12790, 0x1279e, 0x127a0, 0x127bc, 0x127c6, 0x127cc, 0x127d8, + 0x127ee, 0x12820, 0x1283c, 0x12840, 0x12878, 0x128f0, 0x129e0, 0x12bc0, 0x12c18, 0x12c30, 0x12c3e, 0x12c60, + 0x12c7c, 0x12cc0, 0x12cf8, 0x12df0, 0x12e1c, 0x12e38, 0x12e70, 0x12e7e, 0x12ee0, 0x12efc, 0x12f04, 0x12f08, + 0x12f10, 0x12f20, 0x12f3c, 0x12f40, 0x12f78, 0x12f86, 0x12f8c, 0x12f98, 0x12fb0, 0x12fbe, 0x12fce, 0x12fdc, + 0x1302e, 0x1304e, 0x1305c, 0x13062, 0x13068, 0x1308e, 0x1309c, 0x130b8, 0x130c2, 0x130c8, 0x130d0, 0x130de, + 0x130ec, 0x130fa, 0x1310e, 0x13138, 0x13170, 0x1317e, 0x13182, 0x13184, 0x13190, 0x1319e, 0x131a0, 0x131bc, + 0x131c6, 0x131cc, 0x131d8, 0x131f2, 0x131f4, 0x1320e, 0x1321c, 0x13270, 0x1327e, 0x132e0, 0x132fc, 0x13308, + 0x1331e, 0x13320, 0x1333c, 0x13340, 0x13378, 0x13386, 0x13398, 0x133b0, 0x133be, 0x133ce, 0x133dc, 0x133e2, + 0x133e4, 0x133e8, 0x133f6, 0x1340e, 0x1341c, 0x13438, 0x13470, 0x1347e, 0x134e0, 0x134fc, 0x135c0, 0x135f8, + 0x13608, 0x13610, 0x1361e, 0x13620, 0x1363c, 0x13640, 0x13678, 0x136f0, 0x1370c, 0x13718, 0x13730, 0x1373e, + 0x13760, 0x1377c, 0x1379c, 0x137b8, 0x137c2, 0x137c4, 0x137c8, 0x137d0, 0x137de, 0x137e6, 0x137ec, 0x13816, + 0x13826, 0x1382c, 0x13846, 0x1384c, 0x13858, 0x1386e, 0x13874, 0x13886, 0x13898, 0x138b0, 0x138be, 0x138ce, + 0x138dc, 0x138e2, 0x138e4, 0x138e8, 0x13906, 0x1390c, 0x13930, 0x1393e, 0x13960, 0x1397c, 0x1398e, 0x1399c, + 0x139b8, 0x139c8, 0x139d0, 0x139de, 0x139e6, 0x139ec, 0x139fa, 0x13a06, 0x13a0c, 0x13a18, 0x13a30, 0x13a3e, + 0x13a60, 0x13a7c, 0x13ac0, 0x13af8, 0x13b0e, 0x13b1c, 0x13b38, 0x13b70, 0x13b7e, 0x13b88, 0x13b90, 0x13b9e, + 0x13ba0, 0x13bbc, 0x13bcc, 0x13bd8, 0x13bee, 0x13bf2, 0x13bf4, 0x13c12, 0x13c14, 0x13c22, 0x13c24, 0x13c28, + 0x13c36, 0x13c42, 0x13c48, 0x13c50, 0x13c5e, 0x13c66, 0x13c6c, 0x13c82, 0x13c84, 0x13c90, 0x13c9e, 0x13ca0, + 0x13cbc, 0x13cc6, 0x13ccc, 0x13cd8, 0x13cee, 0x13d02, 0x13d04, 0x13d08, 0x13d10, 0x13d1e, 0x13d20, 0x13d3c, + 0x13d40, 0x13d78, 0x13d86, 0x13d8c, 0x13d98, 0x13db0, 0x13dbe, 0x13dce, 0x13ddc, 0x13de4, 0x13de8, 0x13df6, + 0x13e1a, 0x13e2e, 0x13e32, 0x13e34, 0x13e4e, 0x13e5c, 0x13e62, 0x13e64, 0x13e68, 0x13e76, 0x13e8e, 0x13e9c, + 0x13eb8, 0x13ec2, 0x13ec4, 0x13ec8, 0x13ed0, 0x13ede, 0x13ee6, 0x13eec, 0x13f26, 0x13f2c, 0x13f3a, 0x13f46, + 0x13f4c, 0x13f58, 0x13f6e, 0x13f72, 0x13f74, 0x14082, 0x1409e, 0x140a0, 0x140bc, 0x14104, 0x14108, 0x14110, + 0x1411e, 0x14120, 0x1413c, 0x14140, 0x14178, 0x1418c, 0x14198, 0x141b0, 0x141be, 0x141e2, 0x141e4, 0x141e8, + 0x14208, 0x14210, 0x1421e, 0x14220, 0x1423c, 0x14240, 0x14278, 0x142f0, 0x14306, 0x1430c, 0x14318, 0x14330, + 0x1433e, 0x14360, 0x1437c, 0x1438e, 0x143c2, 0x143c4, 0x143c8, 0x143d0, 0x143e6, 0x143ec, 0x14408, 0x14410, + 0x1441e, 0x14420, 0x1443c, 0x14440, 0x14478, 0x144f0, 0x145e0, 0x1460c, 0x14618, 0x14630, 0x1463e, 0x14660, + 0x1467c, 0x146c0, 0x146f8, 0x1471c, 0x14738, 0x14770, 0x1477e, 0x14782, 0x14784, 0x14788, 0x14790, 0x147a0, + 0x147bc, 0x147c6, 0x147cc, 0x147d8, 0x147ee, 0x14810, 0x14820, 0x1483c, 0x14840, 0x14878, 0x148f0, 0x149e0, + 0x14bc0, 0x14c30, 0x14c3e, 0x14c60, 0x14c7c, 0x14cc0, 0x14cf8, 0x14df0, 0x14e38, 0x14e70, 0x14e7e, 0x14ee0, + 0x14efc, 0x14f04, 0x14f08, 0x14f10, 0x14f1e, 0x14f20, 0x14f3c, 0x14f40, 0x14f78, 0x14f86, 0x14f8c, 0x14f98, + 0x14fb0, 0x14fce, 0x14fdc, 0x15020, 0x15040, 0x15078, 0x150f0, 0x151e0, 0x153c0, 0x15860, 0x1587c, 0x158c0, + 0x158f8, 0x159f0, 0x15be0, 0x15c70, 0x15c7e, 0x15ce0, 0x15cfc, 0x15dc0, 0x15df8, 0x15e08, 0x15e10, 0x15e20, + 0x15e40, 0x15e78, 0x15ef0, 0x15f0c, 0x15f18, 0x15f30, 0x15f60, 0x15f7c, 0x15f8e, 0x15f9c, 0x15fb8, 0x1604e, + 0x1605c, 0x1608e, 0x1609c, 0x160b8, 0x160c2, 0x160c4, 0x160c8, 0x160de, 0x1610e, 0x1611c, 0x16138, 0x16170, + 0x1617e, 0x16184, 0x16188, 0x16190, 0x1619e, 0x161a0, 0x161bc, 0x161c6, 0x161cc, 0x161d8, 0x161f2, 0x161f4, + 0x1620e, 0x1621c, 0x16238, 0x16270, 0x1627e, 0x162e0, 0x162fc, 0x16304, 0x16308, 0x16310, 0x1631e, 0x16320, + 0x1633c, 0x16340, 0x16378, 0x16386, 0x1638c, 0x16398, 0x163b0, 0x163be, 0x163ce, 0x163dc, 0x163e2, 0x163e4, + 0x163e8, 0x163f6, 0x1640e, 0x1641c, 0x16438, 0x16470, 0x1647e, 0x164e0, 0x164fc, 0x165c0, 0x165f8, 0x16610, + 0x1661e, 0x16620, 0x1663c, 0x16640, 0x16678, 0x166f0, 0x16718, 0x16730, 0x1673e, 0x16760, 0x1677c, 0x1678e, + 0x1679c, 0x167b8, 0x167c2, 0x167c4, 0x167c8, 0x167d0, 0x167de, 0x167e6, 0x167ec, 0x1681c, 0x16838, 0x16870, + 0x168e0, 0x168fc, 0x169c0, 0x169f8, 0x16bf0, 0x16c10, 0x16c1e, 0x16c20, 0x16c3c, 0x16c40, 0x16c78, 0x16cf0, + 0x16de0, 0x16e18, 0x16e30, 0x16e3e, 0x16e60, 0x16e7c, 0x16ec0, 0x16ef8, 0x16f1c, 0x16f38, 0x16f70, 0x16f7e, + 0x16f84, 0x16f88, 0x16f90, 0x16f9e, 0x16fa0, 0x16fbc, 0x16fc6, 0x16fcc, 0x16fd8, 0x17026, 0x1702c, 0x17046, + 0x1704c, 0x17058, 0x1706e, 0x17086, 0x1708c, 0x17098, 0x170b0, 0x170be, 0x170ce, 0x170dc, 0x170e8, 0x17106, + 0x1710c, 0x17118, 0x17130, 0x1713e, 0x17160, 0x1717c, 0x1718e, 0x1719c, 0x171b8, 0x171c2, 0x171c4, 0x171c8, + 0x171d0, 0x171de, 0x171e6, 0x171ec, 0x171fa, 0x17206, 0x1720c, 0x17218, 0x17230, 0x1723e, 0x17260, 0x1727c, + 0x172c0, 0x172f8, 0x1730e, 0x1731c, 0x17338, 0x17370, 0x1737e, 0x17388, 0x17390, 0x1739e, 0x173a0, 0x173bc, + 0x173cc, 0x173d8, 0x173ee, 0x173f2, 0x173f4, 0x1740c, 0x17418, 0x17430, 0x1743e, 0x17460, 0x1747c, 0x174c0, + 0x174f8, 0x175f0, 0x1760e, 0x1761c, 0x17638, 0x17670, 0x1767e, 0x176e0, 0x176fc, 0x17708, 0x17710, 0x1771e, + 0x17720, 0x1773c, 0x17740, 0x17778, 0x17798, 0x177b0, 0x177be, 0x177dc, 0x177e2, 0x177e4, 0x177e8, 0x17822, + 0x17824, 0x17828, 0x17836, 0x17842, 0x17844, 0x17848, 0x17850, 0x1785e, 0x17866, 0x1786c, 0x17882, 0x17884, + 0x17888, 0x17890, 0x1789e, 0x178a0, 0x178bc, 0x178c6, 0x178cc, 0x178d8, 0x178ee, 0x178f2, 0x178f4, 0x17902, + 0x17904, 0x17908, 0x17910, 0x1791e, 0x17920, 0x1793c, 0x17940, 0x17978, 0x17986, 0x1798c, 0x17998, 0x179b0, + 0x179be, 0x179ce, 0x179dc, 0x179e2, 0x179e4, 0x179e8, 0x179f6, 0x17a04, 0x17a08, 0x17a10, 0x17a1e, 0x17a20, + 0x17a3c, 0x17a40, 0x17a78, 0x17af0, 0x17b06, 0x17b0c, 0x17b18, 0x17b30, 0x17b3e, 0x17b60, 0x17b7c, 0x17b8e, + 0x17b9c, 0x17bb8, 0x17bc4, 0x17bc8, 0x17bd0, 0x17bde, 0x17be6, 0x17bec, 0x17c2e, 0x17c32, 0x17c34, 0x17c4e, + 0x17c5c, 0x17c62, 0x17c64, 0x17c68, 0x17c76, 0x17c8e, 0x17c9c, 0x17cb8, 0x17cc2, 0x17cc4, 0x17cc8, 0x17cd0, + 0x17cde, 0x17ce6, 0x17cec, 0x17d0e, 0x17d1c, 0x17d38, 0x17d70, 0x17d82, 0x17d84, 0x17d88, 0x17d90, 0x17d9e, + 0x17da0, 0x17dbc, 0x17dc6, 0x17dcc, 0x17dd8, 0x17dee, 0x17e26, 0x17e2c, 0x17e3a, 0x17e46, 0x17e4c, 0x17e58, + 0x17e6e, 0x17e72, 0x17e74, 0x17e86, 0x17e8c, 0x17e98, 0x17eb0, 0x17ece, 0x17edc, 0x17ee2, 0x17ee4, 0x17ee8, + 0x17ef6, 0x1813a, 0x18172, 0x18174, 0x18216, 0x18226, 0x1823a, 0x1824c, 0x18258, 0x1826e, 0x18272, 0x18274, + 0x18298, 0x182be, 0x182e2, 0x182e4, 0x182e8, 0x182f6, 0x1835e, 0x1837a, 0x183ae, 0x183d6, 0x18416, 0x18426, + 0x1842c, 0x1843a, 0x18446, 0x18458, 0x1846e, 0x18472, 0x18474, 0x18486, 0x184b0, 0x184be, 0x184ce, 0x184dc, + 0x184e2, 0x184e4, 0x184e8, 0x184f6, 0x18506, 0x1850c, 0x18518, 0x18530, 0x1853e, 0x18560, 0x1857c, 0x1858e, + 0x1859c, 0x185b8, 0x185c2, 0x185c4, 0x185c8, 0x185d0, 0x185de, 0x185e6, 0x185ec, 0x185fa, 0x18612, 0x18614, + 0x18622, 0x18628, 0x18636, 0x18642, 0x18650, 0x1865e, 0x1867a, 0x18682, 0x18684, 0x18688, 0x18690, 0x1869e, + 0x186a0, 0x186bc, 0x186c6, 0x186cc, 0x186d8, 0x186ee, 0x186f2, 0x186f4, 0x1872e, 0x1874e, 0x1875c, 0x18796, + 0x187a6, 0x187ac, 0x187d2, 0x187d4, 0x18826, 0x1882c, 0x1883a, 0x18846, 0x1884c, 0x18858, 0x1886e, 0x18872, + 0x18874, 0x18886, 0x18898, 0x188b0, 0x188be, 0x188ce, 0x188dc, 0x188e2, 0x188e4, 0x188e8, 0x188f6, 0x1890c, + 0x18930, 0x1893e, 0x18960, 0x1897c, 0x1898e, 0x189b8, 0x189c2, 0x189c8, 0x189d0, 0x189de, 0x189e6, 0x189ec, + 0x189fa, 0x18a18, 0x18a30, 0x18a3e, 0x18a60, 0x18a7c, 0x18ac0, 0x18af8, 0x18b1c, 0x18b38, 0x18b70, 0x18b7e, + 0x18b82, 0x18b84, 0x18b88, 0x18b90, 0x18b9e, 0x18ba0, 0x18bbc, 0x18bc6, 0x18bcc, 0x18bd8, 0x18bee, 0x18bf2, + 0x18bf4, 0x18c22, 0x18c24, 0x18c28, 0x18c36, 0x18c42, 0x18c48, 0x18c50, 0x18c5e, 0x18c66, 0x18c7a, 0x18c82, + 0x18c84, 0x18c90, 0x18c9e, 0x18ca0, 0x18cbc, 0x18ccc, 0x18cf2, 0x18cf4, 0x18d04, 0x18d08, 0x18d10, 0x18d1e, + 0x18d20, 0x18d3c, 0x18d40, 0x18d78, 0x18d86, 0x18d98, 0x18dce, 0x18de2, 0x18de4, 0x18de8, 0x18e2e, 0x18e32, + 0x18e34, 0x18e4e, 0x18e5c, 0x18e62, 0x18e64, 0x18e68, 0x18e8e, 0x18e9c, 0x18eb8, 0x18ec2, 0x18ec4, 0x18ec8, + 0x18ed0, 0x18efa, 0x18f16, 0x18f26, 0x18f2c, 0x18f46, 0x18f4c, 0x18f58, 0x18f6e, 0x18f8a, 0x18f92, 0x18f94, + 0x18fa2, 0x18fa4, 0x18fa8, 0x18fb6, 0x1902c, 0x1903a, 0x19046, 0x1904c, 0x19058, 0x19072, 0x19074, 0x19086, + 0x19098, 0x190b0, 0x190be, 0x190ce, 0x190dc, 0x190e2, 0x190e8, 0x190f6, 0x19106, 0x1910c, 0x19130, 0x1913e, + 0x19160, 0x1917c, 0x1918e, 0x1919c, 0x191b8, 0x191c2, 0x191c8, 0x191d0, 0x191de, 0x191e6, 0x191ec, 0x191fa, + 0x19218, 0x1923e, 0x19260, 0x1927c, 0x192c0, 0x192f8, 0x19338, 0x19370, 0x1937e, 0x19382, 0x19384, 0x19390, + 0x1939e, 0x193a0, 0x193bc, 0x193c6, 0x193cc, 0x193d8, 0x193ee, 0x193f2, 0x193f4, 0x19430, 0x1943e, 0x19460, + 0x1947c, 0x194c0, 0x194f8, 0x195f0, 0x19638, 0x19670, 0x1967e, 0x196e0, 0x196fc, 0x19702, 0x19704, 0x19708, + 0x19710, 0x19720, 0x1973c, 0x19740, 0x19778, 0x19786, 0x1978c, 0x19798, 0x197b0, 0x197be, 0x197ce, 0x197dc, + 0x197e2, 0x197e4, 0x197e8, 0x19822, 0x19824, 0x19842, 0x19848, 0x19850, 0x1985e, 0x19866, 0x1987a, 0x19882, + 0x19884, 0x19890, 0x1989e, 0x198a0, 0x198bc, 0x198cc, 0x198f2, 0x198f4, 0x19902, 0x19908, 0x1991e, 0x19920, + 0x1993c, 0x19940, 0x19978, 0x19986, 0x19998, 0x199ce, 0x199e2, 0x199e4, 0x199e8, 0x19a08, 0x19a10, 0x19a1e, + 0x19a20, 0x19a3c, 0x19a40, 0x19a78, 0x19af0, 0x19b18, 0x19b3e, 0x19b60, 0x19b9c, 0x19bc2, 0x19bc4, 0x19bc8, + 0x19bd0, 0x19be6, 0x19c2e, 0x19c34, 0x19c4e, 0x19c5c, 0x19c62, 0x19c64, 0x19c68, 0x19c8e, 0x19c9c, 0x19cb8, + 0x19cc2, 0x19cc8, 0x19cd0, 0x19ce6, 0x19cfa, 0x19d0e, 0x19d1c, 0x19d38, 0x19d70, 0x19d7e, 0x19d82, 0x19d84, + 0x19d88, 0x19d90, 0x19da0, 0x19dcc, 0x19df2, 0x19df4, 0x19e16, 0x19e26, 0x19e2c, 0x19e46, 0x19e4c, 0x19e58, + 0x19e74, 0x19e86, 0x19e8c, 0x19e98, 0x19eb0, 0x19ebe, 0x19ece, 0x19ee2, 0x19ee4, 0x19ee8, 0x19f0a, 0x19f12, + 0x19f14, 0x19f22, 0x19f24, 0x19f28, 0x19f42, 0x19f44, 0x19f48, 0x19f50, 0x19f5e, 0x19f6c, 0x19f9a, 0x19fae, + 0x19fb2, 0x19fb4, 0x1a046, 0x1a04c, 0x1a072, 0x1a074, 0x1a086, 0x1a08c, 0x1a098, 0x1a0b0, 0x1a0be, 0x1a0e2, + 0x1a0e4, 0x1a0e8, 0x1a0f6, 0x1a106, 0x1a10c, 0x1a118, 0x1a130, 0x1a13e, 0x1a160, 0x1a17c, 0x1a18e, 0x1a19c, + 0x1a1b8, 0x1a1c2, 0x1a1c4, 0x1a1c8, 0x1a1d0, 0x1a1de, 0x1a1e6, 0x1a1ec, 0x1a218, 0x1a230, 0x1a23e, 0x1a260, + 0x1a27c, 0x1a2c0, 0x1a2f8, 0x1a31c, 0x1a338, 0x1a370, 0x1a37e, 0x1a382, 0x1a384, 0x1a388, 0x1a390, 0x1a39e, + 0x1a3a0, 0x1a3bc, 0x1a3c6, 0x1a3cc, 0x1a3d8, 0x1a3ee, 0x1a3f2, 0x1a3f4, 0x1a418, 0x1a430, 0x1a43e, 0x1a460, + 0x1a47c, 0x1a4c0, 0x1a4f8, 0x1a5f0, 0x1a61c, 0x1a638, 0x1a670, 0x1a67e, 0x1a6e0, 0x1a6fc, 0x1a702, 0x1a704, + 0x1a708, 0x1a710, 0x1a71e, 0x1a720, 0x1a73c, 0x1a740, 0x1a778, 0x1a786, 0x1a78c, 0x1a798, 0x1a7b0, 0x1a7be, + 0x1a7ce, 0x1a7dc, 0x1a7e2, 0x1a7e4, 0x1a7e8, 0x1a830, 0x1a860, 0x1a87c, 0x1a8c0, 0x1a8f8, 0x1a9f0, 0x1abe0, + 0x1ac70, 0x1ac7e, 0x1ace0, 0x1acfc, 0x1adc0, 0x1adf8, 0x1ae04, 0x1ae08, 0x1ae10, 0x1ae20, 0x1ae3c, 0x1ae40, + 0x1ae78, 0x1aef0, 0x1af06, 0x1af0c, 0x1af18, 0x1af30, 0x1af3e, 0x1af60, 0x1af7c, 0x1af8e, 0x1af9c, 0x1afb8, + 0x1afc4, 0x1afc8, 0x1afd0, 0x1afde, 0x1b042, 0x1b05e, 0x1b07a, 0x1b082, 0x1b084, 0x1b088, 0x1b090, 0x1b09e, + 0x1b0a0, 0x1b0bc, 0x1b0cc, 0x1b0f2, 0x1b0f4, 0x1b102, 0x1b104, 0x1b108, 0x1b110, 0x1b11e, 0x1b120, 0x1b13c, + 0x1b140, 0x1b178, 0x1b186, 0x1b198, 0x1b1ce, 0x1b1e2, 0x1b1e4, 0x1b1e8, 0x1b204, 0x1b208, 0x1b210, 0x1b21e, + 0x1b220, 0x1b23c, 0x1b240, 0x1b278, 0x1b2f0, 0x1b30c, 0x1b33e, 0x1b360, 0x1b39c, 0x1b3c2, 0x1b3c4, 0x1b3c8, + 0x1b3d0, 0x1b3e6, 0x1b410, 0x1b41e, 0x1b420, 0x1b43c, 0x1b440, 0x1b478, 0x1b4f0, 0x1b5e0, 0x1b618, 0x1b660, + 0x1b67c, 0x1b6c0, 0x1b738, 0x1b782, 0x1b784, 0x1b788, 0x1b790, 0x1b79e, 0x1b7a0, 0x1b7cc, 0x1b82e, 0x1b84e, + 0x1b85c, 0x1b88e, 0x1b89c, 0x1b8b8, 0x1b8c2, 0x1b8c4, 0x1b8c8, 0x1b8d0, 0x1b8e6, 0x1b8fa, 0x1b90e, 0x1b91c, + 0x1b938, 0x1b970, 0x1b97e, 0x1b982, 0x1b984, 0x1b988, 0x1b990, 0x1b99e, 0x1b9a0, 0x1b9cc, 0x1b9f2, 0x1b9f4, + 0x1ba0e, 0x1ba1c, 0x1ba38, 0x1ba70, 0x1ba7e, 0x1bae0, 0x1bafc, 0x1bb08, 0x1bb10, 0x1bb20, 0x1bb3c, 0x1bb40, + 0x1bb98, 0x1bbce, 0x1bbe2, 0x1bbe4, 0x1bbe8, 0x1bc16, 0x1bc26, 0x1bc2c, 0x1bc46, 0x1bc4c, 0x1bc58, 0x1bc72, + 0x1bc74, 0x1bc86, 0x1bc8c, 0x1bc98, 0x1bcb0, 0x1bcbe, 0x1bcce, 0x1bce2, 0x1bce4, 0x1bce8, 0x1bd06, 0x1bd0c, + 0x1bd18, 0x1bd30, 0x1bd3e, 0x1bd60, 0x1bd7c, 0x1bd9c, 0x1bdc2, 0x1bdc4, 0x1bdc8, 0x1bdd0, 0x1bde6, 0x1bdfa, + 0x1be12, 0x1be14, 0x1be22, 0x1be24, 0x1be28, 0x1be42, 0x1be44, 0x1be48, 0x1be50, 0x1be5e, 0x1be66, 0x1be82, + 0x1be84, 0x1be88, 0x1be90, 0x1be9e, 0x1bea0, 0x1bebc, 0x1becc, 0x1bef4, 0x1bf1a, 0x1bf2e, 0x1bf32, 0x1bf34, + 0x1bf4e, 0x1bf5c, 0x1bf62, 0x1bf64, 0x1bf68, 0x1c09a, 0x1c0b2, 0x1c0b4, 0x1c11a, 0x1c132, 0x1c134, 0x1c162, + 0x1c164, 0x1c168, 0x1c176, 0x1c1ba, 0x1c21a, 0x1c232, 0x1c234, 0x1c24e, 0x1c25c, 0x1c262, 0x1c264, 0x1c268, + 0x1c276, 0x1c28e, 0x1c2c2, 0x1c2c4, 0x1c2c8, 0x1c2d0, 0x1c2de, 0x1c2e6, 0x1c2ec, 0x1c2fa, 0x1c316, 0x1c326, + 0x1c33a, 0x1c346, 0x1c34c, 0x1c372, 0x1c374, 0x1c41a, 0x1c42e, 0x1c432, 0x1c434, 0x1c44e, 0x1c45c, 0x1c462, + 0x1c464, 0x1c468, 0x1c476, 0x1c48e, 0x1c49c, 0x1c4b8, 0x1c4c2, 0x1c4c8, 0x1c4d0, 0x1c4de, 0x1c4e6, 0x1c4ec, + 0x1c4fa, 0x1c51c, 0x1c538, 0x1c570, 0x1c57e, 0x1c582, 0x1c584, 0x1c588, 0x1c590, 0x1c59e, 0x1c5a0, 0x1c5bc, + 0x1c5c6, 0x1c5cc, 0x1c5d8, 0x1c5ee, 0x1c5f2, 0x1c5f4, 0x1c616, 0x1c626, 0x1c62c, 0x1c63a, 0x1c646, 0x1c64c, + 0x1c658, 0x1c66e, 0x1c672, 0x1c674, 0x1c686, 0x1c68c, 0x1c698, 0x1c6b0, 0x1c6be, 0x1c6ce, 0x1c6dc, 0x1c6e2, + 0x1c6e4, 0x1c6e8, 0x1c712, 0x1c714, 0x1c722, 0x1c728, 0x1c736, 0x1c742, 0x1c744, 0x1c748, 0x1c750, 0x1c75e, + 0x1c766, 0x1c76c, 0x1c77a, 0x1c7ae, 0x1c7d6, 0x1c7ea, 0x1c81a, 0x1c82e, 0x1c832, 0x1c834, 0x1c84e, 0x1c85c, + 0x1c862, 0x1c864, 0x1c868, 0x1c876, 0x1c88e, 0x1c89c, 0x1c8b8, 0x1c8c2, 0x1c8c8, 0x1c8d0, 0x1c8de, 0x1c8e6, + 0x1c8ec, 0x1c8fa, 0x1c90e, 0x1c938, 0x1c970, 0x1c97e, 0x1c982, 0x1c984, 0x1c990, 0x1c99e, 0x1c9a0, 0x1c9bc, + 0x1c9c6, 0x1c9cc, 0x1c9d8, 0x1c9ee, 0x1c9f2, 0x1c9f4, 0x1ca38, 0x1ca70, 0x1ca7e, 0x1cae0, 0x1cafc, 0x1cb02, + 0x1cb04, 0x1cb08, 0x1cb10, 0x1cb20, 0x1cb3c, 0x1cb40, 0x1cb78, 0x1cb86, 0x1cb8c, 0x1cb98, 0x1cbb0, 0x1cbbe, + 0x1cbce, 0x1cbdc, 0x1cbe2, 0x1cbe4, 0x1cbe8, 0x1cbf6, 0x1cc16, 0x1cc26, 0x1cc2c, 0x1cc3a, 0x1cc46, 0x1cc58, + 0x1cc72, 0x1cc74, 0x1cc86, 0x1ccb0, 0x1ccbe, 0x1ccce, 0x1cce2, 0x1cce4, 0x1cce8, 0x1cd06, 0x1cd0c, 0x1cd18, + 0x1cd30, 0x1cd3e, 0x1cd60, 0x1cd7c, 0x1cd9c, 0x1cdc2, 0x1cdc4, 0x1cdc8, 0x1cdd0, 0x1cdde, 0x1cde6, 0x1cdfa, + 0x1ce22, 0x1ce28, 0x1ce42, 0x1ce50, 0x1ce5e, 0x1ce66, 0x1ce7a, 0x1ce82, 0x1ce84, 0x1ce88, 0x1ce90, 0x1ce9e, + 0x1cea0, 0x1cebc, 0x1cecc, 0x1cef2, 0x1cef4, 0x1cf2e, 0x1cf32, 0x1cf34, 0x1cf4e, 0x1cf5c, 0x1cf62, 0x1cf64, + 0x1cf68, 0x1cf96, 0x1cfa6, 0x1cfac, 0x1cfca, 0x1cfd2, 0x1cfd4, 0x1d02e, 0x1d032, 0x1d034, 0x1d04e, 0x1d05c, + 0x1d062, 0x1d064, 0x1d068, 0x1d076, 0x1d08e, 0x1d09c, 0x1d0b8, 0x1d0c2, 0x1d0c4, 0x1d0c8, 0x1d0d0, 0x1d0de, + 0x1d0e6, 0x1d0ec, 0x1d0fa, 0x1d11c, 0x1d138, 0x1d170, 0x1d17e, 0x1d182, 0x1d184, 0x1d188, 0x1d190, 0x1d19e, + 0x1d1a0, 0x1d1bc, 0x1d1c6, 0x1d1cc, 0x1d1d8, 0x1d1ee, 0x1d1f2, 0x1d1f4, 0x1d21c, 0x1d238, 0x1d270, 0x1d27e, + 0x1d2e0, 0x1d2fc, 0x1d302, 0x1d304, 0x1d308, 0x1d310, 0x1d31e, 0x1d320, 0x1d33c, 0x1d340, 0x1d378, 0x1d386, + 0x1d38c, 0x1d398, 0x1d3b0, 0x1d3be, 0x1d3ce, 0x1d3dc, 0x1d3e2, 0x1d3e4, 0x1d3e8, 0x1d3f6, 0x1d470, 0x1d47e, + 0x1d4e0, 0x1d4fc, 0x1d5c0, 0x1d5f8, 0x1d604, 0x1d608, 0x1d610, 0x1d620, 0x1d640, 0x1d678, 0x1d6f0, 0x1d706, + 0x1d70c, 0x1d718, 0x1d730, 0x1d73e, 0x1d760, 0x1d77c, 0x1d78e, 0x1d79c, 0x1d7b8, 0x1d7c2, 0x1d7c4, 0x1d7c8, + 0x1d7d0, 0x1d7de, 0x1d7e6, 0x1d7ec, 0x1d826, 0x1d82c, 0x1d83a, 0x1d846, 0x1d84c, 0x1d858, 0x1d872, 0x1d874, + 0x1d886, 0x1d88c, 0x1d898, 0x1d8b0, 0x1d8be, 0x1d8ce, 0x1d8e2, 0x1d8e4, 0x1d8e8, 0x1d8f6, 0x1d90c, 0x1d918, + 0x1d930, 0x1d93e, 0x1d960, 0x1d97c, 0x1d99c, 0x1d9c2, 0x1d9c4, 0x1d9c8, 0x1d9d0, 0x1d9e6, 0x1d9fa, 0x1da0c, + 0x1da18, 0x1da30, 0x1da3e, 0x1da60, 0x1da7c, 0x1dac0, 0x1daf8, 0x1db38, 0x1db82, 0x1db84, 0x1db88, 0x1db90, + 0x1db9e, 0x1dba0, 0x1dbcc, 0x1dbf2, 0x1dbf4, 0x1dc22, 0x1dc42, 0x1dc44, 0x1dc48, 0x1dc50, 0x1dc5e, 0x1dc66, + 0x1dc7a, 0x1dc82, 0x1dc84, 0x1dc88, 0x1dc90, 0x1dc9e, 0x1dca0, 0x1dcbc, 0x1dccc, 0x1dcf2, 0x1dcf4, 0x1dd04, + 0x1dd08, 0x1dd10, 0x1dd1e, 0x1dd20, 0x1dd3c, 0x1dd40, 0x1dd78, 0x1dd86, 0x1dd98, 0x1ddce, 0x1dde2, 0x1dde4, + 0x1dde8, 0x1de2e, 0x1de32, 0x1de34, 0x1de4e, 0x1de5c, 0x1de62, 0x1de64, 0x1de68, 0x1de8e, 0x1de9c, 0x1deb8, + 0x1dec2, 0x1dec4, 0x1dec8, 0x1ded0, 0x1dee6, 0x1defa, 0x1df16, 0x1df26, 0x1df2c, 0x1df46, 0x1df4c, 0x1df58, + 0x1df72, 0x1df74, 0x1df8a, 0x1df92, 0x1df94, 0x1dfa2, 0x1dfa4, 0x1dfa8, 0x1e08a, 0x1e092, 0x1e094, 0x1e0a2, + 0x1e0a4, 0x1e0a8, 0x1e0b6, 0x1e0da, 0x1e10a, 0x1e112, 0x1e114, 0x1e122, 0x1e124, 0x1e128, 0x1e136, 0x1e142, + 0x1e144, 0x1e148, 0x1e150, 0x1e166, 0x1e16c, 0x1e17a, 0x1e19a, 0x1e1b2, 0x1e1b4, 0x1e20a, 0x1e212, 0x1e214, + 0x1e222, 0x1e224, 0x1e228, 0x1e236, 0x1e242, 0x1e248, 0x1e250, 0x1e25e, 0x1e266, 0x1e26c, 0x1e27a, 0x1e282, + 0x1e284, 0x1e288, 0x1e290, 0x1e2a0, 0x1e2bc, 0x1e2c6, 0x1e2cc, 0x1e2d8, 0x1e2ee, 0x1e2f2, 0x1e2f4, 0x1e31a, + 0x1e332, 0x1e334, 0x1e35c, 0x1e362, 0x1e364, 0x1e368, 0x1e3ba, 0x1e40a, 0x1e412, 0x1e414, 0x1e422, 0x1e428, + 0x1e436, 0x1e442, 0x1e448, 0x1e450, 0x1e45e, 0x1e466, 0x1e46c, 0x1e47a, 0x1e482, 0x1e484, 0x1e490, 0x1e49e, + 0x1e4a0, 0x1e4bc, 0x1e4c6, 0x1e4cc, 0x1e4d8, 0x1e4ee, 0x1e4f2, 0x1e4f4, 0x1e502, 0x1e504, 0x1e508, 0x1e510, + 0x1e51e, 0x1e520, 0x1e53c, 0x1e540, 0x1e578, 0x1e586, 0x1e58c, 0x1e598, 0x1e5b0, 0x1e5be, 0x1e5ce, 0x1e5dc, + 0x1e5e2, 0x1e5e4, 0x1e5e8, 0x1e5f6, 0x1e61a, 0x1e62e, 0x1e632, 0x1e634, 0x1e64e, 0x1e65c, 0x1e662, 0x1e668, + 0x1e68e, 0x1e69c, 0x1e6b8, 0x1e6c2, 0x1e6c4, 0x1e6c8, 0x1e6d0, 0x1e6e6, 0x1e6fa, 0x1e716, 0x1e726, 0x1e72c, + 0x1e73a, 0x1e746, 0x1e74c, 0x1e758, 0x1e772, 0x1e774, 0x1e792, 0x1e794, 0x1e7a2, 0x1e7a4, 0x1e7a8, 0x1e7b6, + 0x1e812, 0x1e814, 0x1e822, 0x1e824, 0x1e828, 0x1e836, 0x1e842, 0x1e844, 0x1e848, 0x1e850, 0x1e85e, 0x1e866, + 0x1e86c, 0x1e87a, 0x1e882, 0x1e884, 0x1e888, 0x1e890, 0x1e89e, 0x1e8a0, 0x1e8bc, 0x1e8c6, 0x1e8cc, 0x1e8d8, + 0x1e8ee, 0x1e8f2, 0x1e8f4, 0x1e902, 0x1e904, 0x1e908, 0x1e910, 0x1e920, 0x1e93c, 0x1e940, 0x1e978, 0x1e986, + 0x1e98c, 0x1e998, 0x1e9b0, 0x1e9be, 0x1e9ce, 0x1e9dc, 0x1e9e2, 0x1e9e4, 0x1e9e8, 0x1e9f6, 0x1ea04, 0x1ea08, + 0x1ea10, 0x1ea20, 0x1ea40, 0x1ea78, 0x1eaf0, 0x1eb06, 0x1eb0c, 0x1eb18, 0x1eb30, 0x1eb3e, 0x1eb60, 0x1eb7c, + 0x1eb8e, 0x1eb9c, 0x1ebb8, 0x1ebc2, 0x1ebc4, 0x1ebc8, 0x1ebd0, 0x1ebde, 0x1ebe6, 0x1ebec, 0x1ec1a, 0x1ec2e, + 0x1ec32, 0x1ec34, 0x1ec4e, 0x1ec5c, 0x1ec62, 0x1ec64, 0x1ec68, 0x1ec8e, 0x1ec9c, 0x1ecb8, 0x1ecc2, 0x1ecc4, + 0x1ecc8, 0x1ecd0, 0x1ece6, 0x1ecfa, 0x1ed0e, 0x1ed1c, 0x1ed38, 0x1ed70, 0x1ed7e, 0x1ed82, 0x1ed84, 0x1ed88, + 0x1ed90, 0x1ed9e, 0x1eda0, 0x1edcc, 0x1edf2, 0x1edf4, 0x1ee16, 0x1ee26, 0x1ee2c, 0x1ee3a, 0x1ee46, 0x1ee4c, + 0x1ee58, 0x1ee6e, 0x1ee72, 0x1ee74, 0x1ee86, 0x1ee8c, 0x1ee98, 0x1eeb0, 0x1eebe, 0x1eece, 0x1eedc, 0x1eee2, + 0x1eee4, 0x1eee8, 0x1ef12, 0x1ef22, 0x1ef24, 0x1ef28, 0x1ef36, 0x1ef42, 0x1ef44, 0x1ef48, 0x1ef50, 0x1ef5e, + 0x1ef66, 0x1ef6c, 0x1ef7a, 0x1efae, 0x1efb2, 0x1efb4, 0x1efd6, 0x1f096, 0x1f0a6, 0x1f0ac, 0x1f0ba, 0x1f0ca, + 0x1f0d2, 0x1f0d4, 0x1f116, 0x1f126, 0x1f12c, 0x1f13a, 0x1f146, 0x1f14c, 0x1f158, 0x1f16e, 0x1f172, 0x1f174, + 0x1f18a, 0x1f192, 0x1f194, 0x1f1a2, 0x1f1a4, 0x1f1a8, 0x1f1da, 0x1f216, 0x1f226, 0x1f22c, 0x1f23a, 0x1f246, + 0x1f258, 0x1f26e, 0x1f272, 0x1f274, 0x1f286, 0x1f28c, 0x1f298, 0x1f2b0, 0x1f2be, 0x1f2ce, 0x1f2dc, 0x1f2e2, + 0x1f2e4, 0x1f2e8, 0x1f2f6, 0x1f30a, 0x1f312, 0x1f314, 0x1f322, 0x1f328, 0x1f342, 0x1f344, 0x1f348, 0x1f350, + 0x1f35e, 0x1f366, 0x1f37a, 0x1f39a, 0x1f3ae, 0x1f3b2, 0x1f3b4, 0x1f416, 0x1f426, 0x1f42c, 0x1f43a, 0x1f446, + 0x1f44c, 0x1f458, 0x1f46e, 0x1f472, 0x1f474, 0x1f486, 0x1f48c, 0x1f498, 0x1f4b0, 0x1f4be, 0x1f4ce, 0x1f4dc, + 0x1f4e2, 0x1f4e4, 0x1f4e8, 0x1f4f6, 0x1f506, 0x1f50c, 0x1f518, 0x1f530, 0x1f53e, 0x1f560, 0x1f57c, 0x1f58e, + 0x1f59c, 0x1f5b8, 0x1f5c2, 0x1f5c4, 0x1f5c8, 0x1f5d0, 0x1f5de, 0x1f5e6, 0x1f5ec, 0x1f5fa, 0x1f60a, 0x1f612, + 0x1f614, 0x1f622, 0x1f624, 0x1f628, 0x1f636, 0x1f642, 0x1f644, 0x1f648, 0x1f650, 0x1f65e, 0x1f666, 0x1f67a, + 0x1f682, 0x1f684, 0x1f688, 0x1f690, 0x1f69e, 0x1f6a0, 0x1f6bc, 0x1f6cc, 0x1f6f2, 0x1f6f4, 0x1f71a, 0x1f72e, + 0x1f732, 0x1f734, 0x1f74e, 0x1f75c, 0x1f762, 0x1f764, 0x1f768, 0x1f776, 0x1f796, 0x1f7a6, 0x1f7ac, 0x1f7ba, + 0x1f7d2, 0x1f7d4, 0x1f89a, 0x1f8ae, 0x1f8b2, 0x1f8b4, 0x1f8d6, 0x1f8ea, 0x1f91a, 0x1f92e, 0x1f932, 0x1f934, + 0x1f94e, 0x1f95c, 0x1f962, 0x1f964, 0x1f968, 0x1f976, 0x1f996, 0x1f9a6, 0x1f9ac, 0x1f9ba, 0x1f9ca, 0x1f9d2, + 0x1f9d4, 0x1fa1a, 0x1fa2e, 0x1fa32, 0x1fa34, 0x1fa4e, 0x1fa5c, 0x1fa62, 0x1fa64, 0x1fa68, 0x1fa76, 0x1fa8e, + 0x1fa9c, 0x1fab8, 0x1fac2, 0x1fac4, 0x1fac8, 0x1fad0, 0x1fade, 0x1fae6, 0x1faec, 0x1fb16, 0x1fb26, 0x1fb2c, + 0x1fb3a, 0x1fb46, 0x1fb4c, 0x1fb58, 0x1fb6e, 0x1fb72, 0x1fb74, 0x1fb8a, 0x1fb92, 0x1fb94, 0x1fba2, 0x1fba4, + 0x1fba8, 0x1fbb6, 0x1fbda}; + +/** + * This table contains to codewords for all symbols. + */ +const int ZX_PDF417_COMMON_CODEWORD_TABLE[] = { + 2627, 1819, 2622, 2621, 1813, 1812, 2729, 2724, 2723, 2779, 2774, 2773, 902, 896, 908, 868, 865, 861, 859, 2511, + 873, 871, 1780, 835, 2493, 825, 2491, 842, 837, 844, 1764, 1762, 811, 810, 809, 2483, 807, 2482, 806, 2480, 815, + 814, 813, 812, 2484, 817, 816, 1745, 1744, 1742, 1746, 2655, 2637, 2635, 2626, 2625, 2623, 2628, 1820, 2752, + 2739, 2737, 2728, 2727, 2725, 2730, 2785, 2783, 2778, 2777, 2775, 2780, 787, 781, 747, 739, 736, 2413, 754, 752, + 1719, 692, 689, 681, 2371, 678, 2369, 700, 697, 694, 703, 1688, 1686, 642, 638, 2343, 631, 2341, 627, 2338, 651, + 646, 643, 2345, 654, 652, 1652, 1650, 1647, 1654, 601, 599, 2322, 596, 2321, 594, 2319, 2317, 611, 610, 608, 606, + 2324, 603, 2323, 615, 614, 612, 1617, 1616, 1614, 1612, 616, 1619, 1618, 2575, 2538, 2536, 905, 901, 898, 909, + 2509, 2507, 2504, 870, 867, 864, 860, 2512, 875, 872, 1781, 2490, 2489, 2487, 2485, 1748, 836, 834, 832, 830, + 2494, 827, 2492, 843, 841, 839, 845, 1765, 1763, 2701, 2676, 2674, 2653, 2648, 2656, 2634, 2633, 2631, 2629, + 1821, 2638, 2636, 2770, 2763, 2761, 2750, 2745, 2753, 2736, 2735, 2733, 2731, 1848, 2740, 2738, 2786, 2784, 591, + 588, 576, 569, 566, 2296, 1590, 537, 534, 526, 2276, 522, 2274, 545, 542, 539, 548, 1572, 1570, 481, 2245, 466, + 2242, 462, 2239, 492, 485, 482, 2249, 496, 494, 1534, 1531, 1528, 1538, 413, 2196, 406, 2191, 2188, 425, 419, + 2202, 415, 2199, 432, 430, 427, 1472, 1467, 1464, 433, 1476, 1474, 368, 367, 2160, 365, 2159, 362, 2157, 2155, + 2152, 378, 377, 375, 2166, 372, 2165, 369, 2162, 383, 381, 379, 2168, 1419, 1418, 1416, 1414, 385, 1411, 384, + 1423, 1422, 1420, 1424, 2461, 802, 2441, 2439, 790, 786, 783, 794, 2409, 2406, 2403, 750, 742, 738, 2414, 756, + 753, 1720, 2367, 2365, 2362, 2359, 1663, 693, 691, 684, 2373, 680, 2370, 702, 699, 696, 704, 1690, 1687, 2337, + 2336, 2334, 2332, 1624, 2329, 1622, 640, 637, 2344, 634, 2342, 630, 2340, 650, 648, 645, 2346, 655, 653, 1653, + 1651, 1649, 1655, 2612, 2597, 2595, 2571, 2568, 2565, 2576, 2534, 2529, 2526, 1787, 2540, 2537, 907, 904, 900, + 910, 2503, 2502, 2500, 2498, 1768, 2495, 1767, 2510, 2508, 2506, 869, 866, 863, 2513, 876, 874, 1782, 2720, 2713, + 2711, 2697, 2694, 2691, 2702, 2672, 2670, 2664, 1828, 2678, 2675, 2647, 2646, 2644, 2642, 1823, 2639, 1822, 2654, + 2652, 2650, 2657, 2771, 1855, 2765, 2762, 1850, 1849, 2751, 2749, 2747, 2754, 353, 2148, 344, 342, 336, 2142, + 332, 2140, 345, 1375, 1373, 306, 2130, 299, 2128, 295, 2125, 319, 314, 311, 2132, 1354, 1352, 1349, 1356, 262, + 257, 2101, 253, 2096, 2093, 274, 273, 267, 2107, 263, 2104, 280, 278, 275, 1316, 1311, 1308, 1320, 1318, 2052, + 202, 2050, 2044, 2040, 219, 2063, 212, 2060, 208, 2055, 224, 221, 2066, 1260, 1258, 1252, 231, 1248, 229, 1266, + 1264, 1261, 1268, 155, 1998, 153, 1996, 1994, 1991, 1988, 165, 164, 2007, 162, 2006, 159, 2003, 2000, 172, 171, + 169, 2012, 166, 2010, 1186, 1184, 1182, 1179, 175, 1176, 173, 1192, 1191, 1189, 1187, 176, 1194, 1193, 2313, + 2307, 2305, 592, 589, 2294, 2292, 2289, 578, 572, 568, 2297, 580, 1591, 2272, 2267, 2264, 1547, 538, 536, 529, + 2278, 525, 2275, 547, 544, 541, 1574, 1571, 2237, 2235, 2229, 1493, 2225, 1489, 478, 2247, 470, 2244, 465, 2241, + 493, 488, 484, 2250, 498, 495, 1536, 1533, 1530, 1539, 2187, 2186, 2184, 2182, 1432, 2179, 1430, 2176, 1427, 414, + 412, 2197, 409, 2195, 405, 2193, 2190, 426, 424, 421, 2203, 418, 2201, 431, 429, 1473, 1471, 1469, 1466, 434, + 1477, 1475, 2478, 2472, 2470, 2459, 2457, 2454, 2462, 803, 2437, 2432, 2429, 1726, 2443, 2440, 792, 789, 785, + 2401, 2399, 2393, 1702, 2389, 1699, 2411, 2408, 2405, 745, 741, 2415, 758, 755, 1721, 2358, 2357, 2355, 2353, + 1661, 2350, 1660, 2347, 1657, 2368, 2366, 2364, 2361, 1666, 690, 687, 2374, 683, 2372, 701, 698, 705, 1691, 1689, + 2619, 2617, 2610, 2608, 2605, 2613, 2593, 2588, 2585, 1803, 2599, 2596, 2563, 2561, 2555, 1797, 2551, 1795, 2573, + 2570, 2567, 2577, 2525, 2524, 2522, 2520, 1786, 2517, 1785, 2514, 1783, 2535, 2533, 2531, 2528, 1788, 2541, 2539, + 906, 903, 911, 2721, 1844, 2715, 2712, 1838, 1836, 2699, 2696, 2693, 2703, 1827, 1826, 1824, 2673, 2671, 2669, + 2666, 1829, 2679, 2677, 1858, 1857, 2772, 1854, 1853, 1851, 1856, 2766, 2764, 143, 1987, 139, 1986, 135, 133, + 131, 1984, 128, 1983, 125, 1981, 138, 137, 136, 1985, 1133, 1132, 1130, 112, 110, 1974, 107, 1973, 104, 1971, + 1969, 122, 121, 119, 117, 1977, 114, 1976, 124, 1115, 1114, 1112, 1110, 1117, 1116, 84, 83, 1953, 81, 1952, 78, + 1950, 1948, 1945, 94, 93, 91, 1959, 88, 1958, 85, 1955, 99, 97, 95, 1961, 1086, 1085, 1083, 1081, 1078, 100, + 1090, 1089, 1087, 1091, 49, 47, 1917, 44, 1915, 1913, 1910, 1907, 59, 1926, 56, 1925, 53, 1922, 1919, 66, 64, + 1931, 61, 1929, 1042, 1040, 1038, 71, 1035, 70, 1032, 68, 1048, 1047, 1045, 1043, 1050, 1049, 12, 10, 1869, 1867, + 1864, 1861, 21, 1880, 19, 1877, 1874, 1871, 28, 1888, 25, 1886, 22, 1883, 982, 980, 977, 974, 32, 30, 991, 989, + 987, 984, 34, 995, 994, 992, 2151, 2150, 2147, 2146, 2144, 356, 355, 354, 2149, 2139, 2138, 2136, 2134, 1359, + 343, 341, 338, 2143, 335, 2141, 348, 347, 346, 1376, 1374, 2124, 2123, 2121, 2119, 1326, 2116, 1324, 310, 308, + 305, 2131, 302, 2129, 298, 2127, 320, 318, 316, 313, 2133, 322, 321, 1355, 1353, 1351, 1357, 2092, 2091, 2089, + 2087, 1276, 2084, 1274, 2081, 1271, 259, 2102, 256, 2100, 252, 2098, 2095, 272, 269, 2108, 266, 2106, 281, 279, + 277, 1317, 1315, 1313, 1310, 282, 1321, 1319, 2039, 2037, 2035, 2032, 1203, 2029, 1200, 1197, 207, 2053, 205, + 2051, 201, 2049, 2046, 2043, 220, 218, 2064, 215, 2062, 211, 2059, 228, 226, 223, 2069, 1259, 1257, 1254, 232, + 1251, 230, 1267, 1265, 1263, 2316, 2315, 2312, 2311, 2309, 2314, 2304, 2303, 2301, 2299, 1593, 2308, 2306, 590, + 2288, 2287, 2285, 2283, 1578, 2280, 1577, 2295, 2293, 2291, 579, 577, 574, 571, 2298, 582, 581, 1592, 2263, 2262, + 2260, 2258, 1545, 2255, 1544, 2252, 1541, 2273, 2271, 2269, 2266, 1550, 535, 532, 2279, 528, 2277, 546, 543, 549, + 1575, 1573, 2224, 2222, 2220, 1486, 2217, 1485, 2214, 1482, 1479, 2238, 2236, 2234, 2231, 1496, 2228, 1492, 480, + 477, 2248, 473, 2246, 469, 2243, 490, 487, 2251, 497, 1537, 1535, 1532, 2477, 2476, 2474, 2479, 2469, 2468, 2466, + 2464, 1730, 2473, 2471, 2453, 2452, 2450, 2448, 1729, 2445, 1728, 2460, 2458, 2456, 2463, 805, 804, 2428, 2427, + 2425, 2423, 1725, 2420, 1724, 2417, 1722, 2438, 2436, 2434, 2431, 1727, 2444, 2442, 793, 791, 788, 795, 2388, + 2386, 2384, 1697, 2381, 1696, 2378, 1694, 1692, 2402, 2400, 2398, 2395, 1703, 2392, 1701, 2412, 2410, 2407, 751, + 748, 744, 2416, 759, 757, 1807, 2620, 2618, 1806, 1805, 2611, 2609, 2607, 2614, 1802, 1801, 1799, 2594, 2592, + 2590, 2587, 1804, 2600, 2598, 1794, 1793, 1791, 1789, 2564, 2562, 2560, 2557, 1798, 2554, 1796, 2574, 2572, 2569, + 2578, 1847, 1846, 2722, 1843, 1842, 1840, 1845, 2716, 2714, 1835, 1834, 1832, 1830, 1839, 1837, 2700, 2698, 2695, + 2704, 1817, 1811, 1810, 897, 862, 1777, 829, 826, 838, 1760, 1758, 808, 2481, 1741, 1740, 1738, 1743, 2624, 1818, + 2726, 2776, 782, 740, 737, 1715, 686, 679, 695, 1682, 1680, 639, 628, 2339, 647, 644, 1645, 1643, 1640, 1648, + 602, 600, 597, 595, 2320, 593, 2318, 609, 607, 604, 1611, 1610, 1608, 1606, 613, 1615, 1613, 2328, 926, 924, 892, + 886, 899, 857, 850, 2505, 1778, 824, 823, 821, 819, 2488, 818, 2486, 833, 831, 828, 840, 1761, 1759, 2649, 2632, + 2630, 2746, 2734, 2732, 2782, 2781, 570, 567, 1587, 531, 527, 523, 540, 1566, 1564, 476, 467, 463, 2240, 486, + 483, 1524, 1521, 1518, 1529, 411, 403, 2192, 399, 2189, 423, 416, 1462, 1457, 1454, 428, 1468, 1465, 2210, 366, + 363, 2158, 360, 2156, 357, 2153, 376, 373, 370, 2163, 1410, 1409, 1407, 1405, 382, 1402, 380, 1417, 1415, 1412, + 1421, 2175, 2174, 777, 774, 771, 784, 732, 725, 722, 2404, 743, 1716, 676, 674, 668, 2363, 665, 2360, 685, 1684, + 1681, 626, 624, 622, 2335, 620, 2333, 617, 2330, 641, 635, 649, 1646, 1644, 1642, 2566, 928, 925, 2530, 2527, + 894, 891, 888, 2501, 2499, 2496, 858, 856, 854, 851, 1779, 2692, 2668, 2665, 2645, 2643, 2640, 2651, 2768, 2759, + 2757, 2744, 2743, 2741, 2748, 352, 1382, 340, 337, 333, 1371, 1369, 307, 300, 296, 2126, 315, 312, 1347, 1342, + 1350, 261, 258, 250, 2097, 246, 2094, 271, 268, 264, 1306, 1301, 1298, 276, 1312, 1309, 2115, 203, 2048, 195, + 2045, 191, 2041, 213, 209, 2056, 1246, 1244, 1238, 225, 1234, 222, 1256, 1253, 1249, 1262, 2080, 2079, 154, 1997, + 150, 1995, 147, 1992, 1989, 163, 160, 2004, 156, 2001, 1175, 1174, 1172, 1170, 1167, 170, 1164, 167, 1185, 1183, + 1180, 1177, 174, 1190, 1188, 2025, 2024, 2022, 587, 586, 564, 559, 556, 2290, 573, 1588, 520, 518, 512, 2268, + 508, 2265, 530, 1568, 1565, 461, 457, 2233, 450, 2230, 446, 2226, 479, 471, 489, 1526, 1523, 1520, 397, 395, + 2185, 392, 2183, 389, 2180, 2177, 410, 2194, 402, 422, 1463, 1461, 1459, 1456, 1470, 2455, 799, 2433, 2430, 779, + 776, 773, 2397, 2394, 2390, 734, 728, 724, 746, 1717, 2356, 2354, 2351, 2348, 1658, 677, 675, 673, 670, 667, 688, + 1685, 1683, 2606, 2589, 2586, 2559, 2556, 2552, 927, 2523, 2521, 2518, 2515, 1784, 2532, 895, 893, 890, 2718, + 2709, 2707, 2689, 2687, 2684, 2663, 2662, 2660, 2658, 1825, 2667, 2769, 1852, 2760, 2758, 142, 141, 1139, 1138, + 134, 132, 129, 126, 1982, 1129, 1128, 1126, 1131, 113, 111, 108, 105, 1972, 101, 1970, 120, 118, 115, 1109, 1108, + 1106, 1104, 123, 1113, 1111, 82, 79, 1951, 75, 1949, 72, 1946, 92, 89, 86, 1956, 1077, 1076, 1074, 1072, 98, + 1069, 96, 1084, 1082, 1079, 1088, 1968, 1967, 48, 45, 1916, 42, 1914, 39, 1911, 1908, 60, 57, 54, 1923, 50, 1920, + 1031, 1030, 1028, 1026, 67, 1023, 65, 1020, 62, 1041, 1039, 1036, 1033, 69, 1046, 1044, 1944, 1943, 1941, 11, 9, + 1868, 7, 1865, 1862, 1859, 20, 1878, 16, 1875, 13, 1872, 970, 968, 966, 963, 29, 960, 26, 23, 983, 981, 978, 975, + 33, 971, 31, 990, 988, 985, 1906, 1904, 1902, 993, 351, 2145, 1383, 331, 330, 328, 326, 2137, 323, 2135, 339, + 1372, 1370, 294, 293, 291, 289, 2122, 286, 2120, 283, 2117, 309, 303, 317, 1348, 1346, 1344, 245, 244, 242, 2090, + 239, 2088, 236, 2085, 2082, 260, 2099, 249, 270, 1307, 1305, 1303, 1300, 1314, 189, 2038, 186, 2036, 183, 2033, + 2030, 2026, 206, 198, 2047, 194, 216, 1247, 1245, 1243, 1240, 227, 1237, 1255, 2310, 2302, 2300, 2286, 2284, + 2281, 565, 563, 561, 558, 575, 1589, 2261, 2259, 2256, 2253, 1542, 521, 519, 517, 514, 2270, 511, 533, 1569, + 1567, 2223, 2221, 2218, 2215, 1483, 2211, 1480, 459, 456, 453, 2232, 449, 474, 491, 1527, 1525, 1522, 2475, 2467, + 2465, 2451, 2449, 2446, 801, 800, 2426, 2424, 2421, 2418, 1723, 2435, 780, 778, 775, 2387, 2385, 2382, 2379, + 1695, 2375, 1693, 2396, 735, 733, 730, 727, 749, 1718, 2616, 2615, 2604, 2603, 2601, 2584, 2583, 2581, 2579, + 1800, 2591, 2550, 2549, 2547, 2545, 1792, 2542, 1790, 2558, 929, 2719, 1841, 2710, 2708, 1833, 1831, 2690, 2688, + 2686, 1815, 1809, 1808, 1774, 1756, 1754, 1737, 1736, 1734, 1739, 1816, 1711, 1676, 1674, 633, 629, 1638, 1636, + 1633, 1641, 598, 1605, 1604, 1602, 1600, 605, 1609, 1607, 2327, 887, 853, 1775, 822, 820, 1757, 1755, 1584, 524, + 1560, 1558, 468, 464, 1514, 1511, 1508, 1519, 408, 404, 400, 1452, 1447, 1444, 417, 1458, 1455, 2208, 364, 361, + 358, 2154, 1401, 1400, 1398, 1396, 374, 1393, 371, 1408, 1406, 1403, 1413, 2173, 2172, 772, 726, 723, 1712, 672, + 669, 666, 682, 1678, 1675, 625, 623, 621, 618, 2331, 636, 632, 1639, 1637, 1635, 920, 918, 884, 880, 889, 849, + 848, 847, 846, 2497, 855, 852, 1776, 2641, 2742, 2787, 1380, 334, 1367, 1365, 301, 297, 1340, 1338, 1335, 1343, + 255, 251, 247, 1296, 1291, 1288, 265, 1302, 1299, 2113, 204, 196, 192, 2042, 1232, 1230, 1224, 214, 1220, 210, + 1242, 1239, 1235, 1250, 2077, 2075, 151, 148, 1993, 144, 1990, 1163, 1162, 1160, 1158, 1155, 161, 1152, 157, + 1173, 1171, 1168, 1165, 168, 1181, 1178, 2021, 2020, 2018, 2023, 585, 560, 557, 1585, 516, 509, 1562, 1559, 458, + 447, 2227, 472, 1516, 1513, 1510, 398, 396, 393, 390, 2181, 386, 2178, 407, 1453, 1451, 1449, 1446, 420, 1460, + 2209, 769, 764, 720, 712, 2391, 729, 1713, 664, 663, 661, 659, 2352, 656, 2349, 671, 1679, 1677, 2553, 922, 919, + 2519, 2516, 885, 883, 881, 2685, 2661, 2659, 2767, 2756, 2755, 140, 1137, 1136, 130, 127, 1125, 1124, 1122, 1127, + 109, 106, 102, 1103, 1102, 1100, 1098, 116, 1107, 1105, 1980, 80, 76, 73, 1947, 1068, 1067, 1065, 1063, 90, 1060, + 87, 1075, 1073, 1070, 1080, 1966, 1965, 46, 43, 40, 1912, 36, 1909, 1019, 1018, 1016, 1014, 58, 1011, 55, 1008, + 51, 1029, 1027, 1024, 1021, 63, 1037, 1034, 1940, 1939, 1937, 1942, 8, 1866, 4, 1863, 1, 1860, 956, 954, 952, + 949, 946, 17, 14, 969, 967, 964, 961, 27, 957, 24, 979, 976, 972, 1901, 1900, 1898, 1896, 986, 1905, 1903, 350, + 349, 1381, 329, 327, 324, 1368, 1366, 292, 290, 287, 284, 2118, 304, 1341, 1339, 1337, 1345, 243, 240, 237, 2086, + 233, 2083, 254, 1297, 1295, 1293, 1290, 1304, 2114, 190, 187, 184, 2034, 180, 2031, 177, 2027, 199, 1233, 1231, + 1229, 1226, 217, 1223, 1241, 2078, 2076, 584, 555, 554, 552, 550, 2282, 562, 1586, 507, 506, 504, 502, 2257, 499, + 2254, 515, 1563, 1561, 445, 443, 441, 2219, 438, 2216, 435, 2212, 460, 454, 475, 1517, 1515, 1512, 2447, 798, + 797, 2422, 2419, 770, 768, 766, 2383, 2380, 2376, 721, 719, 717, 714, 731, 1714, 2602, 2582, 2580, 2548, 2546, + 2543, 923, 921, 2717, 2706, 2705, 2683, 2682, 2680, 1771, 1752, 1750, 1733, 1732, 1731, 1735, 1814, 1707, 1670, + 1668, 1631, 1629, 1626, 1634, 1599, 1598, 1596, 1594, 1603, 1601, 2326, 1772, 1753, 1751, 1581, 1554, 1552, 1504, + 1501, 1498, 1509, 1442, 1437, 1434, 401, 1448, 1445, 2206, 1392, 1391, 1389, 1387, 1384, 359, 1399, 1397, 1394, + 1404, 2171, 2170, 1708, 1672, 1669, 619, 1632, 1630, 1628, 1773, 1378, 1363, 1361, 1333, 1328, 1336, 1286, 1281, + 1278, 248, 1292, 1289, 2111, 1218, 1216, 1210, 197, 1206, 193, 1228, 1225, 1221, 1236, 2073, 2071, 1151, 1150, + 1148, 1146, 152, 1143, 149, 1140, 145, 1161, 1159, 1156, 1153, 158, 1169, 1166, 2017, 2016, 2014, 2019, 1582, + 510, 1556, 1553, 452, 448, 1506, 1500, 394, 391, 387, 1443, 1441, 1439, 1436, 1450, 2207, 765, 716, 713, 1709, + 662, 660, 657, 1673, 1671, 916, 914, 879, 878, 877, 882, 1135, 1134, 1121, 1120, 1118, 1123, 1097, 1096, 1094, + 1092, 103, 1101, 1099, 1979, 1059, 1058, 1056, 1054, 77, 1051, 74, 1066, 1064, 1061, 1071, 1964, 1963, 1007, + 1006, 1004, 1002, 999, 41, 996, 37, 1017, 1015, 1012, 1009, 52, 1025, 1022, 1936, 1935, 1933, 1938, 942, 940, + 938, 935, 932, 5, 2, 955, 953, 950, 947, 18, 943, 15, 965, 962, 958, 1895, 1894, 1892, 1890, 973, 1899, 1897, + 1379, 325, 1364, 1362, 288, 285, 1334, 1332, 1330, 241, 238, 234, 1287, 1285, 1283, 1280, 1294, 2112, 188, 185, + 181, 178, 2028, 1219, 1217, 1215, 1212, 200, 1209, 1227, 2074, 2072, 583, 553, 551, 1583, 505, 503, 500, 513, + 1557, 1555, 444, 442, 439, 436, 2213, 455, 451, 1507, 1505, 1502, 796, 763, 762, 760, 767, 711, 710, 708, 706, + 2377, 718, 715, 1710, 2544, 917, 915, 2681, 1627, 1597, 1595, 2325, 1769, 1749, 1747, 1499, 1438, 1435, 2204, + 1390, 1388, 1385, 1395, 2169, 2167, 1704, 1665, 1662, 1625, 1623, 1620, 1770, 1329, 1282, 1279, 2109, 1214, 1207, + 1222, 2068, 2065, 1149, 1147, 1144, 1141, 146, 1157, 1154, 2013, 2011, 2008, 2015, 1579, 1549, 1546, 1495, 1487, + 1433, 1431, 1428, 1425, 388, 1440, 2205, 1705, 658, 1667, 1664, 1119, 1095, 1093, 1978, 1057, 1055, 1052, 1062, + 1962, 1960, 1005, 1003, 1000, 997, 38, 1013, 1010, 1932, 1930, 1927, 1934, 941, 939, 936, 933, 6, 930, 3, 951, + 948, 944, 1889, 1887, 1884, 1881, 959, 1893, 1891, 35, 1377, 1360, 1358, 1327, 1325, 1322, 1331, 1277, 1275, + 1272, 1269, 235, 1284, 2110, 1205, 1204, 1201, 1198, 182, 1195, 179, 1213, 2070, 2067, 1580, 501, 1551, 1548, + 440, 437, 1497, 1494, 1490, 1503, 761, 709, 707, 1706, 913, 912, 2198, 1386, 2164, 2161, 1621, 1766, 2103, 1208, + 2058, 2054, 1145, 1142, 2005, 2002, 1999, 2009, 1488, 1429, 1426, 2200, 1698, 1659, 1656, 1975, 1053, 1957, 1954, + 1001, 998, 1924, 1921, 1918, 1928, 937, 934, 931, 1879, 1876, 1873, 1870, 945, 1885, 1882, 1323, 1273, 1270, + 2105, 1202, 1199, 1196, 1211, 2061, 2057, 1576, 1543, 1540, 1484, 1481, 1478, 1491, 1700}; diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.h new file mode 100644 index 0000000..485b91d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXMultipleBarcodeReader.h" +#import "ZXReader.h" + +@class ZXDecodeHints, ZXResult; + +/** + * This implementation can detect and decode PDF417 codes in an image. + */ +@interface ZXPDF417Reader : NSObject + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error; +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.m new file mode 100644 index 0000000..39d3156 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.m @@ -0,0 +1,134 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBinaryBitmap.h" +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXDetectorResult.h" +#import "ZXErrors.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417Detector.h" +#import "ZXPDF417DetectorResult.h" +#import "ZXPDF417Reader.h" +#import "ZXPDF417ResultMetadata.h" +#import "ZXPDF417ScanningDecoder.h" +#import "ZXResult.h" +#import "ZXResultPoint.h" + +@implementation ZXPDF417Reader + +/** + * Locates and decodes a PDF417 code in an image. + * + * @return a String representing the content encoded by the PDF417 code + * @return nil if a PDF417 code cannot be found, + * @return nil if a PDF417 cannot be decoded + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + NSArray *result = [self decode:image hints:hints multiple:NO error:error]; + if (!result || result.count == 0 || !result[0]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return result[0]; +} + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decodeMultiple:image hints:nil error:error]; +} + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + return [self decode:image hints:hints multiple:YES error:error]; +} + +- (NSArray *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints multiple:(BOOL)multiple error:(NSError **)error { + NSMutableArray *results = [NSMutableArray array]; + ZXPDF417DetectorResult *detectorResult = [ZXPDF417Detector detect:image hints:hints multiple:multiple error:error]; + if (!detectorResult) { + return nil; + } + for (NSArray *points in detectorResult.points) { + ZXResultPoint *imageTopLeft = points[4] == [NSNull null] ? nil : points[4]; + ZXResultPoint *imageBottomLeft = points[5] == [NSNull null] ? nil : points[5]; + ZXResultPoint *imageTopRight = points[6] == [NSNull null] ? nil : points[6]; + ZXResultPoint *imageBottomRight = points[7] == [NSNull null] ? nil : points[7]; + + ZXDecoderResult *decoderResult = [ZXPDF417ScanningDecoder decode:detectorResult.bits + imageTopLeft:imageTopLeft + imageBottomLeft:imageBottomLeft + imageTopRight:imageTopRight + imageBottomRight:imageBottomRight + minCodewordWidth:[self minCodewordWidth:points] + maxCodewordWidth:[self maxCodewordWidth:points] + error:error]; + if (!decoderResult) { + return nil; + } + ZXResult *result = [[ZXResult alloc] initWithText:decoderResult.text + rawBytes:decoderResult.rawBytes + resultPoints:points + format:kBarcodeFormatPDF417]; + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:decoderResult.ecLevel]; + ZXPDF417ResultMetadata *pdf417ResultMetadata = decoderResult.other; + if (pdf417ResultMetadata) { + [result putMetadata:kResultMetadataTypePDF417ExtraMetadata value:pdf417ResultMetadata]; + } + [results addObject:result]; + } + return [NSArray arrayWithArray:results]; +} + +- (int)maxWidth:(ZXResultPoint *)p1 p2:(ZXResultPoint *)p2 { + if (!p1 || !p2 || (id)p1 == [NSNull null] || p2 == (id)[NSNull null]) { + return 0; + } + return fabsf(p1.x - p2.x); +} + +- (int)minWidth:(ZXResultPoint *)p1 p2:(ZXResultPoint *)p2 { + if (!p1 || !p2 || (id)p1 == [NSNull null] || p2 == (id)[NSNull null]) { + return INT_MAX; + } + return fabsf(p1.x - p2.x); +} + +- (int)maxCodewordWidth:(NSArray *)p { + return MAX( + MAX([self maxWidth:p[0] p2:p[4]], [self maxWidth:p[6] p2:p[2]] * ZX_PDF417_MODULES_IN_CODEWORD / + ZX_PDF417_MODULES_IN_STOP_PATTERN), + MAX([self maxWidth:p[1] p2:p[5]], [self maxWidth:p[7] p2:p[3]] * ZX_PDF417_MODULES_IN_CODEWORD / + ZX_PDF417_MODULES_IN_STOP_PATTERN)); +} + +- (int)minCodewordWidth:(NSArray *)p { + return MIN( + MIN([self minWidth:p[0] p2:p[4]], [self minWidth:p[6] p2:p[2]] * ZX_PDF417_MODULES_IN_CODEWORD / + ZX_PDF417_MODULES_IN_STOP_PATTERN), + MIN([self minWidth:p[1] p2:p[5]], [self minWidth:p[7] p2:p[3]] * ZX_PDF417_MODULES_IN_CODEWORD / + ZX_PDF417_MODULES_IN_STOP_PATTERN)); +} + +- (void)reset { + // nothing needs to be reset +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.h new file mode 100644 index 0000000..1660049 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.h @@ -0,0 +1,24 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXPDF417ResultMetadata : NSObject + +@property (nonatomic, assign) int segmentIndex; +@property (nonatomic, copy) NSString *fileId; +@property (nonatomic, strong) NSArray *optionalData; +@property (nonatomic, assign) BOOL lastSegment; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.m new file mode 100644 index 0000000..c5e2d8a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.m @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417ResultMetadata.h" + +@implementation ZXPDF417ResultMetadata + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.h new file mode 100644 index 0000000..eb09e73 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.h @@ -0,0 +1,21 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +@interface ZXPDF417Writer : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.m new file mode 100644 index 0000000..2f5a022 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.m @@ -0,0 +1,153 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXEncodeHints.h" +#import "ZXPDF417.h" +#import "ZXPDF417BarcodeMatrix.h" +#import "ZXPDF417Dimensions.h" +#import "ZXPDF417Writer.h" + +/** + * default white space (margin) around the code + */ +const int ZX_PDF417_WHITE_SPACE = 30; + +@implementation ZXPDF417Writer + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height + hints:(ZXEncodeHints *)hints error:(NSError **)error { + if (format != kBarcodeFormatPDF417) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode PDF_417, but got %d", format]; + } + + ZXPDF417 *encoder = [[ZXPDF417 alloc] init]; + int margin = ZX_PDF417_WHITE_SPACE; + + if (hints != nil) { + encoder.compact = hints.pdf417Compact; + encoder.compaction = hints.pdf417Compaction; + if (hints.pdf417Dimensions != nil) { + ZXPDF417Dimensions *dimensions = hints.pdf417Dimensions; + [encoder setDimensionsWithMaxCols:dimensions.maxCols + minCols:dimensions.minCols + maxRows:dimensions.maxRows + minRows:dimensions.minRows]; + } + if (hints.margin) { + margin = [hints.margin intValue]; + } + if (hints.encoding > 0) { + encoder.encoding = hints.encoding; + } + } + + return [self bitMatrixFromEncoder:encoder contents:contents width:width height:height margin:margin error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +/** + * Takes encoder, accounts for width/height, and retrieves bit matrix + */ +- (ZXBitMatrix *)bitMatrixFromEncoder:(ZXPDF417 *)encoder + contents:(NSString *)contents + width:(int)width + height:(int)height + margin:(int)margin + error:(NSError **)error { + int errorCorrectionLevel = 2; + if (![encoder generateBarcodeLogic:contents errorCorrectionLevel:errorCorrectionLevel error:error]) { + return nil; + } + + int lineThickness = 2; + int aspectRatio = 4; + NSArray *originalScale = [[encoder barcodeMatrix] scaledMatrixWithXScale:lineThickness yScale:aspectRatio * lineThickness]; + BOOL rotated = NO; + if ((height > width) ^ ([(ZXByteArray *)originalScale[0] length] < [originalScale count])) { + originalScale = [self rotateArray:originalScale]; + rotated = YES; + } + + int scaleX = width / [(ZXByteArray *)originalScale[0] length]; + int scaleY = height / [originalScale count]; + + int scale; + if (scaleX < scaleY) { + scale = scaleX; + } else { + scale = scaleY; + } + + if (scale > 1) { + NSArray *scaledMatrix = + [[encoder barcodeMatrix] scaledMatrixWithXScale:scale * lineThickness yScale:scale * aspectRatio * lineThickness]; + if (rotated) { + scaledMatrix = [self rotateArray:scaledMatrix]; + } + return [self bitMatrixFrombitArray:scaledMatrix margin:margin]; + } + return [self bitMatrixFrombitArray:originalScale margin:margin]; +} + +/** + * This takes an array holding the values of the PDF 417 + * + * @param input a byte array of information with 0 is black, and 1 is white + * @param margin border around the barcode + * @return BitMatrix of the input + */ +- (ZXBitMatrix *)bitMatrixFrombitArray:(NSArray *)input margin:(int)margin { + // Creates the bitmatrix with extra space for whtespace + ZXBitMatrix *output = [[ZXBitMatrix alloc] initWithWidth:[(ZXByteArray *)input[0] length] + 2 * margin height:(int)[input count] + 2 * margin]; + [output clear]; + for (int y = 0, yOutput = output.height - margin; y < [input count]; y++, yOutput--) { + for (int x = 0; x < [(ZXByteArray *)input[0] length]; x++) { + // Zero is white in the bytematrix + if ([(ZXByteArray *)input[y] array][x] == 1) { + [output setX:x + margin y:yOutput]; + } + } + } + return output; +} + +/** + * Takes and rotates the it 90 degrees + */ +- (NSArray *)rotateArray:(NSArray *)bitarray { + NSMutableArray *temp = [NSMutableArray array]; + for (int i = 0; i < [(ZXByteArray *)bitarray[0] length]; i++) { + [temp addObject:[[ZXByteArray alloc] initWithLength:(unsigned int)[bitarray count]]]; + } + + for (int ii = 0; ii < [bitarray count]; ii++) { + // This makes the direction consistent on screen when rotating the + // screen; + int inverseii = (int)[bitarray count] - ii - 1; + for (int jj = 0; jj < [(ZXByteArray *)bitarray[0] length]; jj++) { + ZXByteArray *b = temp[jj]; + b.array[inverseii] = [(ZXByteArray *)bitarray[ii] array][jj]; + } + } + return temp; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXingObjCPDF417.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXingObjCPDF417.h new file mode 100644 index 0000000..2c77a80 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/ZXingObjCPDF417.h @@ -0,0 +1,34 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ZXINGOBJC_PDF417_ + +#define _ZXINGOBJC_PDF417_ + +#import "ZXModulusGF.h" +#import "ZXPDF417.h" +#import "ZXPDF417BarcodeMatrix.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417Detector.h" +#import "ZXPDF417DetectorResult.h" +#import "ZXPDF417Dimensions.h" +#import "ZXPDF417ECErrorCorrection.h" +#import "ZXPDF417Reader.h" +#import "ZXPDF417ResultMetadata.h" +#import "ZXPDF417ScanningDecoder.h" +#import "ZXPDF417Writer.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.h new file mode 100644 index 0000000..f2fb7d9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.h @@ -0,0 +1,28 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXPDF417BarcodeMetadata : NSObject + +@property (nonatomic, assign, readonly) int columnCount; +@property (nonatomic, assign, readonly) int errorCorrectionLevel; +@property (nonatomic, assign, readonly) int rowCountUpperPart; +@property (nonatomic, assign, readonly) int rowCountLowerPart; +@property (nonatomic, assign, readonly) int rowCount; + +- (id)initWithColumnCount:(int)columnCount rowCountUpperPart:(int)rowCountUpperPart rowCountLowerPart:(int)rowCountLowerPart + errorCorrectionLevel:(int)errorCorrectionLevel; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.m new file mode 100644 index 0000000..1173bbe --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.m @@ -0,0 +1,35 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417BarcodeMetadata.h" + +@implementation ZXPDF417BarcodeMetadata + +- (id)initWithColumnCount:(int)columnCount rowCountUpperPart:(int)rowCountUpperPart rowCountLowerPart:(int)rowCountLowerPart + errorCorrectionLevel:(int)errorCorrectionLevel { + self = [super init]; + if (self) { + _columnCount = columnCount; + _errorCorrectionLevel = errorCorrectionLevel; + _rowCountUpperPart = rowCountUpperPart; + _rowCountLowerPart = rowCountLowerPart; + _rowCount = rowCountUpperPart + rowCountLowerPart; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.h new file mode 100644 index 0000000..76147a2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.h @@ -0,0 +1,34 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXIntArray; + +@interface ZXPDF417BarcodeValue : NSObject + +/** + * Add an occurrence of a value + */ +- (void)setValue:(int)value; + +/** + * Determines the maximum occurrence of a set value and returns all values which were set with this occurrence. + * @return an array of int, containing the values with the highest occurrence, or null, if no value was set + */ +- (ZXIntArray *)value; + +- (NSNumber *)confidence:(int)value; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.m new file mode 100644 index 0000000..1f3aa03 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.m @@ -0,0 +1,67 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417BarcodeValue.h" +#import "ZXPDF417Common.h" + +@interface ZXPDF417BarcodeValue () + +@property (nonatomic, strong, readonly) NSMutableDictionary *values; + +@end + +@implementation ZXPDF417BarcodeValue + +- (id)init { + self = [super init]; + if (self) { + _values = [NSMutableDictionary dictionary]; + } + + return self; +} + +- (void)setValue:(int)value { + NSNumber *confidence = self.values[@(value)]; + if (!confidence) { + confidence = @0; + } + confidence = @([confidence intValue] + 1); + self.values[@(value)] = confidence; +} + +- (ZXIntArray *)value { + int maxConfidence = -1; + NSMutableArray *result = [NSMutableArray array]; + for (NSNumber *key in [self.values allKeys]) { + NSNumber *value = self.values[key]; + if ([value intValue] > maxConfidence) { + maxConfidence = [value intValue]; + [result removeAllObjects]; + [result addObject:key]; + } else if ([value intValue] == maxConfidence) { + [result addObject:key]; + } + } + NSArray *array = [[[result sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects]; + return [ZXPDF417Common toIntArray:array]; +} + +- (NSNumber *)confidence:(int)value { + return self.values[@(value)]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.h new file mode 100644 index 0000000..da74a78 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.h @@ -0,0 +1,37 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXResultPoint; + +@interface ZXPDF417BoundingBox : NSObject + +@property (nonatomic, assign, readonly) int minX; +@property (nonatomic, assign, readonly) int maxX; +@property (nonatomic, assign, readonly) int minY; +@property (nonatomic, assign, readonly) int maxY; +@property (nonatomic, strong, readonly) ZXResultPoint *topLeft; +@property (nonatomic, strong, readonly) ZXResultPoint *topRight; +@property (nonatomic, strong, readonly) ZXResultPoint *bottomLeft; +@property (nonatomic, strong, readonly) ZXResultPoint *bottomRight; + +- (id)initWithImage:(ZXBitMatrix *)image topLeft:(ZXResultPoint *)topLeft bottomLeft:(ZXResultPoint *)bottomLeft + topRight:(ZXResultPoint *)topRight bottomRight:(ZXResultPoint *)bottomRight; +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox; + ++ (ZXPDF417BoundingBox *)mergeLeftBox:(ZXPDF417BoundingBox *)leftBox rightBox:(ZXPDF417BoundingBox *)rightBox; +- (ZXPDF417BoundingBox *)addMissingRows:(int)missingStartRows missingEndRows:(int)missingEndRows isLeft:(BOOL)isLeft; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.m new file mode 100644 index 0000000..54a2fa7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.m @@ -0,0 +1,135 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXPDF417BoundingBox.h" +#import "ZXResultPoint.h" + +@interface ZXPDF417BoundingBox () + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, assign) int minX; +@property (nonatomic, assign) int maxX; +@property (nonatomic, assign) int minY; +@property (nonatomic, assign) int maxY; + +@end + +@implementation ZXPDF417BoundingBox + +- (id)initWithImage:(ZXBitMatrix *)image topLeft:(ZXResultPoint *)topLeft bottomLeft:(ZXResultPoint *)bottomLeft + topRight:(ZXResultPoint *)topRight bottomRight:(ZXResultPoint *)bottomRight { + if ((!topLeft && !topRight) || (!bottomLeft && !bottomRight) || + (topLeft && !bottomLeft) || (topRight && !bottomRight)) { + return nil; + } + + self = [super init]; + if (self) { + _image = image; + _topLeft = topLeft; + _bottomLeft = bottomLeft; + _topRight = topRight; + _bottomRight = bottomRight; + [self calculateMinMaxValues]; + } + + return self; +} + +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox { + return [self initWithImage:boundingBox.image topLeft:boundingBox.topLeft bottomLeft:boundingBox.bottomLeft + topRight:boundingBox.topRight bottomRight:boundingBox.bottomRight]; +} + ++ (ZXPDF417BoundingBox *)mergeLeftBox:(ZXPDF417BoundingBox *)leftBox rightBox:(ZXPDF417BoundingBox *)rightBox { + if (!leftBox) { + return rightBox; + } + if (!rightBox) { + return leftBox; + } + return [[self alloc] initWithImage:leftBox.image topLeft:leftBox.topLeft bottomLeft:leftBox.bottomLeft + topRight:rightBox.topRight bottomRight:rightBox.bottomRight]; +} + +- (ZXPDF417BoundingBox *)addMissingRows:(int)missingStartRows missingEndRows:(int)missingEndRows isLeft:(BOOL)isLeft { + ZXResultPoint *newTopLeft = self.topLeft; + ZXResultPoint *newBottomLeft = self.bottomLeft; + ZXResultPoint *newTopRight = self.topRight; + ZXResultPoint *newBottomRight = self.bottomRight; + + if (missingStartRows > 0) { + ZXResultPoint *top = isLeft ? self.topLeft : self.topRight; + int newMinY = (int) top.y - missingStartRows; + if (newMinY < 0) { + newMinY = 0; + } + // TODO use existing points to better interpolate the new x positions + ZXResultPoint *newTop = [[ZXResultPoint alloc] initWithX:top.x y:newMinY]; + if (isLeft) { + newTopLeft = newTop; + } else { + newTopRight = newTop; + } + } + + if (missingEndRows > 0) { + ZXResultPoint *bottom = isLeft ? self.bottomLeft : self.bottomRight; + int newMaxY = (int) bottom.y + missingEndRows; + if (newMaxY >= self.image.height) { + newMaxY = self.image.height - 1; + } + // TODO use existing points to better interpolate the new x positions + ZXResultPoint *newBottom = [[ZXResultPoint alloc] initWithX:bottom.x y:newMaxY]; + if (isLeft) { + newBottomLeft = newBottom; + } else { + newBottomRight = newBottom; + } + } + [self calculateMinMaxValues]; + return [[ZXPDF417BoundingBox alloc] initWithImage:self.image topLeft:newTopLeft bottomLeft:newBottomLeft topRight:newTopRight bottomRight:newBottomRight]; +} + +- (void)calculateMinMaxValues { + if (!self.topLeft) { + _topLeft = [[ZXResultPoint alloc] initWithX:0 y:self.topRight.y]; + _bottomLeft = [[ZXResultPoint alloc] initWithX:0 y:self.bottomRight.y]; + } else if (!self.topRight) { + _topRight = [[ZXResultPoint alloc] initWithX:self.image.width - 1 y:self.topLeft.y]; + _bottomRight = [[ZXResultPoint alloc] initWithX:self.image.width - 1 y:self.bottomLeft.y]; + } + + self.minX = (int) MIN(self.topLeft.x, self.bottomLeft.x); + self.maxX = (int) MAX(self.topRight.x, self.bottomRight.x); + self.minY = (int) MIN(self.topLeft.y, self.topRight.y); + self.maxY = (int) MAX(self.bottomLeft.y, self.bottomRight.y); +} + +/* +- (void)setTopRight:(ZXResultPoint *)topRight { + _topRight = topRight; + [self calculateMinMaxValues]; +} + +- (void)setBottomRight:(ZXResultPoint *)bottomRight { + _bottomRight = bottomRight; + [self calculateMinMaxValues]; +} +*/ + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.h new file mode 100644 index 0000000..d64bf47 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.h @@ -0,0 +1,31 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXPDF417Codeword : NSObject + +@property (nonatomic, assign, readonly) int startX; +@property (nonatomic, assign, readonly) int endX; +@property (nonatomic, assign, readonly) int bucket; +@property (nonatomic, assign, readonly) int value; +@property (nonatomic, assign) int rowNumber; + +- (id)initWithStartX:(int)startX endX:(int)endX bucket:(int)bucket value:(int)value; +- (BOOL)hasValidRowNumber; +- (BOOL)isValidRowNumber:(int)rowNumber; +- (void)setRowNumberAsRowIndicatorColumn; +- (int)width; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.m new file mode 100644 index 0000000..45a624e --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.m @@ -0,0 +1,56 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417Codeword.h" + +const int ZX_PDF417_BARCODE_ROW_UNKNOWN = -1; + +@implementation ZXPDF417Codeword + +- (id)initWithStartX:(int)startX endX:(int)endX bucket:(int)bucket value:(int)value { + self = [super init]; + if (self) { + _startX = startX; + _endX = endX; + _bucket = bucket; + _value = value; + _rowNumber = ZX_PDF417_BARCODE_ROW_UNKNOWN; + } + + return self; +} + +- (BOOL)hasValidRowNumber { + return [self isValidRowNumber:self.rowNumber]; +} + +- (BOOL)isValidRowNumber:(int)rowNumber { + return rowNumber != ZX_PDF417_BARCODE_ROW_UNKNOWN && self.bucket == (rowNumber % 3) * 3; +} + +- (void)setRowNumberAsRowIndicatorColumn { + self.rowNumber = (self.value / 30) * 3 + self.bucket / 3; +} + +- (int)width { + return self.endX - self.startX; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"%d|%d", self.rowNumber, self.value]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.h new file mode 100644 index 0000000..a50e347 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.h @@ -0,0 +1,21 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@interface ZXPDF417CodewordDecoder : NSObject + ++ (int)decodedValue:(NSArray *)moduleBitCount; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.m new file mode 100644 index 0000000..2a3b823 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.m @@ -0,0 +1,114 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417CodewordDecoder.h" +#import "ZXPDF417Common.h" + +static float ZX_PDF417_RATIOS_TABLE[ZX_PDF417_SYMBOL_TABLE_LEN][ZX_PDF417_BARS_IN_MODULE]; + +@implementation ZXPDF417CodewordDecoder + ++ (void)initialize { + if ([self class] != [ZXPDF417CodewordDecoder class]) return; + + // Pre-computes the symbol ratio table. + for (int i = 0; i < ZX_PDF417_SYMBOL_TABLE_LEN; i++) { + int currentSymbol = ZX_PDF417_SYMBOL_TABLE[i]; + int currentBit = currentSymbol & 0x1; + for (int j = 0; j < ZX_PDF417_BARS_IN_MODULE; j++) { + float size = 0.0f; + while ((currentSymbol & 0x1) == currentBit) { + size += 1.0f; + currentSymbol >>= 1; + } + currentBit = currentSymbol & 0x1; + ZX_PDF417_RATIOS_TABLE[i][ZX_PDF417_BARS_IN_MODULE - j - 1] = size / ZX_PDF417_MODULES_IN_CODEWORD; + } + } +} + ++ (int)decodedValue:(NSArray *)moduleBitCount { + int decodedValue = [self decodedCodewordValue:[self sampleBitCounts:moduleBitCount]]; + if (decodedValue != -1) { + return decodedValue; + } + return [self closestDecodedValue:moduleBitCount]; +} + ++ (NSArray *)sampleBitCounts:(NSArray *)moduleBitCount { + float bitCountSum = [ZXPDF417Common bitCountSum:moduleBitCount]; + NSMutableArray *result = [NSMutableArray arrayWithCapacity:ZX_PDF417_BARS_IN_MODULE]; + for (int i = 0; i < ZX_PDF417_BARS_IN_MODULE; i++) { + [result addObject:@0]; + } + + int bitCountIndex = 0; + int sumPreviousBits = 0; + for (int i = 0; i < ZX_PDF417_MODULES_IN_CODEWORD; i++) { + float sampleIndex = + bitCountSum / (2 * ZX_PDF417_MODULES_IN_CODEWORD) + + (i * bitCountSum) / ZX_PDF417_MODULES_IN_CODEWORD; + if (sumPreviousBits + [moduleBitCount[bitCountIndex] intValue] <= sampleIndex) { + sumPreviousBits += [moduleBitCount[bitCountIndex] intValue]; + bitCountIndex++; + } + result[bitCountIndex] = @([result[bitCountIndex] intValue] + 1); + } + return result; +} + ++ (int)decodedCodewordValue:(NSArray *)moduleBitCount { + int decodedValue = [self bitValue:moduleBitCount]; + return [ZXPDF417Common codeword:decodedValue] == -1 ? -1 : decodedValue; +} + ++ (int)bitValue:(NSArray *)moduleBitCount { + long result = 0; + for (int i = 0; i < [moduleBitCount count]; i++) { + for (int bit = 0; bit < [moduleBitCount[i] intValue]; bit++) { + result = (result << 1) | (i % 2 == 0 ? 1 : 0); + } + } + return (int) result; +} + ++ (int)closestDecodedValue:(NSArray *)moduleBitCount { + int bitCountSum = [ZXPDF417Common bitCountSum:moduleBitCount]; + float bitCountRatios[ZX_PDF417_BARS_IN_MODULE]; + for (int i = 0; i < ZX_PDF417_BARS_IN_MODULE; i++) { + bitCountRatios[i] = [moduleBitCount[i] intValue] / (float) bitCountSum; + } + float bestMatchError = MAXFLOAT; + int bestMatch = -1; + for (int j = 0; j < ZX_PDF417_SYMBOL_TABLE_LEN; j++) { + float error = 0.0f; + float *ratioTableRow = ZX_PDF417_RATIOS_TABLE[j]; + for (int k = 0; k < ZX_PDF417_BARS_IN_MODULE; k++) { + float diff = ratioTableRow[k] - bitCountRatios[k]; + error += diff * diff; + if (error >= bestMatchError) { + break; + } + } + if (error < bestMatchError) { + bestMatchError = error; + bestMatch = ZX_PDF417_SYMBOL_TABLE[j]; + } + } + return bestMatch; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.h new file mode 100644 index 0000000..a90df62 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXDecoderResult, ZXIntArray; + +/** + * This class contains the methods for decoding the PDF417 codewords. + */ +@interface ZXPDF417DecodedBitStreamParser : NSObject + ++ (ZXDecoderResult *)decode:(ZXIntArray *)codewords ecLevel:(NSString *)ecLevel error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.m new file mode 100644 index 0000000..8a8d999 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.m @@ -0,0 +1,643 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXCharacterSetECI.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXPDF417DecodedBitStreamParser.h" +#import "ZXPDF417ResultMetadata.h" + +typedef enum { + ZXPDF417ModeAlpha = 0, + ZXPDF417ModeLower, + ZXPDF417ModeMixed, + ZXPDF417ModePunct, + ZXPDF417ModeAlphaShift, + ZXPDF417ModePunctShift +} ZXPDF417Mode; + +const int ZX_PDF417_TEXT_COMPACTION_MODE_LATCH = 900; +const int ZX_PDF417_BYTE_COMPACTION_MODE_LATCH = 901; +const int ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH = 902; +const int ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6 = 924; +const int ZX_PDF417_ECI_USER_DEFINED = 925; +const int ZX_PDF417_ECI_GENERAL_PURPOSE = 926; +const int ZX_PDF417_ECI_CHARSET = 927; +const int ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK = 928; +const int ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD = 923; +const int ZX_PDF417_MACRO_PDF417_TERMINATOR = 922; +const int ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE = 913; +const int ZX_PDF417_MAX_NUMERIC_CODEWORDS = 15; + +const int ZX_PDF417_PL = 25; +const int ZX_PDF417_LL = 27; +const int ZX_PDF417_AS = 27; +const int ZX_PDF417_ML = 28; +const int ZX_PDF417_AL = 28; +const int ZX_PDF417_PS = 29; +const int ZX_PDF417_PAL = 29; + +const unichar ZX_PDF417_PUNCT_CHARS[] = { + ';', '<', '>', '@', '[', '\\', ']', '_', '`', '~', '!', + '\r', '\t', ',', ':', '\n', '-', '.', '$', '/', '"', '|', '*', + '(', ')', '?', '{', '}', '\''}; + +const unichar ZX_PDF417_MIXED_CHARS[] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '&', + '\r', '\t', ',', ':', '#', '-', '.', '$', '/', '+', '%', '*', + '=', '^'}; + +const int ZX_PDF417_NUMBER_OF_SEQUENCE_CODEWORDS = 2; + +const NSStringEncoding ZX_PDF417_DECODING_DEFAULT_ENCODING = NSISOLatin1StringEncoding; + +/** + * Table containing values for the exponent of 900. + * This is used in the numeric compaction decode algorithm. + */ +static NSArray *ZX_PDF417_EXP900 = nil; + +@implementation ZXPDF417DecodedBitStreamParser + ++ (void)initialize { + if ([self class] != [ZXPDF417DecodedBitStreamParser class]) return; + + NSMutableArray *exponents = [NSMutableArray arrayWithCapacity:16]; + [exponents addObject:[NSDecimalNumber one]]; + NSDecimalNumber *nineHundred = [NSDecimalNumber decimalNumberWithString:@"900"]; + [exponents addObject:nineHundred]; + for (int i = 2; i < 16; i++) { + [exponents addObject:[exponents[i - 1] decimalNumberByMultiplyingBy:nineHundred]]; + } + ZX_PDF417_EXP900 = [[NSArray alloc] initWithArray:exponents]; +} + ++ (ZXDecoderResult *)decode:(ZXIntArray *)codewords ecLevel:(NSString *)ecLevel error:(NSError **)error { + NSMutableString *result = [NSMutableString stringWithCapacity:codewords.length * 2]; + NSStringEncoding encoding = ZX_PDF417_DECODING_DEFAULT_ENCODING; + // Get compaction mode + int codeIndex = 1; + int code = codewords.array[codeIndex++]; + ZXPDF417ResultMetadata *resultMetadata = [[ZXPDF417ResultMetadata alloc] init]; + while (codeIndex < codewords.array[0]) { + switch (code) { + case ZX_PDF417_TEXT_COMPACTION_MODE_LATCH: + codeIndex = [self textCompaction:codewords codeIndex:codeIndex result:result]; + break; + case ZX_PDF417_BYTE_COMPACTION_MODE_LATCH: + case ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6: + codeIndex = [self byteCompaction:code codewords:codewords encoding:encoding codeIndex:codeIndex result:result]; + break; + case ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + [result appendFormat:@"%C", (unichar)codewords.array[codeIndex++]]; + break; + case ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH: + codeIndex = [self numericCompaction:codewords codeIndex:codeIndex result:result]; + if (codeIndex < 0) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + case ZX_PDF417_ECI_CHARSET: { + ZXCharacterSetECI *charsetECI = + [ZXCharacterSetECI characterSetECIByValue:codewords.array[codeIndex++]]; + encoding = charsetECI.encoding; + break; + } + case ZX_PDF417_ECI_GENERAL_PURPOSE: + // Can't do anything with generic ECI; skip its 2 characters + codeIndex += 2; + break; + case ZX_PDF417_ECI_USER_DEFINED: + // Can't do anything with user ECI; skip its 1 character + codeIndex ++; + break; + case ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK: + codeIndex = [self decodeMacroBlock:codewords codeIndex:codeIndex resultMetadata:resultMetadata]; + if (codeIndex < 0) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + break; + case ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD: + case ZX_PDF417_MACRO_PDF417_TERMINATOR: + // Should not see these outside a macro block + if (error) *error = ZXFormatErrorInstance(); + return nil; + default: + // Default to text compaction. During testing numerous barcodes + // appeared to be missing the starting mode. In these cases defaulting + // to text compaction seems to work. + codeIndex--; + codeIndex = [self textCompaction:codewords codeIndex:codeIndex result:result]; + break; + } + if (codeIndex < codewords.length) { + code = codewords.array[codeIndex++]; + } else { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } + if ([result length] == 0) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + ZXDecoderResult *decoderResult = [[ZXDecoderResult alloc] initWithRawBytes:nil text:result byteSegments:nil ecLevel:ecLevel]; + decoderResult.other = resultMetadata; + return decoderResult; +} + ++ (int)decodeMacroBlock:(ZXIntArray *)codewords codeIndex:(int)codeIndex resultMetadata:(ZXPDF417ResultMetadata *)resultMetadata { + if (codeIndex + ZX_PDF417_NUMBER_OF_SEQUENCE_CODEWORDS > codewords.array[0]) { + // we must have at least two bytes left for the segment index + return -1; + } + ZXIntArray *segmentIndexArray = [[ZXIntArray alloc] initWithLength:ZX_PDF417_NUMBER_OF_SEQUENCE_CODEWORDS]; + for (int i = 0; i < ZX_PDF417_NUMBER_OF_SEQUENCE_CODEWORDS; i++, codeIndex++) { + segmentIndexArray.array[i] = codewords.array[codeIndex]; + } + resultMetadata.segmentIndex = [[self decodeBase900toBase10:segmentIndexArray count:ZX_PDF417_NUMBER_OF_SEQUENCE_CODEWORDS] intValue]; + + NSMutableString *fileId = [NSMutableString string]; + codeIndex = [self textCompaction:codewords codeIndex:codeIndex result:fileId]; + resultMetadata.fileId = [NSString stringWithString:fileId]; + + if (codewords.array[codeIndex] == ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { + codeIndex++; + NSMutableArray *additionalOptionCodeWords = [NSMutableArray array]; + + BOOL end = NO; + while ((codeIndex < codewords.array[0]) && !end) { + int code = codewords.array[codeIndex++]; + if (code < ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + [additionalOptionCodeWords addObject:@(code)]; + } else { + switch (code) { + case ZX_PDF417_MACRO_PDF417_TERMINATOR: + resultMetadata.lastSegment = YES; + codeIndex++; + end = YES; + break; + default: + return -1; + } + } + } + + resultMetadata.optionalData = additionalOptionCodeWords; + } else if (codewords.array[codeIndex] == ZX_PDF417_MACRO_PDF417_TERMINATOR) { + resultMetadata.lastSegment = YES; + codeIndex++; + } + + return codeIndex; +} + +/** + * Text Compaction mode (see 5.4.1.5) permits all printable ASCII characters to be + * encoded, i.e. values 32 - 126 inclusive in accordance with ISO/IEC 646 (IRV), as + * well as selected control characters. + * + * @param codewords The array of codewords (data + error) + * @param codeIndex The current index into the codeword array. + * @param result The decoded data is appended to the result. + * @return The next index into the codeword array. + */ ++ (int)textCompaction:(ZXIntArray *)codewords codeIndex:(int)codeIndex result:(NSMutableString *)result { + // 2 character per codeword + ZXIntArray *textCompactionData = [[ZXIntArray alloc] initWithLength:(codewords.array[0] - codeIndex) * 2]; + // Used to hold the byte compaction value if there is a mode shift + ZXIntArray *byteCompactionData = [[ZXIntArray alloc] initWithLength:(codewords.array[0] - codeIndex) * 2]; + + int index = 0; + BOOL end = NO; + while ((codeIndex < codewords.array[0]) && !end) { + int code = codewords.array[codeIndex++]; + if (code < ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + textCompactionData.array[index] = code / 30; + textCompactionData.array[index + 1] = code % 30; + index += 2; + } else { + switch (code) { + case ZX_PDF417_TEXT_COMPACTION_MODE_LATCH: + // reinitialize text compaction mode to alpha sub mode + textCompactionData.array[index++] = ZX_PDF417_TEXT_COMPACTION_MODE_LATCH; + break; + case ZX_PDF417_BYTE_COMPACTION_MODE_LATCH: + case ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6: + case ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH: + case ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK: + case ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD: + case ZX_PDF417_MACRO_PDF417_TERMINATOR: + codeIndex--; + end = YES; + break; + case ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE: + // The Mode Shift codeword 913 shall cause a temporary + // switch from Text Compaction mode to Byte Compaction mode. + // This switch shall be in effect for only the next codeword, + // after which the mode shall revert to the prevailing sub-mode + // of the Text Compaction mode. Codeword 913 is only available + // in Text Compaction mode; its use is described in 5.4.2.4. + textCompactionData.array[index] = ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE; + code = codewords.array[codeIndex++]; + byteCompactionData.array[index] = code; + index++; + break; + } + } + } + + [self decodeTextCompaction:textCompactionData byteCompactionData:byteCompactionData length:index result:result]; + return codeIndex; +} + +/** + * The Text Compaction mode includes all the printable ASCII characters + * (i.e. values from 32 to 126) and three ASCII control characters: HT or tab + * (ASCII value 9), LF or line feed (ASCII value 10), and CR or carriage + * return (ASCII value 13). The Text Compaction mode also includes various latch + * and shift characters which are used exclusively within the mode. The Text + * Compaction mode encodes up to 2 characters per codeword. The compaction rules + * for converting data into PDF417 codewords are defined in 5.4.2.2. The sub-mode + * switches are defined in 5.4.2.3. + * + * @param textCompactionData The text compaction data. + * @param byteCompactionData The byte compaction data if there + * was a mode shift. + * @param length The size of the text compaction and byte compaction data. + * @param result The decoded data is appended to the result. + */ ++ (void)decodeTextCompaction:(ZXIntArray *)textCompactionData byteCompactionData:(ZXIntArray *)byteCompactionData length:(unsigned int)length result:(NSMutableString *)result { + // Beginning from an initial state of the Alpha sub-mode + // The default compaction mode for PDF417 in effect at the start of each symbol shall always be Text + // Compaction mode Alpha sub-mode (uppercase alphabetic). A latch codeword from another mode to the Text + // Compaction mode shall always switch to the Text Compaction Alpha sub-mode. + ZXPDF417Mode subMode = ZXPDF417ModeAlpha; + ZXPDF417Mode priorToShiftMode = ZXPDF417ModeAlpha; + int i = 0; + while (i < length) { + int subModeCh = textCompactionData.array[i]; + unichar ch = 0; + switch (subMode) { + case ZXPDF417ModeAlpha: + // Alpha (uppercase alphabetic) + if (subModeCh < 26) { + // Upper case Alpha Character + ch = (unichar)('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == ZX_PDF417_LL) { + subMode = ZXPDF417ModeLower; + } else if (subModeCh == ZX_PDF417_ML) { + subMode = ZXPDF417ModeMixed; + } else if (subModeCh == ZX_PDF417_PS) { + // Shift to punctuation + priorToShiftMode = subMode; + subMode = ZXPDF417ModePunctShift; + } else if (subModeCh == ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + // TODO Does this need to use the current character encoding? See other occurrences below + [result appendFormat:@"%C", (unichar)byteCompactionData.array[i]]; + } else if (subModeCh == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + + case ZXPDF417ModeLower: + // Lower (lowercase alphabetic) + if (subModeCh < 26) { + ch = (unichar)('a' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == ZX_PDF417_AS) { + // Shift to alpha + priorToShiftMode = subMode; + subMode = ZXPDF417ModeAlphaShift; + } else if (subModeCh == ZX_PDF417_ML) { + subMode = ZXPDF417ModeMixed; + } else if (subModeCh == ZX_PDF417_PS) { + // Shift to punctuation + priorToShiftMode = subMode; + subMode = ZXPDF417ModePunctShift; + } else if (subModeCh == ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + [result appendFormat:@"%C", (unichar)byteCompactionData.array[i]]; + } else if (subModeCh == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + + case ZXPDF417ModeMixed: + // Mixed (numeric and some punctuation) + if (subModeCh < ZX_PDF417_PL) { + ch = ZX_PDF417_MIXED_CHARS[subModeCh]; + } else { + if (subModeCh == ZX_PDF417_PL) { + subMode = ZXPDF417ModePunct; + } else if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == ZX_PDF417_LL) { + subMode = ZXPDF417ModeLower; + } else if (subModeCh == ZX_PDF417_AL) { + subMode = ZXPDF417ModeAlpha; + } else if (subModeCh == ZX_PDF417_PS) { + // Shift to punctuation + priorToShiftMode = subMode; + subMode = ZXPDF417ModePunctShift; + } else if (subModeCh == ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + [result appendFormat:@"%C", (unichar)byteCompactionData.array[i]]; + } else if (subModeCh == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + + case ZXPDF417ModePunct: + // Punctuation + if (subModeCh < ZX_PDF417_PAL) { + ch = ZX_PDF417_PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == ZX_PDF417_PAL) { + subMode = ZXPDF417ModeAlpha; + } else if (subModeCh == ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + [result appendFormat:@"%C", (unichar)byteCompactionData.array[i]]; + } else if (ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + + case ZXPDF417ModeAlphaShift: + // Restore sub-mode + subMode = priorToShiftMode; + if (subModeCh < 26) { + ch = (unichar)('A' + subModeCh); + } else { + if (subModeCh == 26) { + ch = ' '; + } else if (subModeCh == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + + case ZXPDF417ModePunctShift: + // Restore sub-mode + subMode = priorToShiftMode; + if (subModeCh < ZX_PDF417_PAL) { + ch = ZX_PDF417_PUNCT_CHARS[subModeCh]; + } else { + if (subModeCh == ZX_PDF417_PAL) { + subMode = ZXPDF417ModeAlpha; + } else if (subModeCh == ZX_PDF417_MODE_SHIFT_TO_BYTE_COMPACTION_MODE) { + // PS before Shift-to-Byte is used as a padding character, + // see 5.4.2.4 of the specification + [result appendFormat:@"%C", (unichar)byteCompactionData.array[i]]; + } else if (subModeCh == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + subMode = ZXPDF417ModeAlpha; + } + } + break; + } + if (ch != 0) { + // Append decoded character to result + [result appendFormat:@"%C", ch]; + } + i++; + } +} + +/** + * Byte Compaction mode (see 5.4.3) permits all 256 possible 8-bit byte values to be encoded. + * This includes all ASCII characters value 0 to 127 inclusive and provides for international + * character set support. + * + * @param mode The byte compaction mode i.e. 901 or 924 + * @param codewords The array of codewords (data + error) + * @param encoding Currently active character encoding + * @param codeIndex The current index into the codeword array. + * @param result The decoded data is appended to the result. + * @return The next index into the codeword array. + */ ++ (int)byteCompaction:(int)mode + codewords:(ZXIntArray *)codewords + encoding:(NSStringEncoding)encoding + codeIndex:(int)codeIndex + result:(NSMutableString *)result { + NSMutableData *decodedBytes = [NSMutableData data]; + if (mode == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH) { + // Total number of Byte Compaction characters to be encoded + // is not a multiple of 6 + int count = 0; + long long value = 0; + ZXIntArray *byteCompactedCodewords = [[ZXIntArray alloc] initWithLength:6]; + BOOL end = NO; + int nextCode = codewords.array[codeIndex++]; + while ((codeIndex < codewords.array[0]) && !end) { + byteCompactedCodewords.array[count++] = nextCode; + // Base 900 + value = 900 * value + nextCode; + nextCode = codewords.array[codeIndex++]; + // perhaps it should be ok to check only nextCode >= TEXT_COMPACTION_MODE_LATCH + if (nextCode == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH || + nextCode == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH || + nextCode == ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH || + nextCode == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6 || + nextCode == ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK || + nextCode == ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + nextCode == ZX_PDF417_MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = YES; + } else { + if ((count % 5 == 0) && (count > 0)) { + // Decode every 5 codewords + // Convert to Base 256 + for (int j = 0; j < 6; ++j) { + int8_t byte = (int8_t) (value >> (8 * (5 - j))); + [decodedBytes appendBytes:&byte length:1]; + } + value = 0; + count = 0; + } + } + } + + // if the end of all codewords is reached the last codeword needs to be added + if (codeIndex == codewords.array[0] && nextCode < ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + byteCompactedCodewords.array[count++] = nextCode; + } + + // If Byte Compaction mode is invoked with codeword 901, + // the last group of codewords is interpreted directly + // as one byte per codeword, without compaction. + for (int i = 0; i < count; i++) { + int8_t byte = (int8_t)byteCompactedCodewords.array[i]; + [decodedBytes appendBytes:&byte length:1]; + } + } else if (mode == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6) { + // Total number of Byte Compaction characters to be encoded + // is an integer multiple of 6 + int count = 0; + long long value = 0; + BOOL end = NO; + while (codeIndex < codewords.array[0] && !end) { + int code = codewords.array[codeIndex++]; + if (code < ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + count++; + // Base 900 + value = 900 * value + code; + } else { + if (code == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH || + code == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH || + code == ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH || + code == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6 || + code == ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == ZX_PDF417_MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = YES; + } + } + if ((count % 5 == 0) && (count > 0)) { + // Decode every 5 codewords + // Convert to Base 256 + for (int j = 0; j < 6; ++j) { + int8_t byte = (int8_t) (value >> (8 * (5 - j))); + [decodedBytes appendBytes:&byte length:1]; + } + value = 0; + count = 0; + } + } + } + [result appendString:[[NSString alloc] initWithData:decodedBytes encoding:encoding]]; + return codeIndex; +} + +/** + * Numeric Compaction mode (see 5.4.4) permits efficient encoding of numeric data strings. + * + * @param codewords The array of codewords (data + error) + * @param codeIndex The current index into the codeword array. + * @param result The decoded data is appended to the result. + * @return The next index into the codeword array. + */ ++ (int)numericCompaction:(ZXIntArray *)codewords codeIndex:(int)codeIndex result:(NSMutableString *)result { + int count = 0; + BOOL end = NO; + + ZXIntArray *numericCodewords = [[ZXIntArray alloc] initWithLength:ZX_PDF417_MAX_NUMERIC_CODEWORDS]; + + while (codeIndex < codewords.array[0] && !end) { + int code = codewords.array[codeIndex++]; + if (codeIndex == codewords.array[0]) { + end = YES; + } + if (code < ZX_PDF417_TEXT_COMPACTION_MODE_LATCH) { + numericCodewords.array[count] = code; + count++; + } else { + if (code == ZX_PDF417_TEXT_COMPACTION_MODE_LATCH || + code == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH || + code == ZX_PDF417_BYTE_COMPACTION_MODE_LATCH_6 || + code == ZX_PDF417_BEGIN_MACRO_PDF417_CONTROL_BLOCK || + code == ZX_PDF417_BEGIN_MACRO_PDF417_OPTIONAL_FIELD || + code == ZX_PDF417_MACRO_PDF417_TERMINATOR) { + codeIndex--; + end = YES; + } + } + if (count % ZX_PDF417_MAX_NUMERIC_CODEWORDS == 0 || + code == ZX_PDF417_NUMERIC_COMPACTION_MODE_LATCH || + end) { + // Re-invoking Numeric Compaction mode (by using codeword 902 + // while in Numeric Compaction mode) serves to terminate the + // current Numeric Compaction mode grouping as described in 5.4.4.2, + // and then to start a new one grouping. + if (count > 0) { + NSString *s = [self decodeBase900toBase10:numericCodewords count:count]; + if (s == nil) { + return -1; + } + [result appendString:s]; + count = 0; + } + } + } + return codeIndex; +} + +/** + * Convert a list of Numeric Compacted codewords from Base 900 to Base 10. + * + * @param codewords The array of codewords + * @param count The number of codewords + * @return The decoded string representing the Numeric data. + */ +/* + EXAMPLE + Encode the fifteen digit numeric string 000213298174000 + Prefix the numeric string with a 1 and set the initial value of + t = 1 000 213 298 174 000 + Calculate codeword 0 + d0 = 1 000 213 298 174 000 mod 900 = 200 + + t = 1 000 213 298 174 000 div 900 = 1 111 348 109 082 + Calculate codeword 1 + d1 = 1 111 348 109 082 mod 900 = 282 + + t = 1 111 348 109 082 div 900 = 1 234 831 232 + Calculate codeword 2 + d2 = 1 234 831 232 mod 900 = 632 + + t = 1 234 831 232 div 900 = 1 372 034 + Calculate codeword 3 + d3 = 1 372 034 mod 900 = 434 + + t = 1 372 034 div 900 = 1 524 + Calculate codeword 4u + d4 = 1 524 mod 900 = 624 + + t = 1 524 div 900 = 1 + Calculate codeword 5 + d5 = 1 mod 900 = 1 + t = 1 div 900 = 0 + Codeword sequence is: 1, 624, 434, 632, 282, 200 + + Decode the above codewords involves + 1 x 900 power of 5 + 624 x 900 power of 4 + 434 x 900 power of 3 + + 632 x 900 power of 2 + 282 x 900 power of 1 + 200 x 900 power of 0 = 1000213298174000 + + Remove leading 1 => Result is 000213298174000 + */ ++ (NSString *)decodeBase900toBase10:(ZXIntArray *)codewords count:(int)count { + NSDecimalNumber *result = [NSDecimalNumber zero]; + for (int i = 0; i < count; i++) { + result = [result decimalNumberByAdding:[ZX_PDF417_EXP900[count - i - 1] decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithDecimal:[@(codewords.array[i]) decimalValue]]]]; + } + NSString *resultString = [result stringValue]; + if (![resultString hasPrefix:@"1"]) { + return nil; + } + return [resultString substringFromIndex:1]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.h new file mode 100644 index 0000000..33c9d44 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.h @@ -0,0 +1,31 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXPDF417BoundingBox, ZXPDF417DetectionResultColumn; + +@interface ZXPDF417DetectionResult : NSObject + +@property (nonatomic, strong) ZXPDF417BoundingBox *boundingBox; + +- (id)initWithBarcodeMetadata:(ZXPDF417BarcodeMetadata *)barcodeMetadata boundingBox:(ZXPDF417BoundingBox *)boundingBox; +- (NSArray *)detectionResultColumns; +- (int)barcodeColumnCount; +- (int)barcodeRowCount; +- (int)barcodeECLevel; +- (void)setDetectionResultColumn:(int)barcodeColumn detectionResultColumn:(ZXPDF417DetectionResultColumn *)detectionResultColumn; +- (ZXPDF417DetectionResultColumn *)detectionResultColumn:(int)barcodeColumn; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.m new file mode 100644 index 0000000..ddf1147 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.m @@ -0,0 +1,303 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417BarcodeMetadata.h" +#import "ZXPDF417BoundingBox.h" +#import "ZXPDF417Codeword.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417DetectionResult.h" +#import "ZXPDF417DetectionResultColumn.h" +#import "ZXPDF417DetectionResultRowIndicatorColumn.h" + +const int ZX_PDF417_ADJUST_ROW_NUMBER_SKIP = 2; + +@interface ZXPDF417DetectionResult () + +@property (nonatomic, strong, readonly) ZXPDF417BarcodeMetadata *barcodeMetadata; +@property (nonatomic, strong, readonly) NSMutableArray *detectionResultColumnsInternal; +@property (nonatomic, assign, readonly) int barcodeColumnCount; + +@end + +@implementation ZXPDF417DetectionResult + +- (id)initWithBarcodeMetadata:(ZXPDF417BarcodeMetadata *)barcodeMetadata boundingBox:(ZXPDF417BoundingBox *)boundingBox { + self = [super init]; + if (self) { + _barcodeMetadata = barcodeMetadata; + _barcodeColumnCount = barcodeMetadata.columnCount; + _boundingBox = boundingBox; + _detectionResultColumnsInternal = [NSMutableArray arrayWithCapacity:_barcodeColumnCount + 2]; + for (int i = 0; i < _barcodeColumnCount + 2; i++) { + [_detectionResultColumnsInternal addObject:[NSNull null]]; + } + } + + return self; +} + +- (NSArray *)detectionResultColumns { + [self adjustIndicatorColumnRowNumbers:self.detectionResultColumnsInternal[0]]; + [self adjustIndicatorColumnRowNumbers:self.detectionResultColumnsInternal[self.barcodeColumnCount + 1]]; + int unadjustedCodewordCount = ZX_PDF417_MAX_CODEWORDS_IN_BARCODE; + int previousUnadjustedCount; + do { + previousUnadjustedCount = unadjustedCodewordCount; + unadjustedCodewordCount = [self adjustRowNumbers]; + } while (unadjustedCodewordCount > 0 && unadjustedCodewordCount < previousUnadjustedCount); + return self.detectionResultColumnsInternal; +} + +- (void)adjustIndicatorColumnRowNumbers:(ZXPDF417DetectionResultColumn *)detectionResultColumn { + if (detectionResultColumn && (id)detectionResultColumn != [NSNull null]) { + [(ZXPDF417DetectionResultRowIndicatorColumn *)detectionResultColumn adjustCompleteIndicatorColumnRowNumbers:self.barcodeMetadata]; + } +} + +// TODO ensure that no detected codewords with unknown row number are left +// we should be able to estimate the row height and use it as a hint for the row number +// we should also fill the rows top to bottom and bottom to top +/** + * @return number of codewords which don't have a valid row number. Note that the count is not accurate as codewords + * will be counted several times. It just serves as an indicator to see when we can stop adjusting row numbers + */ +- (int)adjustRowNumbers { + int unadjustedCount = [self adjustRowNumbersByRow]; + if (unadjustedCount == 0) { + return 0; + } + for (int barcodeColumn = 1; barcodeColumn < self.barcodeColumnCount + 1; barcodeColumn++) { + NSArray *codewords = [self.detectionResultColumnsInternal[barcodeColumn] codewords]; + for (int codewordsRow = 0; codewordsRow < [codewords count]; codewordsRow++) { + if ((id)codewords[codewordsRow] == [NSNull null]) { + continue; + } + if (![codewords[codewordsRow] hasValidRowNumber]) { + [self adjustRowNumbers:barcodeColumn codewordsRow:codewordsRow codewords:codewords]; + } + } + } + return unadjustedCount; +} + +- (int)adjustRowNumbersByRow { + [self adjustRowNumbersFromBothRI]; + // TODO we should only do full row adjustments if row numbers of left and right row indicator column match. + // Maybe it's even better to calculated the height (in codeword rows) and divide it by the number of barcode + // rows. This, together with the LRI and RRI row numbers should allow us to get a good estimate where a row + // number starts and ends. + int unadjustedCount = [self adjustRowNumbersFromLRI]; + return unadjustedCount + [self adjustRowNumbersFromRRI]; +} + +- (void)adjustRowNumbersFromBothRI { + if (self.detectionResultColumnsInternal[0] == [NSNull null] || self.detectionResultColumnsInternal[self.barcodeColumnCount + 1] == [NSNull null]) { + return; + } + NSArray *LRIcodewords = [(ZXPDF417DetectionResultColumn *)self.detectionResultColumnsInternal[0] codewords]; + NSArray *RRIcodewords = [(ZXPDF417DetectionResultColumn *)self.detectionResultColumnsInternal[self.barcodeColumnCount + 1] codewords]; + for (int codewordsRow = 0; codewordsRow < [LRIcodewords count]; codewordsRow++) { + if (LRIcodewords[codewordsRow] != [NSNull null] && + RRIcodewords[codewordsRow] != [NSNull null] && + [(ZXPDF417Codeword *)LRIcodewords[codewordsRow] rowNumber] == [(ZXPDF417Codeword *)RRIcodewords[codewordsRow] rowNumber]) { + for (int barcodeColumn = 1; barcodeColumn <= self.barcodeColumnCount; barcodeColumn++) { + ZXPDF417Codeword *codeword = [(ZXPDF417DetectionResultColumn *)self.detectionResultColumnsInternal[barcodeColumn] codewords][codewordsRow]; + if ((id)codeword == [NSNull null]) { + continue; + } + codeword.rowNumber = [(ZXPDF417Codeword *)LRIcodewords[codewordsRow] rowNumber]; + if (![codeword hasValidRowNumber]) { + [(ZXPDF417DetectionResultColumn *)self.detectionResultColumnsInternal[barcodeColumn] codewords][codewordsRow] = [NSNull null]; + } + } + } + } +} + +- (int)adjustRowNumbersFromRRI { + if (self.detectionResultColumnsInternal[self.barcodeColumnCount + 1] == [NSNull null]) { + return 0; + } + int unadjustedCount = 0; + NSArray *codewords = [self.detectionResultColumnsInternal[self.barcodeColumnCount + 1] codewords]; + for (int codewordsRow = 0; codewordsRow < [codewords count]; codewordsRow++) { + if ((id)codewords[codewordsRow] == [NSNull null]) { + continue; + } + int rowIndicatorRowNumber = [codewords[codewordsRow] rowNumber]; + int invalidRowCounts = 0; + for (int barcodeColumn = self.barcodeColumnCount + 1; barcodeColumn > 0 && invalidRowCounts < ZX_PDF417_ADJUST_ROW_NUMBER_SKIP; barcodeColumn--) { + if (self.detectionResultColumnsInternal[barcodeColumn] != [NSNull null]) { + ZXPDF417Codeword *codeword = [self.detectionResultColumnsInternal[barcodeColumn] codewords][codewordsRow]; + if ((id)codeword != [NSNull null]) { + invalidRowCounts = [self adjustRowNumberIfValid:rowIndicatorRowNumber invalidRowCounts:invalidRowCounts codeword:codeword]; + if (![codeword hasValidRowNumber]) { + unadjustedCount++; + } + } + } + } + } + return unadjustedCount; +} + +- (int)adjustRowNumbersFromLRI { + if (self.detectionResultColumnsInternal[0] == [NSNull null]) { + return 0; + } + int unadjustedCount = 0; + NSArray *codewords = [self.detectionResultColumnsInternal[0] codewords]; + for (int codewordsRow = 0; codewordsRow < [codewords count]; codewordsRow++) { + if ((id)codewords[codewordsRow] == [NSNull null]) { + continue; + } + int rowIndicatorRowNumber = [codewords[codewordsRow] rowNumber]; + int invalidRowCounts = 0; + for (int barcodeColumn = 1; barcodeColumn < self.barcodeColumnCount + 1 && invalidRowCounts < ZX_PDF417_ADJUST_ROW_NUMBER_SKIP; barcodeColumn++) { + if (self.detectionResultColumnsInternal[barcodeColumn] != [NSNull null]) { + ZXPDF417Codeword *codeword = [self.detectionResultColumnsInternal[barcodeColumn] codewords][codewordsRow]; + if ((id)codeword != [NSNull null]) { + invalidRowCounts = [self adjustRowNumberIfValid:rowIndicatorRowNumber invalidRowCounts:invalidRowCounts codeword:codeword]; + if (![codeword hasValidRowNumber]) { + unadjustedCount++; + } + } + } + } + } + return unadjustedCount; +} + +- (int)adjustRowNumberIfValid:(int)rowIndicatorRowNumber invalidRowCounts:(int)invalidRowCounts codeword:(ZXPDF417Codeword *)codeword { + if (!codeword) { + return invalidRowCounts; + } + if (![codeword hasValidRowNumber]) { + if ([codeword isValidRowNumber:rowIndicatorRowNumber]) { + [codeword setRowNumber:rowIndicatorRowNumber]; + invalidRowCounts = 0; + } else { + ++invalidRowCounts; + } + } + return invalidRowCounts; +} + +- (void)adjustRowNumbers:(int)barcodeColumn codewordsRow:(int)codewordsRow codewords:(NSArray *)codewords { + ZXPDF417Codeword *codeword = codewords[codewordsRow]; + NSArray *previousColumnCodewords = [self.detectionResultColumnsInternal[barcodeColumn - 1] codewords]; + NSArray *nextColumnCodewords = previousColumnCodewords; + if (self.detectionResultColumnsInternal[barcodeColumn + 1] != [NSNull null]) { + nextColumnCodewords = [self.detectionResultColumnsInternal[barcodeColumn + 1] codewords]; + } + + NSMutableArray *otherCodewords = [NSMutableArray arrayWithCapacity:14]; + for (int i = 0; i < 14; i++) { + [otherCodewords addObject:[NSNull null]]; + } + + otherCodewords[2] = previousColumnCodewords[codewordsRow]; + otherCodewords[3] = nextColumnCodewords[codewordsRow]; + + if (codewordsRow > 0) { + otherCodewords[0] = codewords[codewordsRow - 1]; + otherCodewords[4] = previousColumnCodewords[codewordsRow - 1]; + otherCodewords[5] = nextColumnCodewords[codewordsRow - 1]; + } + if (codewordsRow > 1) { + otherCodewords[8] = codewords[codewordsRow - 2]; + otherCodewords[10] = previousColumnCodewords[codewordsRow - 2]; + otherCodewords[11] = nextColumnCodewords[codewordsRow - 2]; + } + if (codewordsRow < [codewords count] - 1) { + otherCodewords[1] = codewords[codewordsRow + 1]; + otherCodewords[6] = previousColumnCodewords[codewordsRow + 1]; + otherCodewords[7] = nextColumnCodewords[codewordsRow + 1]; + } + if (codewordsRow < [codewords count] - 2) { + otherCodewords[9] = codewords[codewordsRow + 2]; + otherCodewords[12] = previousColumnCodewords[codewordsRow + 2]; + otherCodewords[13] = nextColumnCodewords[codewordsRow + 2]; + } + for (ZXPDF417Codeword *otherCodeword in otherCodewords) { + if ([self adjustRowNumber:codeword otherCodeword:otherCodeword]) { + return; + } + } +} + +/** + * @return true, if row number was adjusted, false otherwise + */ +- (BOOL)adjustRowNumber:(ZXPDF417Codeword *)codeword otherCodeword:(ZXPDF417Codeword *)otherCodeword { + if ((id)otherCodeword == [NSNull null]) { + return NO; + } + if ([otherCodeword hasValidRowNumber] && otherCodeword.bucket == codeword.bucket) { + [codeword setRowNumber:otherCodeword.rowNumber]; + return YES; + } + return NO; +} + +- (int)barcodeRowCount { + return self.barcodeMetadata.rowCount; +} + +- (int)barcodeECLevel { + return self.barcodeMetadata.errorCorrectionLevel; +} + +- (void)setDetectionResultColumn:(int)barcodeColumn detectionResultColumn:(ZXPDF417DetectionResultColumn *)detectionResultColumn { + if (!detectionResultColumn) { + self.detectionResultColumnsInternal[barcodeColumn] = [NSNull null]; + } else { + self.detectionResultColumnsInternal[barcodeColumn] = detectionResultColumn; + } +} + +- (ZXPDF417DetectionResultColumn *)detectionResultColumn:(int)barcodeColumn { + ZXPDF417DetectionResultColumn *result = self.detectionResultColumnsInternal[barcodeColumn]; + return (id)result == [NSNull null] ? nil : result; +} + +- (NSString *)description { + ZXPDF417DetectionResultColumn *rowIndicatorColumn = self.detectionResultColumnsInternal[0]; + if ((id)rowIndicatorColumn == [NSNull null]) { + rowIndicatorColumn = self.detectionResultColumnsInternal[self.barcodeColumnCount + 1]; + } + NSMutableString *result = [NSMutableString string]; + for (int codewordsRow = 0; codewordsRow < [rowIndicatorColumn.codewords count]; codewordsRow++) { + [result appendFormat:@"CW %3d:", codewordsRow]; + for (int barcodeColumn = 0; barcodeColumn < self.barcodeColumnCount + 2; barcodeColumn++) { + if (self.detectionResultColumnsInternal[barcodeColumn] == [NSNull null]) { + [result appendString:@" | "]; + continue; + } + ZXPDF417Codeword *codeword = [(ZXPDF417DetectionResultColumn *)self.detectionResultColumnsInternal[barcodeColumn] codewords][codewordsRow]; + if ((id)codeword == [NSNull null]) { + [result appendString:@" | "]; + continue; + } + [result appendFormat:@" %3d|%3d", codeword.rowNumber, codeword.value]; + } + [result appendString:@"\n"]; + } + + return [NSString stringWithString:result]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.h new file mode 100644 index 0000000..3a63cd9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.h @@ -0,0 +1,30 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXPDF417BoundingBox, ZXPDF417Codeword; + +@interface ZXPDF417DetectionResultColumn : NSObject + +@property (nonatomic, strong, readonly) ZXPDF417BoundingBox *boundingBox; +@property (nonatomic, strong, readonly) NSMutableArray *codewords; + +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox; +- (ZXPDF417Codeword *)codewordNearby:(int)imageRow; +- (int)imageRowToCodewordIndex:(int)imageRow; +- (void)setCodeword:(int)imageRow codeword:(ZXPDF417Codeword *)codeword; +- (ZXPDF417Codeword *)codeword:(int)imageRow; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.m new file mode 100644 index 0000000..88efbab --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.m @@ -0,0 +1,91 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417BoundingBox.h" +#import "ZXPDF417Codeword.h" +#import "ZXPDF417DetectionResultColumn.h" + +const int ZX_PDF417_MAX_NEARBY_DISTANCE = 5; + +@implementation ZXPDF417DetectionResultColumn + +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox { + self = [super init]; + if (self) { + _boundingBox = [[ZXPDF417BoundingBox alloc] initWithBoundingBox:boundingBox]; + _codewords = [NSMutableArray array]; + for (int i = 0; i < boundingBox.maxY - boundingBox.minY + 1; i++) { + [_codewords addObject:[NSNull null]]; + } + } + + return self; +} + +- (ZXPDF417Codeword *)codewordNearby:(int)imageRow { + ZXPDF417Codeword *codeword = [self codeword:imageRow]; + if (codeword) { + return codeword; + } + for (int i = 1; i < ZX_PDF417_MAX_NEARBY_DISTANCE; i++) { + int nearImageRow = [self imageRowToCodewordIndex:imageRow] - i; + if (nearImageRow >= 0) { + codeword = self.codewords[nearImageRow]; + if ((id)codeword != [NSNull null]) { + return codeword; + } + } + nearImageRow = [self imageRowToCodewordIndex:imageRow] + i; + if (nearImageRow < [self.codewords count]) { + codeword = self.codewords[nearImageRow]; + if ((id)codeword != [NSNull null]) { + return codeword; + } + } + } + return nil; +} + +- (int)imageRowToCodewordIndex:(int)imageRow { + return imageRow - self.boundingBox.minY; +} + +- (void)setCodeword:(int)imageRow codeword:(ZXPDF417Codeword *)codeword { + _codewords[[self imageRowToCodewordIndex:imageRow]] = codeword; +} + +- (ZXPDF417Codeword *)codeword:(int)imageRow { + NSUInteger index = [self imageRowToCodewordIndex:imageRow]; + if (_codewords[index] == [NSNull null]) { + return nil; + } + return _codewords[index]; +} + +- (NSString *)description { + NSMutableString *result = [NSMutableString string]; + int row = 0; + for (ZXPDF417Codeword *codeword in self.codewords) { + if ((id)codeword == [NSNull null]) { + [result appendFormat:@"%3d: | \n", row++]; + continue; + } + [result appendFormat:@"%3d: %3d|%3d\n", row++, codeword.rowNumber, codeword.value]; + } + return [NSString stringWithString:result]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.h new file mode 100644 index 0000000..a20b039 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.h @@ -0,0 +1,30 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417DetectionResultColumn.h" + +@class ZXIntArray, ZXPDF417BarcodeMetadata, ZXPDF417BoundingBox; + +@interface ZXPDF417DetectionResultRowIndicatorColumn : ZXPDF417DetectionResultColumn + +@property (nonatomic, assign, readonly) BOOL isLeft; + +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox isLeft:(BOOL)isLeft; +- (BOOL)getRowHeights:(ZXIntArray **)rowHeights; +- (int)adjustCompleteIndicatorColumnRowNumbers:(ZXPDF417BarcodeMetadata *)barcodeMetadata; +- (ZXPDF417BarcodeMetadata *)barcodeMetadata; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.m new file mode 100644 index 0000000..05a5a03 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.m @@ -0,0 +1,265 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXPDF417BarcodeMetadata.h" +#import "ZXPDF417BarcodeValue.h" +#import "ZXPDF417BoundingBox.h" +#import "ZXPDF417Codeword.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417DetectionResult.h" +#import "ZXPDF417DetectionResultRowIndicatorColumn.h" +#import "ZXResultPoint.h" + +@implementation ZXPDF417DetectionResultRowIndicatorColumn + +- (id)initWithBoundingBox:(ZXPDF417BoundingBox *)boundingBox isLeft:(BOOL)isLeft { + self = [super initWithBoundingBox:boundingBox]; + if (self) { + _isLeft = isLeft; + } + + return self; +} + +- (void)setRowNumbers { + for (ZXPDF417Codeword *codeword in [self codewords]) { + if ((id)codeword != [NSNull null]) { + [codeword setRowNumberAsRowIndicatorColumn]; + } + } +} + +// TODO implement properly +// TODO maybe we should add missing codewords to store the correct row number to make +// finding row numbers for other columns easier +// use row height count to make detection of invalid row numbers more reliable +- (int)adjustCompleteIndicatorColumnRowNumbers:(ZXPDF417BarcodeMetadata *)barcodeMetadata { + [self setRowNumbers]; + [self removeIncorrectCodewords:barcodeMetadata]; + ZXResultPoint *top = self.isLeft ? self.boundingBox.topLeft : self.boundingBox.topRight; + ZXResultPoint *bottom = self.isLeft ? self.boundingBox.bottomLeft : self.boundingBox.bottomRight; + int firstRow = [self imageRowToCodewordIndex:(int) top.y]; + int lastRow = [self imageRowToCodewordIndex:(int) bottom.y]; + // We need to be careful using the average row height. Barcode could be skewed so that we have smaller and + // taller rows + float averageRowHeight = (lastRow - firstRow) / (float) barcodeMetadata.rowCount; + int barcodeRow = -1; + int maxRowHeight = 1; + int currentRowHeight = 0; + for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (self.codewords[codewordsRow] == [NSNull null]) { + continue; + } + ZXPDF417Codeword *codeword = self.codewords[codewordsRow]; + + // float expectedRowNumber = (codewordsRow - firstRow) / averageRowHeight; + // if (Math.abs(codeword.getRowNumber() - expectedRowNumber) > 2) { + // SimpleLog.log(LEVEL.WARNING, + // "Removing codeword, rowNumberSkew too high, codeword[" + codewordsRow + "]: Expected Row: " + + // expectedRowNumber + ", RealRow: " + codeword.getRowNumber() + ", value: " + codeword.getValue()); + // codewords[codewordsRow] = null; + // } + + int rowDifference = codeword.rowNumber - barcodeRow; + + // TODO improve handling with case where first row indicator doesn't start with 0 + + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = MAX(maxRowHeight, currentRowHeight); + currentRowHeight = 1; + barcodeRow = codeword.rowNumber; + } else if (rowDifference < 0 || + codeword.rowNumber >= barcodeMetadata.rowCount || + rowDifference > codewordsRow) { + self.codewords[codewordsRow] = [NSNull null]; + } else { + int checkedRows; + if (maxRowHeight > 2) { + checkedRows = (maxRowHeight - 2) * rowDifference; + } else { + checkedRows = rowDifference; + } + BOOL closePreviousCodewordFound = checkedRows >= codewordsRow; + for (int i = 1; i <= checkedRows && !closePreviousCodewordFound; i++) { + // there must be (height * rowDifference) number of codewords missing. For now we assume height = 1. + // This should hopefully get rid of most problems already. + closePreviousCodewordFound = self.codewords[codewordsRow - i] != [NSNull null]; + } + if (closePreviousCodewordFound) { + self.codewords[codewordsRow] = [NSNull null]; + } else { + barcodeRow = codeword.rowNumber; + currentRowHeight = 1; + } + } + } + return (int) (averageRowHeight + 0.5); +} + +- (BOOL)getRowHeights:(ZXIntArray **)rowHeights { + ZXPDF417BarcodeMetadata *barcodeMetadata = [self barcodeMetadata]; + if (!barcodeMetadata) { + *rowHeights = nil; + return YES; + } + [self adjustIncompleteIndicatorColumnRowNumbers:barcodeMetadata]; + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:barcodeMetadata.rowCount]; + for (ZXPDF417Codeword *codeword in [self codewords]) { + if ((id)codeword != [NSNull null]) { + int rowNumber = codeword.rowNumber; + if (rowNumber >= result.length) { + *rowHeights = nil; + return NO; + } + result.array[rowNumber]++; + } // else throw exception? + } + *rowHeights = result; + return YES; +} + +// TODO maybe we should add missing codewords to store the correct row number to make +// finding row numbers for other columns easier +// use row height count to make detection of invalid row numbers more reliable +- (int)adjustIncompleteIndicatorColumnRowNumbers:(ZXPDF417BarcodeMetadata *)barcodeMetadata { + ZXResultPoint *top = self.isLeft ? self.boundingBox.topLeft : self.boundingBox.topRight; + ZXResultPoint *bottom = self.isLeft ? self.boundingBox.bottomLeft : self.boundingBox.bottomRight; + int firstRow = [self imageRowToCodewordIndex:(int) top.y]; + int lastRow = [self imageRowToCodewordIndex:(int) bottom.y]; + float averageRowHeight = (lastRow - firstRow) / (float) barcodeMetadata.rowCount; + int barcodeRow = -1; + int maxRowHeight = 1; + int currentRowHeight = 0; + for (int codewordsRow = firstRow; codewordsRow < lastRow; codewordsRow++) { + if (self.codewords[codewordsRow] == [NSNull null]) { + continue; + } + ZXPDF417Codeword *codeword = self.codewords[codewordsRow]; + + [codeword setRowNumberAsRowIndicatorColumn]; + + int rowDifference = codeword.rowNumber - barcodeRow; + + // TODO improve handling with case where first row indicator doesn't start with 0 + + if (rowDifference == 0) { + currentRowHeight++; + } else if (rowDifference == 1) { + maxRowHeight = MAX(maxRowHeight, currentRowHeight); + currentRowHeight = 1; + barcodeRow = codeword.rowNumber; + } else if (codeword.rowNumber >= barcodeMetadata.rowCount) { + self.codewords[codewordsRow] = [NSNull null]; + } else { + barcodeRow = codeword.rowNumber; + currentRowHeight = 1; + } + } + return (int) (averageRowHeight + 0.5); +} + +- (ZXPDF417BarcodeMetadata *)barcodeMetadata { + ZXPDF417BarcodeValue *barcodeColumnCount = [[ZXPDF417BarcodeValue alloc] init]; + ZXPDF417BarcodeValue *barcodeRowCountUpperPart = [[ZXPDF417BarcodeValue alloc] init]; + ZXPDF417BarcodeValue *barcodeRowCountLowerPart = [[ZXPDF417BarcodeValue alloc] init]; + ZXPDF417BarcodeValue *barcodeECLevel = [[ZXPDF417BarcodeValue alloc] init]; + for (ZXPDF417Codeword *codeword in self.codewords) { + if ((id)codeword == [NSNull null]) { + continue; + } + [codeword setRowNumberAsRowIndicatorColumn]; + int rowIndicatorValue = codeword.value % 30; + int codewordRowNumber = codeword.rowNumber; + if (!self.isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + [barcodeRowCountUpperPart setValue:rowIndicatorValue * 3 + 1]; + break; + case 1: + [barcodeECLevel setValue:rowIndicatorValue / 3]; + [barcodeRowCountLowerPart setValue:rowIndicatorValue % 3]; + break; + case 2: + [barcodeColumnCount setValue:rowIndicatorValue + 1]; + break; + } + } + // Maybe we should check if we have ambiguous values? + if (([barcodeColumnCount value].length == 0) || + ([barcodeRowCountUpperPart value].length == 0) || + ([barcodeRowCountLowerPart value].length == 0) || + ([barcodeECLevel value].length == 0) || + [barcodeColumnCount value].array[0] < 1 || + [barcodeRowCountUpperPart value].array[0] + [barcodeRowCountLowerPart value].array[0] < ZX_PDF417_MIN_ROWS_IN_BARCODE || + [barcodeRowCountUpperPart value].array[0] + [barcodeRowCountLowerPart value].array[0] > ZX_PDF417_MAX_ROWS_IN_BARCODE) { + return nil; + } + ZXPDF417BarcodeMetadata *barcodeMetadata = [[ZXPDF417BarcodeMetadata alloc] initWithColumnCount:[barcodeColumnCount value].array[0] + rowCountUpperPart:[barcodeRowCountUpperPart value].array[0] + rowCountLowerPart:[barcodeRowCountLowerPart value].array[0] + errorCorrectionLevel:[barcodeECLevel value].array[0]]; + [self removeIncorrectCodewords:barcodeMetadata]; + return barcodeMetadata; +} + +- (void)removeIncorrectCodewords:(ZXPDF417BarcodeMetadata *)barcodeMetadata { + // Remove codewords which do not match the metadata + // TODO Maybe we should keep the incorrect codewords for the start and end positions? + for (int codewordRow = 0; codewordRow < [self.codewords count]; codewordRow++) { + ZXPDF417Codeword *codeword = self.codewords[codewordRow]; + if (self.codewords[codewordRow] == [NSNull null]) { + continue; + } + int rowIndicatorValue = codeword.value % 30; + int codewordRowNumber = codeword.rowNumber; + if (codewordRowNumber > barcodeMetadata.rowCount) { + self.codewords[codewordRow] = [NSNull null]; + continue; + } + if (!self.isLeft) { + codewordRowNumber += 2; + } + switch (codewordRowNumber % 3) { + case 0: + if (rowIndicatorValue * 3 + 1 != barcodeMetadata.rowCountUpperPart) { + self.codewords[codewordRow] = [NSNull null]; + } + break; + case 1: + if (rowIndicatorValue / 3 != barcodeMetadata.errorCorrectionLevel || + rowIndicatorValue % 3 != barcodeMetadata.rowCountLowerPart) { + self.codewords[codewordRow] = [NSNull null]; + } + break; + case 2: + if (rowIndicatorValue + 1 != barcodeMetadata.columnCount) { + self.codewords[codewordRow] = [NSNull null]; + } + break; + } + } +} + +- (NSString *)description { + return [NSString stringWithFormat:@"IsLeft: %@\n%@", @(self.isLeft), [super description]]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.h new file mode 100644 index 0000000..16fad12 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.h @@ -0,0 +1,31 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDecoderResult, ZXResultPoint; + +@interface ZXPDF417ScanningDecoder : NSObject + ++ (ZXDecoderResult *)decode:(ZXBitMatrix *)image + imageTopLeft:(ZXResultPoint *)imageTopLeft + imageBottomLeft:(ZXResultPoint *)imageBottomLeft + imageTopRight:(ZXResultPoint *)imageTopRight + imageBottomRight:(ZXResultPoint *)imageBottomRight + minCodewordWidth:(int)minCodewordWidth + maxCodewordWidth:(int)maxCodewordWidth + error:(NSError **)error; +- (NSString *)description:(NSArray *)barcodeMatrix; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.m new file mode 100644 index 0000000..43d0831 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.m @@ -0,0 +1,685 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXPDF417BarcodeMetadata.h" +#import "ZXPDF417BarcodeValue.h" +#import "ZXPDF417BoundingBox.h" +#import "ZXPDF417Codeword.h" +#import "ZXPDF417CodewordDecoder.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417DecodedBitStreamParser.h" +#import "ZXPDF417DetectionResult.h" +#import "ZXPDF417DetectionResultRowIndicatorColumn.h" +#import "ZXPDF417ECErrorCorrection.h" +#import "ZXPDF417ScanningDecoder.h" +#import "ZXResultPoint.h" + +const int ZX_PDF417_CODEWORD_SKEW_SIZE = 2; + +const int ZX_PDF417_MAX_ERRORS = 3; +const int ZX_PDF417_MAX_EC_CODEWORDS = 512; +static ZXPDF417ECErrorCorrection *errorCorrection; + +@implementation ZXPDF417ScanningDecoder + ++ (void)initialize { + if ([self class] != [ZXPDF417ScanningDecoder class]) return; + + errorCorrection = [[ZXPDF417ECErrorCorrection alloc] init]; +} + +// TODO don't pass in minCodewordWidth and maxCodewordWidth, pass in barcode columns for start and stop pattern +// columns. That way width can be deducted from the pattern column. +// This approach also allows to detect more details about the barcode, e.g. if a bar type (white or black) is wider +// than it should be. This can happen if the scanner used a bad blackpoint. ++ (ZXDecoderResult *)decode:(ZXBitMatrix *)image + imageTopLeft:(ZXResultPoint *)imageTopLeft + imageBottomLeft:(ZXResultPoint *)imageBottomLeft + imageTopRight:(ZXResultPoint *)imageTopRight + imageBottomRight:(ZXResultPoint *)imageBottomRight + minCodewordWidth:(int)minCodewordWidth + maxCodewordWidth:(int)maxCodewordWidth + error:(NSError **)error { + ZXPDF417BoundingBox *boundingBox = [[ZXPDF417BoundingBox alloc] initWithImage:image topLeft:imageTopLeft bottomLeft:imageBottomLeft topRight:imageTopRight bottomRight:imageBottomRight]; + ZXPDF417DetectionResultRowIndicatorColumn *leftRowIndicatorColumn; + ZXPDF417DetectionResultRowIndicatorColumn *rightRowIndicatorColumn; + ZXPDF417DetectionResult *detectionResult; + for (int i = 0; i < 2; i++) { + if (imageTopLeft) { + leftRowIndicatorColumn = [self rowIndicatorColumn:image boundingBox:boundingBox startPoint:imageTopLeft leftToRight:YES + minCodewordWidth:minCodewordWidth maxCodewordWidth:maxCodewordWidth]; + } + if (imageTopRight) { + rightRowIndicatorColumn = [self rowIndicatorColumn:image boundingBox:boundingBox startPoint:imageTopRight leftToRight:NO + minCodewordWidth:minCodewordWidth maxCodewordWidth:maxCodewordWidth]; + } + detectionResult = [self merge:leftRowIndicatorColumn rightRowIndicatorColumn:rightRowIndicatorColumn error:error]; + if (!detectionResult) { + return nil; + } + if (i == 0 && detectionResult.boundingBox && + (detectionResult.boundingBox.minY < boundingBox.minY || + detectionResult.boundingBox.maxY > boundingBox.maxY)) { + boundingBox = [detectionResult boundingBox]; + } else { + detectionResult.boundingBox = boundingBox; + break; + } + } + int maxBarcodeColumn = detectionResult.barcodeColumnCount + 1; + [detectionResult setDetectionResultColumn:0 detectionResultColumn:leftRowIndicatorColumn]; + [detectionResult setDetectionResultColumn:maxBarcodeColumn detectionResultColumn:rightRowIndicatorColumn]; + + BOOL leftToRight = leftRowIndicatorColumn != nil; + for (int barcodeColumnCount = 1; barcodeColumnCount <= maxBarcodeColumn; barcodeColumnCount++) { + int barcodeColumn = leftToRight ? barcodeColumnCount : maxBarcodeColumn - barcodeColumnCount; + if ([detectionResult detectionResultColumn:barcodeColumn]) { + // This will be the case for the opposite row indicator column, which doesn't need to be decoded again. + continue; + } + ZXPDF417DetectionResultColumn *detectionResultColumn; + if (barcodeColumn == 0 || barcodeColumn == maxBarcodeColumn) { + detectionResultColumn = [[ZXPDF417DetectionResultRowIndicatorColumn alloc] initWithBoundingBox:boundingBox isLeft:barcodeColumn == 0]; + } else { + detectionResultColumn = [[ZXPDF417DetectionResultColumn alloc] initWithBoundingBox:boundingBox]; + } + [detectionResult setDetectionResultColumn:barcodeColumn detectionResultColumn:detectionResultColumn]; + int startColumn = -1; + int previousStartColumn = startColumn; + // TODO start at a row for which we know the start position, then detect upwards and downwards from there. + for (int imageRow = boundingBox.minY; imageRow <= boundingBox.maxY; imageRow++) { + startColumn = [self startColumn:detectionResult barcodeColumn:barcodeColumn imageRow:imageRow leftToRight:leftToRight]; + if (startColumn < 0 || startColumn > boundingBox.maxX) { + if (previousStartColumn == -1) { + continue; + } + startColumn = previousStartColumn; + } + ZXPDF417Codeword *codeword = [self detectCodeword:image minColumn:boundingBox.minX maxColumn:boundingBox.maxX leftToRight:leftToRight + startColumn:startColumn imageRow:imageRow minCodewordWidth:minCodewordWidth maxCodewordWidth:maxCodewordWidth]; + if (codeword) { + [detectionResultColumn setCodeword:imageRow codeword:codeword]; + previousStartColumn = startColumn; + minCodewordWidth = MIN(minCodewordWidth, codeword.width); + maxCodewordWidth = MAX(maxCodewordWidth, codeword.width); + } + } + } + return [self createDecoderResult:detectionResult error:error]; +} + ++ (ZXPDF417DetectionResult *)merge:(ZXPDF417DetectionResultRowIndicatorColumn *)leftRowIndicatorColumn + rightRowIndicatorColumn:(ZXPDF417DetectionResultRowIndicatorColumn *)rightRowIndicatorColumn + error:(NSError **)error { + if (!leftRowIndicatorColumn && !rightRowIndicatorColumn) { + return nil; + } + ZXPDF417BarcodeMetadata *barcodeMetadata = [self barcodeMetadata:leftRowIndicatorColumn rightRowIndicatorColumn:rightRowIndicatorColumn]; + if (!barcodeMetadata) { + return nil; + } + ZXPDF417BoundingBox *leftBoundingBox, *rightBoundingBox; + if (![self adjustBoundingBox:&leftBoundingBox rowIndicatorColumn:leftRowIndicatorColumn error:error]) { + return nil; + } + if (![self adjustBoundingBox:&rightBoundingBox rowIndicatorColumn:rightRowIndicatorColumn error:error]) { + return nil; + } + + ZXPDF417BoundingBox *boundingBox = [ZXPDF417BoundingBox mergeLeftBox:leftBoundingBox rightBox:rightBoundingBox]; + if (!boundingBox) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + return [[ZXPDF417DetectionResult alloc] initWithBarcodeMetadata:barcodeMetadata boundingBox:boundingBox]; +} + ++ (BOOL)adjustBoundingBox:(ZXPDF417BoundingBox **)boundingBox + rowIndicatorColumn:(ZXPDF417DetectionResultRowIndicatorColumn *)rowIndicatorColumn + error:(NSError **)error { + if (!rowIndicatorColumn) { + *boundingBox = nil; + return YES; + } + ZXIntArray *rowHeights; + if (![rowIndicatorColumn getRowHeights:&rowHeights]) { + if (error) *error = ZXFormatErrorInstance(); + *boundingBox = nil; + return NO; + } + if (!rowHeights) { + *boundingBox = nil; + return YES; + } + int maxRowHeight = [self max:rowHeights]; + int missingStartRows = 0; + for (int i = 0; i < rowHeights.length; i++) { + int rowHeight = rowHeights.array[i]; + missingStartRows += maxRowHeight - rowHeight; + if (rowHeight > 0) { + break; + } + } + NSArray *codewords = rowIndicatorColumn.codewords; + for (int row = 0; missingStartRows > 0 && codewords[row] == [NSNull null]; row++) { + missingStartRows--; + } + int missingEndRows = 0; + for (int row = rowHeights.length - 1; row >= 0; row--) { + missingEndRows += maxRowHeight - rowHeights.array[row]; + if (rowHeights.array[row] > 0) { + break; + } + } + for (int row = (int)[codewords count] - 1; missingEndRows > 0 && codewords[row] == [NSNull null]; row--) { + missingEndRows--; + } + *boundingBox = [rowIndicatorColumn.boundingBox addMissingRows:missingStartRows + missingEndRows:missingEndRows + isLeft:rowIndicatorColumn.isLeft]; + return *boundingBox != nil; +} + ++ (int)max:(ZXIntArray *)values { + int maxValue = -1; + for (int i = 0; i < values.length; i++) { + int value = values.array[i]; + maxValue = MAX(maxValue, value); + } + return maxValue; +} + ++ (ZXPDF417BarcodeMetadata *)barcodeMetadata:(ZXPDF417DetectionResultRowIndicatorColumn *)leftRowIndicatorColumn + rightRowIndicatorColumn:(ZXPDF417DetectionResultRowIndicatorColumn *)rightRowIndicatorColumn { + ZXPDF417BarcodeMetadata *leftBarcodeMetadata; + if (!leftRowIndicatorColumn || + !(leftBarcodeMetadata = leftRowIndicatorColumn.barcodeMetadata)) { + return rightRowIndicatorColumn ? rightRowIndicatorColumn.barcodeMetadata : nil; + } + ZXPDF417BarcodeMetadata *rightBarcodeMetadata; + if (!rightRowIndicatorColumn || + !(rightBarcodeMetadata = rightRowIndicatorColumn.barcodeMetadata)) { + return leftRowIndicatorColumn.barcodeMetadata; + } + + if (leftBarcodeMetadata.columnCount != rightBarcodeMetadata.columnCount && + leftBarcodeMetadata.errorCorrectionLevel != rightBarcodeMetadata.errorCorrectionLevel && + leftBarcodeMetadata.rowCount != rightBarcodeMetadata.rowCount) { + return nil; + } + return leftBarcodeMetadata; +} + ++ (ZXPDF417DetectionResultRowIndicatorColumn *)rowIndicatorColumn:(ZXBitMatrix *)image + boundingBox:(ZXPDF417BoundingBox *)boundingBox + startPoint:(ZXResultPoint *)startPoint + leftToRight:(BOOL)leftToRight + minCodewordWidth:(int)minCodewordWidth + maxCodewordWidth:(int)maxCodewordWidth { + ZXPDF417DetectionResultRowIndicatorColumn *rowIndicatorColumn = [[ZXPDF417DetectionResultRowIndicatorColumn alloc] initWithBoundingBox:boundingBox + isLeft:leftToRight]; + for (int i = 0; i < 2; i++) { + int increment = i == 0 ? 1 : -1; + int startColumn = (int) startPoint.x; + for (int imageRow = (int) startPoint.y; imageRow <= boundingBox.maxY && + imageRow >= boundingBox.minY; imageRow += increment) { + ZXPDF417Codeword *codeword = [self detectCodeword:image minColumn:0 maxColumn:image.width leftToRight:leftToRight startColumn:startColumn imageRow:imageRow + minCodewordWidth:minCodewordWidth maxCodewordWidth:maxCodewordWidth]; + if (codeword) { + [rowIndicatorColumn setCodeword:imageRow codeword:codeword]; + if (leftToRight) { + startColumn = codeword.startX; + } else { + startColumn = codeword.endX; + } + } + } + } + return rowIndicatorColumn; +} + ++ (BOOL)adjustCodewordCount:(ZXPDF417DetectionResult *)detectionResult barcodeMatrix:(NSArray *)barcodeMatrix { + ZXIntArray *numberOfCodewords = [(ZXPDF417BarcodeValue *)barcodeMatrix[0][1] value]; + int calculatedNumberOfCodewords = [detectionResult barcodeColumnCount] * [detectionResult barcodeRowCount]; + [self numberOfECCodeWords:detectionResult.barcodeECLevel]; + if (numberOfCodewords.length == 0) { + if (calculatedNumberOfCodewords < 1 || calculatedNumberOfCodewords > ZX_PDF417_MAX_CODEWORDS_IN_BARCODE) { + return NO; + } + [(ZXPDF417BarcodeValue *)barcodeMatrix[0][1] setValue:calculatedNumberOfCodewords]; + } else if (numberOfCodewords.array[0] != calculatedNumberOfCodewords) { + // The calculated one is more reliable as it is derived from the row indicator columns + [(ZXPDF417BarcodeValue *)barcodeMatrix[0][1] setValue:calculatedNumberOfCodewords]; + } + + return YES; +} + ++ (ZXDecoderResult *)createDecoderResult:(ZXPDF417DetectionResult *)detectionResult error:(NSError **)error { + NSArray *barcodeMatrix = [self createBarcodeMatrix:detectionResult]; + if (!barcodeMatrix) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + if (![self adjustCodewordCount:detectionResult barcodeMatrix:barcodeMatrix]) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + NSMutableArray *erasures = [NSMutableArray array]; + ZXIntArray *codewords = [[ZXIntArray alloc] initWithLength:detectionResult.barcodeRowCount * detectionResult.barcodeColumnCount]; + NSMutableArray *ambiguousIndexValuesList = [NSMutableArray array]; + NSMutableArray *ambiguousIndexesList = [NSMutableArray array]; + for (int row = 0; row < detectionResult.barcodeRowCount; row++) { + for (int column = 0; column < detectionResult.barcodeColumnCount; column++) { + ZXIntArray *values = [(ZXPDF417BarcodeValue *)barcodeMatrix[row][column + 1] value]; + int codewordIndex = row * detectionResult.barcodeColumnCount + column; + if (values.length == 0) { + [erasures addObject:@(codewordIndex)]; + } else if (values.length == 1) { + codewords.array[codewordIndex] = values.array[0]; + } else { + [ambiguousIndexesList addObject:@(codewordIndex)]; + [ambiguousIndexValuesList addObject:values]; + } + } + } + return [self createDecoderResultFromAmbiguousValues:detectionResult.barcodeECLevel + codewords:codewords + erasureArray:[ZXPDF417Common toIntArray:erasures] + ambiguousIndexes:[ZXPDF417Common toIntArray:ambiguousIndexesList] + ambiguousIndexValues:ambiguousIndexValuesList + error:error]; +} + +/** + * This method deals with the fact, that the decoding process doesn't always yield a single most likely value. The + * current error correction implementation doesn't deal with erasures very well, so it's better to provide a value + * for these ambiguous codewords instead of treating it as an erasure. The problem is that we don't know which of + * the ambiguous values to choose. We try decode using the first value, and if that fails, we use another of the + * ambiguous values and try to decode again. This usually only happens on very hard to read and decode barcodes, + * so decoding the normal barcodes is not affected by this. + * + * @param erasureArray contains the indexes of erasures + * @param ambiguousIndexes array with the indexes that have more than one most likely value + * @param ambiguousIndexValues two dimensional array that contains the ambiguous values. The first dimension must + * be the same length as the ambiguousIndexes array + */ ++ (ZXDecoderResult *)createDecoderResultFromAmbiguousValues:(int)ecLevel + codewords:(ZXIntArray *)codewords + erasureArray:(ZXIntArray *)erasureArray + ambiguousIndexes:(ZXIntArray *)ambiguousIndexes + ambiguousIndexValues:(NSArray *)ambiguousIndexValues + error:(NSError **)error { + ZXIntArray *ambiguousIndexCount = [[ZXIntArray alloc] initWithLength:ambiguousIndexes.length]; + + int tries = 100; + while (tries-- > 0) { + for (int i = 0; i < ambiguousIndexCount.length; i++) { + ZXIntArray *a = ambiguousIndexValues[i]; + codewords.array[ambiguousIndexes.array[i]] = a.array[(ambiguousIndexCount.array[i] + 1) % [(ZXIntArray *)ambiguousIndexValues[i] length]]; + } + NSError *e; + ZXDecoderResult *result = [self decodeCodewords:codewords ecLevel:ecLevel erasures:erasureArray error:&e]; + if (result) { + return result; + } else if (e.code != ZXChecksumError) { + if (error) *error = e; + return nil; + } + if (ambiguousIndexCount.length == 0) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + for (int i = 0; i < ambiguousIndexCount.length; i++) { + if (ambiguousIndexCount.array[i] < [(ZXIntArray *)ambiguousIndexValues[i] length] - 1) { + ambiguousIndexCount.array[i]++; + break; + } else { + ambiguousIndexCount.array[i] = 0; + if (i == ambiguousIndexes.length - 1) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + } + } + } + + if (error) *error = ZXChecksumErrorInstance(); + return nil; +} + ++ (NSArray *)createBarcodeMatrix:(ZXPDF417DetectionResult *)detectionResult { + NSMutableArray *barcodeMatrix = [NSMutableArray array]; + for (int row = 0; row < detectionResult.barcodeRowCount; row++) { + [barcodeMatrix addObject:[NSMutableArray array]]; + for (int column = 0; column < detectionResult.barcodeColumnCount + 2; column++) { + barcodeMatrix[row][column] = [[ZXPDF417BarcodeValue alloc] init]; + } + } + + int column = 0; + for (ZXPDF417DetectionResultColumn *detectionResultColumn in [detectionResult detectionResultColumns]) { + if ((id)detectionResultColumn != [NSNull null]) { + for (ZXPDF417Codeword *codeword in detectionResultColumn.codewords) { + if ((id)codeword != [NSNull null]) { + int rowNumber = codeword.rowNumber; + if (rowNumber >= 0) { + if (rowNumber >= barcodeMatrix.count) { + return nil; + } + [(ZXPDF417BarcodeValue *)barcodeMatrix[rowNumber][column] setValue:codeword.value]; + } + } + } + } + column++; + } + + return barcodeMatrix; +} + ++ (BOOL)isValidBarcodeColumn:(ZXPDF417DetectionResult *)detectionResult barcodeColumn:(int)barcodeColumn { + return barcodeColumn >= 0 && barcodeColumn <= detectionResult.barcodeColumnCount + 1; +} + ++ (int)startColumn:(ZXPDF417DetectionResult *)detectionResult + barcodeColumn:(int)barcodeColumn + imageRow:(int)imageRow + leftToRight:(BOOL)leftToRight { + int offset = leftToRight ? 1 : -1; + ZXPDF417Codeword *codeword; + if ([self isValidBarcodeColumn:detectionResult barcodeColumn:barcodeColumn - offset]) { + codeword = [[detectionResult detectionResultColumn:barcodeColumn - offset] codeword:imageRow]; + } + if (codeword) { + return leftToRight ? codeword.endX : codeword.startX; + } + codeword = [[detectionResult detectionResultColumn:barcodeColumn] codewordNearby:imageRow]; + if (codeword) { + return leftToRight ? codeword.startX : codeword.endX; + } + if ([self isValidBarcodeColumn:detectionResult barcodeColumn:barcodeColumn - offset]) { + codeword = [[detectionResult detectionResultColumn:barcodeColumn - offset] codewordNearby:imageRow]; + } + if (codeword) { + return leftToRight ? codeword.endX : codeword.startX; + } + int skippedColumns = 0; + + while ([self isValidBarcodeColumn:detectionResult barcodeColumn:barcodeColumn - offset]) { + barcodeColumn -= offset; + for (ZXPDF417Codeword *previousRowCodeword in [detectionResult detectionResultColumn:barcodeColumn].codewords) { + if ((id)previousRowCodeword != [NSNull null]) { + return (leftToRight ? previousRowCodeword.endX : previousRowCodeword.startX) + + offset * + skippedColumns * + (previousRowCodeword.endX - previousRowCodeword.startX); + } + } + skippedColumns++; + } + return leftToRight ? detectionResult.boundingBox.minX : detectionResult.boundingBox.maxX; +} + ++ (ZXPDF417Codeword *)detectCodeword:(ZXBitMatrix *)image + minColumn:(int)minColumn + maxColumn:(int)maxColumn + leftToRight:(BOOL)leftToRight + startColumn:(int)startColumn + imageRow:(int)imageRow + minCodewordWidth:(int)minCodewordWidth + maxCodewordWidth:(int)maxCodewordWidth { + startColumn = [self adjustCodewordStartColumn:image minColumn:minColumn maxColumn:maxColumn leftToRight:leftToRight codewordStartColumn:startColumn imageRow:imageRow]; + // we usually know fairly exact now how long a codeword is. We should provide minimum and maximum expected length + // and try to adjust the read pixels, e.g. remove single pixel errors or try to cut off exceeding pixels. + // min and maxCodewordWidth should not be used as they are calculated for the whole barcode an can be inaccurate + // for the current position + NSMutableArray *moduleBitCount = [self moduleBitCount:image minColumn:minColumn maxColumn:maxColumn leftToRight:leftToRight startColumn:startColumn imageRow:imageRow]; + if (!moduleBitCount) { + return nil; + } + int endColumn; + int codewordBitCount = [ZXPDF417Common bitCountSum:moduleBitCount]; + if (leftToRight) { + endColumn = startColumn + codewordBitCount; + } else { + for (int i = 0; i < [moduleBitCount count] / 2; i++) { + int tmpCount = [moduleBitCount[i] intValue]; + moduleBitCount[i] = moduleBitCount[[moduleBitCount count] - 1 - i]; + moduleBitCount[[moduleBitCount count] - 1 - i] = @(tmpCount); + } + endColumn = startColumn; + startColumn = endColumn - codewordBitCount; + } + // TODO implement check for width and correction of black and white bars + // use start (and maybe stop pattern) to determine if blackbars are wider than white bars. If so, adjust. + // should probably done only for codewords with a lot more than 17 bits. + // The following fixes 10-1.png, which has wide black bars and small white bars + // for (int i = 0; i < moduleBitCount.length; i++) { + // if (i % 2 == 0) { + // moduleBitCount[i]--; + // } else { + // moduleBitCount[i]++; + // } + // } + + // We could also use the width of surrounding codewords for more accurate results, but this seems + // sufficient for now + if (![self checkCodewordSkew:codewordBitCount minCodewordWidth:minCodewordWidth maxCodewordWidth:maxCodewordWidth]) { + // We could try to use the startX and endX position of the codeword in the same column in the previous row, + // create the bit count from it and normalize it to 8. This would help with single pixel errors. + return nil; + } + + int decodedValue = [ZXPDF417CodewordDecoder decodedValue:moduleBitCount]; + int codeword = [ZXPDF417Common codeword:decodedValue]; + if (codeword == -1) { + return nil; + } + return [[ZXPDF417Codeword alloc] initWithStartX:startColumn endX:endColumn bucket:[self codewordBucketNumber:decodedValue] value:codeword]; +} + ++ (NSMutableArray *)moduleBitCount:(ZXBitMatrix *)image + minColumn:(int)minColumn + maxColumn:(int)maxColumn + leftToRight:(BOOL)leftToRight + startColumn:(int)startColumn + imageRow:(int)imageRow { + int imageColumn = startColumn; + NSMutableArray *moduleBitCount = [NSMutableArray arrayWithCapacity:8]; + for (int i = 0; i < 8; i++) { + [moduleBitCount addObject:@0]; + } + int moduleNumber = 0; + int increment = leftToRight ? 1 : -1; + BOOL previousPixelValue = leftToRight; + while (((leftToRight && imageColumn < maxColumn) || (!leftToRight && imageColumn >= minColumn)) && + moduleNumber < [moduleBitCount count]) { + if ([image getX:imageColumn y:imageRow] == previousPixelValue) { + moduleBitCount[moduleNumber] = @([moduleBitCount[moduleNumber] intValue] + 1); + imageColumn += increment; + } else { + moduleNumber++; + previousPixelValue = !previousPixelValue; + } + } + if (moduleNumber == [moduleBitCount count] || + (((leftToRight && imageColumn == maxColumn) || (!leftToRight && imageColumn == minColumn)) && moduleNumber == [moduleBitCount count] - 1)) { + return moduleBitCount; + } + return nil; +} + ++ (int)numberOfECCodeWords:(int)barcodeECLevel { + return 2 << barcodeECLevel; +} + ++ (int)adjustCodewordStartColumn:(ZXBitMatrix *)image + minColumn:(int)minColumn + maxColumn:(int)maxColumn + leftToRight:(BOOL)leftToRight + codewordStartColumn:(int)codewordStartColumn + imageRow:(int)imageRow { + int correctedStartColumn = codewordStartColumn; + int increment = leftToRight ? -1 : 1; + // there should be no black pixels before the start column. If there are, then we need to start earlier. + for (int i = 0; i < 2; i++) { + while (((leftToRight && correctedStartColumn >= minColumn) || (!leftToRight && correctedStartColumn < maxColumn)) && + leftToRight == [image getX:correctedStartColumn y:imageRow]) { + if (abs(codewordStartColumn - correctedStartColumn) > ZX_PDF417_CODEWORD_SKEW_SIZE) { + return codewordStartColumn; + } + correctedStartColumn += increment; + } + increment = -increment; + leftToRight = !leftToRight; + } + return correctedStartColumn; +} + ++ (BOOL)checkCodewordSkew:(int)codewordSize minCodewordWidth:(int)minCodewordWidth maxCodewordWidth:(int)maxCodewordWidth { + return minCodewordWidth - ZX_PDF417_CODEWORD_SKEW_SIZE <= codewordSize && + codewordSize <= maxCodewordWidth + ZX_PDF417_CODEWORD_SKEW_SIZE; +} + ++ (ZXDecoderResult *)decodeCodewords:(ZXIntArray *)codewords ecLevel:(int)ecLevel erasures:(ZXIntArray *)erasures error:(NSError **)error { + if (codewords.length == 0) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + int numECCodewords = 1 << (ecLevel + 1); + int correctedErrorsCount = [self correctErrors:codewords erasures:erasures numECCodewords:numECCodewords]; + if (correctedErrorsCount == -1) { + if (error) *error = ZXChecksumErrorInstance(); + return nil; + } + if (![self verifyCodewordCount:codewords numECCodewords:numECCodewords]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + // Decode the codewords + ZXDecoderResult *decoderResult = [ZXPDF417DecodedBitStreamParser decode:codewords ecLevel:[@(ecLevel) stringValue] error:error]; + if (!decoderResult) { + return nil; + } + decoderResult.errorsCorrected = @(correctedErrorsCount); + decoderResult.erasures = @(erasures.length); + return decoderResult; +} + +/** + * Given data and error-correction codewords received, possibly corrupted by errors, attempts to + * correct the errors in-place. + * + * @param codewords data and error correction codewords + * @param erasures positions of any known erasures + * @param numECCodewords number of error correction codewords that are available in codewords + * @throws ChecksumException if error correction fails + */ ++ (int)correctErrors:(ZXIntArray *)codewords erasures:(ZXIntArray *)erasures numECCodewords:(int)numECCodewords { + if (erasures && + (erasures.length > numECCodewords / 2 + ZX_PDF417_MAX_ERRORS || + numECCodewords < 0 || + numECCodewords > ZX_PDF417_MAX_EC_CODEWORDS)) { + // Too many errors or EC Codewords is corrupted + return -1; + } + return [errorCorrection decode:codewords numECCodewords:numECCodewords erasures:erasures]; +} + +/** + * Verify that all is OK with the codeword array. + */ ++ (BOOL)verifyCodewordCount:(ZXIntArray *)codewords numECCodewords:(int)numECCodewords { + if (codewords.length < 4) { + // Codeword array size should be at least 4 allowing for + // Count CW, At least one Data CW, Error Correction CW, Error Correction CW + return NO; + } + // The first codeword, the Symbol Length Descriptor, shall always encode the total number of data + // codewords in the symbol, including the Symbol Length Descriptor itself, data codewords and pad + // codewords, but excluding the number of error correction codewords. + int numberOfCodewords = codewords.array[0]; + if (numberOfCodewords > codewords.length) { + return NO; + } + if (numberOfCodewords == 0) { + // Reset to the length of the array - 8 (Allow for at least level 3 Error Correction (8 Error Codewords) + if (numECCodewords < codewords.length) { + codewords.array[0] = codewords.length - numECCodewords; + } else { + return NO; + } + } + + return YES; +} + ++ (NSArray *)bitCountForCodeword:(int)codeword { + NSMutableArray *result = [NSMutableArray array]; + for (int i = 0; i < 8; i++) { + [result addObject:@0]; + } + + int previousValue = 0; + int i = (int)[result count] - 1; + while (YES) { + if ((codeword & 0x1) != previousValue) { + previousValue = codeword & 0x1; + i--; + if (i < 0) { + break; + } + } + result[i] = @([result[i] intValue] + 1); + codeword >>= 1; + } + return result; +} + ++ (int)codewordBucketNumber:(int)codeword { + return [self codewordBucketNumberWithModuleBitCount:[self bitCountForCodeword:codeword]]; +} + ++ (int)codewordBucketNumberWithModuleBitCount:(NSArray *)moduleBitCount { + return ([moduleBitCount[0] intValue] - [moduleBitCount[2] intValue] + [moduleBitCount[4] intValue] - [moduleBitCount[6] intValue] + 9) % 9; +} + +- (NSString *)description:(NSArray *)barcodeMatrix { + NSMutableString *result = [NSMutableString string]; + for (int row = 0; row < [barcodeMatrix count]; row++) { + [result appendFormat:@"Row %2d: ", row]; + for (int column = 0; column < [(NSArray *)barcodeMatrix[row] count]; column++) { + ZXPDF417BarcodeValue *barcodeValue = barcodeMatrix[row][column]; + if ([barcodeValue value].length == 0) { + [result appendString:@" "]; + } else { + [result appendFormat:@"%4d(%2d)", [barcodeValue value].array[0], + [[barcodeValue confidence:[barcodeValue value].array[0]] intValue]]; + } + } + [result appendString:@"\n"]; + } + return [NSString stringWithString:result]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.h new file mode 100644 index 0000000..ba295e5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.h @@ -0,0 +1,40 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXModulusPoly; + +/** + * A field based on powers of a generator integer, modulo some modulus. + */ +@interface ZXModulusGF : NSObject + +@property (nonatomic, strong, readonly) ZXModulusPoly *one; +@property (nonatomic, strong, readonly) ZXModulusPoly *zero; + ++ (ZXModulusGF *)PDF417_GF; + +- (id)initWithModulus:(int)modulus generator:(int)generator; + +- (ZXModulusPoly *)buildMonomial:(int)degree coefficient:(int)coefficient; +- (int)add:(int)a b:(int)b; +- (int)subtract:(int)a b:(int)b; +- (int)exp:(int)a; +- (int)log:(int)a; +- (int)inverse:(int)a; +- (int)multiply:(int)a b:(int)b; +- (int)size; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.m new file mode 100644 index 0000000..468d6cf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.m @@ -0,0 +1,115 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXModulusGF.h" +#import "ZXModulusPoly.h" +#import "ZXPDF417Common.h" + +@interface ZXModulusGF () + +@property (nonatomic, assign, readonly) int32_t *expTable; +@property (nonatomic, assign, readonly) int32_t *logTable; +@property (nonatomic, assign, readonly) int modulus; + +@end + +@implementation ZXModulusGF + ++ (ZXModulusGF *)PDF417_GF { + static dispatch_once_t pred = 0; + __strong static id _mod = nil; + dispatch_once(&pred, ^{ + @autoreleasepool { + _mod = [[ZXModulusGF alloc] initWithModulus:ZX_PDF417_NUMBER_OF_CODEWORDS generator:3]; + } + }); + return _mod; +} + +- (id)initWithModulus:(int)modulus generator:(int)generator { + if (self = [super init]) { + _modulus = modulus; + _expTable = (int32_t *)calloc(self.modulus, sizeof(int32_t)); + _logTable = (int32_t *)calloc(self.modulus, sizeof(int32_t)); + int32_t x = 1; + for (int i = 0; i < modulus; i++) { + _expTable[i] = x; + x = (x * generator) % modulus; + } + for (int i = 0; i < self.size - 1; i++) { + _logTable[_expTable[i]] = i; + } + // logTable[0] == 0 but this should never be used + _zero = [[ZXModulusPoly alloc] initWithField:self coefficients:[[ZXIntArray alloc] initWithLength:1]]; + _one = [[ZXModulusPoly alloc] initWithField:self coefficients:[[ZXIntArray alloc] initWithInts:1, -1]]; + } + + return self; +} + +- (ZXModulusPoly *)buildMonomial:(int)degree coefficient:(int)coefficient { + if (degree < 0) { + [NSException raise:NSInvalidArgumentException format:@"Degree must be greater than 0."]; + } + if (coefficient == 0) { + return self.zero; + } + ZXIntArray *coefficients = [[ZXIntArray alloc] initWithLength:degree + 1]; + coefficients.array[0] = coefficient; + return [[ZXModulusPoly alloc] initWithField:self coefficients:coefficients]; +} + +- (int)add:(int)a b:(int)b { + return (a + b) % self.modulus; +} + +- (int)subtract:(int)a b:(int)b { + return (self.modulus + a - b) % self.modulus; +} + +- (int)exp:(int)a { + return _expTable[a]; +} + +- (int)log:(int)a { + if (a == 0) { + [NSException raise:NSInvalidArgumentException format:@"Argument must be non-zero."]; + } + return _logTable[a]; +} + +- (int)inverse:(int)a { + if (a == 0) { + [NSException raise:NSInvalidArgumentException format:@"Argument must be non-zero."]; + } + + return _expTable[_modulus - _logTable[a] - 1]; +} + +- (int)multiply:(int)a b:(int)b { + if (a == 0 || b == 0) { + return 0; + } + + return _expTable[(_logTable[a] + _logTable[b]) % (_modulus - 1)]; +} + +- (int)size { + return self.modulus; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.h new file mode 100644 index 0000000..103a8e7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.h @@ -0,0 +1,34 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXIntArray, ZXModulusGF; + +@interface ZXModulusPoly : NSObject + +- (id)initWithField:(ZXModulusGF *)field coefficients:(ZXIntArray *)coefficients; +- (int)degree; +- (BOOL)zero; +- (int)coefficient:(int)degree; +- (int)evaluateAt:(int)a; +- (ZXModulusPoly *)add:(ZXModulusPoly *)other; +- (ZXModulusPoly *)subtract:(ZXModulusPoly *)other; +- (ZXModulusPoly *)multiply:(ZXModulusPoly *)other; +- (ZXModulusPoly *)negative; +- (ZXModulusPoly *)multiplyScalar:(int)scalar; +- (ZXModulusPoly *)multiplyByMonomial:(int)degree coefficient:(int)coefficient; +- (NSArray *)divide:(ZXModulusPoly *)other; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.m new file mode 100644 index 0000000..e28af02 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.m @@ -0,0 +1,263 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXModulusGF.h" +#import "ZXModulusPoly.h" + +@interface ZXModulusPoly () + +@property (nonatomic, strong, readonly) ZXIntArray *coefficients; +@property (nonatomic, weak, readonly) ZXModulusGF *field; + +@end + +@implementation ZXModulusPoly + +- (id)initWithField:(ZXModulusGF *)field coefficients:(ZXIntArray *)coefficients { + if (self = [super init]) { + if (coefficients.length == 0) { + @throw [NSException exceptionWithName:@"IllegalArgumentException" + reason:@"coefficients must have at least one element" + userInfo:nil]; + } + _field = field; + int coefficientsLength = coefficients.length; + if (coefficientsLength > 1 && coefficients.array[0] == 0) { + // Leading term must be non-zero for anything except the constant polynomial "0" + int firstNonZero = 1; + while (firstNonZero < coefficientsLength && coefficients.array[firstNonZero] == 0) { + firstNonZero++; + } + if (firstNonZero == coefficientsLength) { + _coefficients = [[ZXIntArray alloc] initWithLength:1]; + } else { + _coefficients = [[ZXIntArray alloc] initWithLength:coefficientsLength - firstNonZero]; + for (int i = 0; i < _coefficients.length; i++) { + _coefficients.array[i] = coefficients.array[firstNonZero + i]; + } + } + } else { + _coefficients = coefficients; + } + } + + return self; +} + +/** + * @return degree of this polynomial + */ +- (int)degree { + return self.coefficients.length - 1; +} + +/** + * @return true iff this polynomial is the monomial "0" + */ +- (BOOL)zero { + return self.coefficients.array[0] == 0; +} + +/** + * @return coefficient of x^degree term in this polynomial + */ +- (int)coefficient:(int)degree { + return self.coefficients.array[self.coefficients.length - 1 - degree]; +} + +/** + * @return evaluation of this polynomial at a given point + */ +- (int)evaluateAt:(int)a { + if (a == 0) { + return [self coefficient:0]; + } + int size = self.coefficients.length; + if (a == 1) { + // Just the sum of the coefficients + int result = 0; + for (int i = 0; i < size; i++) { + result = [self.field add:result b:self.coefficients.array[i]]; + } + return result; + } + int result = self.coefficients.array[0]; + for (int i = 1; i < size; i++) { + result = [self.field add:[self.field multiply:a b:result] b:self.coefficients.array[i]]; + } + return result; +} + +- (ZXModulusPoly *)add:(ZXModulusPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXModulusPolys do not have same ZXModulusGF field"]; + } + if (self.zero) { + return other; + } + if (other.zero) { + return self; + } + + ZXIntArray *smallerCoefficients = self.coefficients; + ZXIntArray *largerCoefficients = other.coefficients; + if (smallerCoefficients.length > largerCoefficients.length) { + ZXIntArray *temp = smallerCoefficients; + smallerCoefficients = largerCoefficients; + largerCoefficients = temp; + } + ZXIntArray *sumDiff = [[ZXIntArray alloc] initWithLength:largerCoefficients.length]; + int lengthDiff = largerCoefficients.length - smallerCoefficients.length; + // Copy high-order terms only found in higher-degree polynomial's coefficients + memcpy(sumDiff.array, largerCoefficients.array, lengthDiff * sizeof(int32_t)); + + for (int i = lengthDiff; i < largerCoefficients.length; i++) { + sumDiff.array[i] = [self.field add:smallerCoefficients.array[i - lengthDiff] b:largerCoefficients.array[i]]; + } + + return [[ZXModulusPoly alloc] initWithField:self.field coefficients:sumDiff]; +} + +- (ZXModulusPoly *)subtract:(ZXModulusPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXModulusPolys do not have same ZXModulusGF field"]; + } + if (self.zero) { + return self; + } + return [self add:[other negative]]; +} + +- (ZXModulusPoly *)multiply:(ZXModulusPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXModulusPolys do not have same ZXModulusGF field"]; + } + if (self.zero || other.zero) { + return self.field.zero; + } + ZXIntArray *aCoefficients = self.coefficients; + int aLength = aCoefficients.length; + ZXIntArray *bCoefficients = other.coefficients; + int bLength = bCoefficients.length; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:aLength + bLength - 1]; + for (int i = 0; i < aLength; i++) { + int aCoeff = aCoefficients.array[i]; + for (int j = 0; j < bLength; j++) { + product.array[i + j] = [self.field add:product.array[i + j] + b:[self.field multiply:aCoeff b:bCoefficients.array[j]]]; + } + } + return [[ZXModulusPoly alloc] initWithField:self.field coefficients:product]; +} + +- (ZXModulusPoly *)negative { + int size = self.coefficients.length; + ZXIntArray *negativeCoefficients = [[ZXIntArray alloc] initWithLength:size]; + for (int i = 0; i < size; i++) { + negativeCoefficients.array[i] = [self.field subtract:0 b:self.coefficients.array[i]]; + } + return [[ZXModulusPoly alloc] initWithField:self.field coefficients:negativeCoefficients]; +} + +- (ZXModulusPoly *)multiplyScalar:(int)scalar { + if (scalar == 0) { + return self.field.zero; + } + if (scalar == 1) { + return self; + } + int size = self.coefficients.length; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:size]; + for (int i = 0; i < size; i++) { + product.array[i] = [self.field multiply:self.coefficients.array[i] b:scalar]; + } + return [[ZXModulusPoly alloc] initWithField:self.field coefficients:product]; +} + +- (ZXModulusPoly *)multiplyByMonomial:(int)degree coefficient:(int)coefficient { + if (degree < 0) { + [NSException raise:NSInvalidArgumentException format:@"Degree must be greater than 0."]; + } + if (coefficient == 0) { + return self.field.zero; + } + int size = self.coefficients.length; + ZXIntArray *product = [[ZXIntArray alloc] initWithLength:size + degree]; + for (int i = 0; i < size; i++) { + product.array[i] = [self.field multiply:self.coefficients.array[i] b:coefficient]; + } + + return [[ZXModulusPoly alloc] initWithField:self.field coefficients:product]; +} + +- (NSArray *)divide:(ZXModulusPoly *)other { + if (![self.field isEqual:other.field]) { + [NSException raise:NSInvalidArgumentException format:@"ZXModulusPolys do not have same ZXModulusGF field"]; + } + if (other.zero) { + [NSException raise:NSInvalidArgumentException format:@"Divide by 0"]; + } + + ZXModulusPoly *quotient = self.field.zero; + ZXModulusPoly *remainder = self; + + int denominatorLeadingTerm = [other coefficient:other.degree]; + int inverseDenominatorLeadingTerm = [self.field inverse:denominatorLeadingTerm]; + + while ([remainder degree] >= other.degree && !remainder.zero) { + int degreeDifference = remainder.degree - other.degree; + int scale = [self.field multiply:[remainder coefficient:remainder.degree] b:inverseDenominatorLeadingTerm]; + ZXModulusPoly *term = [other multiplyByMonomial:degreeDifference coefficient:scale]; + ZXModulusPoly *iterationQuotient = [self.field buildMonomial:degreeDifference coefficient:scale]; + quotient = [quotient add:iterationQuotient]; + remainder = [remainder subtract:term]; + } + + return @[quotient, remainder]; +} + +- (NSString *)description { + NSMutableString *result = [NSMutableString stringWithCapacity:8 * [self degree]]; + for (int degree = [self degree]; degree >= 0; degree--) { + int coefficient = [self coefficient:degree]; + if (coefficient != 0) { + if (coefficient < 0) { + [result appendString:@" - "]; + coefficient = -coefficient; + } else { + if ([result length] > 0) { + [result appendString:@" + "]; + } + } + if (degree == 0 || coefficient != 1) { + [result appendFormat:@"%d", coefficient]; + } + if (degree != 0) { + if (degree == 1) { + [result appendString:@"x"]; + } else { + [result appendString:@"x^"]; + [result appendFormat:@"%d", degree]; + } + } + } + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.h new file mode 100644 index 0000000..3f89cfb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.h @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXIntArray; + +/** + * PDF417 error correction implementation. + * + * This example + * is quite useful in understanding the algorithm. + */ +@interface ZXPDF417ECErrorCorrection : NSObject + +/** + * @return number of errors + */ +- (int)decode:(ZXIntArray *)received numECCodewords:(int)numECCodewords erasures:(ZXIntArray *)erasures; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.m new file mode 100644 index 0000000..4b8922f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.m @@ -0,0 +1,181 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXIntArray.h" +#import "ZXModulusGF.h" +#import "ZXModulusPoly.h" +#import "ZXPDF417ECErrorCorrection.h" + +@interface ZXPDF417ECErrorCorrection () + +@property (nonatomic, strong, readonly) ZXModulusGF *field; + +@end + +@implementation ZXPDF417ECErrorCorrection + +- (id)init { + if (self = [super init]) { + _field = [ZXModulusGF PDF417_GF]; + } + + return self; +} + +- (int)decode:(ZXIntArray *)received numECCodewords:(int)numECCodewords erasures:(ZXIntArray *)erasures { + ZXModulusPoly *poly = [[ZXModulusPoly alloc] initWithField:self.field coefficients:received]; + ZXIntArray *S = [[ZXIntArray alloc] initWithLength:numECCodewords]; + BOOL error = NO; + for (int i = numECCodewords; i > 0; i--) { + int eval = [poly evaluateAt:[self.field exp:i]]; + S.array[numECCodewords - i] = eval; + if (eval != 0) { + error = YES; + } + } + + if (!error) { + return 0; + } + + ZXModulusPoly *knownErrors = self.field.one; + if (erasures) { + for (int i = 0; i < erasures.length; i++) { + int erasure = erasures.array[i]; + int b = [self.field exp:received.length - 1 - erasure]; + // Add (1 - bx) term: + ZXModulusPoly *term = [[ZXModulusPoly alloc] initWithField:self.field coefficients:[[ZXIntArray alloc] initWithInts:[self.field subtract:0 b:b], 1, -1]]; + knownErrors = [knownErrors multiply:term]; + } + } + + ZXModulusPoly *syndrome = [[ZXModulusPoly alloc] initWithField:self.field coefficients:S]; + //[syndrome multiply:knownErrors]; + + NSArray *sigmaOmega = [self runEuclideanAlgorithm:[self.field buildMonomial:numECCodewords coefficient:1] b:syndrome R:numECCodewords]; + if (!sigmaOmega) { + return -1; + } + + ZXModulusPoly *sigma = sigmaOmega[0]; + ZXModulusPoly *omega = sigmaOmega[1]; + + //sigma = [sigma multiply:knownErrors]; + + ZXIntArray *errorLocations = [self findErrorLocations:sigma]; + if (!errorLocations) return -1; + ZXIntArray *errorMagnitudes = [self findErrorMagnitudes:omega errorLocator:sigma errorLocations:errorLocations]; + + for (int i = 0; i < errorLocations.length; i++) { + int position = received.length - 1 - [self.field log:errorLocations.array[i]]; + if (position < 0) { + return -1; + } + received.array[position] = [self.field subtract:received.array[position] b:errorMagnitudes.array[i]]; + } + + return errorLocations.length; +} + +- (NSArray *)runEuclideanAlgorithm:(ZXModulusPoly *)a b:(ZXModulusPoly *)b R:(int)R { + // Assume a's degree is >= b's + if (a.degree < b.degree) { + ZXModulusPoly *temp = a; + a = b; + b = temp; + } + + ZXModulusPoly *rLast = a; + ZXModulusPoly *r = b; + ZXModulusPoly *tLast = self.field.zero; + ZXModulusPoly *t = self.field.one; + + // Run Euclidean algorithm until r's degree is less than R/2 + while (r.degree >= R / 2) { + ZXModulusPoly *rLastLast = rLast; + ZXModulusPoly *tLastLast = tLast; + rLast = r; + tLast = t; + + // Divide rLastLast by rLast, with quotient in q and remainder in r + if (rLast.zero) { + // Oops, Euclidean algorithm already terminated? + return nil; + } + r = rLastLast; + ZXModulusPoly *q = self.field.zero; + int denominatorLeadingTerm = [rLast coefficient:rLast.degree]; + int dltInverse = [self.field inverse:denominatorLeadingTerm]; + while (r.degree >= rLast.degree && !r.zero) { + int degreeDiff = r.degree - rLast.degree; + int scale = [self.field multiply:[r coefficient:r.degree] b:dltInverse]; + q = [q add:[self.field buildMonomial:degreeDiff coefficient:scale]]; + r = [r subtract:[rLast multiplyByMonomial:degreeDiff coefficient:scale]]; + } + + t = [[[q multiply:tLast] subtract:tLastLast] negative]; + } + + int sigmaTildeAtZero = [t coefficient:0]; + if (sigmaTildeAtZero == 0) { + return nil; + } + + int inverse = [self.field inverse:sigmaTildeAtZero]; + ZXModulusPoly *sigma = [t multiplyScalar:inverse]; + ZXModulusPoly *omega = [r multiplyScalar:inverse]; + return @[sigma, omega]; +} + +- (ZXIntArray *)findErrorLocations:(ZXModulusPoly *)errorLocator { + // This is a direct application of Chien's search + int numErrors = errorLocator.degree; + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:numErrors]; + int e = 0; + for (int i = 1; i < self.field.size && e < numErrors; i++) { + if ([errorLocator evaluateAt:i] == 0) { + result.array[e] = [self.field inverse:i]; + e++; + } + } + if (e != numErrors) { + return nil; + } + return result; +} + +- (ZXIntArray *)findErrorMagnitudes:(ZXModulusPoly *)errorEvaluator errorLocator:(ZXModulusPoly *)errorLocator errorLocations:(ZXIntArray *)errorLocations { + int errorLocatorDegree = errorLocator.degree; + ZXIntArray *formalDerivativeCoefficients = [[ZXIntArray alloc] initWithLength:errorLocatorDegree]; + for (int i = 1; i <= errorLocatorDegree; i++) { + formalDerivativeCoefficients.array[errorLocatorDegree - i] = + [self.field multiply:i b:[errorLocator coefficient:i]]; + } + ZXModulusPoly *formalDerivative = [[ZXModulusPoly alloc] initWithField:self.field coefficients:formalDerivativeCoefficients]; + + // This is directly applying Forney's Formula + int s = errorLocations.length; + ZXIntArray *result = [[ZXIntArray alloc] initWithLength:s]; + for (int i = 0; i < s; i++) { + int xiInverse = [self.field inverse:errorLocations.array[i]]; + int numerator = [self.field subtract:0 b:[errorEvaluator evaluateAt:xiInverse]]; + int denominator = [self.field inverse:[formalDerivative evaluateAt:xiInverse]]; + result.array[i] = [self.field multiply:numerator b:denominator]; + } + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.h new file mode 100644 index 0000000..2ebaee8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.h @@ -0,0 +1,36 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBinaryBitmap, ZXBitArray, ZXBitMatrix, ZXDecodeHints, ZXPDF417DetectorResult; + +/** + * Encapsulates logic that can detect a PDF417 Code in an image, even if the + * PDF417 Code is rotated or skewed, or partially obscured. + */ +@interface ZXPDF417Detector : NSObject + +/** + * Detects a PDF417 Code in an image. Only checks 0 and 180 degree rotations. + * + * @param hints optional hints to detector + * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will + * be found and returned + * @return ZXPDF417DetectorResult encapsulating results of detecting a PDF417 code or nil + * if no PDF417 Code can be found + */ ++ (ZXPDF417DetectorResult *)detect:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints multiple:(BOOL)multiple error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.m new file mode 100644 index 0000000..50333c3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.m @@ -0,0 +1,348 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXBinaryBitmap.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXGridSampler.h" +#import "ZXMathUtils.h" +#import "ZXPDF417Detector.h" +#import "ZXPDF417DetectorResult.h" +#import "ZXPerspectiveTransform.h" +#import "ZXResultPoint.h" + +const int ZX_PDF417_INDEXES_START_PATTERN[] = {0, 4, 1, 5}; +const int ZX_PDF417_INDEXES_STOP_PATTERN[] = {6, 2, 7, 3}; +const float ZX_PDF417_MAX_AVG_VARIANCE = 0.42f; +const float ZX_PDF417_MAX_INDIVIDUAL_VARIANCE = 0.8f; + +// B S B S B S B S Bar/Space pattern +// 11111111 0 1 0 1 0 1 000 +const int ZX_PDF417_DETECTOR_START_PATTERN[] = {8, 1, 1, 1, 1, 1, 1, 3}; + +// 1111111 0 1 000 1 0 1 00 1 +const int ZX_PDF417_DETECTOR_STOP_PATTERN[] = {7, 1, 1, 3, 1, 1, 1, 2, 1}; +const int ZX_PDF417_MAX_PIXEL_DRIFT = 3; +const int ZX_PDF417_MAX_PATTERN_DRIFT = 5; +// if we set the value too low, then we don't detect the correct height of the bar if the start patterns are damaged. +// if we set the value too high, then we might detect the start pattern from a neighbor barcode. +const int ZX_PDF417_SKIPPED_ROW_COUNT_MAX = 25; +// A PDF471 barcode should have at least 3 rows, with each row being >= 3 times the module width. Therefore it should be at least +// 9 pixels tall. To be conservative, we use about half the size to ensure we don't miss it. +const int ZX_PDF417_ROW_STEP = 5; +const int ZX_PDF417_BARCODE_MIN_HEIGHT = 10; + +@implementation ZXPDF417Detector + ++ (ZXPDF417DetectorResult *)detect:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints multiple:(BOOL)multiple error:(NSError **)error { + // TODO detection improvement, tryHarder could try several different luminance thresholds/blackpoints or even + // different binarizers + //boolean tryHarder = hints != null && hints.containsKey(DecodeHintType.TRY_HARDER); + + ZXBitMatrix *bitMatrix = [image blackMatrixWithError:error]; + + NSArray *barcodeCoordinates = [self detect:multiple bitMatrix:bitMatrix error:error]; + if (!barcodeCoordinates) { + return nil; + } + if ([barcodeCoordinates count] == 0) { + bitMatrix = [bitMatrix copy]; + [bitMatrix rotate180]; + barcodeCoordinates = [self detect:multiple bitMatrix:bitMatrix error:error]; + if (!barcodeCoordinates) { + return nil; + } + } + return [[ZXPDF417DetectorResult alloc] initWithBits:bitMatrix points:barcodeCoordinates]; +} + +/** + * Detects PDF417 codes in an image. Only checks 0 degree rotation + * @param multiple if true, then the image is searched for multiple codes. If false, then at most one code will + * be found and returned + * @param bitMatrix bit matrix to detect barcodes in + * @return List of ResultPoint arrays containing the coordinates of found barcodes + */ ++ (NSArray *)detect:(BOOL)multiple bitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error { + NSMutableArray *barcodeCoordinates = [NSMutableArray array]; + int row = 0; + int column = 0; + BOOL foundBarcodeInRow = NO; + while (row < bitMatrix.height) { + NSArray *vertices = [self findVertices:bitMatrix startRow:row startColumn:column]; + + if (vertices[0] == [NSNull null] && vertices[3] == [NSNull null]) { + if (!foundBarcodeInRow) { + // we didn't find any barcode so that's the end of searching + break; + } + // we didn't find a barcode starting at the given column and row. Try again from the first column and slightly + // below the lowest barcode we found so far. + foundBarcodeInRow = NO; + column = 0; + for (NSArray *barcodeCoordinate in barcodeCoordinates) { + if (barcodeCoordinate[1] != [NSNull null]) { + row = MAX(row, (int) [(ZXResultPoint *)barcodeCoordinate[1] y]); + } + if (barcodeCoordinate[3] != [NSNull null]) { + row = MAX(row, (int) [(ZXResultPoint *)barcodeCoordinate[3] y]); + } + } + row += ZX_PDF417_ROW_STEP; + continue; + } + foundBarcodeInRow = YES; + [barcodeCoordinates addObject:vertices]; + if (!multiple) { + break; + } + // if we didn't find a right row indicator column, then continue the search for the next barcode after the + // start pattern of the barcode just found. + if (vertices[2] != [NSNull null]) { + column = (int) [(ZXResultPoint *)vertices[2] x]; + row = (int) [(ZXResultPoint *)vertices[2] y]; + } else { + column = (int) [(ZXResultPoint *)vertices[4] x]; + row = (int) [(ZXResultPoint *)vertices[4] y]; + } + } + return barcodeCoordinates; +} + +/** + * Locate the vertices and the codewords area of a black blob using the Start + * and Stop patterns as locators. + * + * @param matrix the scanned barcode image. + * @return an array containing the vertices: + * vertices[0] x, y top left barcode + * vertices[1] x, y bottom left barcode + * vertices[2] x, y top right barcode + * vertices[3] x, y bottom right barcode + * vertices[4] x, y top left codeword area + * vertices[5] x, y bottom left codeword area + * vertices[6] x, y top right codeword area + * vertices[7] x, y bottom right codeword area + */ ++ (NSMutableArray *)findVertices:(ZXBitMatrix *)matrix startRow:(int)startRow startColumn:(int)startColumn { + int height = matrix.height; + int width = matrix.width; + + NSMutableArray *result = [NSMutableArray arrayWithCapacity:8]; + for (int i = 0; i < 8; i++) { + [result addObject:[NSNull null]]; + } + [self copyToResult:result + tmpResult:[self findRowsWithPattern:matrix + height:height + width:width + startRow:startRow + startColumn:startColumn + pattern:ZX_PDF417_DETECTOR_START_PATTERN + patternLen:sizeof(ZX_PDF417_DETECTOR_START_PATTERN) / sizeof(int)] + destinationIndexes:ZX_PDF417_INDEXES_START_PATTERN + length:sizeof(ZX_PDF417_INDEXES_START_PATTERN) / sizeof(int)]; + + if (result[4] != [NSNull null]) { + startColumn = (int) [(ZXResultPoint *)result[4] x]; + startRow = (int) [(ZXResultPoint *)result[4] y]; + } + [self copyToResult:result + tmpResult:[self findRowsWithPattern:matrix + height:height + width:width + startRow:startRow + startColumn:startColumn + pattern:ZX_PDF417_DETECTOR_STOP_PATTERN + patternLen:sizeof(ZX_PDF417_DETECTOR_STOP_PATTERN) / sizeof(int)] + destinationIndexes:ZX_PDF417_INDEXES_STOP_PATTERN + length:sizeof(ZX_PDF417_INDEXES_STOP_PATTERN) / sizeof(int)]; + return result; +} + ++ (void)copyToResult:(NSMutableArray *)result tmpResult:(NSMutableArray *)tmpResult destinationIndexes:(const int[])destinationIndexes length:(int)length { + for (int i = 0; i < length; i++) { + result[destinationIndexes[i]] = tmpResult[i]; + } +} + ++ (NSMutableArray *)findRowsWithPattern:(ZXBitMatrix *)matrix height:(int)height width:(int)width startRow:(int)startRow + startColumn:(int)startColumn pattern:(const int[])pattern patternLen:(int)patternLen { + NSMutableArray *result = [NSMutableArray array]; + for (int i = 0; i < 4; i++) { + [result addObject:[NSNull null]]; + } + BOOL found = NO; + int counters[patternLen]; + memset(counters, 0, patternLen * sizeof(int)); + for (; startRow < height; startRow += ZX_PDF417_ROW_STEP) { + NSRange loc = [self findGuardPattern:matrix column:startColumn row:startRow width:width whiteFirst:false pattern:pattern patternLen:patternLen counters:counters]; + if (loc.location != NSNotFound) { + while (startRow > 0) { + NSRange previousRowLoc = [self findGuardPattern:matrix column:startColumn row:--startRow width:width whiteFirst:false pattern:pattern patternLen:patternLen counters:counters]; + if (previousRowLoc.location != NSNotFound) { + loc = previousRowLoc; + } else { + startRow++; + break; + } + } + result[0] = [[ZXResultPoint alloc] initWithX:loc.location y:startRow]; + result[1] = [[ZXResultPoint alloc] initWithX:NSMaxRange(loc) y:startRow]; + found = YES; + break; + } + } + int stopRow = startRow + 1; + // Last row of the current symbol that contains pattern + if (found) { + int skippedRowCount = 0; + NSRange previousRowLoc = NSMakeRange((NSUInteger) [(ZXResultPoint *)result[0] x], ((NSUInteger)[(ZXResultPoint *)result[1] x]) - ((NSUInteger)[(ZXResultPoint *)result[0] x])); + for (; stopRow < height; stopRow++) { + NSRange loc = [self findGuardPattern:matrix column:(int)previousRowLoc.location row:stopRow width:width whiteFirst:NO pattern:pattern patternLen:patternLen counters:counters]; + // a found pattern is only considered to belong to the same barcode if the start and end positions + // don't differ too much. Pattern drift should be not bigger than two for consecutive rows. With + // a higher number of skipped rows drift could be larger. To keep it simple for now, we allow a slightly + // larger drift and don't check for skipped rows. + if (loc.location != NSNotFound && + ABS((int)previousRowLoc.location - (int)loc.location) < ZX_PDF417_MAX_PATTERN_DRIFT && + ABS((int)NSMaxRange(previousRowLoc) - (int)NSMaxRange(loc)) < ZX_PDF417_MAX_PATTERN_DRIFT) { + previousRowLoc = loc; + skippedRowCount = 0; + } else { + if (skippedRowCount > ZX_PDF417_SKIPPED_ROW_COUNT_MAX) { + break; + } else { + skippedRowCount++; + } + } + } + stopRow -= skippedRowCount + 1; + result[2] = [[ZXResultPoint alloc] initWithX:previousRowLoc.location y:stopRow]; + result[3] = [[ZXResultPoint alloc] initWithX:NSMaxRange(previousRowLoc) y:stopRow]; + } + if (stopRow - startRow < ZX_PDF417_BARCODE_MIN_HEIGHT) { + for (int i = 0; i < 4; i++) { + result[i] = [NSNull null]; + } + } + return result; +} + +/** + * @param matrix row of black/white values to search + * @param column x position to start search + * @param row y position to start search + * @param width the number of pixels to search on this row + * @param pattern pattern of counts of number of black and white pixels that are + * being searched for as a pattern + * @param counters array of counters, as long as pattern, to re-use + * @return start/end horizontal offset of guard pattern, as an array of two ints. + */ ++ (NSRange)findGuardPattern:(ZXBitMatrix *)matrix + column:(int)column + row:(int)row + width:(int)width + whiteFirst:(BOOL)whiteFirst + pattern:(const int[])pattern + patternLen:(int)patternLen + counters:(int *)counters { + int patternLength = patternLen; + memset(counters, 0, patternLength * sizeof(int)); + BOOL isWhite = whiteFirst; + int patternStart = column; + int pixelDrift = 0; + + // if there are black pixels left of the current pixel shift to the left, but only for ZX_PDF417_MAX_PIXEL_DRIFT pixels + while ([matrix getX:patternStart y:row] && patternStart > 0 && pixelDrift++ < ZX_PDF417_MAX_PIXEL_DRIFT) { + patternStart--; + } + int x = patternStart; + int counterPosition = 0; + for (;x < width; x++) { + BOOL pixel = [matrix getX:x y:row]; + if (pixel ^ isWhite) { + counters[counterPosition] = counters[counterPosition] + 1; + } else { + if (counterPosition == patternLength - 1) { + if ([self patternMatchVariance:counters countersSize:patternLength pattern:pattern maxIndividualVariance:ZX_PDF417_MAX_INDIVIDUAL_VARIANCE] < ZX_PDF417_MAX_AVG_VARIANCE) { + return NSMakeRange(patternStart, x - patternStart); + } + patternStart += counters[0] + counters[1]; + for (int y = 2; y < patternLength; y++) { + counters[y - 2] = counters[y]; + } + counters[patternLength - 2] = 0; + counters[patternLength - 1] = 0; + counterPosition--; + } else { + counterPosition++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + if (counterPosition == patternLength - 1) { + if ([self patternMatchVariance:counters countersSize:patternLen pattern:pattern maxIndividualVariance:ZX_PDF417_MAX_INDIVIDUAL_VARIANCE] < ZX_PDF417_MAX_AVG_VARIANCE) { + return NSMakeRange(patternStart, x - patternStart - 1); + } + } + return NSMakeRange(NSNotFound, 0); +} + +/** + * Determines how closely a set of observed counts of runs of black/white + * values matches a given target pattern. This is reported as the ratio of + * the total variance from the expected pattern proportions across all + * pattern elements, to the length of the pattern. + * + * @param counters observed counters + * @param pattern expected pattern + * @param maxIndividualVariance The most any counter can differ before we give up + * @return ratio of total variance between counters and pattern compared to total pattern size + */ ++ (float)patternMatchVariance:(int *)counters countersSize:(int)countersSize pattern:(const int[])pattern maxIndividualVariance:(float)maxIndividualVariance { + int numCounters = countersSize; + int total = 0; + int patternLength = 0; + for (int i = 0; i < numCounters; i++) { + total += counters[i]; + patternLength += pattern[i]; + } + + if (total < patternLength || patternLength == 0) { + return FLT_MAX; + } + float unitBarWidth = (float) total / patternLength; + maxIndividualVariance *= unitBarWidth; + + float totalVariance = 0.0f; + for (int x = 0; x < numCounters; x++) { + int counter = counters[x]; + float scaledPattern = pattern[x] * unitBarWidth; + float variance = counter > scaledPattern ? counter - scaledPattern : scaledPattern - counter; + if (variance > maxIndividualVariance) { + return FLT_MAX; + } + totalVariance += variance; + } + + return totalVariance / total; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.h new file mode 100644 index 0000000..b7e8c92 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.h @@ -0,0 +1,26 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix; + +@interface ZXPDF417DetectorResult : NSObject + +@property (nonatomic, strong, readonly) ZXBitMatrix *bits; +@property (nonatomic, strong, readonly) NSArray *points; + +- (id)initWithBits:(ZXBitMatrix *)bits points:(NSArray *)points; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.m new file mode 100644 index 0000000..47fa823 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.m @@ -0,0 +1,31 @@ +/* + * Copyright 2013 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417DetectorResult.h" + +@implementation ZXPDF417DetectorResult + +- (id)initWithBits:(ZXBitMatrix *)bits points:(NSArray *)points { + self = [super init]; + if (self) { + _bits = bits; + _points = points; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.h new file mode 100644 index 0000000..76a45a1 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.h @@ -0,0 +1,55 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +@class ZXPDF417BarcodeMatrix, ZXIntArray; + +/** + * Top-level class for the logic part of the PDF417 implementation. + */ +@interface ZXPDF417 : NSObject + +@property (nonatomic, strong, readonly) ZXPDF417BarcodeMatrix *barcodeMatrix; +@property (nonatomic, assign) BOOL compact; +@property (nonatomic, assign) ZXPDF417Compaction compaction; +@property (nonatomic, assign) NSStringEncoding encoding; + +- (id)initWithCompact:(BOOL)compact; + +/** + * Generates the barcode logic. + * + * @param msg the message to encode + */ +- (BOOL)generateBarcodeLogic:(NSString *)msg errorCorrectionLevel:(int)errorCorrectionLevel error:(NSError **)error; + +/** + * Determine optimal nr of columns and rows for the specified number of + * codewords. + * + * @param sourceCodeWords number of code words + * @param errorCorrectionCodeWords number of error correction code words + * @return dimension object containing cols as width and rows as height + */ +- (ZXIntArray *)determineDimensions:(int)sourceCodeWords errorCorrectionCodeWords:(int)errorCorrectionCodeWords error:(NSError **)error; + +/** + * Sets max/min row/col values + */ +- (void)setDimensionsWithMaxCols:(int)maxCols minCols:(int)minCols maxRows:(int)maxRows minRows:(int)minRows; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.m new file mode 100644 index 0000000..fb1e9b7 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.m @@ -0,0 +1,733 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXPDF417.h" +#import "ZXPDF417BarcodeMatrix.h" +#import "ZXPDF417BarcodeRow.h" +#import "ZXPDF417ErrorCorrection.h" +#import "ZXPDF417HighLevelEncoder.h" + +/** + * The start pattern (17 bits) + */ +const int ZX_PDF417_START_PATTERN = 0x1fea8; +/** + * The stop pattern (18 bits) + */ +const int ZX_PDF417_STOP_PATTERN = 0x3fa29; + +/** + * The codeword table from the Annex A of ISO/IEC 15438:2001(E). + */ +#define ZX_PDF417_CODEWORD_TABLE_LEN 3 +#define ZX_PDF417_CODEWORD_TABLE_SUB_LEN 929 +const int ZX_PDF417_CODEWORD_TABLE[ZX_PDF417_CODEWORD_TABLE_LEN][ZX_PDF417_CODEWORD_TABLE_SUB_LEN] = { + {0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, + 0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830, 0x15020, + 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0, 0x1d678, 0x1eb3e, + 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c, + 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, + 0x1af7c, 0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, + 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c, 0x1a460, + 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418, + 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, + 0x1d33c, 0x14c60, 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, + 0x14ee0, 0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38, + 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0, + 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, + 0x1a230, 0x1d11c, 0x14420, 0x1a218, 0x14410, 0x14408, + 0x146c0, 0x1a370, 0x1d1bc, 0x14660, 0x1a338, 0x1d19e, + 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc, + 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, + 0x1e85e, 0x14240, 0x1a130, 0x1d09c, 0x14220, 0x1a118, + 0x1d08e, 0x14210, 0x1a10c, 0x14208, 0x1a106, 0x14360, + 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e, + 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, + 0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110, 0x1a08c, + 0x14108, 0x1a086, 0x14104, 0x141b0, 0x14198, 0x1418c, + 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0, + 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, + 0x1ca38, 0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0, + 0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c, 0x12c60, + 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe, + 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, + 0x12f3c, 0x12fbe, 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, + 0x1ed38, 0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420, + 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970, + 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, + 0x1db38, 0x1ed9e, 0x16c40, 0x12420, 0x19218, 0x1c90e, + 0x16c20, 0x1b618, 0x16c10, 0x126c0, 0x19370, 0x1c9bc, + 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738, + 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, + 0x16f70, 0x12738, 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, + 0x127bc, 0x16fbc, 0x1279e, 0x16f9e, 0x1d960, 0x1ecb8, + 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918, + 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, + 0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c, 0x16640, + 0x12220, 0x1d99c, 0x1c88e, 0x16620, 0x12210, 0x1910c, + 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8, + 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, + 0x1918e, 0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de, + 0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e, 0x167de, + 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e, + 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, + 0x12140, 0x190b0, 0x1c85c, 0x16340, 0x12120, 0x19098, + 0x1c84e, 0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108, + 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc, + 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, + 0x12186, 0x16386, 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, + 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088, 0x1d846, 0x1b084, + 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090, + 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, + 0x16184, 0x12082, 0x120d8, 0x161d8, 0x161cc, 0x161c6, + 0x1d82c, 0x1d826, 0x1b042, 0x1902c, 0x12048, 0x160c8, + 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, + 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, + 0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc, 0x11660, + 0x18b38, 0x1c59e, 0x11630, 0x18b1c, 0x11618, 0x1160c, + 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc, + 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, + 0x1e69c, 0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, + 0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e, 0x19b60, + 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e, + 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, + 0x11360, 0x189b8, 0x1c4de, 0x13760, 0x11330, 0x1cdde, + 0x13730, 0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c, + 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e, + 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, + 0x1ee98, 0x1f74e, 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, + 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, + 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10, + 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, + 0x188b0, 0x1c45c, 0x13340, 0x11120, 0x18898, 0x1c44e, + 0x17740, 0x13320, 0x19998, 0x1ccce, 0x17720, 0x1bb98, + 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708, + 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, + 0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce, 0x11186, + 0x13386, 0x111dc, 0x133dc, 0x111ce, 0x177dc, 0x133ce, + 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88, + 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, + 0x1b9a0, 0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, + 0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982, 0x110a0, + 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0, + 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, + 0x17388, 0x13184, 0x11082, 0x13182, 0x110d8, 0x1886e, + 0x131d8, 0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc, + 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48, + 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, + 0x19848, 0x1cc26, 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, + 0x1b8c2, 0x11050, 0x1882c, 0x130d0, 0x11048, 0x18826, + 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042, + 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, + 0x1ee16, 0x1dc22, 0x1cc16, 0x19824, 0x19822, 0x11028, + 0x13068, 0x170e8, 0x11022, 0x13062, 0x18560, 0x10a40, + 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c, + 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, + 0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, + 0x185de, 0x10b9c, 0x10b8e, 0x10bde, 0x18d40, 0x1c6b0, + 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08, + 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, + 0x10920, 0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, + 0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86, 0x10902, + 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98, + 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, + 0x11bce, 0x1cea0, 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, + 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658, + 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646, + 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, + 0x18458, 0x119a0, 0x10890, 0x1c66e, 0x13ba0, 0x11990, + 0x18ccc, 0x18446, 0x13b90, 0x19dcc, 0x10884, 0x13b88, + 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8, + 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, + 0x108ee, 0x119ee, 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, + 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50, 0x1e72c, 0x1ded0, + 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, + 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, + 0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, + 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850, 0x1842c, 0x118d0, + 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0, + 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, + 0x17bc4, 0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6, + 0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796, 0x1ef24, + 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64, + 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, + 0x1bce8, 0x19c64, 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, + 0x10828, 0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864, + 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2, + 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, + 0x19c34, 0x1bc74, 0x1bc72, 0x11834, 0x13874, 0x178f4, + 0x178f2, 0x10540, 0x10520, 0x18298, 0x10510, 0x10508, + 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc, + 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, + 0x18684, 0x18682, 0x104a0, 0x18258, 0x10da0, 0x186d8, + 0x1824c, 0x10d90, 0x186cc, 0x10d88, 0x186c6, 0x10d84, + 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee, + 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, + 0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0, 0x1c76c, + 0x1c326, 0x18ec8, 0x1c766, 0x18ec4, 0x18642, 0x18ec2, + 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8, + 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, + 0x1046c, 0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6, + 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68, 0x1e7b6, + 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68, + 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, + 0x19ee2, 0x10428, 0x18216, 0x10c68, 0x18636, 0x11ce8, + 0x10c64, 0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4, + 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4, + 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, + 0x1cf34, 0x1c712, 0x1df74, 0x1cf32, 0x1df72, 0x18614, + 0x18e34, 0x18612, 0x19e74, 0x18e32, 0x1bef4}, + {0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, + 0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, + 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade, 0x1d640, 0x1eb30, + 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c, + 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, + 0x1ae40, 0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, + 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04, 0x1af60, + 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20, + 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, + 0x15f60, 0x1afb8, 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, + 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e, + 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e, + 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, + 0x1d340, 0x1e9b0, 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, + 0x1d310, 0x1e98c, 0x1d308, 0x1e986, 0x1d304, 0x1d302, + 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce, + 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, + 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, + 0x14f10, 0x1a78c, 0x14f08, 0x1a786, 0x14f04, 0x14fb0, + 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, + 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, + 0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, + 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188, 0x1e8c6, 0x1d184, + 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc, + 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, + 0x1d1ee, 0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, + 0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6, 0x147ee, + 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842, + 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, + 0x1a1d0, 0x1d0ec, 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, + 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2, + 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822, + 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, + 0x1a0e4, 0x1a0e2, 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, + 0x1e814, 0x1e812, 0x1d034, 0x1d032, 0x1a074, 0x1a072, + 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e, + 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, + 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, + 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586, 0x1cb04, 0x1cb02, + 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, + 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, + 0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, + 0x12f10, 0x1978c, 0x12f08, 0x19786, 0x12f04, 0x12fb0, + 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc, + 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, + 0x169f8, 0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682, + 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490, 0x1fb6e, + 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84, + 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, + 0x1c990, 0x1e4cc, 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, + 0x1c984, 0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8, + 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc, + 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, + 0x127a0, 0x193d8, 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, + 0x16f90, 0x1b7cc, 0x193c6, 0x16f88, 0x12784, 0x16f84, + 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc, + 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, + 0x1f648, 0x1fb26, 0x164fc, 0x1f644, 0x1647e, 0x1f642, + 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448, 0x1f226, 0x1ecc8, + 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, + 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, + 0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, + 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4, 0x191c2, 0x1b3c2, + 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8, + 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, + 0x123e6, 0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624, + 0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68, 0x1f636, + 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8, + 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, + 0x1b1e8, 0x1d8f6, 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, + 0x190f6, 0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2, + 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414, + 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, + 0x1d872, 0x19074, 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, + 0x161f4, 0x120f2, 0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, + 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158, + 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, + 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, + 0x1c588, 0x1e2c6, 0x1c584, 0x1c582, 0x18ba0, 0x1c5d8, + 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, + 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, + 0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8, 0x18bee, + 0x117cc, 0x117c6, 0x117ee, 0x1f350, 0x1f9ac, 0x135f8, + 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342, + 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, + 0x1f366, 0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, + 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6, 0x1cdc4, + 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8, + 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, + 0x113d0, 0x189ec, 0x137d0, 0x113c8, 0x189e6, 0x137c8, + 0x19be6, 0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec, + 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4, + 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, + 0x1f996, 0x132fc, 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, + 0x1f764, 0x1f322, 0x1767e, 0x1f762, 0x1e228, 0x1f116, + 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4, + 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, + 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, + 0x188e8, 0x1c476, 0x199e8, 0x188e4, 0x1bbe8, 0x199e4, + 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6, + 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, + 0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94, 0x172f8, + 0x1b97e, 0x1fb92, 0x1727c, 0x1723e, 0x1f314, 0x1317e, + 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634, + 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, + 0x1c432, 0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, + 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4, 0x131f4, + 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c, + 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, + 0x1c41a, 0x1cc3a, 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, + 0x1107a, 0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac, + 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c, + 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, + 0x185c8, 0x1c2e6, 0x185c4, 0x185c2, 0x10bd0, 0x185ec, + 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2, 0x10bec, 0x10be6, + 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2, + 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, + 0x1e362, 0x1c268, 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, + 0x1c262, 0x1c6e2, 0x184e8, 0x1c276, 0x18de8, 0x184e4, + 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8, + 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, + 0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, + 0x1f194, 0x1197e, 0x1f3b4, 0x1f192, 0x13b7e, 0x1f3b2, + 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772, + 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, + 0x18474, 0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2, + 0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2, 0x13bf2, + 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e, + 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, + 0x1f18a, 0x1f39a, 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, + 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a, + 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa, + 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, + 0x178bc, 0x1789e, 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, + 0x1c168, 0x1e0b6, 0x1c164, 0x1c162, 0x182e8, 0x1c176, + 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2, + 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, + 0x1e092, 0x1e1b2, 0x1c134, 0x1c374, 0x1c132, 0x1c372, + 0x18274, 0x186f4, 0x18272, 0x186f2, 0x104f4, 0x10df4, + 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, + 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, + 0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a, 0x10cfa, + 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c, 0x13d1e, 0x11cbe, + 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c, + 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, + 0x1be5e, 0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, + 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174, 0x18172, + 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a, + 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, + 0x13eb8, 0x19f5e, 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, + 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86, + 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e, + 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, + 0x10f5e, 0x11f5c, 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, + 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c, 0x13f26}, + {0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, + 0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078, 0x1fad0, + 0x15be0, 0x1adf8, 0x1fac8, 0x159f0, 0x1acfc, 0x1fac4, + 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec, + 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, + 0x1f5c2, 0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, + 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6, 0x1d7c4, + 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4, + 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, + 0x148f0, 0x1a47c, 0x14878, 0x1a43e, 0x1483c, 0x1fa68, + 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62, + 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4, + 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, + 0x1d3e8, 0x1e9f6, 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, + 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, + 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34, + 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, + 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, + 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c, 0x14278, 0x1a13e, + 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, + 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, + 0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, + 0x129e0, 0x194f8, 0x1ca7e, 0x128f0, 0x1947c, 0x12878, + 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964, + 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, + 0x1f976, 0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, + 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6, 0x1cbe4, + 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0, + 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, + 0x1b478, 0x1da3e, 0x16870, 0x1b43c, 0x16838, 0x1b41e, + 0x1681c, 0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0, + 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c, + 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, + 0x1fb74, 0x1f932, 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, + 0x1263e, 0x16e3e, 0x1f274, 0x1277e, 0x1f6f4, 0x1f272, + 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2, + 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, + 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, + 0x16470, 0x1b23c, 0x16438, 0x1b21e, 0x1641c, 0x1640e, + 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678, + 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, + 0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, + 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa, 0x191fa, 0x162e0, + 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e, + 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, + 0x1633c, 0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170, + 0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e, 0x120bc, + 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c, + 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, + 0x18af8, 0x1c57e, 0x114f0, 0x18a7c, 0x11478, 0x18a3e, + 0x1143c, 0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2, + 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4, + 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, + 0x19af0, 0x1cd7c, 0x134e0, 0x19a78, 0x1cd3e, 0x13470, + 0x19a3c, 0x13438, 0x19a1e, 0x1341c, 0x1340e, 0x112f0, + 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e, + 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, + 0x1377c, 0x1133e, 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, + 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa, 0x1bae0, 0x1dd78, + 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, + 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, + 0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270, 0x1993c, + 0x17670, 0x1bb3c, 0x1991e, 0x17638, 0x1321c, 0x1761c, + 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c, + 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, + 0x111be, 0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc, + 0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c, 0x17218, + 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370, + 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, + 0x1730e, 0x110bc, 0x131bc, 0x1109e, 0x173bc, 0x1319e, + 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c, + 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e, + 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, + 0x130de, 0x171de, 0x170b0, 0x1b85c, 0x17098, 0x1b84e, + 0x1708c, 0x17086, 0x1305c, 0x170dc, 0x1304e, 0x170ce, + 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e, + 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, + 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, + 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78, 0x1c6be, 0x11a70, + 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978, + 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, + 0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, + 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c, 0x13a18, 0x19d0e, + 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938, + 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, + 0x108bc, 0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, + 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30, 0x1de9c, + 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08, + 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, + 0x13930, 0x19c9c, 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, + 0x1390c, 0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e, + 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c, + 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, + 0x17940, 0x1bcb0, 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, + 0x17910, 0x1bc8c, 0x17908, 0x1bc86, 0x17904, 0x17902, + 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998, + 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, + 0x1184e, 0x179dc, 0x138ce, 0x179ce, 0x178a0, 0x1bc58, + 0x1de2e, 0x17890, 0x1bc4c, 0x17888, 0x1bc46, 0x17884, + 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc, + 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, + 0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842, 0x1382c, + 0x1786c, 0x13826, 0x17866, 0x17828, 0x1bc16, 0x17824, + 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c, + 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, + 0x10d1c, 0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, + 0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c, 0x11d18, + 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8, + 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, + 0x11dde, 0x13d40, 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, + 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04, + 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e, + 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, + 0x11cdc, 0x10c4e, 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, + 0x1df58, 0x1efae, 0x1be90, 0x1df4c, 0x1be88, 0x1df46, + 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0, + 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, + 0x13c84, 0x17d84, 0x13c82, 0x17d82, 0x11c58, 0x18e2e, + 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc, 0x11c46, 0x17dcc, + 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee, + 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, + 0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, + 0x1be66, 0x17cc4, 0x13c42, 0x17cc2, 0x11c2c, 0x13c6c, + 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16, + 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, + 0x17c64, 0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76, + 0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12, 0x17c32, + 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e, + 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, + 0x10e8c, 0x10e86, 0x1065c, 0x10edc, 0x1064e, 0x10ece, + 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88, + 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8, + 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, + 0x11eee, 0x19f50, 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, + 0x19f42, 0x11e50, 0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, + 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c, + 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, + 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, + 0x19f24, 0x1bf64, 0x19f22, 0x1bf62, 0x11e28, 0x18f16, + 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4, + 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, + 0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, + 0x11e14, 0x13e34, 0x11e12, 0x17e74, 0x13e32, 0x17e72, + 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a, + 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, + 0x1032e, 0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6, + 0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726, 0x10f66, + 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796, + 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, + 0x10f36, 0x11f76, 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, + 0x18f92, 0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74, + 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a, + 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, + 0x107a4, 0x107a2, 0x10396, 0x107b6, 0x187d4, 0x187d2, + 0x10794, 0x10fb4, 0x10792, 0x10fb2, 0x1c7ea}}; + +const float ZX_PDF417_PREFERRED_RATIO = 3.0f; +const float ZX_PDF417_DEFAULT_MODULE_WIDTH = 0.357f; //1px in mm +const float ZX_PDF417_HEIGHT = 2.0f; //mm + +@interface ZXPDF417 () + +@property (nonatomic, strong) ZXPDF417BarcodeMatrix *barcodeMatrix; +@property (nonatomic, assign) int minCols; +@property (nonatomic, assign) int maxCols; +@property (nonatomic, assign) int minRows; +@property (nonatomic, assign) int maxRows; + +@end + +@implementation ZXPDF417 + +- (id)init { + return [self initWithCompact:NO]; +} + +- (id)initWithCompact:(BOOL)compact { + if (self = [super init]) { + _compact = compact; + _compaction = ZXPDF417CompactionAuto; + _encoding = ZX_PDF417_DEFAULT_ENCODING; + _minCols = 2; + _maxCols = 30; + _maxRows = 30; + _minRows = 2; + } + + return self; +} + +/** + * Calculates the necessary number of rows as described in annex Q of ISO/IEC 15438:2001(E). + * + * @param m the number of source codewords prior to the additional of the Symbol Length + * Descriptor and any pad codewords + * @param k the number of error correction codewords + * @param c the number of columns in the symbol in the data region (excluding start, stop and + * row indicator codewords) + * @return the number of rows in the symbol (r) + */ +- (int)calculateNumberOfRowsM:(int)m k:(int)k c:(int)c { + int r = ((m + 1 + k) / c) + 1; + if (c * r >= (m + 1 + k + c)) { + r--; + } + return r; +} + +/** + * Calculates the number of pad codewords as described in 4.9.2 of ISO/IEC 15438:2001(E). + * + * @param m the number of source codewords prior to the additional of the Symbol Length + * Descriptor and any pad codewords + * @param k the number of error correction codewords + * @param c the number of columns in the symbol in the data region (excluding start, stop and + * row indicator codewords) + * @param r the number of rows in the symbol + * @return the number of pad codewords + */ +- (int)numberOfPadCodewordsM:(int)m k:(int)k c:(int)c r:(int)r { + int n = c * r - k; + return n > m + 1 ? n - m - 1 : 0; +} + +- (void)encodeCharPattern:(int)pattern len:(int)len logic:(ZXPDF417BarcodeRow *)logic { + int map = 1 << (len - 1); + BOOL last = (pattern & map) != 0; //Initialize to inverse of first bit + int width = 0; + for (int i = 0; i < len; i++) { + BOOL black = (pattern & map) != 0; + if (last == black) { + width++; + } else { + [logic addBar:last width:width]; + + last = black; + width = 1; + } + map >>= 1; + } + [logic addBar:last width:width]; +} + +- (void)encodeLowLevel:(NSString *)fullCodewords c:(int)c r:(int)r errorCorrectionLevel:(int)errorCorrectionLevel logic:(ZXPDF417BarcodeMatrix *)logic { + int idx = 0; + for (int y = 0; y < r; y++) { + int cluster = y % 3; + [logic startRow]; + [self encodeCharPattern:ZX_PDF417_START_PATTERN len:17 logic:logic.currentRow]; + + int left; + int right; + if (cluster == 0) { + left = (30 * (y / 3)) + ((r - 1) / 3); + right = (30 * (y / 3)) + (c - 1); + } else if (cluster == 1) { + left = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + right = (30 * (y / 3)) + ((r - 1) / 3); + } else { + left = (30 * (y / 3)) + (c - 1); + right = (30 * (y / 3)) + (errorCorrectionLevel * 3) + ((r - 1) % 3); + } + + int pattern = ZX_PDF417_CODEWORD_TABLE[cluster][left]; + [self encodeCharPattern:pattern len:17 logic:logic.currentRow]; + + for (int x = 0; x < c; x++) { + pattern = ZX_PDF417_CODEWORD_TABLE[cluster][[fullCodewords characterAtIndex:idx]]; + [self encodeCharPattern:pattern len:17 logic:logic.currentRow]; + idx++; + } + + if (self.compact) { + [self encodeCharPattern:ZX_PDF417_STOP_PATTERN len:1 logic:logic.currentRow]; + } else { + pattern = ZX_PDF417_CODEWORD_TABLE[cluster][right]; + [self encodeCharPattern:pattern len:17 logic:logic.currentRow]; + + [self encodeCharPattern:ZX_PDF417_STOP_PATTERN len:18 logic:logic.currentRow]; + } + } +} + +- (BOOL)generateBarcodeLogic:(NSString *)msg errorCorrectionLevel:(int)anErrorCorrectionLevel error:(NSError **)error { + + //1. step: High-level encoding + int errorCorrectionCodeWords = [ZXPDF417ErrorCorrection errorCorrectionCodewordCount:anErrorCorrectionLevel]; + NSString *highLevel = [ZXPDF417HighLevelEncoder encodeHighLevel:msg compaction:self.compaction encoding:self.encoding error:error]; + if (!highLevel) { + return NO; + } + int sourceCodeWords = (int)highLevel.length; + + ZXIntArray *dimension = [self determineDimensions:sourceCodeWords errorCorrectionCodeWords:errorCorrectionCodeWords error:error]; + if (!dimension) { + return NO; + } + + int cols = dimension.array[0]; + int rows = dimension.array[1]; + + int pad = [self numberOfPadCodewordsM:sourceCodeWords k:errorCorrectionCodeWords c:cols r:rows]; + + //2. step: construct data codewords + if (sourceCodeWords + errorCorrectionCodeWords + 1 > 929) { // +1 for symbol length CW + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Encoded message contains to many code words, message to big (%d bytes)", (int)msg.length]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + + int n = sourceCodeWords + pad + 1; + NSMutableString *sb = [NSMutableString stringWithCapacity:n]; + [sb appendFormat:@"%C", (unichar)n]; + [sb appendFormat:@"%@", highLevel]; + for (int i = 0; i < pad; i++) { + [sb appendFormat:@"%C", (unichar) 900]; //PAD characters + } + NSString *dataCodewords = sb; + + //3. step: Error correction + NSString *ec = [ZXPDF417ErrorCorrection generateErrorCorrection:dataCodewords errorCorrectionLevel:anErrorCorrectionLevel]; + NSString *fullCodewords = [dataCodewords stringByAppendingString:ec]; + + //4. step: low-level encoding + self.barcodeMatrix = [[ZXPDF417BarcodeMatrix alloc] initWithHeight:rows width:cols]; + [self encodeLowLevel:fullCodewords c:cols r:rows errorCorrectionLevel:anErrorCorrectionLevel logic:self.barcodeMatrix]; + + return YES; +} + +- (ZXIntArray *)determineDimensions:(int)sourceCodeWords errorCorrectionCodeWords:(int)errorCorrectionCodeWords error:(NSError **)error { + float ratio = 0.0f; + ZXIntArray *dimension = nil; + + for (int cols = self.minCols; cols <= self.maxCols; cols++) { + + int rows = [self calculateNumberOfRowsM:sourceCodeWords k:errorCorrectionCodeWords c:cols]; + + if (rows < self.minRows) { + break; + } + + if (rows > self.maxRows) { + continue; + } + + float newRatio = ((17 * cols + 69) * ZX_PDF417_DEFAULT_MODULE_WIDTH) / (rows * ZX_PDF417_HEIGHT); + + // ignore if previous ratio is closer to preferred ratio + if (dimension && fabsf(newRatio - ZX_PDF417_PREFERRED_RATIO) > fabsf(ratio - ZX_PDF417_PREFERRED_RATIO)) { + continue; + } + + ratio = newRatio; + dimension = [[ZXIntArray alloc] initWithInts:cols, rows, -1]; + } + + // Handle case when min values were larger than necessary + if (!dimension) { + int rows = [self calculateNumberOfRowsM:sourceCodeWords k:errorCorrectionCodeWords c:self.minCols]; + if (rows < self.minRows) { + dimension = [[ZXIntArray alloc] initWithInts:self.minCols, self.minRows, -1]; + } + } + + if (!dimension) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Unable to fit message in columns"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return nil; + } + + return dimension; +} + +- (void)setDimensionsWithMaxCols:(int)maxCols minCols:(int)minCols maxRows:(int)maxRows minRows:(int)minRows { + self.maxCols = maxCols; + self.minCols = minCols; + self.maxRows = maxRows; + self.minRows = minRows; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.h new file mode 100644 index 0000000..9ff0aed --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.h @@ -0,0 +1,38 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXPDF417BarcodeRow; + +/** + * Holds all of the information for a barcode in a format where it can be easily accessable + */ +@interface ZXPDF417BarcodeMatrix : NSObject + +@property (nonatomic, assign, readonly) int height; +@property (nonatomic, assign, readonly) int width; + +/** + * @param height the height of the matrix (Rows) + * @param width the width of the matrix (Cols) + */ +- (id)initWithHeight:(int)height width:(int)width; +- (void)startRow; +- (ZXPDF417BarcodeRow *)currentRow; +- (NSArray *)matrix; +//- (NSArray *)scaledMatrix:(int)scale; +- (NSArray *)scaledMatrixWithXScale:(int)xScale yScale:(int)yScale; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.m new file mode 100644 index 0000000..6e0d452 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.m @@ -0,0 +1,86 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417BarcodeMatrix.h" +#import "ZXPDF417BarcodeRow.h" + +@interface ZXPDF417BarcodeMatrix () + +@property (nonatomic, assign) int currentRowIndex; +@property (nonatomic, strong, readonly) NSArray *rowMatrix; + +@end + +@implementation ZXPDF417BarcodeMatrix + +- (id)initWithHeight:(int)height width:(int)width { + if (self = [super init]) { + NSMutableArray *matrix = [NSMutableArray array]; + for (int i = 0, matrixLength = height; i < matrixLength; i++) { + [matrix addObject:[ZXPDF417BarcodeRow barcodeRowWithWidth:(width + 4) * 17 + 1]]; + } + _rowMatrix = matrix; + _width = width * 17; + _height = height; + _currentRowIndex = -1; + } + + return self; +} + +- (void)setX:(int)x y:(int)y value:(int8_t)value { + [self.rowMatrix[y] setX:x value:value]; +} + +/* +- (void)setMatrixX:(int)x y:(int)y black:(BOOL)black { + [self setX:x y:y value:(int8_t)(black ? 1 : 0)]; +} +*/ + +- (void)startRow { + ++self.currentRowIndex; +} + +- (ZXPDF417BarcodeRow *)currentRow { + return self.rowMatrix[self.currentRowIndex]; +} + +- (NSArray *)matrix { + return [self scaledMatrixWithXScale:1 yScale:1]; +} + +/* +- (NSArray *)scaledMatrix:(int)scale { + return [self scaledMatrixWithXScale:scale yScale:scale]; +} +*/ + +- (NSArray *)scaledMatrixWithXScale:(int)xScale yScale:(int)yScale { + int yMax = self.height * yScale; + NSMutableArray *matrixOut = [NSMutableArray array]; + for (int i = 0; i < yMax; i++) { + [matrixOut addObject:[NSNull null]]; + } + + for (int i = 0; i < yMax; i++) { + matrixOut[yMax - i - 1] = [(ZXPDF417BarcodeRow *)self.rowMatrix[i / yScale] scaledRow:xScale]; + } + + return matrixOut; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.h new file mode 100644 index 0000000..a00f7b9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.h @@ -0,0 +1,60 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray; + +@interface ZXPDF417BarcodeRow : NSObject + +@property (nonatomic, strong, readonly) ZXByteArray *row; + +/** + * Creates a Barcode row of the width + */ ++ (ZXPDF417BarcodeRow *)barcodeRowWithWidth:(int)width; + +- (id)initWithWidth:(int)width; + +/** + * Sets a specific location in the bar + * + * @param x The location in the bar + * @param value Black if true, white if false; + */ +- (void)setX:(int)x value:(int8_t)value; + +/** + * Sets a specific location in the bar + * + * @param x The location in the bar + * @param black Black if true, white if false; + */ +- (void)setX:(int)x black:(BOOL)black; + +/** + * @param black A boolean which is true if the bar black false if it is white + * @param width How many spots wide the bar is. + */ +- (void)addBar:(BOOL)black width:(int)width; + +/** + * This function scales the row + * + * @param scale How much you want the image to be scaled, must be greater than or equal to 1. + * @return the scaled row + */ +- (ZXByteArray *)scaledRow:(int)scale; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.m new file mode 100644 index 0000000..6237bf5 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.m @@ -0,0 +1,63 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXPDF417BarcodeRow.h" + +@interface ZXPDF417BarcodeRow () + +//A tacker for position in the bar +@property (nonatomic, assign) int currentLocation; + +@end + +@implementation ZXPDF417BarcodeRow + ++ (ZXPDF417BarcodeRow *)barcodeRowWithWidth:(int)width { + return [[ZXPDF417BarcodeRow alloc] initWithWidth:width]; +} + +- (id)initWithWidth:(int)width { + if (self = [super init]) { + _row = [[ZXByteArray alloc] initWithLength:width]; + _currentLocation = 0; + } + return self; +} + +- (void)setX:(int)x value:(int8_t)value { + self.row.array[x] = value; +} + +- (void)setX:(int)x black:(BOOL)black { + self.row.array[x] = (int8_t) (black ? 1 : 0); +} + +- (void)addBar:(BOOL)black width:(int)width { + for (int ii = 0; ii < width; ii++) { + [self setX:self.currentLocation++ black:black]; + } +} + +- (ZXByteArray *)scaledRow:(int)scale { + ZXByteArray *output = [[ZXByteArray alloc] initWithLength:self.row.length * scale]; + for (int i = 0; i < output.length; i++) { + output.array[i] = self.row.array[i / scale]; + } + return output; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.h new file mode 100644 index 0000000..0e1f155 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.h @@ -0,0 +1,29 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Data object to specify the minimum and maximum number of rows and columns for a PDF417 barcode. + */ +@interface ZXPDF417Dimensions : NSObject + +@property (nonatomic, assign, readonly) int minCols; +@property (nonatomic, assign, readonly) int maxCols; +@property (nonatomic, assign, readonly) int minRows; +@property (nonatomic, assign, readonly) int maxRows; + +- (id)initWithMinCols:(int)minCols maxCols:(int)maxCols minRows:(int)minRows maxRows:(int)maxRows; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.m new file mode 100644 index 0000000..33529ab --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.m @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXPDF417Dimensions.h" + +@implementation ZXPDF417Dimensions + +- (id)initWithMinCols:(int)minCols maxCols:(int)maxCols minRows:(int)minRows maxRows:(int)maxRows { + if (self = [super init]) { + _minCols = minCols; + _maxCols = maxCols; + _minRows = minRows; + _maxRows = maxRows; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.h new file mode 100644 index 0000000..de8eb75 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.h @@ -0,0 +1,51 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * PDF417 error correction code following the algorithm described in ISO/IEC 15438:2001(E) in + * chapter 4.10. + */ +@interface ZXPDF417ErrorCorrection : NSObject + +/** + * Determines the number of error correction codewords for a specified error correction + * level. + * + * @param errorCorrectionLevel the error correction level (0-8) + * @return the number of codewords generated for error correction + */ + ++ (int)errorCorrectionCodewordCount:(int)errorCorrectionLevel; + +/** + * Returns the recommended minimum error correction level as described in annex E of + * ISO/IEC 15438:2001(E). + * + * @param n the number of data codewords + * @return the recommended minimum error correction level + */ ++ (int)recommendedMinimumErrorCorrectionLevel:(int)n error:(NSError **)error; + +/** + * Generates the error correction codewords according to 4.10 in ISO/IEC 15438:2001(E). + * + * @param dataCodewords the data codewords + * @param errorCorrectionLevel the error correction level (0-8) + * @return the String representing the error correction codewords + */ ++ (NSString *)generateErrorCorrection:(NSString *)dataCodewords errorCorrectionLevel:(int)errorCorrectionLevel; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.m new file mode 100644 index 0000000..9b88804 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.m @@ -0,0 +1,176 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXErrors.h" +#import "ZXPDF417ErrorCorrection.h" + +/** + * Tables of coefficients for calculating error correction words + * (see annex F, ISO/IEC 15438:2001(E)) + */ +const int ZX_PDF417_EC_COEFFICIENTS[][512] = { + {27, 917}, + {522, 568, 723, 809}, + {237, 308, 436, 284, 646, 653, 428, 379}, + {274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, + 42, 176, 65}, + {361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, + 284, 193, 517, 273, 494, 263, 147, 593, 800, 571, 320, 803, + 133, 231, 390, 685, 330, 63, 410}, + {539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, + 877, 381, 612, 723, 476, 462, 172, 430, 609, 858, 822, 543, + 376, 511, 400, 672, 762, 283, 184, 440, 35, 519, 31, 460, + 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, 648, + 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, + 623, 264, 543}, + {521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, + 925, 749, 415, 822, 93, 217, 208, 928, 244, 583, 620, 246, + 148, 447, 631, 292, 908, 490, 704, 516, 258, 457, 907, 594, + 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, 193, + 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, + 463, 646, 776, 171, 491, 297, 763, 156, 732, 95, 270, 447, + 90, 507, 48, 228, 821, 808, 898, 784, 663, 627, 378, 382, + 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, 157, + 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, + 587, 804, 34, 211, 330, 539, 297, 827, 865, 37, 517, 834, + 315, 550, 86, 801, 4, 108, 539}, + {524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, + 786, 138, 720, 858, 194, 311, 913, 275, 190, 375, 850, 438, + 733, 194, 280, 201, 280, 828, 757, 710, 814, 919, 89, 68, + 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, 439, + 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, + 549, 209, 884, 315, 70, 329, 793, 490, 274, 877, 162, 749, + 812, 684, 461, 334, 376, 849, 521, 307, 291, 803, 712, 19, + 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, 637, + 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, + 538, 906, 90, 2, 290, 743, 199, 655, 903, 329, 49, 802, + 580, 355, 588, 188, 462, 10, 134, 628, 320, 479, 130, 739, + 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, 722, + 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, + 60, 732, 621, 895, 544, 261, 852, 655, 309, 697, 755, 756, + 60, 231, 773, 434, 421, 726, 528, 503, 118, 49, 795, 32, + 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, 73, + 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, + 791, 893, 754, 605, 383, 228, 749, 760, 213, 54, 297, 134, + 54, 834, 299, 922, 191, 910, 532, 609, 829, 189, 20, 167, + 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, 404, + 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, + 55, 497, 10}, + {352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, + 380, 350, 492, 197, 265, 920, 155, 914, 299, 229, 643, 294, + 871, 306, 88, 87, 193, 352, 781, 846, 75, 327, 520, 435, + 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, 539, + 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, + 916, 552, 41, 542, 289, 122, 272, 383, 800, 485, 98, 752, + 472, 761, 107, 784, 860, 658, 741, 290, 204, 681, 407, 855, + 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, 808, + 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, + 192, 516, 258, 240, 518, 794, 395, 768, 848, 51, 610, 384, + 168, 190, 826, 328, 596, 786, 303, 570, 381, 415, 641, 156, + 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, 40, + 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, + 92, 358, 785, 288, 357, 850, 836, 827, 736, 707, 94, 8, + 494, 114, 521, 2, 499, 851, 543, 152, 729, 771, 95, 248, + 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, 669, + 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, + 591, 452, 578, 37, 124, 298, 332, 552, 43, 427, 119, 662, + 777, 475, 850, 764, 364, 578, 911, 283, 711, 472, 420, 245, + 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, 842, + 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, + 159, 672, 729, 624, 59, 193, 417, 158, 209, 563, 564, 343, + 693, 109, 608, 563, 365, 181, 772, 677, 310, 248, 353, 708, + 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, 618, + 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, + 247, 184, 45, 787, 680, 18, 66, 407, 369, 54, 492, 228, + 613, 830, 922, 437, 519, 644, 905, 789, 420, 305, 441, 207, + 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, 242, + 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, + 665, 397, 808, 851, 309, 473, 795, 378, 31, 647, 915, 459, + 806, 590, 731, 425, 216, 548, 249, 321, 881, 699, 535, 673, + 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, 660, + 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, + 336, 286, 437, 375, 273, 610, 296, 183, 923, 116, 667, 751, + 353, 62, 366, 691, 379, 687, 842, 37, 357, 720, 742, 330, + 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, 342, + 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, + 610, 46, 656, 447, 171, 616, 464, 190, 531, 297, 321, 762, + 752, 533, 175, 134, 14, 381, 433, 717, 45, 111, 20, 596, + 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, 407, + 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, + 223, 849, 647, 63, 310, 863, 251, 366, 304, 282, 738, 675, + 410, 389, 244, 31, 121, 303, 263}}; + +@implementation ZXPDF417ErrorCorrection + ++ (int)errorCorrectionCodewordCount:(int)errorCorrectionLevel { + if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) { + [NSException raise:NSInvalidArgumentException format:@"Error correction level must be between 0 and 8!"]; + } + return 1 << (errorCorrectionLevel + 1); +} + ++ (int)recommendedMinimumErrorCorrectionLevel:(int)n error:(NSError **)error { + if (n <= 0) { + [NSException raise:NSInvalidArgumentException format:@"n must be > 0"]; + } + if (n <= 40) { + return 2; + } + if (n <= 160) { + return 3; + } + if (n <= 320) { + return 4; + } + if (n <= 863) { + return 5; + } + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"No recommendation possible"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return -1; +} + ++ (NSString *)generateErrorCorrection:(NSString *)dataCodewords errorCorrectionLevel:(int)errorCorrectionLevel { + int k = [self errorCorrectionCodewordCount:errorCorrectionLevel]; + unichar e[k]; + memset(e, 0, k * sizeof(unichar)); + + int sld = (int)dataCodewords.length; + for (int i = 0; i < sld; i++) { + int t1 = ([dataCodewords characterAtIndex:i] + e[k - 1]) % 929; + int t2; + int t3; + for (int j = k - 1; j >= 1; j--) { + t2 = (t1 * ZX_PDF417_EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929; + t3 = 929 - t2; + e[j] = (unichar) ((e[j - 1] + t3) % 929); + } + t2 = (t1 * ZX_PDF417_EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929; + t3 = 929 - t2; + e[0] = (unichar) (t3 % 929); + } + NSMutableString *sb = [NSMutableString stringWithCapacity:k]; + for (int j = k - 1; j >= 0; j--) { + if (e[j] != 0) { + e[j] = (unichar) (929 - e[j]); + } + [sb appendFormat:@"%C", e[j]]; + } + return sb; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.h new file mode 100644 index 0000000..9ae3deb --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.h @@ -0,0 +1,37 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXEncodeHints.h" + +extern const NSStringEncoding ZX_PDF417_DEFAULT_ENCODING; + +/** + * PDF417 high-level encoder following the algorithm described in ISO/IEC 15438:2001(E) in + * annex P. + */ +@interface ZXPDF417HighLevelEncoder : NSObject + +/** + * Performs high-level encoding of a PDF417 message using the algorithm described in annex P + * of ISO/IEC 15438:2001(E). If byte compaction has been selected, then only byte compaction + * is used. + * + * @param msg the message + * @return the encoded message (the char values range from 0 to 928) + */ ++ (NSString *)encodeHighLevel:(NSString *)msg compaction:(ZXPDF417Compaction)compaction encoding:(NSStringEncoding)encoding error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.m new file mode 100644 index 0000000..ed6198b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.m @@ -0,0 +1,586 @@ +/* + * Copyright 2006 Jeremias Maerki in part, and ZXing Authors in part + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXCharacterSetECI.h" +#import "ZXErrors.h" +#import "ZXPDF417HighLevelEncoder.h" + +/** + * code for Text compaction + */ +const int ZX_PDF417_TEXT_COMPACTION = 0; + +/** + * code for Byte compaction + */ +const int ZX_PDF417_BYTE_COMPACTION = 1; + +/** + * code for Numeric compaction + */ +const int ZX_PDF417_NUMERIC_COMPACTION = 2; + +/** + * Text compaction submode Alpha + */ +const int ZX_PDF417_SUBMODE_ALPHA = 0; + +/** + * Text compaction submode Lower + */ +const int ZX_PDF417_SUBMODE_LOWER = 1; + +/** + * Text compaction submode Mixed + */ +const int ZX_PDF417_SUBMODE_MIXED = 2; + +/** + * Text compaction submode Punctuation + */ +const int ZX_PDF417_SUBMODE_PUNCTUATION = 3; + +/** + * mode latch to Text Compaction mode + */ +const int ZX_PDF417_LATCH_TO_TEXT = 900; + +/** + * mode latch to Byte Compaction mode (number of characters NOT a multiple of 6) + */ +const int ZX_PDF417_LATCH_TO_BYTE_PADDED = 901; + +/** + * mode latch to Numeric Compaction mode + */ +const int ZX_PDF417_LATCH_TO_NUMERIC = 902; + +/** + * mode shift to Byte Compaction mode + */ +const int ZX_PDF417_SHIFT_TO_BYTE = 913; + +/** + * mode latch to Byte Compaction mode (number of characters a multiple of 6) + */ +const int ZX_PDF417_LATCH_TO_BYTE = 924; + +/** + * identifier for a user defined Extended Channel Interpretation (ECI) + */ +const int ZX_PDF417_HIGH_LEVEL_ECI_USER_DEFINED = 925; + +/** + * identifier for a general purpose ECO format + */ +const int ZX_PDF417_HIGH_LEVEL_ECI_GENERAL_PURPOSE = 926; + +/** + * identifier for an ECI of a character set of code page + */ +const int ZX_PDF417_HIGH_LEVEL_ECI_CHARSET = 927; + +/** + * Raw code table for text compaction Mixed sub-mode + */ +const int8_t ZX_PDF417_TEXT_MIXED_RAW[] = { + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, + 35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0}; + +/** + * Raw code table for text compaction: Punctuation sub-mode + */ +const int8_t ZX_PDF417_TEXT_PUNCTUATION_RAW[] = { + 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, + 10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0}; + +const int ZX_PDF417_MIXED_TABLE_LEN = 128; +unichar ZX_PDF417_MIXED_TABLE[ZX_PDF417_MIXED_TABLE_LEN]; + +const int ZX_PDF417_PUNCTUATION_LEN = 128; +unichar ZX_PDF417_PUNCTUATION[ZX_PDF417_PUNCTUATION_LEN]; + +const NSStringEncoding ZX_PDF417_DEFAULT_ENCODING = NSISOLatin1StringEncoding; + +@implementation ZXPDF417HighLevelEncoder + ++ (void)initialize { + if ([self class] != [ZXPDF417HighLevelEncoder class]) return; + + //Construct inverse lookups + for (int i = 0; i < ZX_PDF417_MIXED_TABLE_LEN; i++) { + ZX_PDF417_MIXED_TABLE[i] = 0xFF; + } + for (int8_t i = 0; i < sizeof(ZX_PDF417_TEXT_MIXED_RAW) / sizeof(int8_t); i++) { + int8_t b = ZX_PDF417_TEXT_MIXED_RAW[i]; + if (b > 0) { + ZX_PDF417_MIXED_TABLE[b] = i; + } + } + for (int i = 0; i < ZX_PDF417_PUNCTUATION_LEN; i++) { + ZX_PDF417_PUNCTUATION[i] = 0xFF; + } + for (int8_t i = 0; i < sizeof(ZX_PDF417_TEXT_PUNCTUATION_RAW) / sizeof(int8_t); i++) { + int8_t b = ZX_PDF417_TEXT_PUNCTUATION_RAW[i]; + if (b > 0) { + ZX_PDF417_PUNCTUATION[b] = i; + } + } +} + ++ (NSString *)encodeHighLevel:(NSString *)msg compaction:(ZXPDF417Compaction)compaction encoding:(NSStringEncoding)encoding error:(NSError **)error { + //the codewords 0..928 are encoded as Unicode characters + NSMutableString *sb = [NSMutableString stringWithCapacity:msg.length]; + + if (encoding == 0) { + encoding = ZX_PDF417_DEFAULT_ENCODING; + } else if (ZX_PDF417_DEFAULT_ENCODING != encoding) { + ZXCharacterSetECI *eci = [ZXCharacterSetECI characterSetECIByEncoding:encoding]; + if (![self encodingECI:eci.value sb:sb error:error]) { + return nil; + } + } + + NSUInteger len = msg.length; + int p = 0; + int textSubMode = ZX_PDF417_SUBMODE_ALPHA; + + // User selected encoding mode + ZXByteArray *bytes = nil; //Fill later and only if needed + if (compaction == ZXPDF417CompactionText) { + [self encodeText:msg startpos:p count:(int)len buffer:sb initialSubmode:textSubMode]; + } else if (compaction == ZXPDF417CompactionByte) { + bytes = [self bytesForMessage:msg encoding:encoding]; + [self encodeBinary:bytes startpos:p count:(int)msg.length startmode:ZX_PDF417_BYTE_COMPACTION buffer:sb]; + } else if (compaction == ZXPDF417CompactionNumeric) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_LATCH_TO_NUMERIC]; + [self encodeNumeric:msg startpos:p count:(int)len buffer:sb]; + } else { + int encodingMode = ZX_PDF417_TEXT_COMPACTION; //Default mode, see 4.4.2.1 + while (p < len) { + int n = [self determineConsecutiveDigitCount:msg startpos:p]; + if (n >= 13) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_LATCH_TO_NUMERIC]; + encodingMode = ZX_PDF417_NUMERIC_COMPACTION; + textSubMode = ZX_PDF417_SUBMODE_ALPHA; //Reset after latch + [self encodeNumeric:msg startpos:p count:n buffer:sb]; + p += n; + } else { + int t = [self determineConsecutiveTextCount:msg startpos:p]; + if (t >= 5 || n == len) { + if (encodingMode != ZX_PDF417_TEXT_COMPACTION) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_LATCH_TO_TEXT]; + encodingMode = ZX_PDF417_TEXT_COMPACTION; + textSubMode = ZX_PDF417_SUBMODE_ALPHA; //start with submode alpha after latch + } + textSubMode = [self encodeText:msg startpos:p count:t buffer:sb initialSubmode:textSubMode]; + p += t; + } else { + if (bytes == NULL) { + bytes = [self bytesForMessage:msg encoding:encoding]; + } + int b = [self determineConsecutiveBinaryCount:msg bytes:bytes startpos:p error:error]; + if (b == -1) { + return nil; + } else if (b == 0) { + b = 1; + } + if (b == 1 && encodingMode == ZX_PDF417_TEXT_COMPACTION) { + //Switch for one byte (instead of latch) + [self encodeBinary:bytes startpos:p count:1 startmode:ZX_PDF417_TEXT_COMPACTION buffer:sb]; + } else { + //Mode latch performed by encodeBinary + [self encodeBinary:bytes startpos:p count:b startmode:encodingMode buffer:sb]; + encodingMode = ZX_PDF417_BYTE_COMPACTION; + textSubMode = ZX_PDF417_SUBMODE_ALPHA; //Reset after latch + } + p += b; + } + } + } + } + + return sb; +} + +/** + * Encode parts of the message using Text Compaction as described in ISO/IEC 15438:2001(E), + * chapter 4.4.2. + * + * @param msg the message + * @param startpos the start position within the message + * @param count the number of characters to encode + * @param sb receives the encoded codewords + * @param initialSubmode should normally be SUBMODE_ALPHA + * @return the text submode in which this method ends + */ ++ (int)encodeText:(NSString *)msg startpos:(int)startpos count:(int)count buffer:(NSMutableString *)sb initialSubmode:(int)initialSubmode { + NSMutableString *tmp = [NSMutableString stringWithCapacity:count]; + int submode = initialSubmode; + int idx = 0; + while (true) { + unichar ch = [msg characterAtIndex:startpos + idx]; + switch (submode) { + case ZX_PDF417_SUBMODE_ALPHA: + if ([self isAlphaUpper:ch]) { + if (ch == ' ') { + [tmp appendFormat:@"%C", (unichar) 26]; //space + } else { + [tmp appendFormat:@"%C", (unichar) (ch - 65)]; + } + } else { + if ([self isAlphaLower:ch]) { + submode = ZX_PDF417_SUBMODE_LOWER; + [tmp appendFormat:@"%C", (unichar) 27]; //ll + continue; + } else if ([self isMixed:ch]) { + submode = ZX_PDF417_SUBMODE_MIXED; + [tmp appendFormat:@"%C", (unichar) 28]; //ml + continue; + } else { + [tmp appendFormat:@"%C", (unichar) 29]; //ps + [tmp appendFormat:@"%C", ZX_PDF417_PUNCTUATION[ch]]; + break; + } + } + break; + case ZX_PDF417_SUBMODE_LOWER: + if ([self isAlphaLower:ch]) { + if (ch == ' ') { + [tmp appendFormat:@"%C", (unichar) 26]; //space + } else { + [tmp appendFormat:@"%C", (unichar) (ch - 97)]; + } + } else { + if ([self isAlphaUpper:ch]) { + [tmp appendFormat:@"%C", (unichar) 27]; //as + [tmp appendFormat:@"%C", (unichar) (ch - 65)]; + //space cannot happen here, it is also in "Lower" + break; + } else if ([self isMixed:ch]) { + submode = ZX_PDF417_SUBMODE_MIXED; + [tmp appendFormat:@"%C", (unichar) 28]; //ml + continue; + } else { + [tmp appendFormat:@"%C", (unichar) 29]; //ps + [tmp appendFormat:@"%C", ZX_PDF417_PUNCTUATION[ch]]; + break; + } + } + break; + case ZX_PDF417_SUBMODE_MIXED: + if ([self isMixed:ch]) { + [tmp appendFormat:@"%C", ZX_PDF417_MIXED_TABLE[ch]]; //as + } else { + if ([self isAlphaUpper:ch]) { + submode = ZX_PDF417_SUBMODE_ALPHA; + [tmp appendFormat:@"%C", (unichar) 28]; //al + continue; + } else if ([self isAlphaLower:ch]) { + submode = ZX_PDF417_SUBMODE_LOWER; + [tmp appendFormat:@"%C", (unichar) 27]; //ll + continue; + } else { + if (startpos + idx + 1 < count) { + char next = [msg characterAtIndex:startpos + idx + 1]; + if ([self isPunctuation:next]) { + submode = ZX_PDF417_SUBMODE_PUNCTUATION; + [tmp appendFormat:@"%C", (unichar) 25]; //pl + continue; + } + } + [tmp appendFormat:@"%C", (unichar) 29]; //ps + [tmp appendFormat:@"%C", ZX_PDF417_PUNCTUATION[ch]]; + } + } + break; + default: //ZX_PDF417_SUBMODE_PUNCTUATION + if ([self isPunctuation:ch]) { + [tmp appendFormat:@"%C", ZX_PDF417_PUNCTUATION[ch]]; + } else { + submode = ZX_PDF417_SUBMODE_ALPHA; + [tmp appendFormat:@"%C", (unichar) 29]; //al + continue; + } + } + idx++; + if (idx >= count) { + break; + } + } + unichar h = 0; + NSUInteger len = tmp.length; + for (int i = 0; i < len; i++) { + BOOL odd = (i % 2) != 0; + if (odd) { + h = (unichar) ((h * 30) + [tmp characterAtIndex:i]); + [sb appendFormat:@"%C", h]; + } else { + h = [tmp characterAtIndex:i]; + } + } + if ((len % 2) != 0) { + [sb appendFormat:@"%C", (unichar) ((h * 30) + 29)]; //ps + } + return submode; +} + +/** + * Encode parts of the message using Byte Compaction as described in ISO/IEC 15438:2001(E), + * chapter 4.4.3. The Unicode characters will be converted to binary using the cp437 + * codepage. + * + * @param bytes the message converted to a byte array + * @param startpos the start position within the message + * @param count the number of bytes to encode + * @param startmode the mode from which this method starts + * @param sb receives the encoded codewords + */ ++ (void)encodeBinary:(ZXByteArray *)bytes startpos:(int)startpos count:(int)count startmode:(int)startmode buffer:(NSMutableString *)sb { + if (count == 1 && startmode == ZX_PDF417_TEXT_COMPACTION) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_SHIFT_TO_BYTE]; + } else { + BOOL sixpack = ((count % 6) == 0); + if (sixpack) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_LATCH_TO_BYTE]; + } else { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_LATCH_TO_BYTE_PADDED]; + } + } + + int idx = startpos; + // Encode sixpacks + if (count >= 6) { + const int charsLen = 5; + unichar chars[charsLen]; + memset(chars, 0, charsLen * sizeof(unichar)); + while ((startpos + count - idx) >= 6) { + long t = 0; + for (int i = 0; i < 6; i++) { + t <<= 8; + t += bytes.array[idx + i] & 0xff; + } + for (int i = 0; i < 5; i++) { + chars[i] = (unichar) (t % 900); + t /= 900; + } + for (int i = charsLen - 1; i >= 0; i--) { + [sb appendFormat:@"%C", chars[i]]; + } + idx += 6; + } + } + //Encode rest (remaining n<5 bytes if any) + for (int i = idx; i < startpos + count; i++) { + int ch = bytes.array[i] & 0xff; + [sb appendFormat:@"%C", (unichar)ch]; + } +} + ++ (void)encodeNumeric:(NSString *)msg startpos:(int)startpos count:(int)count buffer:(NSMutableString *)sb { + int idx = 0; + NSMutableString *tmp = [NSMutableString stringWithCapacity:count / 3 + 1]; + NSDecimalNumber *num900 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:900] decimalValue]]; + NSDecimalNumber *num0 = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInt:0] decimalValue]]; + while (idx < count) { + [tmp setString:@""]; + int len = MIN(44, count - idx); + NSString *part = [@"1" stringByAppendingString:[msg substringWithRange:NSMakeRange(startpos + idx, len)]]; + NSDecimalNumber *bigint = [NSDecimalNumber decimalNumberWithString:part]; + do { + NSRoundingMode roundingMode = ((bigint.floatValue < 0) ^ (num900.floatValue < 0)) ? NSRoundUp : NSRoundDown; + NSDecimalNumber *quotient = [bigint decimalNumberByDividingBy:num900 + withBehavior:[NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode + scale:0 + raiseOnExactness:NO + raiseOnOverflow:NO + raiseOnUnderflow:NO + raiseOnDivideByZero:NO]]; + + NSDecimalNumber *subtractAmount = [quotient decimalNumberByMultiplyingBy:num900]; + NSDecimalNumber *remainder = [bigint decimalNumberBySubtracting:subtractAmount]; + + [tmp appendFormat:@"%C", (unichar)[remainder longValue]]; + bigint = quotient; + } while (![bigint isEqualToNumber:num0]); + + //Reverse temporary string + for (int i = (int)tmp.length - 1; i >= 0; i--) { + [sb appendFormat:@"%C", [tmp characterAtIndex:i]]; + } + idx += len; + } +} + ++ (BOOL)isDigit:(unichar)ch { + return ch >= '0' && ch <= '9'; +} + ++ (BOOL)isAlphaUpper:(unichar)ch { + return ch == ' ' || (ch >= 'A' && ch <= 'Z'); +} + ++ (BOOL)isAlphaLower:(unichar)ch { + return ch == ' ' || (ch >= 'a' && ch <= 'z'); +} + ++ (BOOL)isMixed:(unichar)ch { + return ZX_PDF417_MIXED_TABLE[ch] != 0xFF; +} + ++ (BOOL)isPunctuation:(unichar)ch { + return ZX_PDF417_PUNCTUATION[ch] != 0xFF; +} + ++ (BOOL)isText:(unichar)ch { + return ch == '\t' || ch == '\n' || ch == '\r' || (ch >= 32 && ch <= 126); +} + +/** + * Determines the number of consecutive characters that are encodable using numeric compaction. + * + * @param msg the message + * @param startpos the start position within the message + * @return the requested character count + */ ++ (int)determineConsecutiveDigitCount:(NSString *)msg startpos:(int)startpos { + int count = 0; + NSUInteger len = msg.length; + int idx = startpos; + if (idx < len) { + char ch = [msg characterAtIndex:idx]; + while ([self isDigit:ch] && idx < len) { + count++; + idx++; + if (idx < len) { + ch = [msg characterAtIndex:idx]; + } + } + } + return count; +} + +/** + * Determines the number of consecutive characters that are encodable using text compaction. + * + * @param msg the message + * @param startpos the start position within the message + * @return the requested character count + */ ++ (int)determineConsecutiveTextCount:(NSString *)msg startpos:(int)startpos { + NSUInteger len = msg.length; + int idx = startpos; + while (idx < len) { + char ch = [msg characterAtIndex:idx]; + int numericCount = 0; + while (numericCount < 13 && [self isDigit:ch] && idx < len) { + numericCount++; + idx++; + if (idx < len) { + ch = [msg characterAtIndex:idx]; + } + } + if (numericCount >= 13) { + return idx - startpos - numericCount; + } + if (numericCount > 0) { + //Heuristic: All text-encodable chars or digits are binary encodable + continue; + } + ch = [msg characterAtIndex:idx]; + + //Check if character is encodable + if (![self isText:ch]) { + break; + } + idx++; + } + return idx - startpos; +} + +/** + * Determines the number of consecutive characters that are encodable using binary compaction. + * + * @param msg the message + * @param bytes the message converted to a byte array + * @param startpos the start position within the message + * @return the requested character count + */ ++ (int)determineConsecutiveBinaryCount:(NSString *)msg bytes:(ZXByteArray *)bytes startpos:(int)startpos error:(NSError **)error { + NSUInteger len = msg.length; + int idx = startpos; + while (idx < len) { + char ch = [msg characterAtIndex:idx]; + int numericCount = 0; + + while (numericCount < 13 && [self isDigit:ch]) { + numericCount++; + //textCount++; + int i = idx + numericCount; + if (i >= len) { + break; + } + ch = [msg characterAtIndex:i]; + } + if (numericCount >= 13) { + return idx - startpos; + } + ch = [msg characterAtIndex:idx]; + + //Check if character is encodable + //Sun returns a ASCII 63 (?) for a character that cannot be mapped. Let's hope all + //other VMs do the same + if (bytes.array[idx] == 63 && ch != '?') { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Non-encodable character detected: %c (Unicode: %C)", ch, (unichar)ch]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return -1; + } + idx++; + } + return idx - startpos; +} + ++ (BOOL)encodingECI:(int)eci sb:(NSMutableString *)sb error:(NSError **)error { + if (eci >= 0 && eci < 900) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_HIGH_LEVEL_ECI_CHARSET]; + [sb appendFormat:@"%C", (unichar) eci]; + } else if (eci < 810900) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_HIGH_LEVEL_ECI_GENERAL_PURPOSE]; + [sb appendFormat:@"%C", (unichar) (eci / 900 - 1)]; + [sb appendFormat:@"%C", (unichar) (eci % 900)]; + } else if (eci < 811800) { + [sb appendFormat:@"%C", (unichar) ZX_PDF417_HIGH_LEVEL_ECI_USER_DEFINED]; + [sb appendFormat:@"%C", (unichar) (810900 - eci)]; + } else { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"ECI number not in valid range from 0..811799, but was %d", eci]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + return YES; +} + ++ (ZXByteArray *)bytesForMessage:(NSString *)msg encoding:(NSStringEncoding)encoding { + NSData *data = [msg dataUsingEncoding:encoding]; + int8_t *bytes = (int8_t *)[data bytes]; + ZXByteArray *byteArray = [[ZXByteArray alloc] initWithLength:(unsigned int)[data length]]; + memcpy(byteArray.array, bytes, [data length] * sizeof(int8_t)); + return byteArray; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.h new file mode 100644 index 0000000..cc3c232 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.h @@ -0,0 +1,28 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXReader.h" + +@class ZXQRCodeDecoder; + +/** + * This implementation can detect and decode QR Codes in an image. + */ +@interface ZXQRCodeReader : NSObject + +@property (nonatomic, strong, readonly) ZXQRCodeDecoder *decoder; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.m new file mode 100644 index 0000000..1bb8286 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.m @@ -0,0 +1,218 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBarcodeFormat.h" +#import "ZXBinaryBitmap.h" +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDecoderResult.h" +#import "ZXDetectorResult.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXQRCodeDecoder.h" +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXQRCodeDetector.h" +#import "ZXQRCodeReader.h" +#import "ZXResult.h" + +@implementation ZXQRCodeReader + +- (id)init { + if (self = [super init]) { + _decoder = [[ZXQRCodeDecoder alloc] init]; + } + + return self; +} + +/** + * Locates and decodes a QR code in an image. + * + * @return a String representing the content encoded by the QR code + * @throws NotFoundException if a QR code cannot be found + * @throws FormatException if a QR code cannot be decoded + * @throws ChecksumException if error correction fails + */ +- (ZXResult *)decode:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXResult *)decode:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXDecoderResult *decoderResult; + NSMutableArray *points; + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + if (hints != nil && hints.pureBarcode) { + ZXBitMatrix *bits = [self extractPureBits:matrix]; + if (!bits) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + decoderResult = [self.decoder decodeMatrix:bits hints:hints error:error]; + if (!decoderResult) { + return nil; + } + points = [NSMutableArray array]; + } else { + ZXDetectorResult *detectorResult = [[[ZXQRCodeDetector alloc] initWithImage:matrix] detect:hints error:error]; + if (!detectorResult) { + return nil; + } + decoderResult = [self.decoder decodeMatrix:[detectorResult bits] hints:hints error:error]; + if (!decoderResult) { + return nil; + } + points = [[detectorResult points] mutableCopy]; + } + + // If the code was mirrored: swap the bottom-left and the top-right points. + if ([decoderResult.other isKindOfClass:[ZXQRCodeDecoderMetaData class]]) { + [(ZXQRCodeDecoderMetaData *)decoderResult.other applyMirroredCorrection:points]; + } + + ZXResult *result = [ZXResult resultWithText:decoderResult.text + rawBytes:decoderResult.rawBytes + resultPoints:points + format:kBarcodeFormatQRCode]; + NSMutableArray *byteSegments = decoderResult.byteSegments; + if (byteSegments != nil) { + [result putMetadata:kResultMetadataTypeByteSegments value:byteSegments]; + } + NSString *ecLevel = decoderResult.ecLevel; + if (ecLevel != nil) { + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:ecLevel]; + } + if ([decoderResult hasStructuredAppend]) { + [result putMetadata:kResultMetadataTypeStructuredAppendSequence + value:@(decoderResult.structuredAppendSequenceNumber)]; + [result putMetadata:kResultMetadataTypeStructuredAppendParity + value:@(decoderResult.structuredAppendParity)]; + } + return result; +} + +- (void)reset { + // do nothing +} + +/** + * This method detects a code in a "pure" image -- that is, pure monochrome image + * which contains only an unrotated, unskewed, image of a code, with some white border + * around it. This is a specialized method that works exceptionally fast in this special + * case. + */ +- (ZXBitMatrix *)extractPureBits:(ZXBitMatrix *)image { + ZXIntArray *leftTopBlack = image.topLeftOnBit; + ZXIntArray *rightBottomBlack = image.bottomRightOnBit; + if (leftTopBlack == nil || rightBottomBlack == nil) { + return nil; + } + + float moduleSize = [self moduleSize:leftTopBlack image:image]; + if (moduleSize == -1) { + return nil; + } + + int top = leftTopBlack.array[1]; + int bottom = rightBottomBlack.array[1]; + int left = leftTopBlack.array[0]; + int right = rightBottomBlack.array[0]; + + // Sanity check! + if (left >= right || top >= bottom) { + return nil; + } + + if (bottom - top != right - left) { + // Special case, where bottom-right module wasn't black so we found something else in the last row + // Assume it's a square, so use height as the width + right = left + (bottom - top); + } + + int matrixWidth = round((right - left + 1) / moduleSize); + int matrixHeight = round((bottom - top + 1) / moduleSize); + if (matrixWidth <= 0 || matrixHeight <= 0) { + return nil; + } + if (matrixHeight != matrixWidth) { + return nil; + } + + int nudge = (int) (moduleSize / 2.0f); + top += nudge; + left += nudge; + + // But careful that this does not sample off the edge + // "right" is the farthest-right valid pixel location -- right+1 is not necessarily + // This is positive by how much the inner x loop below would be too large + int nudgedTooFarRight = left + (int) ((matrixWidth - 1) * moduleSize) - right; + if (nudgedTooFarRight > 0) { + if (nudgedTooFarRight > nudge) { + // Neither way fits; abort + return nil; + } + left -= nudgedTooFarRight; + } + // See logic above + int nudgedTooFarDown = top + (int) ((matrixHeight - 1) * moduleSize) - bottom; + if (nudgedTooFarDown > 0) { + if (nudgedTooFarDown > nudge) { + // Neither way fits; abort + return nil; + } + top -= nudgedTooFarDown; + } + + // Now just read off the bits + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithWidth:matrixWidth height:matrixHeight]; + for (int y = 0; y < matrixHeight; y++) { + int iOffset = top + (int) (y * moduleSize); + for (int x = 0; x < matrixWidth; x++) { + if ([image getX:left + (int) (x * moduleSize) y:iOffset]) { + [bits setX:x y:y]; + } + } + } + return bits; +} + +- (float)moduleSize:(ZXIntArray *)leftTopBlack image:(ZXBitMatrix *)image { + int height = image.height; + int width = image.width; + int x = leftTopBlack.array[0]; + int y = leftTopBlack.array[1]; + BOOL inBlack = YES; + int transitions = 0; + while (x < width && y < height) { + if (inBlack != [image getX:x y:y]) { + if (++transitions == 5) { + break; + } + inBlack = !inBlack; + } + x++; + y++; + } + if (x == width || y == height) { + return -1; + } + + return (x - leftTopBlack.array[0]) / 7.0f; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.h new file mode 100644 index 0000000..647d9db --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.h @@ -0,0 +1,24 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXWriter.h" + +/** + * This object renders a QR Code as a BitMatrix 2D array of greyscale values. + */ +@interface ZXQRCodeWriter : NSObject + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.m new file mode 100644 index 0000000..575b3d3 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.m @@ -0,0 +1,94 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteMatrix.h" +#import "ZXEncodeHints.h" +#import "ZXQRCode.h" +#import "ZXQRCodeEncoder.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeWriter.h" + +const int ZX_QUIET_ZONE_SIZE = 4; + +@implementation ZXQRCodeWriter + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height error:(NSError **)error { + return [self encode:contents format:format width:width height:height hints:nil error:error]; +} + +- (ZXBitMatrix *)encode:(NSString *)contents format:(ZXBarcodeFormat)format width:(int)width height:(int)height hints:(ZXEncodeHints *)hints error:(NSError **)error { + if ([contents length] == 0) { + [NSException raise:NSInvalidArgumentException format:@"Found empty contents"]; + } + + if (format != kBarcodeFormatQRCode) { + [NSException raise:NSInvalidArgumentException format:@"Can only encode QR_CODE"]; + } + + if (width < 0 || height < 0) { + [NSException raise:NSInvalidArgumentException format:@"Requested dimensions are too small: %dx%d", width, height]; + } + + ZXQRCodeErrorCorrectionLevel *errorCorrectionLevel = [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelL]; + int quietZone = ZX_QUIET_ZONE_SIZE; + if (hints != nil) { + if (hints.errorCorrectionLevel) { + errorCorrectionLevel = hints.errorCorrectionLevel; + } + if (hints.margin) { + quietZone = [hints.margin intValue]; + } + } + + ZXQRCode *code = [ZXQRCodeEncoder encode:contents ecLevel:errorCorrectionLevel hints:hints error:error]; + return [self renderResult:code width:width height:height quietZone:quietZone]; +} + +- (ZXBitMatrix *)renderResult:(ZXQRCode *)code width:(int)width height:(int)height quietZone:(int)quietZone { + ZXByteMatrix *input = code.matrix; + if (input == nil) { + return nil; + } + int inputWidth = input.width; + int inputHeight = input.height; + int qrWidth = inputWidth + (quietZone * 2); + int qrHeight = inputHeight + (quietZone * 2); + int outputWidth = MAX(width, qrWidth); + int outputHeight = MAX(height, qrHeight); + + int multiple = MIN(outputWidth / qrWidth, outputHeight / qrHeight); + // Padding includes both the quiet zone and the extra white pixels to accommodate the requested + // dimensions. For example, if input is 25x25 the QR will be 33x33 including the quiet zone. + // If the requested size is 200x160, the multiple will be 4, for a QR of 132x132. These will + // handle all the padding from 100x100 (the actual QR) up to 200x160. + int leftPadding = (outputWidth - (inputWidth * multiple)) / 2; + int topPadding = (outputHeight - (inputHeight * multiple)) / 2; + + ZXBitMatrix *output = [[ZXBitMatrix alloc] initWithWidth:outputWidth height:outputHeight]; + + for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) { + for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) { + if ([input getX:inputX y:inputY] == 1) { + [output setRegionAtLeft:outputX top:outputY width:multiple height:multiple]; + } + } + } + + return output; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXingObjCQRCode.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXingObjCQRCode.h new file mode 100644 index 0000000..0672a3b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/ZXingObjCQRCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXingObjCCore.h" + +#ifndef _ZXINGOBJC_QRCODE_ + +#define _ZXINGOBJC_QRCODE_ + +#import "ZXQRCode.h" +#import "ZXQRCodeAlignmentPattern.h" +#import "ZXQRCodeDecoder.h" +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXQRCodeDetector.h" +#import "ZXQRCodeEncoder.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeFinderPatternInfo.h" +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternFinder.h" +#import "ZXQRCodeFinderPatternInfo.h" +#import "ZXQRCodeMode.h" +#import "ZXQRCodeReader.h" +#import "ZXQRCodeVersion.h" +#import "ZXQRCodeWriter.h" + +#endif diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.h new file mode 100644 index 0000000..ca89b37 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.h @@ -0,0 +1,72 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXByteArray, ZXQRCodeFormatInformation, ZXQRCodeVersion; + +@interface ZXQRCodeBitMatrixParser : NSObject + +/** + * @param bitMatrix ZXBitMatrix to parse + * @return nil if dimension is not >= 21 and 1 mod 4 + */ +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error; + +/** + * Reads format information from one of its two locations within the QR Code. + * + * @return ZXFormatInformation encapsulating the QR Code's format info + * @return nil if both format information locations cannot be parsed as + * the valid encoding of format information + */ +- (ZXQRCodeFormatInformation *)readFormatInformationWithError:(NSError **)error; + +/** + * Reads version information from one of its two locations within the QR Code. + * + * @return ZXQRCodeVersion encapsulating the QR Code's version or nil + * if both version information locations cannot be parsed as + * the valid encoding of version information + */ +- (ZXQRCodeVersion *)readVersionWithError:(NSError **)error; + +/** + * Reads the bits in the ZXBitMatrix representing the finder pattern in the + * correct order in order to reconstruct the codewords bytes contained within the + * QR Code. + * + * @return bytes encoded within the QR Code or nil if the exact number of bytes expected is not read + */ +- (ZXByteArray *)readCodewordsWithError:(NSError **)error; + +/** + * Revert the mask removal done while reading the code words. The bit matrix should revert to its original state. + */ +- (void)remask; + +/** + * Prepare the parser for a mirrored operation. + * This flag has effect only on the readFormatInformation and the + * readVersion. Before proceeding with readCodewords the + * mirror method should be called. + * + * @param mirror Whether to read version and format information mirrored. + */ +- (void)setMirror:(BOOL)mirror; + +/** Mirror the bit matrix in order to attempt a second reading. */ +- (void)mirror; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.m new file mode 100644 index 0000000..0fc1062 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.m @@ -0,0 +1,223 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXByteArray.h" +#import "ZXErrors.h" +#import "ZXQRCodeBitMatrixParser.h" +#import "ZXQRCodeDataMask.h" +#import "ZXQRCodeFormatInformation.h" +#import "ZXQRCodeVersion.h" + +@interface ZXQRCodeBitMatrixParser () + +@property (nonatomic, strong, readonly) ZXBitMatrix *bitMatrix; +@property (nonatomic, assign) BOOL shouldMirror; +@property (nonatomic, strong) ZXQRCodeFormatInformation *parsedFormatInfo; +@property (nonatomic, strong) ZXQRCodeVersion *parsedVersion; + +@end + +@implementation ZXQRCodeBitMatrixParser + +- (id)initWithBitMatrix:(ZXBitMatrix *)bitMatrix error:(NSError **)error { + int dimension = bitMatrix.height; + if (dimension < 21 || (dimension & 0x03) != 1) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + + if (self = [super init]) { + _bitMatrix = bitMatrix; + _parsedFormatInfo = nil; + _parsedVersion = nil; + } + return self; +} + +- (ZXQRCodeFormatInformation *)readFormatInformationWithError:(NSError **)error { + if (self.parsedFormatInfo != nil) { + return self.parsedFormatInfo; + } + int formatInfoBits1 = 0; + + for (int i = 0; i < 6; i++) { + formatInfoBits1 = [self copyBit:i j:8 versionBits:formatInfoBits1]; + } + + formatInfoBits1 = [self copyBit:7 j:8 versionBits:formatInfoBits1]; + formatInfoBits1 = [self copyBit:8 j:8 versionBits:formatInfoBits1]; + formatInfoBits1 = [self copyBit:8 j:7 versionBits:formatInfoBits1]; + + for (int j = 5; j >= 0; j--) { + formatInfoBits1 = [self copyBit:8 j:j versionBits:formatInfoBits1]; + } + + int dimension = self.bitMatrix.height; + int formatInfoBits2 = 0; + int jMin = dimension - 7; + + for (int j = dimension - 1; j >= jMin; j--) { + formatInfoBits2 = [self copyBit:8 j:j versionBits:formatInfoBits2]; + } + + for (int i = dimension - 8; i < dimension; i++) { + formatInfoBits2 = [self copyBit:i j:8 versionBits:formatInfoBits2]; + } + + self.parsedFormatInfo = [ZXQRCodeFormatInformation decodeFormatInformation:formatInfoBits1 maskedFormatInfo2:formatInfoBits2]; + if (self.parsedFormatInfo != nil) { + return self.parsedFormatInfo; + } + if (error) *error = ZXFormatErrorInstance(); + return nil; +} + +- (ZXQRCodeVersion *)readVersionWithError:(NSError **)error { + if (self.parsedVersion != nil) { + return self.parsedVersion; + } + int dimension = self.bitMatrix.height; + int provisionalVersion = (dimension - 17) / 4; + if (provisionalVersion <= 6) { + return [ZXQRCodeVersion versionForNumber:provisionalVersion]; + } + int versionBits = 0; + int ijMin = dimension - 11; + + for (int j = 5; j >= 0; j--) { + + for (int i = dimension - 9; i >= ijMin; i--) { + versionBits = [self copyBit:i j:j versionBits:versionBits]; + } + + } + + ZXQRCodeVersion *theParsedVersion = [ZXQRCodeVersion decodeVersionInformation:versionBits]; + if (theParsedVersion != nil && theParsedVersion.dimensionForVersion == dimension) { + self.parsedVersion = theParsedVersion; + return self.parsedVersion; + } + versionBits = 0; + + for (int i = 5; i >= 0; i--) { + for (int j = dimension - 9; j >= ijMin; j--) { + versionBits = [self copyBit:i j:j versionBits:versionBits]; + } + } + + theParsedVersion = [ZXQRCodeVersion decodeVersionInformation:versionBits]; + if (theParsedVersion != nil && theParsedVersion.dimensionForVersion == dimension) { + self.parsedVersion = theParsedVersion; + return self.parsedVersion; + } + if (error) *error = ZXFormatErrorInstance(); + return nil; +} + +- (int)copyBit:(int)i j:(int)j versionBits:(int)versionBits { + BOOL bit = self.shouldMirror ? [self.bitMatrix getX:j y:i] : [self.bitMatrix getX:i y:j]; + return bit ? (versionBits << 1) | 0x1 : versionBits << 1; +} + +- (ZXByteArray *)readCodewordsWithError:(NSError **)error { + ZXQRCodeFormatInformation *formatInfo = [self readFormatInformationWithError:error]; + if (!formatInfo) { + return nil; + } + + ZXQRCodeVersion *version = [self readVersionWithError:error]; + if (!version) { + return nil; + } + + // Get the data mask for the format used in this QR Code. This will exclude + // some bits from reading as we wind through the bit matrix. + ZXQRCodeDataMask *dataMask = [ZXQRCodeDataMask forReference:[formatInfo dataMask]]; + int dimension = self.bitMatrix.height; + [dataMask unmaskBitMatrix:self.bitMatrix dimension:dimension]; + + ZXBitMatrix *functionPattern = [version buildFunctionPattern]; + + BOOL readingUp = YES; + ZXByteArray *result = [[ZXByteArray alloc] initWithLength:version.totalCodewords]; + int resultOffset = 0; + int currentByte = 0; + int bitsRead = 0; + // Read columns in pairs, from right to left + for (int j = dimension - 1; j > 0; j -= 2) { + if (j == 6) { + // Skip whole column with vertical alignment pattern; + // saves time and makes the other code proceed more cleanly + j--; + } + // Read alternatingly from bottom to top then top to bottom + for (int count = 0; count < dimension; count++) { + int i = readingUp ? dimension - 1 - count : count; + for (int col = 0; col < 2; col++) { + // Ignore bits covered by the function pattern + if (![functionPattern getX:j - col y:i]) { + // Read a bit + bitsRead++; + currentByte <<= 1; + if ([self.bitMatrix getX:j - col y:i]) { + currentByte |= 1; + } + // If we've made a whole byte, save it off + if (bitsRead == 8) { + result.array[resultOffset++] = (int8_t) currentByte; + bitsRead = 0; + currentByte = 0; + } + } + } + } + readingUp ^= YES; // readingUp = !readingUp; // switch directions + } + if (resultOffset != [version totalCodewords]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + return result; +} + +- (void)remask { + if (!self.parsedFormatInfo) { + return; // We have no format information, and have no data mask + } + ZXQRCodeDataMask *dataMask = [ZXQRCodeDataMask forReference:self.parsedFormatInfo.dataMask]; + int dimension = self.bitMatrix.height; + [dataMask unmaskBitMatrix:self.bitMatrix dimension:dimension]; +} + +- (void)setMirror:(BOOL)mirror { + self.parsedVersion = nil; + self.parsedFormatInfo = nil; + self.shouldMirror = mirror; +} + +- (void)mirror { + for (int x = 0; x < self.bitMatrix.width; x++) { + for (int y = x + 1; y < self.bitMatrix.height; y++) { + if ([self.bitMatrix getX:x y:y] != [self.bitMatrix getX:y y:x]) { + [self.bitMatrix flipX:y y:x]; + [self.bitMatrix flipX:x y:y]; + } + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.h new file mode 100644 index 0000000..ca5a80c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.h @@ -0,0 +1,44 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXQRCodeErrorCorrectionLevel, ZXQRCodeVersion; + +/** + * Encapsulates a block of data within a QR Code. QR Codes may split their data into + * multiple blocks, each of which is a unit of data and error-correction codewords. Each + * is represented by an instance of this class. + */ +@interface ZXQRCodeDataBlock : NSObject + +@property (nonatomic, strong, readonly) ZXByteArray *codewords; +@property (nonatomic, assign, readonly) int numDataCodewords; + +- (id)initWithNumDataCodewords:(int)numDataCodewords codewords:(ZXByteArray *)codewords; + +/** + * When QR Codes use multiple data blocks, they are actually interleaved. + * That is, the first byte of data block 1 to n is written, then the second bytes, and so on. This + * method will separate the data into original blocks. + * + * @param rawCodewords bytes as read directly from the QR Code + * @param version version of the QR Code + * @param ecLevel error-correction level of the QR Code + * @return DataBlocks containing original bytes, "de-interleaved" from representation in the + * QR Code + */ ++ (NSArray *)dataBlocks:(ZXByteArray *)rawCodewords version:(ZXQRCodeVersion *)version ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.m new file mode 100644 index 0000000..2b3a1d4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.m @@ -0,0 +1,98 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXQRCodeDataBlock.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeVersion.h" + +@implementation ZXQRCodeDataBlock + +- (id)initWithNumDataCodewords:(int)numDataCodewords codewords:(ZXByteArray *)codewords { + if (self = [super init]) { + _numDataCodewords = numDataCodewords; + _codewords = codewords; + } + + return self; +} + ++ (NSArray *)dataBlocks:(ZXByteArray *)rawCodewords version:(ZXQRCodeVersion *)version ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel { + if (rawCodewords.length != version.totalCodewords) { + [NSException raise:NSInvalidArgumentException format:@"Invalid codewords count"]; + } + + // Figure out the number and size of data blocks used by this version and + // error correction level + ZXQRCodeECBlocks *ecBlocks = [version ecBlocksForLevel:ecLevel]; + + // First count the total number of data blocks + int totalBlocks = 0; + NSArray *ecBlockArray = ecBlocks.ecBlocks; + for (ZXQRCodeECB *ecBlock in ecBlockArray) { + totalBlocks += ecBlock.count; + } + + // Now establish DataBlocks of the appropriate size and number of data codewords + NSMutableArray *result = [NSMutableArray arrayWithCapacity:totalBlocks]; + for (ZXQRCodeECB *ecBlock in ecBlockArray) { + for (int i = 0; i < ecBlock.count; i++) { + int numDataCodewords = ecBlock.dataCodewords; + int numBlockCodewords = ecBlocks.ecCodewordsPerBlock + numDataCodewords; + [result addObject:[[ZXQRCodeDataBlock alloc] initWithNumDataCodewords:numDataCodewords codewords:[[ZXByteArray alloc] initWithLength:numBlockCodewords]]]; + } + } + + // All blocks have the same amount of data, except that the last n + // (where n may be 0) have 1 more byte. Figure out where these start. + int shorterBlocksTotalCodewords = [(ZXQRCodeDataBlock *)result[0] codewords].length; + int longerBlocksStartAt = (int)[result count] - 1; + while (longerBlocksStartAt >= 0) { + int numCodewords = [(ZXQRCodeDataBlock *)result[longerBlocksStartAt] codewords].length; + if (numCodewords == shorterBlocksTotalCodewords) { + break; + } + longerBlocksStartAt--; + } + longerBlocksStartAt++; + + int shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.ecCodewordsPerBlock; + // The last elements of result may be 1 element longer; + // first fill out as many elements as all of them have + int rawCodewordsOffset = 0; + int numResultBlocks = (int)[result count]; + for (int i = 0; i < shorterBlocksNumDataCodewords; i++) { + for (int j = 0; j < numResultBlocks; j++) { + [(ZXQRCodeDataBlock *)result[j] codewords].array[i] = rawCodewords.array[rawCodewordsOffset++]; + } + } + // Fill out the last data block in the longer ones + for (int j = longerBlocksStartAt; j < numResultBlocks; j++) { + [(ZXQRCodeDataBlock *)result[j] codewords].array[shorterBlocksNumDataCodewords] = rawCodewords.array[rawCodewordsOffset++]; + } + // Now add in error correction blocks + int max = (int)[(ZXQRCodeDataBlock *)result[0] codewords].length; + for (int i = shorterBlocksNumDataCodewords; i < max; i++) { + for (int j = 0; j < numResultBlocks; j++) { + int iOffset = j < longerBlocksStartAt ? i : i + 1; + [(ZXQRCodeDataBlock *)result[j] codewords].array[iOffset] = rawCodewords.array[rawCodewordsOffset++]; + } + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.h new file mode 100644 index 0000000..8ea4d1b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.h @@ -0,0 +1,48 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix; + +/** + * Encapsulates data masks for the data bits in a QR code, per ISO 18004:2006 6.8. Implementations + * of this class can un-mask a raw BitMatrix. For simplicity, they will unmask the entire BitMatrix, + * including areas used for finder patterns, timing patterns, etc. These areas should be unused + * after the point they are unmasked anyway. + * + * Note that the diagram in section 6.8.1 is misleading since it indicates that i is column position + * and j is row position. In fact, as the text says, i is row position and j is column position. + */ +@interface ZXQRCodeDataMask : NSObject + +/** + * Implementations of this method reverse the data masking process applied to a QR Code and + * make its bits ready to read. + * + * @param bits representation of QR Code bits + * @param dimension dimension of QR Code, represented by bits, being unmasked + */ +- (void)unmaskBitMatrix:(ZXBitMatrix *)bits dimension:(int)dimension; + +- (BOOL)isMasked:(int)i j:(int)j; + +/** + * @param reference a value between 0 and 7 indicating one of the eight possible + * data mask patterns a QR Code may use + * @return DataMask encapsulating the data mask pattern + */ ++ (ZXQRCodeDataMask *)forReference:(int)reference; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.m new file mode 100644 index 0000000..108bd39 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.m @@ -0,0 +1,196 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXQRCodeDataMask.h" + +/** + * 000: mask bits for which (x + y) mod 2 == 0 + */ +@interface ZXDataMask000 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask000 + +- (BOOL)isMasked:(int)i j:(int)j { + return ((i + j) & 0x01) == 0; +} + +@end + + +/** + * 001: mask bits for which x mod 2 == 0 + */ +@interface ZXDataMask001 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask001 + +- (BOOL)isMasked:(int)i j:(int)j { + return (i & 0x01) == 0; +} + +@end + + +/** + * 010: mask bits for which y mod 3 == 0 + */ +@interface ZXDataMask010 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask010 + +- (BOOL)isMasked:(int)i j:(int)j { + return j % 3 == 0; +} + +@end + + +/** + * 011: mask bits for which (x + y) mod 3 == 0 + */ +@interface ZXDataMask011 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask011 + +- (BOOL)isMasked:(int)i j:(int)j { + return (i + j) % 3 == 0; +} + +@end + + +/** + * 100: mask bits for which (x/2 + y/3) mod 2 == 0 + */ +@interface ZXDataMask100 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask100 + +- (BOOL)isMasked:(int)i j:(int)j { + return (((i / 2) + (j /3)) & 0x01) == 0; +} + +@end + + +/** + * 101: mask bits for which xy mod 2 + xy mod 3 == 0 + */ +@interface ZXDataMask101 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask101 + +- (BOOL)isMasked:(int)i j:(int)j { + int temp = i * j; + return (temp & 0x01) + (temp % 3) == 0; +} + +@end + + +/** + * 110: mask bits for which (xy mod 2 + xy mod 3) mod 2 == 0 + */ +@interface ZXDataMask110 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask110 + +- (BOOL)isMasked:(int)i j:(int)j { + int temp = i * j; + return (((temp & 0x01) + (temp % 3)) & 0x01) == 0; +} + +@end + + +/** + * 111: mask bits for which ((x+y)mod 2 + xy mod 3) mod 2 == 0 + */ +@interface ZXDataMask111 : ZXQRCodeDataMask + +@end + +@implementation ZXDataMask111 + +- (BOOL)isMasked:(int)i j:(int)j { + return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0; +} + +@end + + +@implementation ZXQRCodeDataMask + +/** + * See ISO 18004:2006 6.8.1 + */ +static NSArray *DATA_MASKS = nil; + +/** + * Implementations of this method reverse the data masking process applied to a QR Code and + * make its bits ready to read. + */ +- (void)unmaskBitMatrix:(ZXBitMatrix *)bits dimension:(int)dimension { + for (int i = 0; i < dimension; i++) { + for (int j = 0; j < dimension; j++) { + if ([self isMasked:i j:j]) { + [bits flipX:j y:i]; + } + } + } +} + +- (BOOL)isMasked:(int)i j:(int)j { + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] + userInfo:nil]; +} + + ++ (ZXQRCodeDataMask *)forReference:(int)reference { + if (!DATA_MASKS) { + DATA_MASKS = @[[[ZXDataMask000 alloc] init], + [[ZXDataMask001 alloc] init], + [[ZXDataMask010 alloc] init], + [[ZXDataMask011 alloc] init], + [[ZXDataMask100 alloc] init], + [[ZXDataMask101 alloc] init], + [[ZXDataMask110 alloc] init], + [[ZXDataMask111 alloc] init]]; + } + + if (reference < 0 || reference > 7) { + [NSException raise:NSInvalidArgumentException format:@"Invalid reference value"]; + } + return DATA_MASKS[reference]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.h new file mode 100644 index 0000000..d43a639 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.h @@ -0,0 +1,33 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray, ZXDecodeHints, ZXDecoderResult, ZXQRCodeErrorCorrectionLevel, ZXQRCodeVersion; + +/** + * QR Codes can encode text as bits in one of several modes, and can use multiple modes + * in one QR Code. This class decodes the bits back into text. + * + * See ISO 18004:2006, 6.4.3 - 6.4.7 + */ +@interface ZXQRCodeDecodedBitStreamParser : NSObject + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes + version:(ZXQRCodeVersion *)version + ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel + hints:(ZXDecodeHints *)hints + error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.m new file mode 100644 index 0000000..b725d47 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.m @@ -0,0 +1,338 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitSource.h" +#import "ZXByteArray.h" +#import "ZXCharacterSetECI.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXQRCodeDecodedBitStreamParser.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeMode.h" +#import "ZXQRCodeVersion.h" +#import "ZXStringUtils.h" + +/** + * See ISO 18004:2006, 6.4.4 Table 5 + */ +const unichar ZX_ALPHANUMERIC_CHARS[45] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + ' ', '$', '%', '*', '+', '-', '.', '/', ':' +}; + +const int ZX_GB2312_SUBSET = 1; + +@implementation ZXQRCodeDecodedBitStreamParser + ++ (ZXDecoderResult *)decode:(ZXByteArray *)bytes + version:(ZXQRCodeVersion *)version + ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel + hints:(ZXDecodeHints *)hints + error:(NSError **)error { + ZXBitSource *bits = [[ZXBitSource alloc] initWithBytes:bytes]; + NSMutableString *result = [NSMutableString stringWithCapacity:50]; + NSMutableArray *byteSegments = [NSMutableArray arrayWithCapacity:1]; + int symbolSequence = -1; + int parityData = -1; + + ZXCharacterSetECI *currentCharacterSetECI = nil; + ZXQRCodeMode *mode; + BOOL fc1InEffect = NO; + + do { + // While still another segment to read... + if ([bits available] < 4) { + // OK, assume we're done. Really, a TERMINATOR mode should have been recorded here + mode = [ZXQRCodeMode terminatorMode]; + } else { + mode = [ZXQRCodeMode forBits:[bits readBits:4]]; // mode is encoded by 4 bits + if (!mode) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } + if (![mode isEqual:[ZXQRCodeMode terminatorMode]]) { + if ([mode isEqual:[ZXQRCodeMode fnc1FirstPositionMode]] || [mode isEqual:[ZXQRCodeMode fnc1SecondPositionMode]]) { + // We do little with FNC1 except alter the parsed result a bit according to the spec + fc1InEffect = YES; + } else if ([mode isEqual:[ZXQRCodeMode structuredAppendMode]]) { + if (bits.available < 16) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + // sequence number and parity is added later to the result metadata + // Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue + symbolSequence = [bits readBits:8]; + parityData = [bits readBits:8]; + } else if ([mode isEqual:[ZXQRCodeMode eciMode]]) { + // Count doesn't apply to ECI + int value = [self parseECIValue:bits]; + currentCharacterSetECI = [ZXCharacterSetECI characterSetECIByValue:value]; + if (currentCharacterSetECI == nil) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else { + // First handle Hanzi mode which does not start with character count + if ([mode isEqual:[ZXQRCodeMode hanziMode]]) { + //chinese mode contains a sub set indicator right after mode indicator + int subset = [bits readBits:4]; + int countHanzi = [bits readBits:[mode characterCountBits:version]]; + if (subset == ZX_GB2312_SUBSET) { + if (![self decodeHanziSegment:bits result:result count:countHanzi]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } + } else { + // "Normal" QR code modes: + // How many characters will follow, encoded in this mode? + int count = [bits readBits:[mode characterCountBits:version]]; + if ([mode isEqual:[ZXQRCodeMode numericMode]]) { + if (![self decodeNumericSegment:bits result:result count:count]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else if ([mode isEqual:[ZXQRCodeMode alphanumericMode]]) { + if (![self decodeAlphanumericSegment:bits result:result count:count fc1InEffect:fc1InEffect]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else if ([mode isEqual:[ZXQRCodeMode byteMode]]) { + if (![self decodeByteSegment:bits result:result count:count currentCharacterSetECI:currentCharacterSetECI byteSegments:byteSegments hints:hints]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else if ([mode isEqual:[ZXQRCodeMode kanjiMode]]) { + if (![self decodeKanjiSegment:bits result:result count:count]) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } else { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + } + } + } + } while (![mode isEqual:[ZXQRCodeMode terminatorMode]]); + + return [[ZXDecoderResult alloc] initWithRawBytes:bytes + text:result.description + byteSegments:byteSegments.count == 0 ? nil : byteSegments + ecLevel:ecLevel == nil ? nil : ecLevel.description + saSequence:symbolSequence + saParity:parityData]; +} + + +/** + * See specification GBT 18284-2000 + */ ++ (BOOL)decodeHanziSegment:(ZXBitSource *)bits result:(NSMutableString *)result count:(int)count { + if (count * 13 > bits.available) { + return NO; + } + + NSMutableData *buffer = [NSMutableData dataWithCapacity:2 * count]; + while (count > 0) { + int twoBytes = [bits readBits:13]; + int assembledTwoBytes = ((twoBytes / 0x060) << 8) | (twoBytes % 0x060); + if (assembledTwoBytes < 0x003BF) { + assembledTwoBytes += 0x0A1A1; + } else { + assembledTwoBytes += 0x0A6A1; + } + int8_t bytes[2]; + bytes[0] = (int8_t)((assembledTwoBytes >> 8) & 0xFF); + bytes[1] = (int8_t)(assembledTwoBytes & 0xFF); + + [buffer appendBytes:bytes length:2]; + + count--; + } + + NSString *string = [[NSString alloc] initWithData:buffer encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)]; + if (string) { + [result appendString:string]; + } + return YES; +} + ++ (BOOL)decodeKanjiSegment:(ZXBitSource *)bits result:(NSMutableString *)result count:(int)count { + if (count * 13 > bits.available) { + return NO; + } + + NSMutableData *buffer = [NSMutableData dataWithCapacity:2 * count]; + while (count > 0) { + int twoBytes = [bits readBits:13]; + int assembledTwoBytes = ((twoBytes / 0x0C0) << 8) | (twoBytes % 0x0C0); + if (assembledTwoBytes < 0x01F00) { + assembledTwoBytes += 0x08140; + } else { + assembledTwoBytes += 0x0C140; + } + int8_t bytes[2]; + bytes[0] = (int8_t)(assembledTwoBytes >> 8); + bytes[1] = (int8_t)assembledTwoBytes; + + [buffer appendBytes:bytes length:2]; + + count--; + } + + NSString *string = [[NSString alloc] initWithData:buffer encoding:NSShiftJISStringEncoding]; + if (string) { + [result appendString:string]; + } + return YES; +} + ++ (BOOL)decodeByteSegment:(ZXBitSource *)bits result:(NSMutableString *)result count:(int)count currentCharacterSetECI:(ZXCharacterSetECI *)currentCharacterSetECI byteSegments:(NSMutableArray *)byteSegments hints:(ZXDecodeHints *)hints { + if (8 * count > bits.available) { + return NO; + } + + ZXByteArray *readBytes = [[ZXByteArray alloc] initWithLength:count]; + for (int i = 0; i < count; i++) { + readBytes.array[i] = (int8_t)[bits readBits:8]; + } + NSStringEncoding encoding; + if (currentCharacterSetECI == nil) { + encoding = [ZXStringUtils guessEncoding:readBytes hints:hints]; + } else { + encoding = [currentCharacterSetECI encoding]; + } + + NSString *string = [[NSString alloc] initWithBytes:readBytes.array length:readBytes.length encoding:encoding]; + if (string) { + [result appendString:string]; + } + + [byteSegments addObject:readBytes]; + return YES; +} + ++ (unichar)toAlphaNumericChar:(int)value { + if (value >= 45) { + return -1; + } + return ZX_ALPHANUMERIC_CHARS[value]; +} + ++ (BOOL)decodeAlphanumericSegment:(ZXBitSource *)bits result:(NSMutableString *)result count:(int)count fc1InEffect:(BOOL)fc1InEffect { + int start = (int)result.length; + + while (count > 1) { + if ([bits available] < 11) { + return NO; + } + int nextTwoCharsBits = [bits readBits:11]; + unichar next1 = [self toAlphaNumericChar:nextTwoCharsBits / 45]; + unichar next2 = [self toAlphaNumericChar:nextTwoCharsBits % 45]; + + [result appendFormat:@"%C%C", next1, next2]; + count -= 2; + } + + if (count == 1) { + if ([bits available] < 6) { + return NO; + } + unichar next1 = [self toAlphaNumericChar:[bits readBits:6]]; + [result appendFormat:@"%C", next1]; + } + if (fc1InEffect) { + for (int i = start; i < [result length]; i++) { + if ([result characterAtIndex:i] == '%') { + if (i < [result length] - 1 && [result characterAtIndex:i + 1] == '%') { + [result deleteCharactersInRange:NSMakeRange(i + 1, 1)]; + } else { + [result insertString:[NSString stringWithFormat:@"%C", (unichar)0x1D] + atIndex:i]; + } + } + } + } + return YES; +} + ++ (BOOL)decodeNumericSegment:(ZXBitSource *)bits result:(NSMutableString *)result count:(int)count { + // Read three digits at a time + while (count >= 3) { + // Each 10 bits encodes three digits + if (bits.available < 10) { + return NO; + } + int threeDigitsBits = [bits readBits:10]; + if (threeDigitsBits >= 1000) { + return NO; + } + unichar next1 = [self toAlphaNumericChar:threeDigitsBits / 100]; + unichar next2 = [self toAlphaNumericChar:(threeDigitsBits / 10) % 10]; + unichar next3 = [self toAlphaNumericChar:threeDigitsBits % 10]; + + [result appendFormat:@"%C%C%C", next1, next2, next3]; + count -= 3; + } + + if (count == 2) { + // Two digits left over to read, encoded in 7 bits + if (bits.available < 7) { + return NO; + } + int twoDigitsBits = [bits readBits:7]; + if (twoDigitsBits >= 100) { + return NO; + } + unichar next1 = [self toAlphaNumericChar:twoDigitsBits / 10]; + unichar next2 = [self toAlphaNumericChar:twoDigitsBits % 10]; + [result appendFormat:@"%C%C", next1, next2]; + } else if (count == 1) { + // One digit left over to read + if (bits.available < 4) { + return NO; + } + int digitBits = [bits readBits:4]; + if (digitBits >= 10) { + return NO; + } + unichar next1 = [self toAlphaNumericChar:digitBits]; + [result appendFormat:@"%C", next1]; + } + return YES; +} + ++ (int)parseECIValue:(ZXBitSource *)bits { + int firstByte = [bits readBits:8]; + if ((firstByte & 0x80) == 0) { + return firstByte & 0x7F; + } + if ((firstByte & 0xC0) == 0x80) { + int secondByte = [bits readBits:8]; + return ((firstByte & 0x3F) << 8) | secondByte; + } + if ((firstByte & 0xE0) == 0xC0) { + int secondThirdBytes = [bits readBits:16]; + return ((firstByte & 0x1F) << 16) | secondThirdBytes; + } + return -1; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.h new file mode 100644 index 0000000..5578557 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.h @@ -0,0 +1,50 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDecodeHints, ZXDecodeHints, ZXDecoderResult; + +/** + * The main class which implements QR Code decoding -- as opposed to locating and extracting + * the QR Code from an image. + */ +@interface ZXQRCodeDecoder : NSObject + +/** + * Convenience method that can decode a QR Code represented as a 2D array of booleans. + * "true" is taken to mean a black module. + * + * @param image booleans representing white/black QR Code modules + * @return text and bytes encoded within the QR Code + * @return nil if the QR Code cannot be decoded + * @return nil if error correction fails + */ +- (ZXDecoderResult *)decode:(NSArray *)image error:(NSError **)error; + +/** + * Decodes a QR Code represented as a {@link BitMatrix}. A 1 or "true" is taken to mean a black module. + * + * @param bits booleans representing white/black QR Code modules + * @return text and bytes encoded within the QR Code + * @return nil if the QR Code cannot be decoded + * @return nil if error correction fails + */ +- (ZXDecoderResult *)decode:(NSArray *)image hints:(ZXDecodeHints *)hints error:(NSError **)error; + +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits error:(NSError **)error; + +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits hints:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.m new file mode 100644 index 0000000..dc3de93 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.m @@ -0,0 +1,191 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXBoolArray.h" +#import "ZXByteArray.h" +#import "ZXDecoderResult.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXQRCodeBitMatrixParser.h" +#import "ZXQRCodeDataBlock.h" +#import "ZXQRCodeDecodedBitStreamParser.h" +#import "ZXQRCodeDecoder.h" +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeFormatInformation.h" +#import "ZXQRCodeVersion.h" +#import "ZXReedSolomonDecoder.h" + +@interface ZXQRCodeDecoder () + +@property (nonatomic, strong, readonly) ZXReedSolomonDecoder *rsDecoder; + +@end + +@implementation ZXQRCodeDecoder + +- (id)init { + if (self = [super init]) { + _rsDecoder = [[ZXReedSolomonDecoder alloc] initWithField:[ZXGenericGF QrCodeField256]]; + } + + return self; +} + +- (ZXDecoderResult *)decode:(NSArray *)image error:(NSError **)error { + return [self decode:image hints:nil error:error]; +} + +- (ZXDecoderResult *)decode:(NSArray *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + int dimension = (int)[image count]; + ZXBitMatrix *bits = [[ZXBitMatrix alloc] initWithDimension:dimension]; + for (int i = 0; i < dimension; i++) { + ZXBoolArray *b = image[i]; + for (int j = 0; j < dimension; j++) { + if (b.array[j]) { + [bits setX:j y:i]; + } + } + } + + return [self decodeMatrix:bits hints:hints error:error]; +} + +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits error:(NSError **)error { + return [self decodeMatrix:bits hints:nil error:error]; +} + +- (ZXDecoderResult *)decodeMatrix:(ZXBitMatrix *)bits hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXQRCodeBitMatrixParser *parser = [[ZXQRCodeBitMatrixParser alloc] initWithBitMatrix:bits error:error]; + if (!parser) { + return nil; + } + ZXDecoderResult *result = [self decodeParser:parser hints:hints error:error]; + if (result) { + return result; + } + + // Revert the bit matrix + [parser remask]; + + // Will be attempting a mirrored reading of the version and format info. + [parser setMirror:YES]; + + // Preemptively read the version. + if (![parser readVersionWithError:error]) { + return nil; + } + + /* + * Since we're here, this means we have successfully detected some kind + * of version and format information when mirrored. This is a good sign, + * that the QR code may be mirrored, and we should try once more with a + * mirrored content. + */ + // Prepare for a mirrored reading. + [parser mirror]; + + result = [self decodeParser:parser hints:hints error:error]; + if (!result) { + return nil; + } + + // Success! Notify the caller that the code was mirrored. + result.other = [[ZXQRCodeDecoderMetaData alloc] initWithMirrored:YES]; + + return result; +} + +- (ZXDecoderResult *)decodeParser:(ZXQRCodeBitMatrixParser *)parser hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXQRCodeVersion *version = [parser readVersionWithError:error]; + if (!version) { + return nil; + } + ZXQRCodeFormatInformation *formatInfo = [parser readFormatInformationWithError:error]; + if (!formatInfo) { + return nil; + } + ZXQRCodeErrorCorrectionLevel *ecLevel = formatInfo.errorCorrectionLevel; + + ZXByteArray *codewords = [parser readCodewordsWithError:error]; + if (!codewords) { + return nil; + } + NSArray *dataBlocks = [ZXQRCodeDataBlock dataBlocks:codewords version:version ecLevel:ecLevel]; + + int totalBytes = 0; + for (ZXQRCodeDataBlock *dataBlock in dataBlocks) { + totalBytes += dataBlock.numDataCodewords; + } + + if (totalBytes == 0) { + return nil; + } + + ZXByteArray *resultBytes = [[ZXByteArray alloc] initWithLength:totalBytes]; + int resultOffset = 0; + + for (ZXQRCodeDataBlock *dataBlock in dataBlocks) { + ZXByteArray *codewordBytes = dataBlock.codewords; + int numDataCodewords = [dataBlock numDataCodewords]; + if (![self correctErrors:codewordBytes numDataCodewords:numDataCodewords error:error]) { + return nil; + } + for (int i = 0; i < numDataCodewords; i++) { + resultBytes.array[resultOffset++] = codewordBytes.array[i]; + } + } + + return [ZXQRCodeDecodedBitStreamParser decode:resultBytes version:version ecLevel:ecLevel hints:hints error:error]; +} + +/** + * Given data and error-correction codewords received, possibly corrupted by errors, attempts to + * correct the errors in-place using Reed-Solomon error correction. + * + * @param codewordBytes data and error correction codewords + * @param numDataCodewords number of codewords that are data bytes + * @return NO if error correction fails + */ +- (BOOL)correctErrors:(ZXByteArray *)codewordBytes numDataCodewords:(int)numDataCodewords error:(NSError **)error { + int numCodewords = (int)codewordBytes.length; + // First read into an array of ints + ZXIntArray *codewordsInts = [[ZXIntArray alloc] initWithLength:numCodewords]; + for (int i = 0; i < numCodewords; i++) { + codewordsInts.array[i] = codewordBytes.array[i] & 0xFF; + } + int numECCodewords = (int)codewordBytes.length - numDataCodewords; + NSError *decodeError = nil; + if (![self.rsDecoder decode:codewordsInts twoS:numECCodewords error:&decodeError]) { + if (decodeError.code == ZXReedSolomonError) { + if (error) *error = ZXChecksumErrorInstance(); + return NO; + } else { + if (error) *error = decodeError; + return NO; + } + } + // Copy back into array of bytes -- only need to worry about the bytes that were data + // We don't care about errors in the error-correction codewords + for (int i = 0; i < numDataCodewords; i++) { + codewordBytes.array[i] = (int8_t) codewordsInts.array[i]; + } + return YES; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.h new file mode 100644 index 0000000..f31f497 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.h @@ -0,0 +1,34 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Meta-data container for QR Code decoding. Instances of this class may be used to convey information back to the + * decoding caller. Callers are expected to process this. + */ +@interface ZXQRCodeDecoderMetaData : NSObject + +@property (nonatomic, assign, readonly) BOOL mirrored; + +- (id)initWithMirrored:(BOOL)mirrored; + +/** + * Apply the result points' order correction due to mirroring. + * + * @param points Array of points to apply mirror correction to. + */ +- (void)applyMirroredCorrection:(NSMutableArray *)points; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.m new file mode 100644 index 0000000..653b760 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.m @@ -0,0 +1,40 @@ +/* + * Copyright 2014 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXResultPoint.h" + +@implementation ZXQRCodeDecoderMetaData + +- (id)initWithMirrored:(BOOL)mirrored { + if (self = [super init]) { + _mirrored = mirrored; + } + + return self; +} + +- (void)applyMirroredCorrection:(NSMutableArray *)points { + if (!self.mirrored || [points count] < 3) { + return; + } + ZXResultPoint *bottomLeft = points[0]; + points[0] = points[2]; + points[2] = bottomLeft; + // No need to 'fix' top-left and alignment pattern. +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.h new file mode 100644 index 0000000..72230a8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.h @@ -0,0 +1,55 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * See ISO 18004:2006, 6.5.1. This enum encapsulates the four error correction levels + * defined by the QR code standard. + */ +@interface ZXQRCodeErrorCorrectionLevel : NSObject + +@property (nonatomic, assign, readonly) int bits; +@property (nonatomic, copy, readonly) NSString *name; +@property (nonatomic, assign, readonly) int ordinal; + +- (id)initWithOrdinal:(int)anOrdinal bits:(int)bits name:(NSString *)name; + +/** + * @param bits int containing the two bits encoding a QR Code's error correction level + * @return ErrorCorrectionLevel representing the encoded error correction level + */ ++ (ZXQRCodeErrorCorrectionLevel *)forBits:(int)bits; + +/** + * L = ~7% correction + */ ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelL; + +/** + * M = ~15% correction + */ ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelM; + +/** + * Q = ~25% correction + */ ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelQ; + +/** + * H = ~30% correction + */ ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelH; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.m new file mode 100644 index 0000000..adc913b --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.m @@ -0,0 +1,87 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeErrorCorrectionLevel.h" + +@implementation ZXQRCodeErrorCorrectionLevel + +static NSArray *FOR_BITS = nil; + +- (id)initWithOrdinal:(int)ordinal bits:(int)bits name:(NSString *)name { + if (self = [super init]) { + _ordinal = ordinal; + _bits = bits; + _name = name; + } + + return self; +} + +- (NSString *)description { + return self.name; +} + ++ (ZXQRCodeErrorCorrectionLevel *)forBits:(int)bits { + if (!FOR_BITS) { + FOR_BITS = @[[ZXQRCodeErrorCorrectionLevel errorCorrectionLevelM], [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelL], + [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelH], [ZXQRCodeErrorCorrectionLevel errorCorrectionLevelQ]]; + } + + if (bits < 0 || bits >= [FOR_BITS count]) { + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"Invalid bits" + userInfo:nil]; + } + return FOR_BITS[bits]; +} + ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelL { + static ZXQRCodeErrorCorrectionLevel *thisLevel = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisLevel = [[ZXQRCodeErrorCorrectionLevel alloc] initWithOrdinal:0 bits:0x01 name:@"L"]; + }); + return thisLevel; +} + ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelM { + static ZXQRCodeErrorCorrectionLevel *thisLevel = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisLevel = [[ZXQRCodeErrorCorrectionLevel alloc] initWithOrdinal:1 bits:0x00 name:@"M"]; + }); + return thisLevel; +} + ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelQ { + static ZXQRCodeErrorCorrectionLevel *thisLevel = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisLevel = [[ZXQRCodeErrorCorrectionLevel alloc] initWithOrdinal:2 bits:0x03 name:@"Q"]; + }); + return thisLevel; +} + ++ (ZXQRCodeErrorCorrectionLevel *)errorCorrectionLevelH { + static ZXQRCodeErrorCorrectionLevel *thisLevel = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisLevel = [[ZXQRCodeErrorCorrectionLevel alloc] initWithOrdinal:3 bits:0x02 name:@"H"]; + }); + return thisLevel; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.h new file mode 100644 index 0000000..dc7f0ef --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXQRCodeErrorCorrectionLevel; + +/** + * Encapsulates a QR Code's format information, including the data mask used and + * error correction level. + */ +@interface ZXQRCodeFormatInformation : NSObject + +@property (nonatomic, strong, readonly) ZXQRCodeErrorCorrectionLevel *errorCorrectionLevel; +@property (nonatomic, assign, readonly) int8_t dataMask; + ++ (int)numBitsDiffering:(int)a b:(int)b; + +/** + * @param maskedFormatInfo1 format info indicator, with mask still applied + * @param maskedFormatInfo2 second copy of same info; both are checked at the same time + * to establish best match + * @return information about the format it specifies, or {@code null} + * if doesn't seem to match any known pattern + */ ++ (ZXQRCodeFormatInformation *)decodeFormatInformation:(int)maskedFormatInfo1 maskedFormatInfo2:(int)maskedFormatInfo2; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.m new file mode 100644 index 0000000..8fed469 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.m @@ -0,0 +1,138 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeFormatInformation.h" + +const int ZX_FORMAT_INFO_MASK_QR = 0x5412; + +/** + * See ISO 18004:2006, Annex C, Table C.1 + */ +const int ZX_FORMAT_INFO_DECODE_LOOKUP_LEN = 32; +const int ZX_FORMAT_INFO_DECODE_LOOKUP[ZX_FORMAT_INFO_DECODE_LOOKUP_LEN][2] = { + {0x5412, 0x00}, + {0x5125, 0x01}, + {0x5E7C, 0x02}, + {0x5B4B, 0x03}, + {0x45F9, 0x04}, + {0x40CE, 0x05}, + {0x4F97, 0x06}, + {0x4AA0, 0x07}, + {0x77C4, 0x08}, + {0x72F3, 0x09}, + {0x7DAA, 0x0A}, + {0x789D, 0x0B}, + {0x662F, 0x0C}, + {0x6318, 0x0D}, + {0x6C41, 0x0E}, + {0x6976, 0x0F}, + {0x1689, 0x10}, + {0x13BE, 0x11}, + {0x1CE7, 0x12}, + {0x19D0, 0x13}, + {0x0762, 0x14}, + {0x0255, 0x15}, + {0x0D0C, 0x16}, + {0x083B, 0x17}, + {0x355F, 0x18}, + {0x3068, 0x19}, + {0x3F31, 0x1A}, + {0x3A06, 0x1B}, + {0x24B4, 0x1C}, + {0x2183, 0x1D}, + {0x2EDA, 0x1E}, + {0x2BED, 0x1F}, +}; + +/** + * Offset i holds the number of 1 bits in the binary representation of i + */ +const int ZX_BITS_SET_IN_HALF_BYTE[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4}; + +@implementation ZXQRCodeFormatInformation + +- (id)initWithFormatInfo:(int)formatInfo { + if (self = [super init]) { + _errorCorrectionLevel = [ZXQRCodeErrorCorrectionLevel forBits:(formatInfo >> 3) & 0x03]; + _dataMask = (int8_t)(formatInfo & 0x07); + } + + return self; +} + ++ (int)numBitsDiffering:(int)a b:(int)b { + a ^= b; + return ZX_BITS_SET_IN_HALF_BYTE[a & 0x0F] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 4 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 8 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 12 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 16 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 20 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 24 & 0x0F)] + + ZX_BITS_SET_IN_HALF_BYTE[((int)((unsigned int)a) >> 28 & 0x0F)]; +} + ++ (ZXQRCodeFormatInformation *)decodeFormatInformation:(int)maskedFormatInfo1 maskedFormatInfo2:(int)maskedFormatInfo2 { + ZXQRCodeFormatInformation *formatInfo = [self doDecodeFormatInformation:maskedFormatInfo1 maskedFormatInfo2:maskedFormatInfo2]; + if (formatInfo != nil) { + return formatInfo; + } + return [self doDecodeFormatInformation:maskedFormatInfo1 ^ ZX_FORMAT_INFO_MASK_QR maskedFormatInfo2:maskedFormatInfo2 ^ ZX_FORMAT_INFO_MASK_QR]; +} + ++ (ZXQRCodeFormatInformation *)doDecodeFormatInformation:(int)maskedFormatInfo1 maskedFormatInfo2:(int)maskedFormatInfo2 { + int bestDifference = INT_MAX; + int bestFormatInfo = 0; + + for (int i = 0; i < ZX_FORMAT_INFO_DECODE_LOOKUP_LEN; i++) { + int targetInfo = ZX_FORMAT_INFO_DECODE_LOOKUP[i][0]; + if (targetInfo == maskedFormatInfo1 || targetInfo == maskedFormatInfo2) { + return [[ZXQRCodeFormatInformation alloc] initWithFormatInfo:ZX_FORMAT_INFO_DECODE_LOOKUP[i][1]]; + } + int bitsDifference = [self numBitsDiffering:maskedFormatInfo1 b:targetInfo]; + if (bitsDifference < bestDifference) { + bestFormatInfo = ZX_FORMAT_INFO_DECODE_LOOKUP[i][1]; + bestDifference = bitsDifference; + } + if (maskedFormatInfo1 != maskedFormatInfo2) { + bitsDifference = [self numBitsDiffering:maskedFormatInfo2 b:targetInfo]; + if (bitsDifference < bestDifference) { + bestFormatInfo = ZX_FORMAT_INFO_DECODE_LOOKUP[i][1]; + bestDifference = bitsDifference; + } + } + } + + if (bestDifference <= 3) { + return [[ZXQRCodeFormatInformation alloc] initWithFormatInfo:bestFormatInfo]; + } + return nil; +} + +- (NSUInteger)hash { + return (self.errorCorrectionLevel.ordinal << 3) | (int)self.dataMask; +} + +- (BOOL)isEqual:(id)o { + if (![o isKindOfClass:[ZXQRCodeFormatInformation class]]) { + return NO; + } + ZXQRCodeFormatInformation *other = (ZXQRCodeFormatInformation *)o; + return self.errorCorrectionLevel == other.errorCorrectionLevel && self.dataMask == other.dataMask; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.h new file mode 100644 index 0000000..6c41791 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.h @@ -0,0 +1,56 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXQRCodeVersion; + +/** + * See ISO 18004:2006, 6.4.1, Tables 2 and 3. This enum encapsulates the various modes in which + * data can be encoded to bits in the QR code standard. + */ +@interface ZXQRCodeMode : NSObject + +@property (nonatomic, assign, readonly) int bits; +@property (nonatomic, copy, readonly) NSString *name; + +- (id)initWithCharacterCountBitsForVersions:(NSArray *)characterCountBitsForVersions bits:(int)bits name:(NSString *)name; + +/** + * @param bits four bits encoding a QR Code data mode + * @return Mode encoded by these bits or nil if bits do not correspond to a known mode + */ ++ (ZXQRCodeMode *)forBits:(int)bits; + +- (int)characterCountBits:(ZXQRCodeVersion *)version; + +/** + * @param version version in question + * @return number of bits used, in this QR Code symbol {@link Version}, to encode the + * count of characters that will follow encoded in this Mode + */ ++ (ZXQRCodeMode *)terminatorMode; // Not really a mode... ++ (ZXQRCodeMode *)numericMode; ++ (ZXQRCodeMode *)alphanumericMode; ++ (ZXQRCodeMode *)structuredAppendMode; // Not supported ++ (ZXQRCodeMode *)byteMode; ++ (ZXQRCodeMode *)eciMode; // character counts don't apply ++ (ZXQRCodeMode *)kanjiMode; ++ (ZXQRCodeMode *)fnc1FirstPositionMode; ++ (ZXQRCodeMode *)fnc1SecondPositionMode; + +/** See GBT 18284-2000; "Hanzi" is a transliteration of this mode name. */ ++ (ZXQRCodeMode *)hanziMode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.m new file mode 100644 index 0000000..e94cd1d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.m @@ -0,0 +1,172 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeMode.h" +#import "ZXQRCodeVersion.h" + +@interface ZXQRCodeMode () + +@property (nonatomic, strong, readonly) NSArray *characterCountBitsForVersions; + +@end + +@implementation ZXQRCodeMode + +- (id)initWithCharacterCountBitsForVersions:(NSArray *)characterCountBitsForVersions bits:(int)bits name:(NSString *)name { + if (self = [super init]) { + _characterCountBitsForVersions = characterCountBitsForVersions; + _bits = bits; + _name = name; + } + + return self; +} + ++ (ZXQRCodeMode *)forBits:(int)bits { + switch (bits) { + case 0x0: + return [ZXQRCodeMode terminatorMode]; + case 0x1: + return [ZXQRCodeMode numericMode]; + case 0x2: + return [ZXQRCodeMode alphanumericMode]; + case 0x3: + return [ZXQRCodeMode structuredAppendMode]; + case 0x4: + return [ZXQRCodeMode byteMode]; + case 0x5: + return [ZXQRCodeMode fnc1FirstPositionMode]; + case 0x7: + return [ZXQRCodeMode eciMode]; + case 0x8: + return [ZXQRCodeMode kanjiMode]; + case 0x9: + return [ZXQRCodeMode fnc1SecondPositionMode]; + case 0xD: + return [ZXQRCodeMode hanziMode]; + default: + return nil; + } +} + +- (int)characterCountBits:(ZXQRCodeVersion *)version { + int number = version.versionNumber; + int offset; + if (number <= 9) { + offset = 0; + } else if (number <= 26) { + offset = 1; + } else { + offset = 2; + } + return [self.characterCountBitsForVersions[offset] intValue]; +} + +- (NSString *)description { + return self.name; +} + ++ (ZXQRCodeMode *)terminatorMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x00 name:@"TERMINATOR"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)numericMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@10, @12, @14] bits:0x01 name:@"NUMERIC"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)alphanumericMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@9, @11, @13] bits:0x02 name:@"ALPHANUMERIC"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)structuredAppendMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x03 name:@"STRUCTURED_APPEND"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)byteMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @16, @16] bits:0x04 name:@"BYTE"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)eciMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x07 name:@"ECI"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)kanjiMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @10, @12] bits:0x08 name:@"KANJI"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)fnc1FirstPositionMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x05 name:@"FNC1_FIRST_POSITION"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)fnc1SecondPositionMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@0, @0, @0] bits:0x09 name:@"FNC1_SECOND_POSITION"]; + }); + return thisMode; +} + ++ (ZXQRCodeMode *)hanziMode { + static ZXQRCodeMode *thisMode = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + thisMode = [[ZXQRCodeMode alloc] initWithCharacterCountBitsForVersions:@[@8, @10, @12] bits:0x0D name:@"HANZI"]; + }); + return thisMode; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.h new file mode 100644 index 0000000..b1d5061 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.h @@ -0,0 +1,71 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXIntArray, ZXQRCodeECB, ZXQRCodeECBlocks, ZXQRCodeErrorCorrectionLevel; + +/** + * See ISO 18004:2006 Annex D + */ +@interface ZXQRCodeVersion : NSObject + +@property (nonatomic, assign, readonly) int versionNumber; +@property (nonatomic, strong, readonly) ZXIntArray *alignmentPatternCenters; +@property (nonatomic, strong, readonly) NSArray *ecBlocks; +@property (nonatomic, assign, readonly) int totalCodewords; +@property (nonatomic, assign, readonly) int dimensionForVersion; + +- (ZXQRCodeECBlocks *)ecBlocksForLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel; ++ (ZXQRCodeVersion *)provisionalVersionForDimension:(int)dimension; ++ (ZXQRCodeVersion *)versionForNumber:(int)versionNumber; ++ (ZXQRCodeVersion *)decodeVersionInformation:(int)versionBits; +- (ZXBitMatrix *)buildFunctionPattern; + +@end + +/** + * Encapsulates a set of error-correction blocks in one symbol version. Most versions will + * use blocks of differing sizes within one version, so, this encapsulates the parameters for + * each set of blocks. It also holds the number of error-correction codewords per block since it + * will be the same across all blocks within one version. + */ +@interface ZXQRCodeECBlocks : NSObject + +@property (nonatomic, assign, readonly) int ecCodewordsPerBlock; +@property (nonatomic, assign, readonly) int numBlocks; +@property (nonatomic, assign, readonly) int totalECCodewords; +@property (nonatomic, strong, readonly) NSArray *ecBlocks; + +- (id)initWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks:(ZXQRCodeECB *)ecBlocks; +- (id)initWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks1:(ZXQRCodeECB *)ecBlocks1 ecBlocks2:(ZXQRCodeECB *)ecBlocks2; ++ (ZXQRCodeECBlocks *)ecBlocksWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks:(ZXQRCodeECB *)ecBlocks; ++ (ZXQRCodeECBlocks *)ecBlocksWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks1:(ZXQRCodeECB *)ecBlocks1 ecBlocks2:(ZXQRCodeECB *)ecBlocks2; + +@end + +/** + * Encapsualtes the parameters for one error-correction block in one symbol version. + * This includes the number of data codewords, and the number of times a block with these + * parameters is used consecutively in the QR code version's format. + */ +@interface ZXQRCodeECB : NSObject + +@property (nonatomic, assign, readonly) int count; +@property (nonatomic, assign, readonly) int dataCodewords; + +- (id)initWithCount:(int)count dataCodewords:(int)dataCodewords; ++ (ZXQRCodeECB *)ecbWithCount:(int)count dataCodewords:(int)dataCodewords; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.m new file mode 100644 index 0000000..a012739 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.m @@ -0,0 +1,497 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXIntArray.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeFormatInformation.h" +#import "ZXQRCodeVersion.h" + +/** + * See ISO 18004:2006 Annex D. + * Element i represents the raw version bits that specify version i + 7 + */ +const int ZX_VERSION_DECODE_INFO[] = { + 0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, + 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, + 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, + 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, + 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, + 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, + 0x2542E, 0x26A64, 0x27541, 0x28C69 +}; + +static NSArray *ZX_VERSIONS = nil; + +@implementation ZXQRCodeVersion + +- (id)initWithVersionNumber:(int)versionNumber alignmentPatternCenters:(ZXIntArray *)alignmentPatternCenters ecBlocks1:(ZXQRCodeECBlocks *)ecBlocks1 ecBlocks2:(ZXQRCodeECBlocks *)ecBlocks2 ecBlocks3:(ZXQRCodeECBlocks *)ecBlocks3 ecBlocks4:(ZXQRCodeECBlocks *)ecBlocks4 { + if (self = [super init]) { + _versionNumber = versionNumber; + _alignmentPatternCenters = alignmentPatternCenters; + _ecBlocks = @[ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4]; + int total = 0; + int ecCodewords = ecBlocks1.ecCodewordsPerBlock; + + for (ZXQRCodeECB *ecBlock in ecBlocks1.ecBlocks) { + total += ecBlock.count * (ecBlock.dataCodewords + ecCodewords); + } + + _totalCodewords = total; + } + + return self; +} + ++ (ZXQRCodeVersion *)ZXQRCodeVersionWithVersionNumber:(int)versionNumber alignmentPatternCenters:(ZXIntArray *)alignmentPatternCenters ecBlocks1:(ZXQRCodeECBlocks *)ecBlocks1 ecBlocks2:(ZXQRCodeECBlocks *)ecBlocks2 ecBlocks3:(ZXQRCodeECBlocks *)ecBlocks3 ecBlocks4:(ZXQRCodeECBlocks *)ecBlocks4 { + return [[ZXQRCodeVersion alloc] initWithVersionNumber:versionNumber alignmentPatternCenters:alignmentPatternCenters ecBlocks1:ecBlocks1 ecBlocks2:ecBlocks2 ecBlocks3:ecBlocks3 ecBlocks4:ecBlocks4]; +} + +- (int)dimensionForVersion { + return 17 + 4 * self.versionNumber; +} + +- (ZXQRCodeECBlocks *)ecBlocksForLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel { + return self.ecBlocks[[ecLevel ordinal]]; +} + +/** + * Deduces version information purely from QR Code dimensions. + * + * @param dimension dimension in modules + * @return Version for a QR Code of that dimension or nil if dimension is not 1 mod 4 + */ ++ (ZXQRCodeVersion *)provisionalVersionForDimension:(int)dimension { + if (dimension % 4 != 1) { + return nil; + } + + return [self versionForNumber:(dimension - 17) / 4]; +} + ++ (ZXQRCodeVersion *)versionForNumber:(int)versionNumber { + if (versionNumber < 1 || versionNumber > 40) { + return nil; + } + return ZX_VERSIONS[versionNumber - 1]; +} + ++ (ZXQRCodeVersion *)decodeVersionInformation:(int)versionBits { + int bestDifference = INT_MAX; + int bestVersion = 0; + + for (int i = 0; i < sizeof(ZX_VERSION_DECODE_INFO) / sizeof(int); i++) { + int targetVersion = ZX_VERSION_DECODE_INFO[i]; + if (targetVersion == versionBits) { + return [self versionForNumber:i + 7]; + } + int bitsDifference = [ZXQRCodeFormatInformation numBitsDiffering:versionBits b:targetVersion]; + if (bitsDifference < bestDifference) { + bestVersion = i + 7; + bestDifference = bitsDifference; + } + } + + if (bestDifference <= 3) { + return [self versionForNumber:bestVersion]; + } + return nil; +} + +/** + * See ISO 18004:2006 Annex E + */ +- (ZXBitMatrix *)buildFunctionPattern { + int dimension = [self dimensionForVersion]; + ZXBitMatrix *bitMatrix = [[ZXBitMatrix alloc] initWithDimension:dimension]; + [bitMatrix setRegionAtLeft:0 top:0 width:9 height:9]; + [bitMatrix setRegionAtLeft:dimension - 8 top:0 width:8 height:9]; + [bitMatrix setRegionAtLeft:0 top:dimension - 8 width:9 height:8]; + int max = self.alignmentPatternCenters.length; + + for (int x = 0; x < max; x++) { + int i = self.alignmentPatternCenters.array[x] - 2; + + for (int y = 0; y < max; y++) { + if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) { + continue; + } + [bitMatrix setRegionAtLeft:self.alignmentPatternCenters.array[y] - 2 top:i width:5 height:5]; + } + } + + [bitMatrix setRegionAtLeft:6 top:9 width:1 height:dimension - 17]; + [bitMatrix setRegionAtLeft:9 top:6 width:dimension - 17 height:1]; + if (self.versionNumber > 6) { + [bitMatrix setRegionAtLeft:dimension - 11 top:0 width:3 height:6]; + [bitMatrix setRegionAtLeft:0 top:dimension - 11 width:6 height:3]; + } + return bitMatrix; +} + +- (NSString *)description { + return [@(self.versionNumber) stringValue]; +} + +/** + * See ISO 18004:2006 6.5.1 Table 9 + */ ++ (void)initialize { + if ([self class] != [ZXQRCodeVersion class]) return; + + ZX_VERSIONS = @[[ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:1 + alignmentPatternCenters:[[ZXIntArray alloc] initWithLength:0] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:7 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:19]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:10 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:16]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:13 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:13]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:17 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:9]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:2 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 18, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:10 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:34]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:16 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:28]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:22]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:3 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 22, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:15 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:55]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:44]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:17]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:4 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:20 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:80]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:32]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:24]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:16 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:9]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:5 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks:[ZXQRCodeECB ecbWithCount:1 dataCodewords:108]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:43]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:16]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:11] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:12]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:6 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:68]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:16 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:27]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:19]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:15]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:7 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 22, 38, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:20 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:78]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:31]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:14] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:15]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:13] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:14]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:8 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 24, 42, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:97]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:38] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:39]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:18] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:19]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:14] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:15]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:9 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 46, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks:[ZXQRCodeECB ecbWithCount:2 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:36] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:37]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:20 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:17]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:12] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:10 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 28, 50, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:18 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:68] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:69]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:43] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:44]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:19] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:20]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:11 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 54, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:20 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:81]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:1 dataCodewords:50] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:51]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:22] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:23]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:12] ecBlocks2:[ZXQRCodeECB ecbWithCount:8 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:12 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 32, 58, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:92] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:93]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:36] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:37]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:20] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:21]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:7 dataCodewords:14] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:15]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:13 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, 62, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks:[ZXQRCodeECB ecbWithCount:4 dataCodewords:107]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:37] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:38]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:20] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:21]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:12 dataCodewords:11] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:12]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:14 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 46, 66, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:115] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:40] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:41]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:20 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:17]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:12] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:15 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 48, 70, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:22 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:87] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:88]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:41] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:42]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:12] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:16 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 50, 74, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:98] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:99]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:7 dataCodewords:45] ecBlocks2:[ZXQRCodeECB ecbWithCount:3 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks1:[ZXQRCodeECB ecbWithCount:15 dataCodewords:19] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:20]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:13 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:17 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 50, 78, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:1 dataCodewords:107] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:108]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:10 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:1 dataCodewords:22] ecBlocks2:[ZXQRCodeECB ecbWithCount:15 dataCodewords:23]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:14] ecBlocks2:[ZXQRCodeECB ecbWithCount:17 dataCodewords:15]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:18 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 56, 82, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:120] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:121]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:9 dataCodewords:43] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:44]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:17 dataCodewords:22] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:23]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:14] ecBlocks2:[ZXQRCodeECB ecbWithCount:19 dataCodewords:15]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:19 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 58, 86, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:113] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:114]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:44] ecBlocks2:[ZXQRCodeECB ecbWithCount:11 dataCodewords:45]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:17 dataCodewords:21] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:22]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:9 dataCodewords:13] ecBlocks2:[ZXQRCodeECB ecbWithCount:16 dataCodewords:14]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:20 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, 62, 90, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:107] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:108]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:41] ecBlocks2:[ZXQRCodeECB ecbWithCount:13 dataCodewords:42]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:15 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:15 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:21 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 28, 50, 72, 94, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:116] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:117]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks:[ZXQRCodeECB ecbWithCount:17 dataCodewords:42]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:17 dataCodewords:22] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:23]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:17]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:22 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 50, 72, 98, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:111] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:112]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks:[ZXQRCodeECB ecbWithCount:17 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:7 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:16 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:24 ecBlocks:[ZXQRCodeECB ecbWithCount:34 dataCodewords:13]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:23 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 54, 78, 102, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:121] ecBlocks2:[ZXQRCodeECB ecbWithCount:5 dataCodewords:122]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:16 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:24 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 28, 54, 80, 106, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:117] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:118]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:45] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:16 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:30 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:17]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:25 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 32, 58, 84, 110, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:26 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:106] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:107]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:13 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:7 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:22 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:22 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:13 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:26 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 58, 86, 114, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:10 dataCodewords:114] ecBlocks2:[ZXQRCodeECB ecbWithCount:2 dataCodewords:115]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:28 dataCodewords:22] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:23]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:33 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:17]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:27 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, 62, 90, 118, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:122] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:123]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:22 dataCodewords:45] ecBlocks2:[ZXQRCodeECB ecbWithCount:3 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:8 dataCodewords:23] ecBlocks2:[ZXQRCodeECB ecbWithCount:26 dataCodewords:24]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:12 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:28 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:28 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 50, 74, 98, 122, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:117] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:118]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:3 dataCodewords:45] ecBlocks2:[ZXQRCodeECB ecbWithCount:23 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:31 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:31 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:29 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 54, 78, 102, 126, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:7 dataCodewords:116] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:117]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:21 dataCodewords:45] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:46]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:1 dataCodewords:23] ecBlocks2:[ZXQRCodeECB ecbWithCount:37 dataCodewords:24]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:26 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:30 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 52, 78, 104, 130, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:5 dataCodewords:115] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:15 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:25 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:23 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:25 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:31 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 56, 82, 108, 134, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:13 dataCodewords:115] ecBlocks2:[ZXQRCodeECB ecbWithCount:3 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:29 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:42 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:23 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:28 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:32 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, 60, 86, 112, 138, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks:[ZXQRCodeECB ecbWithCount:17 dataCodewords:115]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:10 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:23 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:10 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:35 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:35 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:33 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 58, 86, 114, 142, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:17 dataCodewords:115] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:14 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:21 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:29 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:19 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:11 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:46 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:34 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 34, 62, 90, 118, 146, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:13 dataCodewords:115] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:116]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:14 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:23 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:44 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:59 dataCodewords:16] ecBlocks2:[ZXQRCodeECB ecbWithCount:1 dataCodewords:17]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:35 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 54, 78, 102, 126, 150, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:12 dataCodewords:121] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:122]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:12 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:26 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:39 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:22 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:41 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:36 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 24, 50, 76, 102, 128, 154, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:121] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:122]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:6 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:34 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:46 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:2 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:64 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:37 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 28, 54, 80, 106, 132, 158, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:17 dataCodewords:122] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:123]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:29 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:49 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:10 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:24 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:46 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:38 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 32, 58, 84, 110, 136, 162, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:4 dataCodewords:122] ecBlocks2:[ZXQRCodeECB ecbWithCount:18 dataCodewords:123]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:13 dataCodewords:46] ecBlocks2:[ZXQRCodeECB ecbWithCount:32 dataCodewords:47]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:48 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:14 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:42 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:32 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:39 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 26, 54, 82, 110, 138, 166, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:20 dataCodewords:117] ecBlocks2:[ZXQRCodeECB ecbWithCount:4 dataCodewords:118]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:40 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:7 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:43 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:22 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:10 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:67 dataCodewords:16]]], + + [ZXQRCodeVersion ZXQRCodeVersionWithVersionNumber:40 + alignmentPatternCenters:[[ZXIntArray alloc] initWithInts:6, 30, 58, 86, 114, 142, 170, -1] + ecBlocks1:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:19 dataCodewords:118] ecBlocks2:[ZXQRCodeECB ecbWithCount:6 dataCodewords:119]] + ecBlocks2:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:28 ecBlocks1:[ZXQRCodeECB ecbWithCount:18 dataCodewords:47] ecBlocks2:[ZXQRCodeECB ecbWithCount:31 dataCodewords:48]] + ecBlocks3:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:34 dataCodewords:24] ecBlocks2:[ZXQRCodeECB ecbWithCount:34 dataCodewords:25]] + ecBlocks4:[ZXQRCodeECBlocks ecBlocksWithEcCodewordsPerBlock:30 ecBlocks1:[ZXQRCodeECB ecbWithCount:20 dataCodewords:15] ecBlocks2:[ZXQRCodeECB ecbWithCount:61 dataCodewords:16]]]]; +} + +@end + +@implementation ZXQRCodeECBlocks + +- (id)initWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks:(ZXQRCodeECB *)ecBlocks { + if (self = [super init]) { + _ecCodewordsPerBlock = ecCodewordsPerBlock; + _ecBlocks = @[ecBlocks]; + } + + return self; +} + +- (id)initWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks1:(ZXQRCodeECB *)ecBlocks1 ecBlocks2:(ZXQRCodeECB *)ecBlocks2 { + if (self = [super init]) { + _ecCodewordsPerBlock = ecCodewordsPerBlock; + _ecBlocks = @[ecBlocks1, ecBlocks2]; + } + + return self; +} + ++ (ZXQRCodeECBlocks *)ecBlocksWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks:(ZXQRCodeECB *)ecBlocks { + return [[ZXQRCodeECBlocks alloc] initWithEcCodewordsPerBlock:ecCodewordsPerBlock ecBlocks:ecBlocks]; +} + ++ (ZXQRCodeECBlocks *)ecBlocksWithEcCodewordsPerBlock:(int)ecCodewordsPerBlock ecBlocks1:(ZXQRCodeECB *)ecBlocks1 ecBlocks2:(ZXQRCodeECB *)ecBlocks2 { + return [[ZXQRCodeECBlocks alloc] initWithEcCodewordsPerBlock:ecCodewordsPerBlock ecBlocks1:ecBlocks1 ecBlocks2:ecBlocks2]; +} + +- (int)numBlocks { + int total = 0; + + for (ZXQRCodeECB *ecb in self.ecBlocks) { + total += [ecb count]; + } + + return total; +} + +- (int)totalECCodewords { + return self.ecCodewordsPerBlock * [self numBlocks]; +} + +@end + +@implementation ZXQRCodeECB + +- (id)initWithCount:(int)count dataCodewords:(int)dataCodewords { + if (self = [super init]) { + _count = count; + _dataCodewords = dataCodewords; + } + + return self; +} + ++ (ZXQRCodeECB *)ecbWithCount:(int)count dataCodewords:(int)dataCodewords { + return [[ZXQRCodeECB alloc] initWithCount:count dataCodewords:dataCodewords]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.h new file mode 100644 index 0000000..55f400c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.h @@ -0,0 +1,39 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultPoint.h" + +/** + * Encapsulates an alignment pattern, which are the smaller square patterns found in + * all but the simplest QR Codes. + */ +@interface ZXQRCodeAlignmentPattern : ZXResultPoint + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize; + +/** + * Determines if this alignment pattern "about equals" an alignment pattern at the stated + * position and size -- meaning, it is at nearly the same center with nearly the same size. + */ +- (BOOL)aboutEquals:(float)moduleSize i:(float)i j:(float)j; + +/** + * Combines this object's current estimate of a finder pattern position and module size + * with a new estimate. It returns a new {@code FinderPattern} containing an average of the two. + */ +- (ZXQRCodeAlignmentPattern *)combineEstimateI:(float)i j:(float)j newModuleSize:(float)newModuleSize; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.m new file mode 100644 index 0000000..5c9a9ad --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.m @@ -0,0 +1,51 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeAlignmentPattern.h" + +@interface ZXQRCodeAlignmentPattern () + +@property (nonatomic, assign, readonly) float estimatedModuleSize; + +@end + +@implementation ZXQRCodeAlignmentPattern + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize { + if (self = [super initWithX:posX y:posY]) { + _estimatedModuleSize = estimatedModuleSize; + } + + return self; +} + +- (BOOL)aboutEquals:(float)moduleSize i:(float)i j:(float)j { + if (fabsf(i - self.y) <= moduleSize && fabsf(j - self.x) <= moduleSize) { + float moduleSizeDiff = fabsf(moduleSize - self.estimatedModuleSize); + return moduleSizeDiff <= 1.0f || moduleSizeDiff <= self.estimatedModuleSize; + } + + return NO; +} + +- (ZXQRCodeAlignmentPattern *)combineEstimateI:(float)i j:(float)j newModuleSize:(float)newModuleSize { + float combinedX = (self.x + j) / 2.0f; + float combinedY = (self.y + i) / 2.0f; + float combinedModuleSize = (self.estimatedModuleSize + newModuleSize) / 2.0f; + return [[ZXQRCodeAlignmentPattern alloc] initWithPosX:combinedX posY:combinedY estimatedModuleSize:combinedModuleSize]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.h new file mode 100644 index 0000000..6c0af36 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.h @@ -0,0 +1,55 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@protocol ZXResultPointCallback; +@class ZXBitMatrix, ZXQRCodeAlignmentPattern; + +/** + * This class attempts to find alignment patterns in a QR Code. Alignment patterns look like finder + * patterns but are smaller and appear at regular intervals throughout the image. + * + * At the moment this only looks for the bottom-right alignment pattern. + * + * This is mostly a simplified copy of {@link FinderPatternFinder}. It is copied, + * pasted and stripped down here for maximum performance but does unfortunately duplicate + * some code. + * + * This class is thread-safe but not reentrant. Each thread must allocate its own object. + */ +@interface ZXQRCodeAlignmentPatternFinder : NSObject + +/** + * Creates a finder that will look in a portion of the whole image. + * + * @param image image to search + * @param startX left column from which to start searching + * @param startY top row from which to start searching + * @param width width of region to search + * @param height height of region to search + * @param moduleSize estimated module size so far + */ + +- (id)initWithImage:(ZXBitMatrix *)image startX:(int)startX startY:(int)startY width:(int)width height:(int)height moduleSize:(float)moduleSize resultPointCallback:(id)resultPointCallback; + +/** + * This method attempts to find the bottom-right alignment pattern in the image. It is a bit messy since + * it's pretty performance-critical and so is written to be fast foremost. + * + * @return ZXAlignmentPattern if found or nil if not found + */ +- (ZXQRCodeAlignmentPattern *)findWithError:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.m new file mode 100644 index 0000000..e9cde0c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.m @@ -0,0 +1,239 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXErrors.h" +#import "ZXIntArray.h" +#import "ZXQRCodeAlignmentPattern.h" +#import "ZXQRCodeAlignmentPatternFinder.h" +#import "ZXResultPointCallback.h" + +@interface ZXQRCodeAlignmentPatternFinder () + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, strong, readonly) NSMutableArray *possibleCenters; +@property (nonatomic, assign, readonly) int startX; +@property (nonatomic, assign, readonly) int startY; +@property (nonatomic, assign, readonly) int width; +@property (nonatomic, assign, readonly) int height; +@property (nonatomic, assign, readonly) float moduleSize; +@property (nonatomic, strong, readonly) ZXIntArray *crossCheckStateCount; +@property (nonatomic, weak, readonly) id resultPointCallback; + +@end + +@implementation ZXQRCodeAlignmentPatternFinder + +- (id)initWithImage:(ZXBitMatrix *)image startX:(int)startX startY:(int)startY width:(int)width height:(int)height moduleSize:(float)moduleSize resultPointCallback:(id)resultPointCallback { + if (self = [super init]) { + _image = image; + _possibleCenters = [NSMutableArray arrayWithCapacity:5]; + _startX = startX; + _startY = startY; + _width = width; + _height = height; + _moduleSize = moduleSize; + _crossCheckStateCount = [[ZXIntArray alloc] initWithLength:3]; + _resultPointCallback = resultPointCallback; + } + + return self; +} + +- (ZXQRCodeAlignmentPattern *)findWithError:(NSError **)error { + int maxJ = self.startX + self.width; + int middleI = self.startY + (self.height / 2); + int stateCount[3]; + + for (int iGen = 0; iGen < self.height; iGen++) { + int i = middleI + ((iGen & 0x01) == 0 ? (iGen + 1) / 2 : -((iGen + 1) / 2)); + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + int j = self.startX; + + while (j < maxJ && ![self.image getX:j y:i]) { + j++; + } + + int currentState = 0; + + while (j < maxJ) { + if ([self.image getX:j y:i]) { + if (currentState == 1) { + stateCount[currentState]++; + } else { + if (currentState == 2) { + if ([self foundPatternCross:stateCount]) { + ZXQRCodeAlignmentPattern *confirmed = [self handlePossibleCenter:stateCount i:i j:j]; + if (confirmed != nil) { + return confirmed; + } + } + stateCount[0] = stateCount[2]; + stateCount[1] = 1; + stateCount[2] = 0; + currentState = 1; + } else { + stateCount[++currentState]++; + } + } + } else { + if (currentState == 1) { + currentState++; + } + stateCount[currentState]++; + } + j++; + } + + if ([self foundPatternCross:stateCount]) { + ZXQRCodeAlignmentPattern *confirmed = [self handlePossibleCenter:stateCount i:i j:maxJ]; + if (confirmed != nil) { + return confirmed; + } + } + } + + if ([self.possibleCenters count] > 0) { + return self.possibleCenters[0]; + } + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +/** + * Given a count of black/white/black pixels just seen and an end position, + * figures the location of the center of this black/white/black run. + */ +- (float)centerFromEnd:(int *)stateCount end:(int)end { + return (float)(end - stateCount[2]) - stateCount[1] / 2.0f; +} + +/** + * @param stateCount count of black/white/black pixels just read + * @return true iff the proportions of the counts is close enough to the 1/1/1 ratios + * used by alignment patterns to be considered a match + */ +- (BOOL)foundPatternCross:(int *)stateCount { + float maxVariance = self.moduleSize / 2.0f; + + for (int i = 0; i < 3; i++) { + if (fabsf(self.moduleSize - stateCount[i]) >= maxVariance) { + return NO; + } + } + + return YES; +} + +/** + * After a horizontal scan finds a potential alignment pattern, this method + * "cross-checks" by scanning down vertically through the center of the possible + * alignment pattern to see if the same proportion is detected. + * + * @param startI row where an alignment pattern was detected + * @param centerJ center of the section that appears to cross an alignment pattern + * @param maxCount maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * @return vertical center of alignment pattern, or {@link Float#NaN} if not found + */ +- (float)crossCheckVertical:(int)startI centerJ:(int)centerJ maxCount:(int)maxCount originalStateCountTotal:(int)originalStateCountTotal { + int maxI = self.image.height; + [self.crossCheckStateCount clear]; + int32_t *stateCount = self.crossCheckStateCount.array; + + int i = startI; + while (i >= 0 && [self.image getX:centerJ y:i] && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + + if (i < 0 || stateCount[1] > maxCount) { + return NAN; + } + + while (i >= 0 && ![self.image getX:centerJ y:i] && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + + if (stateCount[0] > maxCount) { + return NAN; + } + i = startI + 1; + + while (i < maxI && [self.image getX:centerJ y:i] && stateCount[1] <= maxCount) { + stateCount[1]++; + i++; + } + + if (i == maxI || stateCount[1] > maxCount) { + return NAN; + } + + while (i < maxI && ![self.image getX:centerJ y:i] && stateCount[2] <= maxCount) { + stateCount[2]++; + i++; + } + + if (stateCount[2] > maxCount) { + return NAN; + } + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { + return NAN; + } + return [self foundPatternCross:stateCount] ? [self centerFromEnd:stateCount end:i] : NAN; +} + +/** + * This is called when a horizontal scan finds a possible alignment pattern. It will + * cross check with a vertical scan, and if successful, will see if this pattern had been + * found on a previous horizontal scan. If so, we consider it confirmed and conclude we have + * found the alignment pattern. + * + * @param stateCount reading state module counts from horizontal scan + * @param i row where alignment pattern may be found + * @param j end of possible alignment pattern in row + * @return ZXAlignmentPattern if we have found the same pattern twice, or null if not + */ +- (ZXQRCodeAlignmentPattern *)handlePossibleCenter:(int *)stateCount i:(int)i j:(int)j { + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; + float centerJ = [self centerFromEnd:stateCount end:j]; + float centerI = [self crossCheckVertical:i centerJ:(int)centerJ maxCount:2 * stateCount[1] originalStateCountTotal:stateCountTotal]; + if (!isnan(centerI)) { + float estimatedModuleSize = (float)(stateCount[0] + stateCount[1] + stateCount[2]) / 3.0f; + int max = (int)self.possibleCenters.count; + + for (int index = 0; index < max; index++) { + ZXQRCodeAlignmentPattern *center = self.possibleCenters[index]; + // Look for about the same center and module size: + if ([center aboutEquals:estimatedModuleSize i:centerI j:centerJ]) { + return [center combineEstimateI:centerI j:centerJ newModuleSize:estimatedModuleSize]; + } + } + // Hadn't found this before; save it + ZXResultPoint *point = [[ZXQRCodeAlignmentPattern alloc] initWithPosX:centerJ posY:centerI estimatedModuleSize:estimatedModuleSize]; + [self.possibleCenters addObject:point]; + if (self.resultPointCallback != nil) { + [self.resultPointCallback foundPossibleResultPoint:point]; + } + } + return nil; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.h new file mode 100644 index 0000000..dcad42d --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.h @@ -0,0 +1,69 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitMatrix, ZXDecodeHints, ZXDetectorResult, ZXPerspectiveTransform, ZXQRCodeAlignmentPattern, ZXQRCodeFinderPatternInfo, ZXResultPoint; +@protocol ZXResultPointCallback; + +/** + * Encapsulates logic that can detect a QR Code in an image, even if the QR Code + * is rotated or skewed, or partially obscured. + */ +@interface ZXQRCodeDetector : NSObject + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, weak, readonly) id resultPointCallback; + +- (id)initWithImage:(ZXBitMatrix *)image; + +/** + * Detects a QR Code in an image, simply. + * + * @return ZXDetectorResult encapsulating results of detecting a QR Code or nil + * if no QR Code can be found + */ +- (ZXDetectorResult *)detectWithError:(NSError **)error; + +/** + * Detects a QR Code in an image, simply. + * + * @param hints optional hints to detector + * @return ZXDetectorResult encapsulating results of detecting a QR Code + * @return nil if QR Code cannot be found + * @return nil if a QR Code cannot be decoded + */ +- (ZXDetectorResult *)detect:(ZXDecodeHints *)hints error:(NSError **)error; + +- (ZXDetectorResult *)processFinderPatternInfo:(ZXQRCodeFinderPatternInfo *)info error:(NSError **)error; + +/** + * Computes an average estimated module size based on estimated derived from the positions + * of the three finder patterns. + */ +- (float)calculateModuleSize:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight bottomLeft:(ZXResultPoint *)bottomLeft; + +/** + * Attempts to locate an alignment pattern in a limited region of the image, which is + * guessed to contain it. This method uses ZXAlignmentPattern. + * + * @param overallEstModuleSize estimated module size so far + * @param estAlignmentX x coordinate of center of area probably containing alignment pattern + * @param estAlignmentY y coordinate of above + * @param allowanceFactor number of pixels in all directions to search from the center + * @return ZXAlignmentPattern if found, or nil if an unexpected error occurs during detection + */ +- (ZXQRCodeAlignmentPattern *)findAlignmentInRegion:(float)overallEstModuleSize estAlignmentX:(int)estAlignmentX estAlignmentY:(int)estAlignmentY allowanceFactor:(float)allowanceFactor error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.m new file mode 100644 index 0000000..e6bc99f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.m @@ -0,0 +1,331 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDetectorResult.h" +#import "ZXErrors.h" +#import "ZXGridSampler.h" +#import "ZXIntArray.h" +#import "ZXMathUtils.h" +#import "ZXPerspectiveTransform.h" +#import "ZXQRCodeAlignmentPattern.h" +#import "ZXQRCodeAlignmentPatternFinder.h" +#import "ZXQRCodeDetector.h" +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternFinder.h" +#import "ZXQRCodeFinderPatternInfo.h" +#import "ZXQRCodeVersion.h" +#import "ZXResultPoint.h" +#import "ZXResultPointCallback.h" + +@interface ZXQRCodeDetector () + +@property (nonatomic, weak) id resultPointCallback; + +@end + +@implementation ZXQRCodeDetector + +- (id)initWithImage:(ZXBitMatrix *)image { + if (self = [super init]) { + _image = image; + } + + return self; +} + +- (ZXDetectorResult *)detectWithError:(NSError **)error { + return [self detect:nil error:error]; +} + +- (ZXDetectorResult *)detect:(ZXDecodeHints *)hints error:(NSError **)error { + self.resultPointCallback = hints == nil ? nil : hints.resultPointCallback; + + ZXQRCodeFinderPatternFinder *finder = [[ZXQRCodeFinderPatternFinder alloc] initWithImage:self.image resultPointCallback:self.resultPointCallback]; + ZXQRCodeFinderPatternInfo *info = [finder find:hints error:error]; + if (!info) { + return nil; + } + + return [self processFinderPatternInfo:info error:error]; +} + +- (ZXDetectorResult *)processFinderPatternInfo:(ZXQRCodeFinderPatternInfo *)info error:(NSError **)error { + ZXQRCodeFinderPattern *topLeft = info.topLeft; + ZXQRCodeFinderPattern *topRight = info.topRight; + ZXQRCodeFinderPattern *bottomLeft = info.bottomLeft; + + float moduleSize = [self calculateModuleSize:topLeft topRight:topRight bottomLeft:bottomLeft]; + if (moduleSize < 1.0f) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + int dimension = [ZXQRCodeDetector computeDimension:topLeft topRight:topRight bottomLeft:bottomLeft moduleSize:moduleSize error:error]; + if (dimension == -1) { + return nil; + } + + ZXQRCodeVersion *provisionalVersion = [ZXQRCodeVersion provisionalVersionForDimension:dimension]; + if (!provisionalVersion) { + if (error) *error = ZXFormatErrorInstance(); + return nil; + } + int modulesBetweenFPCenters = [provisionalVersion dimensionForVersion] - 7; + + ZXQRCodeAlignmentPattern *alignmentPattern = nil; + if (provisionalVersion.alignmentPatternCenters.length > 0) { + float bottomRightX = [topRight x] - [topLeft x] + [bottomLeft x]; + float bottomRightY = [topRight y] - [topLeft y] + [bottomLeft y]; + + float correctionToTopLeft = 1.0f - 3.0f / (float)modulesBetweenFPCenters; + int estAlignmentX = (int)([topLeft x] + correctionToTopLeft * (bottomRightX - [topLeft x])); + int estAlignmentY = (int)([topLeft y] + correctionToTopLeft * (bottomRightY - [topLeft y])); + + for (int i = 4; i <= 16; i <<= 1) { + NSError *alignmentError = nil; + alignmentPattern = [self findAlignmentInRegion:moduleSize estAlignmentX:estAlignmentX estAlignmentY:estAlignmentY allowanceFactor:(float)i error:&alignmentError]; + if (alignmentPattern) { + break; + } else if (alignmentError.code != ZXNotFoundError) { + if (error) *error = alignmentError; + return nil; + } + } + } + + ZXPerspectiveTransform *transform = [ZXQRCodeDetector createTransform:topLeft topRight:topRight bottomLeft:bottomLeft alignmentPattern:alignmentPattern dimension:dimension]; + ZXBitMatrix *bits = [self sampleGrid:self.image transform:transform dimension:dimension error:error]; + if (!bits) { + return nil; + } + NSArray *points; + if (alignmentPattern == nil) { + points = @[bottomLeft, topLeft, topRight]; + } else { + points = @[bottomLeft, topLeft, topRight, alignmentPattern]; + } + return [[ZXDetectorResult alloc] initWithBits:bits points:points]; +} + ++ (ZXPerspectiveTransform *)createTransform:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight bottomLeft:(ZXResultPoint *)bottomLeft alignmentPattern:(ZXResultPoint *)alignmentPattern dimension:(int)dimension { + float dimMinusThree = (float)dimension - 3.5f; + float bottomRightX; + float bottomRightY; + float sourceBottomRightX; + float sourceBottomRightY; + if (alignmentPattern != nil) { + bottomRightX = alignmentPattern.x; + bottomRightY = alignmentPattern.y; + sourceBottomRightX = dimMinusThree - 3.0f; + sourceBottomRightY = sourceBottomRightX; + } else { + bottomRightX = (topRight.x - topLeft.x) + bottomLeft.x; + bottomRightY = (topRight.y - topLeft.y) + bottomLeft.y; + sourceBottomRightX = dimMinusThree; + sourceBottomRightY = dimMinusThree; + } + + return [ZXPerspectiveTransform quadrilateralToQuadrilateral:3.5f y0:3.5f + x1:dimMinusThree y1:3.5f + x2:sourceBottomRightX y2:sourceBottomRightY + x3:3.5f y3:dimMinusThree + x0p:topLeft.x y0p:topLeft.y + x1p:topRight.x y1p:topRight.y + x2p:bottomRightX y2p:bottomRightY + x3p:bottomLeft.x y3p:bottomLeft.y]; +} + +- (ZXBitMatrix *)sampleGrid:(ZXBitMatrix *)anImage transform:(ZXPerspectiveTransform *)transform dimension:(int)dimension error:(NSError **)error { + ZXGridSampler *sampler = [ZXGridSampler instance]; + return [sampler sampleGrid:anImage dimensionX:dimension dimensionY:dimension transform:transform error:error]; +} + +/** + * Computes the dimension (number of modules on a size) of the QR Code based on the position + * of the finder patterns and estimated module size. Returns -1 on an error. + */ ++ (int)computeDimension:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight bottomLeft:(ZXResultPoint *)bottomLeft moduleSize:(float)moduleSize error:(NSError **)error { + int tltrCentersDimension = [ZXMathUtils round:[ZXResultPoint distance:topLeft pattern2:topRight] / moduleSize]; + int tlblCentersDimension = [ZXMathUtils round:[ZXResultPoint distance:topLeft pattern2:bottomLeft] / moduleSize]; + int dimension = ((tltrCentersDimension + tlblCentersDimension) / 2) + 7; + + switch (dimension & 0x03) { + case 0: + dimension++; + break; + case 2: + dimension--; + break; + case 3: + if (error) *error = ZXNotFoundErrorInstance(); + return -1; + } + return dimension; +} + +/** + * Computes an average estimated module size based on estimated derived from the positions + * of the three finder patterns. + */ +- (float)calculateModuleSize:(ZXResultPoint *)topLeft topRight:(ZXResultPoint *)topRight bottomLeft:(ZXResultPoint *)bottomLeft { + return ([self calculateModuleSizeOneWay:topLeft otherPattern:topRight] + [self calculateModuleSizeOneWay:topLeft otherPattern:bottomLeft]) / 2.0f; +} + +/** + * Estimates module size based on two finder patterns -- it uses + * sizeOfBlackWhiteBlackRunBothWays:fromY:toX:toY: to figure the + * width of each, measuring along the axis between their centers. + */ +- (float)calculateModuleSizeOneWay:(ZXResultPoint *)pattern otherPattern:(ZXResultPoint *)otherPattern { + float moduleSizeEst1 = [self sizeOfBlackWhiteBlackRunBothWays:(int)[pattern x] fromY:(int)[pattern y] toX:(int)[otherPattern x] toY:(int)[otherPattern y]]; + float moduleSizeEst2 = [self sizeOfBlackWhiteBlackRunBothWays:(int)[otherPattern x] fromY:(int)[otherPattern y] toX:(int)[pattern x] toY:(int)[pattern y]]; + if (isnan(moduleSizeEst1)) { + return moduleSizeEst2 / 7.0f; + } + if (isnan(moduleSizeEst2)) { + return moduleSizeEst1 / 7.0f; + } + return (moduleSizeEst1 + moduleSizeEst2) / 14.0f; +} + +/** + * See sizeOfBlackWhiteBlackRun:fromY:toX:toY: computes the total width of + * a finder pattern by looking for a black-white-black run from the center in the direction + * of another point (another finder pattern center), and in the opposite direction too.

+ */ +- (float)sizeOfBlackWhiteBlackRunBothWays:(int)fromX fromY:(int)fromY toX:(int)toX toY:(int)toY { + float result = [self sizeOfBlackWhiteBlackRun:fromX fromY:fromY toX:toX toY:toY]; + + // Now count other way -- don't run off image though of course + float scale = 1.0f; + int otherToX = fromX - (toX - fromX); + if (otherToX < 0) { + scale = (float)fromX / (float)(fromX - otherToX); + otherToX = 0; + } else if (otherToX >= self.image.width) { + scale = (float)(self.image.width - 1 - fromX) / (float)(otherToX - fromX); + otherToX = self.image.width - 1; + } + int otherToY = (int)(fromY - (toY - fromY) * scale); + + scale = 1.0f; + if (otherToY < 0) { + scale = (float)fromY / (float)(fromY - otherToY); + otherToY = 0; + } else if (otherToY >= self.image.height) { + scale = (float)(self.image.height - 1 - fromY) / (float)(otherToY - fromY); + otherToY = self.image.height - 1; + } + otherToX = (int)(fromX + (otherToX - fromX) * scale); + + result += [self sizeOfBlackWhiteBlackRun:fromX fromY:fromY toX:otherToX toY:otherToY]; + + // Middle pixel is double-counted this way; subtract 1 + return result - 1.0f; +} + +/** + * This method traces a line from a point in the image, in the direction towards another point. + * It begins in a black region, and keeps going until it finds white, then black, then white again. + * It reports the distance from the start to this point. + * + * This is used when figuring out how wide a finder pattern is, when the finder pattern + * may be skewed or rotated. + */ +- (float)sizeOfBlackWhiteBlackRun:(int)fromX fromY:(int)fromY toX:(int)toX toY:(int)toY { + // Mild variant of Bresenham's algorithm; + // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm + BOOL steep = abs(toY - fromY) > abs(toX - fromX); + if (steep) { + int temp = fromX; + fromX = fromY; + fromY = temp; + temp = toX; + toX = toY; + toY = temp; + } + + int dx = abs(toX - fromX); + int dy = abs(toY - fromY); + int error = -dx / 2; + int xstep = fromX < toX ? 1 : -1; + int ystep = fromY < toY ? 1 : -1; + + // In black pixels, looking for white, first or second time. + int state = 0; + // Loop up until x == toX, but not beyond + int xLimit = toX + xstep; + for (int x = fromX, y = fromY; x != xLimit; x += xstep) { + int realX = steep ? y : x; + int realY = steep ? x : y; + + // Does current pixel mean we have moved white to black or vice versa? + // Scanning black in state 0,2 and white in state 1, so if we find the wrong + // color, advance to next state or end if we are in state 2 already + if ((state == 1) == [self.image getX:realX y:realY]) { + if (state == 2) { + return [ZXMathUtils distanceInt:x aY:y bX:fromX bY:fromY]; + } + state++; + } + + error += dy; + if (error > 0) { + if (y == toY) { + break; + } + y += ystep; + error -= dx; + } + } + // Found black-white-black; give the benefit of the doubt that the next pixel outside the image + // is "white" so this last point at (toX+xStep,toY) is the right ending. This is really a + // small approximation; (toX+xStep,toY+yStep) might be really correct. Ignore this. + if (state == 2) { + return [ZXMathUtils distanceInt:toX + xstep aY:toY bX:fromX bY:fromY]; + } + // else we didn't find even black-white-black; no estimate is really possible + return NAN; +} + +- (ZXQRCodeAlignmentPattern *)findAlignmentInRegion:(float)overallEstModuleSize estAlignmentX:(int)estAlignmentX estAlignmentY:(int)estAlignmentY allowanceFactor:(float)allowanceFactor error:(NSError **)error { + int allowance = (int)(allowanceFactor * overallEstModuleSize); + int alignmentAreaLeftX = MAX(0, estAlignmentX - allowance); + int alignmentAreaRightX = MIN(self.image.width - 1, estAlignmentX + allowance); + if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + int alignmentAreaTopY = MAX(0, estAlignmentY - allowance); + int alignmentAreaBottomY = MIN(self.image.height - 1, estAlignmentY + allowance); + if (alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize * 3) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + ZXQRCodeAlignmentPatternFinder *alignmentFinder = [[ZXQRCodeAlignmentPatternFinder alloc] initWithImage:self.image + startX:alignmentAreaLeftX + startY:alignmentAreaTopY + width:alignmentAreaRightX - alignmentAreaLeftX + height:alignmentAreaBottomY - alignmentAreaTopY + moduleSize:overallEstModuleSize + resultPointCallback:self.resultPointCallback]; + return [alignmentFinder findWithError:error]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.h new file mode 100644 index 0000000..32ea5de --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.h @@ -0,0 +1,48 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXResultPoint.h" + +/** + * Encapsulates a finder pattern, which are the three square patterns found in + * the corners of QR Codes. It also encapsulates a count of similar finder patterns, + * as a convenience to the finder's bookkeeping. + */ +@interface ZXQRCodeFinderPattern : ZXResultPoint + +@property (nonatomic, assign, readonly) int count; +@property (nonatomic, assign, readonly) float estimatedModuleSize; + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize; + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize count:(int)count; + +//- (void)incrementCount; + +/** + * Determines if this finder pattern "about equals" a finder pattern at the stated + * position and size -- meaning, it is at nearly the same center with nearly the same size. + */ +- (BOOL)aboutEquals:(float)moduleSize i:(float)i j:(float)j; + +/** + * Combines this object's current estimate of a finder pattern position and module size + * with a new estimate. It returns a new ZXFinderPattern containing a weighted average + * based on count. + */ +- (ZXQRCodeFinderPattern *)combineEstimateI:(float)i j:(float)j newModuleSize:(float)newModuleSize; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.m new file mode 100644 index 0000000..7a112ce --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.m @@ -0,0 +1,59 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeFinderPattern.h" + +@implementation ZXQRCodeFinderPattern + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize { + return [self initWithPosX:posX posY:posY estimatedModuleSize:estimatedModuleSize count:1]; +} + +- (id)initWithPosX:(float)posX posY:(float)posY estimatedModuleSize:(float)estimatedModuleSize count:(int)count { + if (self = [super initWithX:posX y:posY]) { + _estimatedModuleSize = estimatedModuleSize; + _count = count; + } + + return self; +} + +/* +- (void)incrementCount { + self.count++; +} +*/ + +- (BOOL)aboutEquals:(float)moduleSize i:(float)i j:(float)j { + if (fabsf(i - [self y]) <= moduleSize && fabsf(j - [self x]) <= moduleSize) { + float moduleSizeDiff = fabsf(moduleSize - self.estimatedModuleSize); + return moduleSizeDiff <= 1.0f || moduleSizeDiff <= self.estimatedModuleSize; + } + return NO; +} + +- (ZXQRCodeFinderPattern *)combineEstimateI:(float)i j:(float)j newModuleSize:(float)newModuleSize { + int combinedCount = self.count + 1; + float combinedX = (self.count * self.x + j) / combinedCount; + float combinedY = (self.count * self.y + i) / combinedCount; + float combinedModuleSize = (self.count * self.estimatedModuleSize + newModuleSize) / combinedCount; + return [[ZXQRCodeFinderPattern alloc] initWithPosX:combinedX + posY:combinedY + estimatedModuleSize:combinedModuleSize + count:combinedCount]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.h new file mode 100644 index 0000000..ada43ad --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.h @@ -0,0 +1,71 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern const int ZX_FINDER_PATTERN_MIN_SKIP; +extern const int ZX_FINDER_PATTERN_MAX_MODULES; + +@protocol ZXResultPointCallback; +@class ZXBitMatrix, ZXDecodeHints, ZXQRCodeFinderPatternInfo; + +/** + * This class attempts to find finder patterns in a QR Code. Finder patterns are the square + * markers at three corners of a QR Code. + * + * This class is thread-safe but not reentrant. Each thread must allocate its own object. + */ +@interface ZXQRCodeFinderPatternFinder : NSObject + +@property (nonatomic, strong, readonly) ZXBitMatrix *image; +@property (nonatomic, strong, readonly) NSMutableArray *possibleCenters; + +/** + * Creates a finder that will search the image for three finder patterns. + * + * @param image image to search + */ +- (id)initWithImage:(ZXBitMatrix *)image; + +- (id)initWithImage:(ZXBitMatrix *)image resultPointCallback:(id)resultPointCallback; + +- (ZXQRCodeFinderPatternInfo *)find:(ZXDecodeHints *)hints error:(NSError **)error; + +/** + * @param stateCount count of black/white/black/white/black pixels just read + * @return true iff the proportions of the counts is close enough to the 1/1/3/1/1 ratios + * used by finder patterns to be considered a match + */ ++ (BOOL)foundPatternCross:(const int[])stateCount; + +/** + * This is called when a horizontal scan finds a possible alignment pattern. It will + * cross check with a vertical scan, and if successful, will, ah, cross-cross-check + * with another horizontal scan. This is needed primarily to locate the real horizontal + * center of the pattern in cases of extreme skew. + * And then we cross-cross-cross check with another diagonal scan. + * + * If that succeeds the finder pattern location is added to a list that tracks + * the number of times each location has been nearly-matched as a finder pattern. + * Each additional find is more evidence that the location is in fact a finder + * pattern center + * + * @param stateCount reading state module counts from horizontal scan + * @param i row where finder pattern may be found + * @param j end of possible finder pattern in row + * @return true if a finder pattern candidate was found this time + */ +- (BOOL)handlePossibleCenter:(const int[])stateCount i:(int)i j:(int)j pureBarcode:(BOOL)pureBarcode; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.m new file mode 100644 index 0000000..3a3b7b2 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.m @@ -0,0 +1,570 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternInfo.h" +#import "ZXQRCodeFinderPatternFinder.h" +#import "ZXResultPoint.h" +#import "ZXResultPointCallback.h" + +const int ZX_CENTER_QUORUM = 2; +const int ZX_FINDER_PATTERN_MIN_SKIP = 3; +const int ZX_FINDER_PATTERN_MAX_MODULES = 57; + +@interface ZXQRCodeFinderPatternFinder () + +NSInteger centerCompare(id center1, id center2, void *context); +NSInteger furthestFromAverageCompare(id center1, id center2, void *context); + +@property (nonatomic, assign) BOOL hasSkipped; +@property (nonatomic, weak, readonly) id resultPointCallback; +@property (nonatomic, strong) NSMutableArray *possibleCenters; + +@end + +@implementation ZXQRCodeFinderPatternFinder + +- (id)initWithImage:(ZXBitMatrix *)image { + return [self initWithImage:image resultPointCallback:nil]; +} + +- (id)initWithImage:(ZXBitMatrix *)image resultPointCallback:(id)resultPointCallback { + if (self = [super init]) { + _image = image; + _possibleCenters = [NSMutableArray array]; + _resultPointCallback = resultPointCallback; + } + + return self; +} + +- (ZXQRCodeFinderPatternInfo *)find:(ZXDecodeHints *)hints error:(NSError **)error { + BOOL tryHarder = hints != nil && hints.tryHarder; + BOOL pureBarcode = hints != nil && hints.pureBarcode; + int maxI = self.image.height; + int maxJ = self.image.width; + int iSkip = (3 * maxI) / (4 * ZX_FINDER_PATTERN_MAX_MODULES); + if (iSkip < ZX_FINDER_PATTERN_MIN_SKIP || tryHarder) { + iSkip = ZX_FINDER_PATTERN_MIN_SKIP; + } + + BOOL done = NO; + int stateCount[5]; + for (int i = iSkip - 1; i < maxI && !done; i += iSkip) { + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + int currentState = 0; + + for (int j = 0; j < maxJ; j++) { + if ([self.image getX:j y:i]) { + if ((currentState & 1) == 1) { + currentState++; + } + stateCount[currentState]++; + } else { + if ((currentState & 1) == 0) { + if (currentState == 4) { + if ([ZXQRCodeFinderPatternFinder foundPatternCross:stateCount]) { + BOOL confirmed = [self handlePossibleCenter:stateCount i:i j:j pureBarcode:pureBarcode]; + if (confirmed) { + iSkip = 2; + if (self.hasSkipped) { + done = [self haveMultiplyConfirmedCenters]; + } else { + int rowSkip = [self findRowSkip]; + if (rowSkip > stateCount[2]) { + i += rowSkip - stateCount[2] - iSkip; + j = maxJ - 1; + } + } + } else { + stateCount[0] = stateCount[2]; + stateCount[1] = stateCount[3]; + stateCount[2] = stateCount[4]; + stateCount[3] = 1; + stateCount[4] = 0; + currentState = 3; + continue; + } + currentState = 0; + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + } else { + stateCount[0] = stateCount[2]; + stateCount[1] = stateCount[3]; + stateCount[2] = stateCount[4]; + stateCount[3] = 1; + stateCount[4] = 0; + currentState = 3; + } + } else { + stateCount[++currentState]++; + } + } else { + stateCount[currentState]++; + } + } + } + + if ([ZXQRCodeFinderPatternFinder foundPatternCross:stateCount]) { + BOOL confirmed = [self handlePossibleCenter:stateCount i:i j:maxJ pureBarcode:pureBarcode]; + if (confirmed) { + iSkip = stateCount[0]; + if (self.hasSkipped) { + done = [self haveMultiplyConfirmedCenters]; + } + } + } + } + + NSMutableArray *patternInfo = [self selectBestPatterns]; + if (!patternInfo) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + [ZXResultPoint orderBestPatterns:patternInfo]; + return [[ZXQRCodeFinderPatternInfo alloc] initWithPatternCenters:patternInfo]; +} + +/** + * Given a count of black/white/black/white/black pixels just seen and an end position, + * figures the location of the center of this run. + */ +- (float)centerFromEnd:(const int[])stateCount end:(int)end { + return (float)(end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0f; +} + ++ (BOOL)foundPatternCross:(const int[])stateCount { + int totalModuleSize = 0; + for (int i = 0; i < 5; i++) { + int count = stateCount[i]; + if (count == 0) { + return NO; + } + totalModuleSize += count; + } + if (totalModuleSize < 7) { + return NO; + } + float moduleSize = totalModuleSize / 7.0f; + float maxVariance = moduleSize / 2.0f; + // Allow less than 50% variance from 1-1-3-1-1 proportions + return + ABS(moduleSize - stateCount[0]) < maxVariance && + ABS(moduleSize - stateCount[1]) < maxVariance && + ABS(3.0f * moduleSize - stateCount[2]) < 3 * maxVariance && + ABS(moduleSize - stateCount[3]) < maxVariance && + ABS(moduleSize - stateCount[4]) < maxVariance; +} + +/** + * After a vertical and horizontal scan finds a potential finder pattern, this method + * "cross-cross-cross-checks" by scanning down diagonally through the center of the possible + * finder pattern to see if the same proportion is detected. + * + * @param startI row where a finder pattern was detected + * @param centerJ center of the section that appears to cross a finder pattern + * @param maxCount maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * @param originalStateCountTotal The original state count total. + * @return true if proportions are withing expected limits + */ +- (BOOL)crossCheckDiagonal:(int)startI centerJ:(int)centerJ maxCount:(int)maxCount originalStateCountTotal:(int)originalStateCountTotal { + int stateCount[5] = {0, 0, 0, 0, 0}; + + // Start counting up, left from center finding black center mass + int i = 0; + while (startI >= i && centerJ >= i && [self.image getX:centerJ - i y:startI - i]) { + stateCount[2]++; + i++; + } + + if (startI < i || centerJ < i) { + return NO; + } + + // Continue up, left finding white space + while (startI >= i && centerJ >= i && ![self.image getX:centerJ - i y:startI - i] && + stateCount[1] <= maxCount) { + stateCount[1]++; + i++; + } + + // If already too many modules in this state or ran off the edge: + if (startI < i || centerJ < i || stateCount[1] > maxCount) { + return NO; + } + + // Continue up, left finding black border + while (startI >= i && centerJ >= i && [self.image getX:centerJ - i y:startI - i] && + stateCount[0] <= maxCount) { + stateCount[0]++; + i++; + } + if (stateCount[0] > maxCount) { + return NO; + } + + int maxI = self.image.height; + int maxJ = self.image.width; + + // Now also count down, right from center + i = 1; + while (startI + i < maxI && centerJ + i < maxJ && [self.image getX:centerJ + i y:startI + i]) { + stateCount[2]++; + i++; + } + + // Ran off the edge? + if (startI + i >= maxI || centerJ + i >= maxJ) { + return NO; + } + + while (startI + i < maxI && centerJ + i < maxJ && ![self.image getX:centerJ + i y:startI + i] && + stateCount[3] < maxCount) { + stateCount[3]++; + i++; + } + + if (startI + i >= maxI || centerJ + i >= maxJ || stateCount[3] >= maxCount) { + return NO; + } + + while (startI + i < maxI && centerJ + i < maxJ && [self.image getX:centerJ + i y:startI + i] && + stateCount[4] < maxCount) { + stateCount[4]++; + i++; + } + + if (stateCount[4] >= maxCount) { + return NO; + } + + // If we found a finder-pattern-like section, but its size is more than 100% different than + // the original, assume it's a false positive + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + return + abs(stateCountTotal - originalStateCountTotal) < 2 * originalStateCountTotal && + [ZXQRCodeFinderPatternFinder foundPatternCross:stateCount]; +} + +/** + * After a horizontal scan finds a potential finder pattern, this method + * "cross-checks" by scanning down vertically through the center of the possible + * finder pattern to see if the same proportion is detected. + * + * @param startI row where a finder pattern was detected + * @param centerJ center of the section that appears to cross a finder pattern + * @param maxCount maximum reasonable number of modules that should be + * observed in any reading state, based on the results of the horizontal scan + * @return vertical center of finder pattern, or {@link Float#NaN} if not found + */ +- (float)crossCheckVertical:(int)startI centerJ:(int)centerJ maxCount:(int)maxCount originalStateCountTotal:(int)originalStateCountTotal { + int maxI = self.image.height; + int stateCount[5] = {0, 0, 0, 0, 0}; + + int i = startI; + while (i >= 0 && [self.image getX:centerJ y:i]) { + stateCount[2]++; + i--; + } + if (i < 0) { + return NAN; + } + while (i >= 0 && ![self.image getX:centerJ y:i] && stateCount[1] <= maxCount) { + stateCount[1]++; + i--; + } + if (i < 0 || stateCount[1] > maxCount) { + return NAN; + } + while (i >= 0 && [self.image getX:centerJ y:i] && stateCount[0] <= maxCount) { + stateCount[0]++; + i--; + } + if (stateCount[0] > maxCount) { + return NAN; + } + + i = startI + 1; + while (i < maxI && [self.image getX:centerJ y:i]) { + stateCount[2]++; + i++; + } + if (i == maxI) { + return NAN; + } + while (i < maxI && ![self.image getX:centerJ y:i] && stateCount[3] < maxCount) { + stateCount[3]++; + i++; + } + if (i == maxI || stateCount[3] >= maxCount) { + return NAN; + } + while (i < maxI && [self.image getX:centerJ y:i] && stateCount[4] < maxCount) { + stateCount[4]++; + i++; + } + if (stateCount[4] >= maxCount) { + return NAN; + } + + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) { + return NAN; + } + return [ZXQRCodeFinderPatternFinder foundPatternCross:stateCount] ? [self centerFromEnd:stateCount end:i] : NAN; +} + +/** + * Like crossCheckVertical, and in fact is basically identical, + * except it reads horizontally instead of vertically. This is used to cross-cross + * check a vertical cross check and locate the real center of the alignment pattern. + */ +- (float)crossCheckHorizontal:(int)startJ centerI:(int)centerI maxCount:(int)maxCount originalStateCountTotal:(int)originalStateCountTotal { + int maxJ = self.image.width; + int stateCount[5] = {0, 0, 0, 0, 0}; + + int j = startJ; + while (j >= 0 && [self.image getX:j y:centerI]) { + stateCount[2]++; + j--; + } + if (j < 0) { + return NAN; + } + while (j >= 0 && ![self.image getX:j y:centerI] && stateCount[1] <= maxCount) { + stateCount[1]++; + j--; + } + if (j < 0 || stateCount[1] > maxCount) { + return NAN; + } + while (j >= 0 && [self.image getX:j y:centerI] && stateCount[0] <= maxCount) { + stateCount[0]++; + j--; + } + if (stateCount[0] > maxCount) { + return NAN; + } + + j = startJ + 1; + while (j < maxJ && [self.image getX:j y:centerI]) { + stateCount[2]++; + j++; + } + if (j == maxJ) { + return NAN; + } + while (j < maxJ && ![self.image getX:j y:centerI] && stateCount[3] < maxCount) { + stateCount[3]++; + j++; + } + if (j == maxJ || stateCount[3] >= maxCount) { + return NAN; + } + while (j < maxJ && [self.image getX:j y:centerI] && stateCount[4] < maxCount) { + stateCount[4]++; + j++; + } + if (stateCount[4] >= maxCount) { + return NAN; + } + + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + if (5 * abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) { + return NAN; + } + + return [ZXQRCodeFinderPatternFinder foundPatternCross:stateCount] ? [self centerFromEnd:stateCount end:j] : NAN; +} + +- (BOOL)handlePossibleCenter:(const int[])stateCount i:(int)i j:(int)j pureBarcode:(BOOL)pureBarcode { + int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; + float centerJ = [self centerFromEnd:stateCount end:j]; + float centerI = [self crossCheckVertical:i centerJ:(int)centerJ maxCount:stateCount[2] originalStateCountTotal:stateCountTotal]; + if (!isnan(centerI)) { + centerJ = [self crossCheckHorizontal:(int)centerJ centerI:(int)centerI maxCount:stateCount[2] originalStateCountTotal:stateCountTotal]; + if (!isnan(centerJ) && + (!pureBarcode || [self crossCheckDiagonal:(int)centerI centerJ:(int) centerJ maxCount:stateCount[2] originalStateCountTotal:stateCountTotal])) { + float estimatedModuleSize = (float)stateCountTotal / 7.0f; + BOOL found = NO; + int max = (int)[self.possibleCenters count]; + for (int index = 0; index < max; index++) { + ZXQRCodeFinderPattern *center = self.possibleCenters[index]; + if ([center aboutEquals:estimatedModuleSize i:centerI j:centerJ]) { + self.possibleCenters[index] = [center combineEstimateI:centerI j:centerJ newModuleSize:estimatedModuleSize]; + found = YES; + break; + } + } + + if (!found) { + ZXResultPoint *point = [[ZXQRCodeFinderPattern alloc] initWithPosX:centerJ posY:centerI estimatedModuleSize:estimatedModuleSize]; + [self.possibleCenters addObject:point]; + if (self.resultPointCallback != nil) { + [self.resultPointCallback foundPossibleResultPoint:point]; + } + } + return YES; + } + } + return NO; +} + +/** + * @return number of rows we could safely skip during scanning, based on the first + * two finder patterns that have been located. In some cases their position will + * allow us to infer that the third pattern must lie below a certain point farther + * down in the image. + */ +- (int)findRowSkip { + int max = (int)[self.possibleCenters count]; + if (max <= 1) { + return 0; + } + ZXResultPoint *firstConfirmedCenter = nil; + for (int i = 0; i < max; i++) { + ZXQRCodeFinderPattern *center = self.possibleCenters[i]; + if ([center count] >= ZX_CENTER_QUORUM) { + if (firstConfirmedCenter == nil) { + firstConfirmedCenter = center; + } else { + self.hasSkipped = YES; + return (int)(fabsf([firstConfirmedCenter x] - [center x]) - fabsf([firstConfirmedCenter y] - [center y])) / 2; + } + } + } + return 0; +} + +/** + * @return true iff we have found at least 3 finder patterns that have been detected + * at least ZX_CENTER_QUORUM times each, and, the estimated module size of the + * candidates is "pretty similar" + */ +- (BOOL)haveMultiplyConfirmedCenters { + int confirmedCount = 0; + float totalModuleSize = 0.0f; + int max = (int)[self.possibleCenters count]; + for (int i = 0; i < max; i++) { + ZXQRCodeFinderPattern *pattern = self.possibleCenters[i]; + if ([pattern count] >= ZX_CENTER_QUORUM) { + confirmedCount++; + totalModuleSize += [pattern estimatedModuleSize]; + } + } + if (confirmedCount < 3) { + return NO; + } + + float average = totalModuleSize / (float)max; + float totalDeviation = 0.0f; + for (int i = 0; i < max; i++) { + ZXQRCodeFinderPattern *pattern = self.possibleCenters[i]; + totalDeviation += fabsf([pattern estimatedModuleSize] - average); + } + return totalDeviation <= 0.05f * totalModuleSize; +} + +/** + * Orders by ZXFinderPattern count, descending. + */ +NSInteger centerCompare(id center1, id center2, void *context) { + float average = [(__bridge NSNumber *)context floatValue]; + + if ([((ZXQRCodeFinderPattern *)center2) count] == [((ZXQRCodeFinderPattern *)center1) count]) { + float dA = fabsf([((ZXQRCodeFinderPattern *)center2) estimatedModuleSize] - average); + float dB = fabsf([((ZXQRCodeFinderPattern *)center1) estimatedModuleSize] - average); + return dA < dB ? 1 : dA == dB ? 0 : -1; + } else { + return [((ZXQRCodeFinderPattern *)center2) count] - [((ZXQRCodeFinderPattern *)center1) count]; + } +} + +/** + * Orders by furthest from average + */ +NSInteger furthestFromAverageCompare(id center1, id center2, void *context) { + float average = [(__bridge NSNumber *)context floatValue]; + + float dA = fabsf([((ZXQRCodeFinderPattern *)center2) estimatedModuleSize] - average); + float dB = fabsf([((ZXQRCodeFinderPattern *)center1) estimatedModuleSize] - average); + return dA < dB ? -1 : dA == dB ? 0 : 1; +} + +/** + * @return the 3 best ZXFinderPatterns from our list of candidates. The "best" are + * those that have been detected at least ZXCENTER_QUORUM times, and whose module + * size differs from the average among those patterns the least + * @return nil if 3 such finder patterns do not exist + */ +- (NSMutableArray *)selectBestPatterns { + int startSize = (int)[self.possibleCenters count]; + if (startSize < 3) { + return nil; + } + + if (startSize > 3) { + float totalModuleSize = 0.0f; + float square = 0.0f; + for (int i = 0; i < startSize; i++) { + float size = [self.possibleCenters[i] estimatedModuleSize]; + totalModuleSize += size; + square += size * size; + } + float average = totalModuleSize / (float)startSize; + float stdDev = (float)sqrt(square / startSize - average * average); + + [self.possibleCenters sortUsingFunction: furthestFromAverageCompare context: (__bridge void *)@(average)]; + + float limit = MAX(0.2f * average, stdDev); + + for (int i = 0; i < [self.possibleCenters count] && [self.possibleCenters count] > 3; i++) { + ZXQRCodeFinderPattern *pattern = self.possibleCenters[i]; + if (fabsf([pattern estimatedModuleSize] - average) > limit) { + [self.possibleCenters removeObjectAtIndex:i]; + i--; + } + } + } + + if ([self.possibleCenters count] > 3) { + float totalModuleSize = 0.0f; + for (int i = 0; i < [self.possibleCenters count]; i++) { + totalModuleSize += [self.possibleCenters[i] estimatedModuleSize]; + } + + float average = totalModuleSize / (float)[self.possibleCenters count]; + + [self.possibleCenters sortUsingFunction:centerCompare context:(__bridge void *)(@(average))]; + + self.possibleCenters = [[NSMutableArray alloc] initWithArray:[self.possibleCenters subarrayWithRange:NSMakeRange(0, 3)]]; + } + + return [@[self.possibleCenters[0], self.possibleCenters[1], self.possibleCenters[2]] mutableCopy]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.h new file mode 100644 index 0000000..f529186 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXQRCodeFinderPattern; + +/** + * Encapsulates information about finder patterns in an image, including the location of + * the three finder patterns, and their estimated module size. + */ +@interface ZXQRCodeFinderPatternInfo : NSObject + +@property (nonatomic, strong, readonly) ZXQRCodeFinderPattern *bottomLeft; +@property (nonatomic, strong, readonly) ZXQRCodeFinderPattern *topLeft; +@property (nonatomic, strong, readonly) ZXQRCodeFinderPattern *topRight; + +- (id)initWithPatternCenters:(NSArray *)patternCenters; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.m new file mode 100644 index 0000000..9d63893 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.m @@ -0,0 +1,32 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternInfo.h" + +@implementation ZXQRCodeFinderPatternInfo + +- (id)initWithPatternCenters:(NSArray *)patternCenters { + if (self = [super init]) { + _bottomLeft = patternCenters[0]; + _topLeft = patternCenters[1]; + _topRight = patternCenters[2]; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.h new file mode 100644 index 0000000..20ba525 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.h @@ -0,0 +1,31 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +extern const int ZX_NUM_MASK_PATTERNS; + +@class ZXByteMatrix, ZXQRCodeErrorCorrectionLevel, ZXQRCodeMode, ZXQRCodeVersion; + +@interface ZXQRCode : NSObject + +@property (nonatomic, strong) ZXQRCodeMode *mode; +@property (nonatomic, strong) ZXQRCodeErrorCorrectionLevel *ecLevel; +@property (nonatomic, strong) ZXQRCodeVersion *version; +@property (nonatomic, assign) int maskPattern; +@property (nonatomic, strong) ZXByteMatrix *matrix; + ++ (BOOL)isValidMaskPattern:(int)maskPattern; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.m new file mode 100644 index 0000000..3e84654 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.m @@ -0,0 +1,58 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteMatrix.h" +#import "ZXQRCode.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeMode.h" + +const int ZX_NUM_MASK_PATTERNS = 8; + +@implementation ZXQRCode + +- (id)init { + if (self = [super init]) { + _mode = nil; + _ecLevel = nil; + _version = nil; + _maskPattern = -1; + _matrix = nil; + } + + return self; +} + +- (NSString *)description { + NSMutableString *result = [NSMutableString stringWithCapacity:200]; + [result appendFormat:@"<<\n mode: %@", self.mode]; + [result appendFormat:@"\n ecLevel: %@", self.ecLevel]; + [result appendFormat:@"\n version: %@", self.version]; + [result appendFormat:@"\n maskPattern: %d", self.maskPattern]; + if (self.matrix == nil) { + [result appendString:@"\n matrix: (null)\n"]; + } else { + [result appendFormat:@"\n matrix:\n%@", [self.matrix description]]; + } + [result appendString:@">>\n"]; + return [NSString stringWithString:result]; +} + +// Check if "mask_pattern" is valid. ++ (BOOL)isValidMaskPattern:(int)maskPattern { + return maskPattern >= 0 && maskPattern < ZX_NUM_MASK_PATTERNS; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.h new file mode 100644 index 0000000..16c6882 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.h @@ -0,0 +1,26 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteArray; + +@interface ZXQRCodeBlockPair : NSObject + +@property (nonatomic, strong, readonly) ZXByteArray *dataBytes; +@property (nonatomic, strong, readonly) ZXByteArray *errorCorrectionBytes; + +- (id)initWithData:(ZXByteArray *)data errorCorrection:(ZXByteArray *)errorCorrection; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.m new file mode 100644 index 0000000..b77fa32 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.m @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeBlockPair.h" + +@implementation ZXQRCodeBlockPair + +- (id)initWithData:(ZXByteArray *)data errorCorrection:(ZXByteArray *)errorCorrection { + if (self = [super init]) { + _dataBytes = data; + _errorCorrectionBytes = errorCorrection; + } + + return self; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.h new file mode 100644 index 0000000..a5cd026 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.h @@ -0,0 +1,87 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXByteArray, ZXEncodeHints, ZXQRCode, ZXQRCodeErrorCorrectionLevel, ZXQRCodeMode, ZXQRCodeVersion; + +extern const NSStringEncoding ZX_DEFAULT_BYTE_MODE_ENCODING; + +@interface ZXQRCodeEncoder : NSObject + +/** + * Encode "bytes" with the error correction level "ecLevel". The encoding mode will be chosen + * internally by chooseMode:. On success, store the result in "qrCode". + * + * We recommend you to use QRCode.EC_LEVEL_L (the lowest level) for + * "getECLevel" since our primary use is to show QR code on desktop screens. We don't need very + * strong error correction for this purpose. + * + * Note that there is no way to encode bytes in MODE_KANJI. We might want to add EncodeWithMode() + * with which clients can specify the encoding mode. For now, we don't need the functionality. + */ ++ (ZXQRCode *)encode:(NSString *)content ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel error:(NSError **)error; + ++ (ZXQRCode *)encode:(NSString *)content ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel hints:(ZXEncodeHints *)hints error:(NSError **)error; + +/** + * Return the code point of the table used in alphanumeric mode or + * -1 if there is no corresponding code in the table. + */ ++ (int)alphanumericCode:(int)code; + +/** + * Terminate bits as described in 8.4.8 and 8.4.9 of JISX0510:2004 (p.24). + */ ++ (BOOL)terminateBits:(int)numDataBytes bits:(ZXBitArray *)bits error:(NSError **)error; + +/** + * Get number of data bytes and number of error correction bytes for block id "blockID". Store + * the result in "numDataBytesInBlock", and "numECBytesInBlock". See table 12 in 8.5.1 of + * JISX0510:2004 (p.30) + */ ++ (BOOL)numDataBytesAndNumECBytesForBlockID:(int)numTotalBytes numDataBytes:(int)numDataBytes numRSBlocks:(int)numRSBlocks blockID:(int)blockID numDataBytesInBlock:(int[])numDataBytesInBlock numECBytesInBlock:(int[])numECBytesInBlock error:(NSError **)error; + +/** + * Interleave "bits" with corresponding error correction bytes. On success, store the result in + * "result". The interleave rule is complicated. See 8.6 of JISX0510:2004 (p.37) for details. + */ ++ (ZXBitArray *)interleaveWithECBytes:(ZXBitArray *)bits numTotalBytes:(int)numTotalBytes numDataBytes:(int)numDataBytes numRSBlocks:(int)numRSBlocks error:(NSError **)error; + ++ (ZXByteArray *)generateECBytes:(ZXByteArray *)dataBytes numEcBytesInBlock:(int)numEcBytesInBlock; + +/** + * Append mode info. On success, store the result in "bits". + */ ++ (void)appendModeInfo:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits; + +/** + * Append length info. On success, store the result in "bits". + */ ++ (BOOL)appendLengthInfo:(int)numLetters version:(ZXQRCodeVersion *)version mode:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits error:(NSError **)error; + +/** + * Append "bytes" in "mode" mode (encoding) into "bits". On success, store the result in "bits". + */ ++ (BOOL)appendBytes:(NSString *)content mode:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits encoding:(NSStringEncoding)encoding error:(NSError **)error; + ++ (void)appendNumericBytes:(NSString *)content bits:(ZXBitArray *)bits; + ++ (BOOL)appendAlphanumericBytes:(NSString *)content bits:(ZXBitArray *)bits error:(NSError **)error; + ++ (void)append8BitBytes:(NSString *)content bits:(ZXBitArray *)bits encoding:(NSStringEncoding)encoding; + ++ (BOOL)appendKanjiBytes:(NSString *)content bits:(ZXBitArray *)bits error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.m new file mode 100644 index 0000000..f0d163f --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.m @@ -0,0 +1,563 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXByteArray.h" +#import "ZXByteMatrix.h" +#import "ZXCharacterSetECI.h" +#import "ZXEncodeHints.h" +#import "ZXErrors.h" +#import "ZXGenericGF.h" +#import "ZXIntArray.h" +#import "ZXQRCode.h" +#import "ZXQRCodeBlockPair.h" +#import "ZXQRCodeEncoder.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeMaskUtil.h" +#import "ZXQRCodeMatrixUtil.h" +#import "ZXQRCodeMode.h" +#import "ZXQRCodeVersion.h" +#import "ZXReedSolomonEncoder.h" + +// The original table is defined in the table 5 of JISX0510:2004 (p.19). +const int ZX_ALPHANUMERIC_TABLE[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x00-0x0f + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0x10-0x1f + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // 0x20-0x2f + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // 0x30-0x3f + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 0x40-0x4f + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // 0x50-0x5f +}; + +const NSStringEncoding ZX_DEFAULT_BYTE_MODE_ENCODING = NSISOLatin1StringEncoding; + +@implementation ZXQRCodeEncoder + +// The mask penalty calculation is complicated. See Table 21 of JISX0510:2004 (p.45) for details. +// Basically it applies four rules and summate all penalties. ++ (int)calculateMaskPenalty:(ZXByteMatrix *)matrix { + return [ZXQRCodeMaskUtil applyMaskPenaltyRule1:matrix] + + [ZXQRCodeMaskUtil applyMaskPenaltyRule2:matrix] + + [ZXQRCodeMaskUtil applyMaskPenaltyRule3:matrix] + + [ZXQRCodeMaskUtil applyMaskPenaltyRule4:matrix]; +} + ++ (ZXQRCode *)encode:(NSString *)content ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel error:(NSError **)error { + return [self encode:content ecLevel:ecLevel hints:nil error:error]; +} + ++ (ZXQRCode *)encode:(NSString *)content ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel hints:(ZXEncodeHints *)hints error:(NSError **)error { + // Determine what character encoding has been specified by the caller, if any + NSStringEncoding encoding = hints == nil ? 0 : hints.encoding; + if (encoding == 0) { + encoding = ZX_DEFAULT_BYTE_MODE_ENCODING; + } + + // Pick an encoding mode appropriate for the content. Note that this will not attempt to use + // multiple modes / segments even if that were more efficient. Twould be nice. + ZXQRCodeMode *mode = [self chooseMode:content encoding:encoding]; + + // This will store the header information, like mode and + // length, as well as "header" segments like an ECI segment. + ZXBitArray *headerBits = [[ZXBitArray alloc] init]; + + // Append ECI segment if applicable + if ([mode isEqual:[ZXQRCodeMode byteMode]] && ZX_DEFAULT_BYTE_MODE_ENCODING != encoding) { + ZXCharacterSetECI *eci = [ZXCharacterSetECI characterSetECIByEncoding:encoding]; + if (eci != nil) { + [self appendECI:eci bits:headerBits]; + } + } + + // (With ECI in place,) Write the mode marker + [self appendModeInfo:mode bits:headerBits]; + + // Collect data within the main segment, separately, to count its size if needed. Don't add it to + // main payload yet. + ZXBitArray *dataBits = [[ZXBitArray alloc] init]; + if (![self appendBytes:content mode:mode bits:dataBits encoding:encoding error:error]) { + return nil; + } + + // Hard part: need to know version to know how many bits length takes. But need to know how many + // bits it takes to know version. First we take a guess at version by assuming version will be + // the minimum, 1: + + int provisionalBitsNeeded = headerBits.size + + [mode characterCountBits:[ZXQRCodeVersion versionForNumber:1]] + + dataBits.size; + ZXQRCodeVersion *provisionalVersion = [self chooseVersion:provisionalBitsNeeded ecLevel:ecLevel error:error]; + if (!provisionalVersion) { + return nil; + } + + // Use that guess to calculate the right version. I am still not sure this works in 100% of cases. + + int bitsNeeded = headerBits.size + + [mode characterCountBits:provisionalVersion] + + dataBits.size; + ZXQRCodeVersion *version = [self chooseVersion:bitsNeeded ecLevel:ecLevel error:error]; + if (!version) { + return nil; + } + + ZXBitArray *headerAndDataBits = [[ZXBitArray alloc] init]; + [headerAndDataBits appendBitArray:headerBits]; + // Find "length" of main segment and write it + int numLetters = [mode isEqual:[ZXQRCodeMode byteMode]] ? [dataBits sizeInBytes] : (int)[content length]; + if (![self appendLengthInfo:numLetters version:version mode:mode bits:headerAndDataBits error:error]) { + return nil; + } + // Put data together into the overall payload + [headerAndDataBits appendBitArray:dataBits]; + + ZXQRCodeECBlocks *ecBlocks = [version ecBlocksForLevel:ecLevel]; + int numDataBytes = version.totalCodewords - ecBlocks.totalECCodewords; + + // Terminate the bits properly. + if (![self terminateBits:numDataBytes bits:headerAndDataBits error:error]) { + return nil; + } + + // Interleave data bits with error correction code. + ZXBitArray *finalBits = [self interleaveWithECBytes:headerAndDataBits numTotalBytes:version.totalCodewords numDataBytes:numDataBytes + numRSBlocks:ecBlocks.numBlocks error:error]; + if (!finalBits) { + return nil; + } + + ZXQRCode *qrCode = [[ZXQRCode alloc] init]; + + qrCode.ecLevel = ecLevel; + qrCode.mode = mode; + qrCode.version = version; + + // Choose the mask pattern and set to "qrCode". + int dimension = version.dimensionForVersion; + ZXByteMatrix *matrix = [[ZXByteMatrix alloc] initWithWidth:dimension height:dimension]; + int maskPattern = [self chooseMaskPattern:finalBits ecLevel:[qrCode ecLevel] version:[qrCode version] matrix:matrix error:error]; + if (maskPattern == -1) { + return nil; + } + [qrCode setMaskPattern:maskPattern]; + + // Build the matrix and set it to "qrCode". + if (![ZXQRCodeMatrixUtil buildMatrix:finalBits ecLevel:ecLevel version:version maskPattern:maskPattern matrix:matrix error:error]) { + return nil; + } + [qrCode setMatrix:matrix]; + + return qrCode; +} + ++ (int)alphanumericCode:(int)code { + if (code < sizeof(ZX_ALPHANUMERIC_TABLE) / sizeof(int)) { + return ZX_ALPHANUMERIC_TABLE[code]; + } + return -1; +} + ++ (ZXQRCodeMode *)chooseMode:(NSString *)content { + return [self chooseMode:content encoding:-1]; +} + +/** + * Choose the best mode by examining the content. Note that 'encoding' is used as a hint; + * if it is Shift_JIS, and the input is only double-byte Kanji, then we return {@link Mode#KANJI}. + */ ++ (ZXQRCodeMode *)chooseMode:(NSString *)content encoding:(NSStringEncoding)encoding { + if (NSShiftJISStringEncoding == encoding) { + return [self isOnlyDoubleByteKanji:content] ? [ZXQRCodeMode kanjiMode] : [ZXQRCodeMode byteMode]; + } + BOOL hasNumeric = NO; + BOOL hasAlphanumeric = NO; + for (int i = 0; i < [content length]; ++i) { + unichar c = [content characterAtIndex:i]; + if (c >= '0' && c <= '9') { + hasNumeric = YES; + } else if ([self alphanumericCode:c] != -1) { + hasAlphanumeric = YES; + } else { + return [ZXQRCodeMode byteMode]; + } + } + if (hasAlphanumeric) { + return [ZXQRCodeMode alphanumericMode]; + } + if (hasNumeric) { + return [ZXQRCodeMode numericMode]; + } + return [ZXQRCodeMode byteMode]; +} + ++ (BOOL)isOnlyDoubleByteKanji:(NSString *)content { + NSData *data = [content dataUsingEncoding:NSShiftJISStringEncoding]; + int8_t *bytes = (int8_t *)[data bytes]; + NSUInteger length = [data length]; + if (length % 2 != 0) { + return NO; + } + for (int i = 0; i < length; i += 2) { + int byte1 = bytes[i] & 0xFF; + if ((byte1 < 0x81 || byte1 > 0x9F) && (byte1 < 0xE0 || byte1 > 0xEB)) { + return NO; + } + } + return YES; +} + ++ (int)chooseMaskPattern:(ZXBitArray *)bits ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel version:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + int minPenalty = INT_MAX; + int bestMaskPattern = -1; + + for (int maskPattern = 0; maskPattern < ZX_NUM_MASK_PATTERNS; maskPattern++) { + if (![ZXQRCodeMatrixUtil buildMatrix:bits ecLevel:ecLevel version:version maskPattern:maskPattern matrix:matrix error:error]) { + return -1; + } + int penalty = [self calculateMaskPenalty:matrix]; + if (penalty < minPenalty) { + minPenalty = penalty; + bestMaskPattern = maskPattern; + } + } + return bestMaskPattern; +} + ++ (ZXQRCodeVersion *)chooseVersion:(int)numInputBits ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel error:(NSError **)error { + // In the following comments, we use numbers of Version 7-H. + for (int versionNum = 1; versionNum <= 40; versionNum++) { + ZXQRCodeVersion *version = [ZXQRCodeVersion versionForNumber:versionNum]; + // numBytes = 196 + int numBytes = version.totalCodewords; + // getNumECBytes = 130 + ZXQRCodeECBlocks *ecBlocks = [version ecBlocksForLevel:ecLevel]; + int numEcBytes = ecBlocks.totalECCodewords; + // getNumDataBytes = 196 - 130 = 66 + int numDataBytes = numBytes - numEcBytes; + int totalInputBytes = (numInputBits + 7) / 8; + if (numDataBytes >= totalInputBytes) { + return version; + } + } + + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Data too big"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return nil; +} + ++ (int)totalInputBytes:(int)numInputBits version:(ZXQRCodeVersion *)version mode:(ZXQRCodeMode *)mode { + int modeInfoBits = 4; + int charCountBits = [mode characterCountBits:version]; + int headerBits = modeInfoBits + charCountBits; + int totalBits = numInputBits + headerBits; + + return (totalBits + 7) / 8; +} + ++ (BOOL)terminateBits:(int)numDataBytes bits:(ZXBitArray *)bits error:(NSError **)error { + int capacity = numDataBytes * 8; + if ([bits size] > capacity) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"data bits cannot fit in the QR Code %d > %d", [bits size], capacity]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + for (int i = 0; i < 4 && [bits size] < capacity; ++i) { + [bits appendBit:NO]; + } + int numBitsInLastByte = [bits size] & 0x07; + if (numBitsInLastByte > 0) { + for (int i = numBitsInLastByte; i < 8; i++) { + [bits appendBit:NO]; + } + } + int numPaddingBytes = numDataBytes - [bits sizeInBytes]; + for (int i = 0; i < numPaddingBytes; ++i) { + [bits appendBits:(i & 0x01) == 0 ? 0xEC : 0x11 numBits:8]; + } + if ([bits size] != capacity) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Bits size does not equal capacity"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + return YES; +} + ++ (BOOL)numDataBytesAndNumECBytesForBlockID:(int)numTotalBytes numDataBytes:(int)numDataBytes numRSBlocks:(int)numRSBlocks blockID:(int)blockID numDataBytesInBlock:(int[])numDataBytesInBlock numECBytesInBlock:(int[])numECBytesInBlock error:(NSError **)error { + if (blockID >= numRSBlocks) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Block ID too large"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + int numRsBlocksInGroup2 = numTotalBytes % numRSBlocks; + int numRsBlocksInGroup1 = numRSBlocks - numRsBlocksInGroup2; + int numTotalBytesInGroup1 = numTotalBytes / numRSBlocks; + int numTotalBytesInGroup2 = numTotalBytesInGroup1 + 1; + int numDataBytesInGroup1 = numDataBytes / numRSBlocks; + int numDataBytesInGroup2 = numDataBytesInGroup1 + 1; + int numEcBytesInGroup1 = numTotalBytesInGroup1 - numDataBytesInGroup1; + int numEcBytesInGroup2 = numTotalBytesInGroup2 - numDataBytesInGroup2; + if (numEcBytesInGroup1 != numEcBytesInGroup2) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"EC bytes mismatch"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + if (numRSBlocks != numRsBlocksInGroup1 + numRsBlocksInGroup2) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"RS blocks mismatch"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + if (numTotalBytes != ((numDataBytesInGroup1 + numEcBytesInGroup1) * numRsBlocksInGroup1) + ((numDataBytesInGroup2 + numEcBytesInGroup2) * numRsBlocksInGroup2)) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Total bytes mismatch"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + if (blockID < numRsBlocksInGroup1) { + numDataBytesInBlock[0] = numDataBytesInGroup1; + numECBytesInBlock[0] = numEcBytesInGroup1; + } else { + numDataBytesInBlock[0] = numDataBytesInGroup2; + numECBytesInBlock[0] = numEcBytesInGroup2; + } + return YES; +} + ++ (ZXBitArray *)interleaveWithECBytes:(ZXBitArray *)bits numTotalBytes:(int)numTotalBytes numDataBytes:(int)numDataBytes numRSBlocks:(int)numRSBlocks error:(NSError **)error { + // "bits" must have "getNumDataBytes" bytes of data. + if ([bits sizeInBytes] != numDataBytes) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Number of bits and data bytes does not match"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return nil; + } + + // Step 1. Divide data bytes into blocks and generate error correction bytes for them. We'll + // store the divided data bytes blocks and error correction bytes blocks into "blocks". + int dataBytesOffset = 0; + int maxNumDataBytes = 0; + int maxNumEcBytes = 0; + + // Since, we know the number of reedsolmon blocks, we can initialize the vector with the number. + NSMutableArray *blocks = [NSMutableArray arrayWithCapacity:numRSBlocks]; + + for (int i = 0; i < numRSBlocks; ++i) { + int numDataBytesInBlock[1]; + int numEcBytesInBlock[1]; + if (![self numDataBytesAndNumECBytesForBlockID:numTotalBytes numDataBytes:numDataBytes numRSBlocks:numRSBlocks + blockID:i numDataBytesInBlock:numDataBytesInBlock + numECBytesInBlock:numEcBytesInBlock error:error]) { + return nil; + } + + int size = numDataBytesInBlock[0]; + ZXByteArray *dataBytes = [[ZXByteArray alloc] initWithLength:size]; + [bits toBytes:8 * dataBytesOffset array:dataBytes offset:0 numBytes:size]; + ZXByteArray *ecBytes = [self generateECBytes:dataBytes numEcBytesInBlock:numEcBytesInBlock[0]]; + [blocks addObject:[[ZXQRCodeBlockPair alloc] initWithData:dataBytes errorCorrection:ecBytes]]; + + maxNumDataBytes = MAX(maxNumDataBytes, size); + maxNumEcBytes = MAX(maxNumEcBytes, numEcBytesInBlock[0]); + dataBytesOffset += numDataBytesInBlock[0]; + } + if (numDataBytes != dataBytesOffset) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Data bytes does not match offset"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return nil; + } + + ZXBitArray *result = [[ZXBitArray alloc] init]; + + // First, place data blocks. + for (int i = 0; i < maxNumDataBytes; ++i) { + for (ZXQRCodeBlockPair *block in blocks) { + ZXByteArray *dataBytes = block.dataBytes; + NSUInteger length = dataBytes.length; + if (i < length) { + [result appendBits:dataBytes.array[i] numBits:8]; + } + } + } + // Then, place error correction blocks. + for (int i = 0; i < maxNumEcBytes; ++i) { + for (ZXQRCodeBlockPair *block in blocks) { + ZXByteArray *ecBytes = block.errorCorrectionBytes; + int length = ecBytes.length; + if (i < length) { + [result appendBits:ecBytes.array[i] numBits:8]; + } + } + } + if (numTotalBytes != [result sizeInBytes]) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Interleaving error: %d and %d differ.", numTotalBytes, [result sizeInBytes]]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return nil; + } + + return result; +} + ++ (ZXByteArray *)generateECBytes:(ZXByteArray *)dataBytes numEcBytesInBlock:(int)numEcBytesInBlock { + int numDataBytes = dataBytes.length; + ZXIntArray *toEncode = [[ZXIntArray alloc] initWithLength:numDataBytes + numEcBytesInBlock]; + for (int i = 0; i < numDataBytes; i++) { + toEncode.array[i] = dataBytes.array[i] & 0xFF; + } + [[[ZXReedSolomonEncoder alloc] initWithField:[ZXGenericGF QrCodeField256]] encode:toEncode ecBytes:numEcBytesInBlock]; + + ZXByteArray *ecBytes = [[ZXByteArray alloc] initWithLength:numEcBytesInBlock]; + for (int i = 0; i < numEcBytesInBlock; i++) { + ecBytes.array[i] = (int8_t) toEncode.array[numDataBytes + i]; + } + + return ecBytes; +} + ++ (void)appendModeInfo:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits { + [bits appendBits:[mode bits] numBits:4]; +} + +/** + * Append length info. On success, store the result in "bits". + */ ++ (BOOL)appendLengthInfo:(int)numLetters version:(ZXQRCodeVersion *)version mode:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits error:(NSError **)error { + int numBits = [mode characterCountBits:version]; + if (numLetters >= (1 << numBits)) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"%d is bigger than %d", numLetters, ((1 << numBits) - 1)]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + [bits appendBits:numLetters numBits:numBits]; + return YES; +} + ++ (BOOL)appendBytes:(NSString *)content mode:(ZXQRCodeMode *)mode bits:(ZXBitArray *)bits encoding:(NSStringEncoding)encoding error:(NSError **)error { + if ([mode isEqual:[ZXQRCodeMode numericMode]]) { + [self appendNumericBytes:content bits:bits]; + } else if ([mode isEqual:[ZXQRCodeMode alphanumericMode]]) { + if (![self appendAlphanumericBytes:content bits:bits error:error]) { + return NO; + } + } else if ([mode isEqual:[ZXQRCodeMode byteMode]]) { + [self append8BitBytes:content bits:bits encoding:encoding]; + } else if ([mode isEqual:[ZXQRCodeMode kanjiMode]]) { + if (![self appendKanjiBytes:content bits:bits error:error]) { + return NO; + } + } else { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Invalid mode: %@", mode]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + return YES; +} + ++ (void)appendNumericBytes:(NSString *)content bits:(ZXBitArray *)bits { + NSUInteger length = [content length]; + int i = 0; + while (i < length) { + int num1 = [content characterAtIndex:i] - '0'; + if (i + 2 < length) { + int num2 = [content characterAtIndex:i + 1] - '0'; + int num3 = [content characterAtIndex:i + 2] - '0'; + [bits appendBits:num1 * 100 + num2 * 10 + num3 numBits:10]; + i += 3; + } else if (i + 1 < length) { + int num2 = [content characterAtIndex:i + 1] - '0'; + [bits appendBits:num1 * 10 + num2 numBits:7]; + i += 2; + } else { + [bits appendBits:num1 numBits:4]; + i++; + } + } +} + ++ (BOOL)appendAlphanumericBytes:(NSString *)content bits:(ZXBitArray *)bits error:(NSError **)error { + NSUInteger length = [content length]; + int i = 0; + + while (i < length) { + int code1 = [self alphanumericCode:[content characterAtIndex:i]]; + if (code1 == -1) { + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:nil]; + return NO; + } + if (i + 1 < length) { + int code2 = [self alphanumericCode:[content characterAtIndex:i + 1]]; + if (code2 == -1) { + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:nil]; + return NO; + } + [bits appendBits:code1 * 45 + code2 numBits:11]; + i += 2; + } else { + [bits appendBits:code1 numBits:6]; + i++; + } + } + return YES; +} + ++ (void)append8BitBytes:(NSString *)content bits:(ZXBitArray *)bits encoding:(NSStringEncoding)encoding { + NSData *data = [content dataUsingEncoding:encoding]; + int8_t *bytes = (int8_t *)[data bytes]; + + for (int i = 0; i < [data length]; ++i) { + [bits appendBits:bytes[i] numBits:8]; + } +} + ++ (BOOL)appendKanjiBytes:(NSString *)content bits:(ZXBitArray *)bits error:(NSError **)error { + NSData *data = [content dataUsingEncoding:NSShiftJISStringEncoding]; + int8_t *bytes = (int8_t *)[data bytes]; + for (int i = 0; i < [data length]; i += 2) { + int byte1 = bytes[i] & 0xFF; + int byte2 = bytes[i + 1] & 0xFF; + int code = (byte1 << 8) | byte2; + int subtracted = -1; + if (code >= 0x8140 && code <= 0x9ffc) { + subtracted = code - 0x8140; + } else if (code >= 0xe040 && code <= 0xebbf) { + subtracted = code - 0xc140; + } + if (subtracted == -1) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Invalid byte sequence"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXWriterError userInfo:userInfo]; + return NO; + } + int encoded = ((subtracted >> 8) * 0xc0) + (subtracted & 0xff); + [bits appendBits:encoded numBits:13]; + } + return YES; +} + ++ (void)appendECI:(ZXCharacterSetECI *)eci bits:(ZXBitArray *)bits { + [bits appendBits:[[ZXQRCodeMode eciMode] bits] numBits:4]; + [bits appendBits:[eci value] numBits:8]; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.h new file mode 100644 index 0000000..a70a5d8 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.h @@ -0,0 +1,53 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXByteMatrix; + +@interface ZXQRCodeMaskUtil : NSObject + +/** + * Apply mask penalty rule 1 and return the penalty. Find repetitive cells with the same color and + * give penalty to them. Example: 00000 or 11111. + */ ++ (int)applyMaskPenaltyRule1:(ZXByteMatrix *)matrix; + +/** + * Apply mask penalty rule 2 and return the penalty. Find 2x2 blocks with the same color and give + * penalty to them. This is actually equivalent to the spec's rule, which is to find MxN blocks and give a + * penalty proportional to (M-1)x(N-1), because this is the number of 2x2 blocks inside such a block. + */ ++ (int)applyMaskPenaltyRule2:(ZXByteMatrix *)matrix; + +/** + * Apply mask penalty rule 3 and return the penalty. Find consecutive runs of 1:1:3:1:1:4 + * starting with black, or 4:1:1:3:1:1 starting with white, and give penalty to them. If we + * find patterns like 000010111010000, we give penalty once. + */ ++ (int)applyMaskPenaltyRule3:(ZXByteMatrix *)matrix; + +/** + * Apply mask penalty rule 4 and return the penalty. Calculate the ratio of dark cells and give + * penalty if the ratio is far from 50%. It gives 10 penalty for 5% distance. + */ ++ (int)applyMaskPenaltyRule4:(ZXByteMatrix *)matrix; + +/** + * Return the mask bit for "getMaskPattern" at "x" and "y". See 8.8 of JISX0510:2004 for mask + * pattern conditions. + */ ++ (BOOL)dataMaskBit:(int)maskPattern x:(int)x y:(int)y; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.m new file mode 100644 index 0000000..ba5b443 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.m @@ -0,0 +1,190 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteMatrix.h" +#import "ZXQRCode.h" +#import "ZXQRCodeMaskUtil.h" + +// Penalty weights from section 6.8.2.1 +const int ZX_N1 = 3; +const int ZX_N2 = 3; +const int ZX_N3 = 40; +const int ZX_N4 = 10; + +@implementation ZXQRCodeMaskUtil + ++ (int)applyMaskPenaltyRule1:(ZXByteMatrix *)matrix { + return [self applyMaskPenaltyRule1Internal:matrix isHorizontal:YES] + [self applyMaskPenaltyRule1Internal:matrix isHorizontal:NO]; +} + ++ (int)applyMaskPenaltyRule2:(ZXByteMatrix *)matrix { + int penalty = 0; + int8_t **array = matrix.array; + int width = matrix.width; + int height = matrix.height; + + for (int y = 0; y < height - 1; y++) { + for (int x = 0; x < width - 1; x++) { + int value = array[y][x]; + if (value == array[y][x + 1] && value == array[y + 1][x] && value == array[y + 1][x + 1]) { + penalty++; + } + } + } + + return ZX_N2 * penalty; +} + ++ (int)applyMaskPenaltyRule3:(ZXByteMatrix *)matrix { + int numPenalties = 0; + int8_t **array = matrix.array; + int width = matrix.width; + int height = matrix.height; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int8_t *arrayY = array[y]; // We can at least optimize this access + if (x + 6 < width && + arrayY[x] == 1 && + arrayY[x + 1] == 0 && + arrayY[x + 2] == 1 && + arrayY[x + 3] == 1 && + arrayY[x + 4] == 1 && + arrayY[x + 5] == 0 && + arrayY[x + 6] == 1 && + ([self isWhiteHorizontal:arrayY length:width from:x - 4 to:x] || [self isWhiteHorizontal:arrayY length:width from:x + 7 to:x + 11])) { + numPenalties++; + } + if (y + 6 < height && + array[y][x] == 1 && + array[y + 1][x] == 0 && + array[y + 2][x] == 1 && + array[y + 3][x] == 1 && + array[y + 4][x] == 1 && + array[y + 5][x] == 0 && + array[y + 6][x] == 1 && + ([self isWhiteVertical:array length:width col:x from:y - 4 to:y] || [self isWhiteVertical:array length:height col:x from:y + 7 to:y + 11])) { + numPenalties++; + } + } + } + return numPenalties * ZX_N3; +} + ++ (BOOL)isWhiteHorizontal:(int8_t *)rowArray length:(int)length from:(int)from to:(int)to { + for (int i = from; i < to; i++) { + if (i >= 0 && i < length && rowArray[i] == 1) { + return NO; + } + } + return YES; +} + ++ (BOOL)isWhiteVertical:(int8_t **)array length:(int)length col:(int)col from:(int)from to:(int)to { + for (int i = from; i < to; i++) { + if (i >= 0 && i < length && array[i][col] == 1) { + return NO; + } + } + return YES; +} + ++ (int)applyMaskPenaltyRule4:(ZXByteMatrix *)matrix { + int numDarkCells = 0; + int8_t **array = matrix.array; + int width = matrix.width; + int height = matrix.height; + for (int y = 0; y < height; y++) { + int8_t *arrayY = array[y]; + for (int x = 0; x < width; x++) { + if (arrayY[x] == 1) { + numDarkCells++; + } + } + } + int numTotalCells = [matrix height] * [matrix width]; + int fivePercentVariances = abs(numDarkCells * 2 - numTotalCells) * 10 / numTotalCells; + return fivePercentVariances * ZX_N4; +} + ++ (BOOL)dataMaskBit:(int)maskPattern x:(int)x y:(int)y { + int intermediate; + int temp; + switch (maskPattern) { + case 0: + intermediate = (y + x) & 0x1; + break; + case 1: + intermediate = y & 0x1; + break; + case 2: + intermediate = x % 3; + break; + case 3: + intermediate = (y + x) % 3; + break; + case 4: + intermediate = ((y / 2) + (x / 3)) & 0x1; + break; + case 5: + temp = y * x; + intermediate = (temp & 0x1) + (temp % 3); + break; + case 6: + temp = y * x; + intermediate = ((temp & 0x1) + (temp % 3)) & 0x1; + break; + case 7: + temp = y * x; + intermediate = ((temp % 3) + ((y + x) & 0x1)) & 0x1; + break; + default: + [NSException raise:NSInvalidArgumentException format:@"Invalid mask pattern: %d", maskPattern]; + } + return intermediate == 0; +} + +/** + * Helper function for applyMaskPenaltyRule1. We need this for doing this calculation in both + * vertical and horizontal orders respectively. + */ ++ (int)applyMaskPenaltyRule1Internal:(ZXByteMatrix *)matrix isHorizontal:(BOOL)isHorizontal { + int penalty = 0; + int iLimit = isHorizontal ? matrix.height : matrix.width; + int jLimit = isHorizontal ? matrix.width : matrix.height; + int8_t **array = matrix.array; + for (int i = 0; i < iLimit; i++) { + int numSameBitCells = 0; + int prevBit = -1; + for (int j = 0; j < jLimit; j++) { + int bit = isHorizontal ? array[i][j] : array[j][i]; + if (bit == prevBit) { + numSameBitCells++; + } else { + if (numSameBitCells >= 5) { + penalty += ZX_N1 + (numSameBitCells - 5); + } + numSameBitCells = 1; // Include the cell itself. + prevBit = bit; + } + } + if (numSameBitCells >= 5) { + penalty += ZX_N1 + (numSameBitCells - 5); + } + } + return penalty; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.h new file mode 100644 index 0000000..ab89bf4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.h @@ -0,0 +1,91 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@class ZXBitArray, ZXByteMatrix, ZXQRCodeErrorCorrectionLevel, ZXQRCodeVersion; + +@interface ZXQRCodeMatrixUtil : NSObject + +// Set all cells to -1. -1 means that the cell is empty (not set yet). ++ (void)clearMatrix:(ZXByteMatrix *)matrix; + +// Build 2D matrix of QR Code from "dataBits" with "ecLevel", "version" and "getMaskPattern". On +// success, store the result in "matrix" and return true. ++ (BOOL)buildMatrix:(ZXBitArray *)dataBits ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel version:(ZXQRCodeVersion *)version maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error; + +// Embed basic patterns. On success, modify the matrix and return true. +// The basic patterns are: +// - Position detection patterns +// - Timing patterns +// - Dark dot at the left bottom corner +// - Position adjustment patterns, if need be ++ (BOOL)embedBasicPatterns:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix error:(NSError **)error; + +// Embed type information. On success, modify the matrix. ++ (BOOL)embedTypeInfo:(ZXQRCodeErrorCorrectionLevel *)ecLevel maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error; + +// Embed version information if need be. On success, modify the matrix and return true. +// See 8.10 of JISX0510:2004 (p.47) for how to embed version information. ++ (BOOL)maybeEmbedVersionInfo:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix error:(NSError **)error; + +// Embed "dataBits" using "getMaskPattern". On success, modify the matrix and return true. +// For debugging purposes, it skips masking process if "getMaskPattern" is -1. +// See 8.7 of JISX0510:2004 (p.38) for how to embed data bits. ++ (BOOL)embedDataBits:(ZXBitArray *)dataBits maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error; + +// Return the position of the most significant bit set (to one) in the "value". The most +// significant bit is position 32. If there is no bit set, return 0. Examples: +// - findMSBSet(0) => 0 +// - findMSBSet(1) => 1 +// - findMSBSet(255) => 8 ++ (int)findMSBSet:(int)value; + +// Calculate BCH (Bose-Chaudhuri-Hocquenghem) code for "value" using polynomial "poly". The BCH +// code is used for encoding type information and version information. +// Example: Calculation of version information of 7. +// f(x) is created from 7. +// - 7 = 000111 in 6 bits +// - f(x) = x^2 + x^1 + x^0 +// g(x) is given by the standard (p. 67) +// - g(x) = x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1 +// Multiply f(x) by x^(18 - 6) +// - f'(x) = f(x) * x^(18 - 6) +// - f'(x) = x^14 + x^13 + x^12 +// Calculate the remainder of f'(x) / g(x) +// x^2 +// __________________________________________________ +// g(x) )x^14 + x^13 + x^12 +// x^14 + x^13 + x^12 + x^11 + x^10 + x^7 + x^4 + x^2 +// -------------------------------------------------- +// x^11 + x^10 + x^7 + x^4 + x^2 +// +// The remainder is x^11 + x^10 + x^7 + x^4 + x^2 +// Encode it in binary: 110010010100 +// The return value is 0xc94 (1100 1001 0100) +// +// Since all coefficients in the polynomials are 1 or 0, we can do the calculation by bit +// operations. We don't care if cofficients are positive or negative. ++ (int)calculateBCHCode:(int)value poly:(int)poly; + +// Make bit vector of type information. On success, store the result in "bits" and return true. +// Encode error correction level and mask pattern. See 8.9 of +// JISX0510:2004 (p.45) for details. ++ (BOOL)makeTypeInfoBits:(ZXQRCodeErrorCorrectionLevel *)ecLevel maskPattern:(int)maskPattern bits:(ZXBitArray *)bits error:(NSError **)error; + +// Make bit vector of version information. On success, store the result in "bits" and return true. +// See 8.10 of JISX0510:2004 (p.45) for details. ++ (BOOL)makeVersionInfoBits:(ZXQRCodeVersion *)version bits:(ZXBitArray *)bits error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.m new file mode 100644 index 0000000..422e6cf --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.m @@ -0,0 +1,466 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitArray.h" +#import "ZXByteMatrix.h" +#import "ZXErrors.h" +#import "ZXQRCode.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeMaskUtil.h" +#import "ZXQRCodeMatrixUtil.h" +#import "ZXQRCodeVersion.h" + +const int ZX_POSITION_DETECTION_PATTERN[][7] = { + {1, 1, 1, 1, 1, 1, 1}, + {1, 0, 0, 0, 0, 0, 1}, + {1, 0, 1, 1, 1, 0, 1}, + {1, 0, 1, 1, 1, 0, 1}, + {1, 0, 1, 1, 1, 0, 1}, + {1, 0, 0, 0, 0, 0, 1}, + {1, 1, 1, 1, 1, 1, 1}, +}; + +const int ZX_POSITION_ADJUSTMENT_PATTERN[][5] = { + {1, 1, 1, 1, 1}, + {1, 0, 0, 0, 1}, + {1, 0, 1, 0, 1}, + {1, 0, 0, 0, 1}, + {1, 1, 1, 1, 1}, +}; + +// From Appendix E. Table 1, JIS0510X:2004 (p 71). The table was double-checked by komatsu. +const int ZX_POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[][7] = { + {-1, -1, -1, -1, -1, -1, -1}, // Version 1 + { 6, 18, -1, -1, -1, -1, -1}, // Version 2 + { 6, 22, -1, -1, -1, -1, -1}, // Version 3 + { 6, 26, -1, -1, -1, -1, -1}, // Version 4 + { 6, 30, -1, -1, -1, -1, -1}, // Version 5 + { 6, 34, -1, -1, -1, -1, -1}, // Version 6 + { 6, 22, 38, -1, -1, -1, -1}, // Version 7 + { 6, 24, 42, -1, -1, -1, -1}, // Version 8 + { 6, 26, 46, -1, -1, -1, -1}, // Version 9 + { 6, 28, 50, -1, -1, -1, -1}, // Version 10 + { 6, 30, 54, -1, -1, -1, -1}, // Version 11 + { 6, 32, 58, -1, -1, -1, -1}, // Version 12 + { 6, 34, 62, -1, -1, -1, -1}, // Version 13 + { 6, 26, 46, 66, -1, -1, -1}, // Version 14 + { 6, 26, 48, 70, -1, -1, -1}, // Version 15 + { 6, 26, 50, 74, -1, -1, -1}, // Version 16 + { 6, 30, 54, 78, -1, -1, -1}, // Version 17 + { 6, 30, 56, 82, -1, -1, -1}, // Version 18 + { 6, 30, 58, 86, -1, -1, -1}, // Version 19 + { 6, 34, 62, 90, -1, -1, -1}, // Version 20 + { 6, 28, 50, 72, 94, -1, -1}, // Version 21 + { 6, 26, 50, 74, 98, -1, -1}, // Version 22 + { 6, 30, 54, 78, 102, -1, -1}, // Version 23 + { 6, 28, 54, 80, 106, -1, -1}, // Version 24 + { 6, 32, 58, 84, 110, -1, -1}, // Version 25 + { 6, 30, 58, 86, 114, -1, -1}, // Version 26 + { 6, 34, 62, 90, 118, -1, -1}, // Version 27 + { 6, 26, 50, 74, 98, 122, -1}, // Version 28 + { 6, 30, 54, 78, 102, 126, -1}, // Version 29 + { 6, 26, 52, 78, 104, 130, -1}, // Version 30 + { 6, 30, 56, 82, 108, 134, -1}, // Version 31 + { 6, 34, 60, 86, 112, 138, -1}, // Version 32 + { 6, 30, 58, 86, 114, 142, -1}, // Version 33 + { 6, 34, 62, 90, 118, 146, -1}, // Version 34 + { 6, 30, 54, 78, 102, 126, 150}, // Version 35 + { 6, 24, 50, 76, 102, 128, 154}, // Version 36 + { 6, 28, 54, 80, 106, 132, 158}, // Version 37 + { 6, 32, 58, 84, 110, 136, 162}, // Version 38 + { 6, 26, 54, 82, 110, 138, 166}, // Version 39 + { 6, 30, 58, 86, 114, 142, 170}, // Version 40 +}; + +// Type info cells at the left top corner. +const int ZX_TYPE_INFO_COORDINATES[][2] = { + {8, 0}, + {8, 1}, + {8, 2}, + {8, 3}, + {8, 4}, + {8, 5}, + {8, 7}, + {8, 8}, + {7, 8}, + {5, 8}, + {4, 8}, + {3, 8}, + {2, 8}, + {1, 8}, + {0, 8}, +}; + +// From Appendix D in JISX0510:2004 (p. 67) +const int ZX_VERSION_INFO_POLY = 0x1f25; // 1 1111 0010 0101 + +// From Appendix C in JISX0510:2004 (p.65). +const int ZX_TYPE_INFO_POLY = 0x537; +const int ZX_TYPE_INFO_MASK_PATTERN = 0x5412; + +@implementation ZXQRCodeMatrixUtil + ++ (void)clearMatrix:(ZXByteMatrix *)matrix { + [matrix clear:-1]; +} + ++ (BOOL)buildMatrix:(ZXBitArray *)dataBits ecLevel:(ZXQRCodeErrorCorrectionLevel *)ecLevel version:(ZXQRCodeVersion *)version maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + [self clearMatrix:matrix]; + if (![self embedBasicPatterns:version matrix:matrix error:error]) { + return NO; + } + // Type information appear with any version. + if (![self embedTypeInfo:ecLevel maskPattern:maskPattern matrix:matrix error:error]) { + return NO; + } + // Version info appear if version >= 7. + if (![self maybeEmbedVersionInfo:version matrix:matrix error:error]) { + return NO; + } + // Data should be embedded at end. + if (![self embedDataBits:dataBits maskPattern:maskPattern matrix:matrix error:error]) { + return NO; + } + return YES; +} + ++ (BOOL)embedBasicPatterns:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + // Let's get started with embedding big squares at corners. + if (![self embedPositionDetectionPatternsAndSeparators:matrix]) { + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:nil]; + return NO; + } + // Then, embed the dark dot at the left bottom corner. + if (![self embedDarkDotAtLeftBottomCorner:matrix]) { + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:nil]; + return NO; + } + + // Position adjustment patterns appear if version >= 2. + [self maybeEmbedPositionAdjustmentPatterns:version matrix:matrix]; + // Timing patterns should be embedded after position adj. patterns. + [self embedTimingPatterns:matrix]; + + return YES; +} + ++ (BOOL)embedTypeInfo:(ZXQRCodeErrorCorrectionLevel *)ecLevel maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + ZXBitArray *typeInfoBits = [[ZXBitArray alloc] init]; + if (![self makeTypeInfoBits:ecLevel maskPattern:maskPattern bits:typeInfoBits error:error]) { + return NO; + } + + for (int i = 0; i < [typeInfoBits size]; ++i) { + // Place bits in LSB to MSB order. LSB (least significant bit) is the last value in + // "typeInfoBits". + BOOL bit = [typeInfoBits get:[typeInfoBits size] - 1 - i]; + + // Type info bits at the left top corner. See 8.9 of JISX0510:2004 (p.46). + int x1 = ZX_TYPE_INFO_COORDINATES[i][0]; + int y1 = ZX_TYPE_INFO_COORDINATES[i][1]; + [matrix setX:x1 y:y1 boolValue:bit]; + + if (i < 8) { + // Right top corner. + int x2 = [matrix width] - i - 1; + int y2 = 8; + [matrix setX:x2 y:y2 boolValue:bit]; + } else { + // Left bottom corner. + int x2 = 8; + int y2 = [matrix height] - 7 + (i - 8); + [matrix setX:x2 y:y2 boolValue:bit]; + } + } + + return YES; +} + ++ (BOOL)maybeEmbedVersionInfo:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + if (version.versionNumber < 7) { // Version info is necessary if version >= 7. + return YES; // Don't need version info. + } + ZXBitArray *versionInfoBits = [[ZXBitArray alloc] init]; + if (![self makeVersionInfoBits:version bits:versionInfoBits error:error]) { + return NO; + } + + int bitIndex = 6 * 3 - 1; // It will decrease from 17 to 0. + for (int i = 0; i < 6; ++i) { + for (int j = 0; j < 3; ++j) { + // Place bits in LSB (least significant bit) to MSB order. + BOOL bit = [versionInfoBits get:bitIndex]; + bitIndex--; + // Left bottom corner. + [matrix setX:i y:[matrix height] - 11 + j boolValue:bit]; + // Right bottom corner. + [matrix setX:[matrix height] - 11 + j y:i boolValue:bit]; + } + } + + return YES; +} + ++ (BOOL)embedDataBits:(ZXBitArray *)dataBits maskPattern:(int)maskPattern matrix:(ZXByteMatrix *)matrix error:(NSError **)error { + int bitIndex = 0; + int direction = -1; + // Start from the right bottom cell. + int x = [matrix width] - 1; + int y = [matrix height] - 1; + while (x > 0) { + // Skip the vertical timing pattern. + if (x == 6) { + x -= 1; + } + while (y >= 0 && y < [matrix height]) { + for (int i = 0; i < 2; ++i) { + int xx = x - i; + // Skip the cell if it's not empty. + if (![self isEmpty:[matrix getX:xx y:y]]) { + continue; + } + BOOL bit; + if (bitIndex < [dataBits size]) { + bit = [dataBits get:bitIndex]; + ++bitIndex; + } else { + // Padding bit. If there is no bit left, we'll fill the left cells with 0, as described + // in 8.4.9 of JISX0510:2004 (p. 24). + bit = NO; + } + + // Skip masking if mask_pattern is -1. + if (maskPattern != -1 && [ZXQRCodeMaskUtil dataMaskBit:maskPattern x:xx y:y]) { + bit = !bit; + } + [matrix setX:xx y:y boolValue:bit]; + } + y += direction; + } + direction = -direction; // Reverse the direction. + y += direction; + x -= 2; // Move to the left. + } + // All bits should be consumed. + if (bitIndex != [dataBits size]) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Not all bits consumed: %d/%d", bitIndex, [dataBits size]]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:userInfo]; + return NO; + } + + return YES; +} + ++ (int)findMSBSet:(int)value { + int numDigits = 0; + while (value != 0) { + value = (int)((unsigned int)value >> 1); + ++numDigits; + } + return numDigits; +} + ++ (int)calculateBCHCode:(int)value poly:(int)poly { + // If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1 + // from 13 to make it 12. + int msbSetInPoly = [self findMSBSet:poly]; + value <<= msbSetInPoly - 1; + // Do the division business using exclusive-or operations. + while ([self findMSBSet:value] >= msbSetInPoly) { + value ^= poly << ([self findMSBSet:value] - msbSetInPoly); + } + // Now the "value" is the remainder (i.e. the BCH code) + return value; +} + ++ (BOOL)makeTypeInfoBits:(ZXQRCodeErrorCorrectionLevel *)ecLevel maskPattern:(int)maskPattern bits:(ZXBitArray *)bits error:(NSError **)error { + if (![ZXQRCode isValidMaskPattern:maskPattern]) { + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @"Invalid mask pattern"}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:userInfo]; + return NO; + } + int typeInfo = ([ecLevel bits] << 3) | maskPattern; + [bits appendBits:typeInfo numBits:5]; + + int bchCode = [self calculateBCHCode:typeInfo poly:ZX_TYPE_INFO_POLY]; + [bits appendBits:bchCode numBits:10]; + + ZXBitArray *maskBits = [[ZXBitArray alloc] init]; + [maskBits appendBits:ZX_TYPE_INFO_MASK_PATTERN numBits:15]; + [bits xor:maskBits]; + + if ([bits size] != 15) { // Just in case. + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"should not happen but we got: %d", [bits size]]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:userInfo]; + return NO; + } + + return YES; +} + ++ (BOOL)makeVersionInfoBits:(ZXQRCodeVersion *)version bits:(ZXBitArray *)bits error:(NSError **)error { + [bits appendBits:version.versionNumber numBits:6]; + int bchCode = [self calculateBCHCode:version.versionNumber poly:ZX_VERSION_INFO_POLY]; + [bits appendBits:bchCode numBits:12]; + + if ([bits size] != 18) { // Just in case. + NSDictionary *userInfo = @{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"should not happen but we got: %d", [bits size]]}; + + if (error) *error = [[NSError alloc] initWithDomain:ZXErrorDomain code:ZXNotFoundError userInfo:userInfo]; + return NO; + } + + return YES; +} + +// Check if "value" is empty. ++ (BOOL)isEmpty:(int)value { + return value == -1; +} + ++ (void)embedTimingPatterns:(ZXByteMatrix *)matrix { + // -8 is for skipping position detection patterns (size 7), and two horizontal/vertical + // separation patterns (size 1). Thus, 8 = 7 + 1. + for (int i = 8; i < [matrix width] - 8; ++i) { + int bit = (i + 1) % 2; + // Horizontal line. + if ([self isEmpty:[matrix getX:i y:6]]) { + [matrix setX:i y:6 boolValue:bit]; + } + // Vertical line. + if ([self isEmpty:[matrix getX:6 y:i]]) { + [matrix setX:6 y:i boolValue:bit]; + } + } +} + +// Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46) ++ (BOOL)embedDarkDotAtLeftBottomCorner:(ZXByteMatrix *)matrix { + if ([matrix getX:8 y:matrix.height - 8] == 0) { + return NO; + } + [matrix setX:8 y:matrix.height - 8 intValue:1]; + + return YES; +} + ++ (BOOL)embedHorizontalSeparationPattern:(int)xStart yStart:(int)yStart matrix:(ZXByteMatrix *)matrix { + for (int x = 0; x < 8; ++x) { + if (![self isEmpty:[matrix getX:xStart + x y:yStart]]) { + return NO; + } + [matrix setX:xStart + x y:yStart intValue:0]; + } + + return YES; +} + ++ (BOOL)embedVerticalSeparationPattern:(int)xStart yStart:(int)yStart matrix:(ZXByteMatrix *)matrix { + for (int y = 0; y < 7; ++y) { + if (![self isEmpty:[matrix getX:xStart y:yStart + y]]) { + return NO; + } + [matrix setX:xStart y:yStart + y intValue:0]; + } + + return YES; +} + +// Note that we cannot unify the function with embedPositionDetectionPattern() despite they are +// almost identical, since we cannot write a function that takes 2D arrays in different sizes in +// C/C++. We should live with the fact. ++ (void)embedPositionAdjustmentPattern:(int)xStart yStart:(int)yStart matrix:(ZXByteMatrix *)matrix { + for (int y = 0; y < 5; ++y) { + for (int x = 0; x < 5; ++x) { + [matrix setX:xStart + x y:yStart + y intValue:ZX_POSITION_ADJUSTMENT_PATTERN[y][x]]; + } + } +} + ++ (void)embedPositionDetectionPattern:(int)xStart yStart:(int)yStart matrix:(ZXByteMatrix *)matrix { + for (int y = 0; y < 7; ++y) { + for (int x = 0; x < 7; ++x) { + [matrix setX:xStart + x y:yStart + y intValue:ZX_POSITION_DETECTION_PATTERN[y][x]]; + } + } +} + +// Embed position detection patterns and surrounding vertical/horizontal separators. ++ (BOOL)embedPositionDetectionPatternsAndSeparators:(ZXByteMatrix *)matrix { + // Embed three big squares at corners. + int pdpWidth = sizeof(ZX_POSITION_DETECTION_PATTERN[0]) / sizeof(int); + // Left top corner. + [self embedPositionDetectionPattern:0 yStart:0 matrix:matrix]; + // Right top corner. + [self embedPositionDetectionPattern:[matrix width] - pdpWidth yStart:0 matrix:matrix]; + // Left bottom corner. + [self embedPositionDetectionPattern:0 yStart:[matrix width] - pdpWidth matrix:matrix]; + + // Embed horizontal separation patterns around the squares. + int hspWidth = 8; + // Left top corner. + [self embedHorizontalSeparationPattern:0 yStart:hspWidth - 1 matrix:matrix]; + // Right top corner. + [self embedHorizontalSeparationPattern:[matrix width] - hspWidth yStart:hspWidth - 1 matrix:matrix]; + // Left bottom corner. + [self embedHorizontalSeparationPattern:0 yStart:[matrix width] - hspWidth matrix:matrix]; + + // Embed vertical separation patterns around the squares. + int vspSize = 7; + // Left top corner. + if (![self embedVerticalSeparationPattern:vspSize yStart:0 matrix:matrix]) { + return NO; + } + // Right top corner. + if (![self embedVerticalSeparationPattern:[matrix height] - vspSize - 1 yStart:0 matrix:matrix]) { + return NO; + } + // Left bottom corner. + if (![self embedVerticalSeparationPattern:vspSize yStart:[matrix height] - vspSize matrix:matrix]) { + return NO; + } + + return YES; +} + +// Embed position adjustment patterns if need be. ++ (void)maybeEmbedPositionAdjustmentPatterns:(ZXQRCodeVersion *)version matrix:(ZXByteMatrix *)matrix { + if (version.versionNumber < 2) { // The patterns appear if version >= 2 + return; + } + int index = version.versionNumber - 1; + int numCoordinates = sizeof(ZX_POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index]) / sizeof(int); + for (int i = 0; i < numCoordinates; ++i) { + for (int j = 0; j < numCoordinates; ++j) { + int y = ZX_POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][i]; + int x = ZX_POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index][j]; + if (x == -1 || y == -1) { + continue; + } + // If the cell is unset, we embed the position adjustment pattern here. + if ([self isEmpty:[matrix getX:x y:y]]) { + // -2 is necessary since the x/y coordinates point to the center of the pattern, not the + // left top corner. + [self embedPositionAdjustmentPattern:x - 2 yStart:y - 2 matrix:matrix]; + } + } + } +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.h new file mode 100644 index 0000000..0c2fba9 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.h @@ -0,0 +1,25 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXMultipleBarcodeReader.h" +#import "ZXQRCodeReader.h" + +/** + * This implementation can detect and decode multiple QR Codes in an image. + */ +@interface ZXQRCodeMultiReader : ZXQRCodeReader + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.m new file mode 100644 index 0000000..aa4fa6c --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.m @@ -0,0 +1,147 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXByteArray.h" +#import "ZXDecoderResult.h" +#import "ZXDetectorResult.h" +#import "ZXMultiDetector.h" +#import "ZXQRCodeDecoder.h" +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXQRCodeMultiReader.h" +#import "ZXResult.h" + +@implementation ZXQRCodeMultiReader + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image error:(NSError **)error { + return [self decodeMultiple:image hints:nil error:error]; +} + +- (NSArray *)decodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints error:(NSError **)error { + ZXBitMatrix *matrix = [image blackMatrixWithError:error]; + if (!matrix) { + return nil; + } + NSMutableArray *results = [NSMutableArray array]; + NSArray *detectorResults = [[[ZXMultiDetector alloc] initWithImage:matrix] detectMulti:hints error:error]; + if (!detectorResults) { + return nil; + } + for (ZXDetectorResult *detectorResult in detectorResults) { + ZXDecoderResult *decoderResult = [[self decoder] decodeMatrix:[detectorResult bits] hints:hints error:nil]; + if (decoderResult) { + NSMutableArray *points = [[detectorResult points] mutableCopy]; + // If the code was mirrored: swap the bottom-left and the top-right points. + if ([decoderResult.other isKindOfClass:[ZXQRCodeDecoderMetaData class]]) { + [(ZXQRCodeDecoderMetaData *)decoderResult.other applyMirroredCorrection:points]; + } + ZXResult *result = [ZXResult resultWithText:decoderResult.text + rawBytes:decoderResult.rawBytes + resultPoints:points + format:kBarcodeFormatQRCode]; + NSMutableArray *byteSegments = decoderResult.byteSegments; + if (byteSegments != nil) { + [result putMetadata:kResultMetadataTypeByteSegments value:byteSegments]; + } + NSString *ecLevel = decoderResult.ecLevel; + if (ecLevel != nil) { + [result putMetadata:kResultMetadataTypeErrorCorrectionLevel value:ecLevel]; + } + if ([decoderResult hasStructuredAppend]) { + [result putMetadata:kResultMetadataTypeStructuredAppendSequence + value:@(decoderResult.structuredAppendSequenceNumber)]; + [result putMetadata:kResultMetadataTypeStructuredAppendParity + value:@(decoderResult.structuredAppendParity)]; + } + [results addObject:result]; + } + } + + results = [self processStructuredAppend:results]; + return results; +} + +- (NSMutableArray *)processStructuredAppend:(NSMutableArray *)results { + BOOL hasSA = NO; + + // first, check, if there is at least on SA result in the list + for (ZXResult *result in results) { + if (result.resultMetadata[@(kResultMetadataTypeStructuredAppendSequence)]) { + hasSA = YES; + break; + } + } + if (!hasSA) { + return results; + } + + // it is, second, split the lists and built a new result list + NSMutableArray *newResults = [NSMutableArray array]; + NSMutableArray *saResults = [NSMutableArray array]; + for (ZXResult *result in results) { + [newResults addObject:result]; + if (result.resultMetadata[@(kResultMetadataTypeStructuredAppendSequence)]) { + [saResults addObject:result]; + } + } + // sort and concatenate the SA list items + [saResults sortUsingComparator:^NSComparisonResult(ZXResult *a, ZXResult *b) { + int aNumber = [a.resultMetadata[@(kResultMetadataTypeStructuredAppendSequence)] intValue]; + int bNumber = [b.resultMetadata[@(kResultMetadataTypeStructuredAppendSequence)] intValue]; + if (aNumber < bNumber) { + return NSOrderedAscending; + } + if (aNumber > bNumber) { + return NSOrderedDescending; + } + return NSOrderedSame; + }]; + NSMutableString *concatedText = [NSMutableString string]; + int rawBytesLen = 0; + int byteSegmentLength = 0; + for (ZXResult *saResult in saResults) { + [concatedText appendString:saResult.text]; + rawBytesLen += saResult.rawBytes.length; + if (saResult.resultMetadata[@(kResultMetadataTypeByteSegments)]) { + for (ZXByteArray *segment in saResult.resultMetadata[@(kResultMetadataTypeByteSegments)]) { + byteSegmentLength += segment.length; + } + } + } + ZXByteArray *newRawBytes = [[ZXByteArray alloc] initWithLength:rawBytesLen]; + ZXByteArray *newByteSegment = [[ZXByteArray alloc] initWithLength:byteSegmentLength]; + int newRawBytesIndex = 0; + int byteSegmentIndex = 0; + for (ZXResult *saResult in saResults) { + memcpy(newRawBytes.array, saResult.rawBytes.array, saResult.rawBytes.length * sizeof(int8_t)); + newRawBytesIndex += saResult.rawBytes.length; + if (saResult.resultMetadata[@(kResultMetadataTypeByteSegments)]) { + for (ZXByteArray *segment in saResult.resultMetadata[@(kResultMetadataTypeByteSegments)]) { + memcpy(newByteSegment.array, segment.array, segment.length * sizeof(int8_t)); + byteSegmentIndex += segment.length; + } + } + } + ZXResult *newResult = [[ZXResult alloc] initWithText:concatedText rawBytes:newRawBytes resultPoints:@[] format:kBarcodeFormatQRCode]; + if (byteSegmentLength > 0) { + NSMutableArray *byteSegmentList = [NSMutableArray array]; + [byteSegmentList addObject:newByteSegment]; + [newResult putMetadata:kResultMetadataTypeByteSegments value:byteSegmentList]; + } + [newResults addObject:newResult]; + return newResults; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.h new file mode 100644 index 0000000..348b768 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.h @@ -0,0 +1,30 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeDetector.h" + +/** + * Encapsulates logic that can detect one or more QR Codes in an image, even if the QR Code + * is rotated or skewed, or partially obscured. + */ + +@class ZXDecodeHints; + +@interface ZXMultiDetector : ZXQRCodeDetector + +- (NSArray *)detectMulti:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.m new file mode 100644 index 0000000..399d3ad --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.m @@ -0,0 +1,45 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXMultiDetector.h" +#import "ZXMultiFinderPatternFinder.h" +#import "ZXResultPointCallback.h" + +@implementation ZXMultiDetector + +- (NSArray *)detectMulti:(ZXDecodeHints *)hints error:(NSError **)error { + id resultPointCallback = hints == nil ? nil : hints.resultPointCallback; + ZXMultiFinderPatternFinder *finder = [[ZXMultiFinderPatternFinder alloc] initWithImage:self.image resultPointCallback:resultPointCallback]; + NSArray *info = [finder findMulti:hints error:error]; + if ([info count] == 0) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + NSMutableArray *result = [NSMutableArray array]; + for (int i = 0; i < [info count]; i++) { + ZXDetectorResult *patternInfo = [self processFinderPatternInfo:info[i] error:nil]; + if (patternInfo) { + [result addObject:patternInfo]; + } + } + + return result; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.h new file mode 100644 index 0000000..b61025a --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.h @@ -0,0 +1,36 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXQRCodeFinderPatternFinder.h" + +@class ZXDecodeHints; + +/** + * This class attempts to find finder patterns in a QR Code. Finder patterns are the square + * markers at three corners of a QR Code. + * + * This class is thread-safe but not reentrant. Each thread must allocate its own object. + * + * In contrast to ZXFinderPatternFinder, this class will return an array of all possible + * QR code locations in the image. + * + * Use the tryHarder hint to ask for a more thorough detection. + */ +@interface ZXMultiFinderPatternFinder : ZXQRCodeFinderPatternFinder + +- (NSArray *)findMulti:(ZXDecodeHints *)hints error:(NSError **)error; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.m new file mode 100644 index 0000000..d49f3b4 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.m @@ -0,0 +1,240 @@ +/* + * Copyright 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ZXBitMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXErrors.h" +#import "ZXMultiFinderPatternFinder.h" +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternInfo.h" + +// TODO MIN_MODULE_COUNT and MAX_MODULE_COUNT would be great hints to ask the user for +// since it limits the number of regions to decode + +// max. legal count of modules per QR code edge (177) +float const ZX_MAX_MODULE_COUNT_PER_EDGE = 180; +// min. legal count per modules per QR code edge (11) +float const ZX_MIN_MODULE_COUNT_PER_EDGE = 9; + +/** + * More or less arbitrary cutoff point for determining if two finder patterns might belong + * to the same code if they differ less than DIFF_MODSIZE_CUTOFF_PERCENT percent in their + * estimated modules sizes. + */ +float const ZX_DIFF_MODSIZE_CUTOFF_PERCENT = 0.05f; + +/** + * More or less arbitrary cutoff point for determining if two finder patterns might belong + * to the same code if they differ less than DIFF_MODSIZE_CUTOFF pixels/module in their + * estimated modules sizes. + */ +float const ZX_DIFF_MODSIZE_CUTOFF = 0.5f; + +@implementation ZXMultiFinderPatternFinder + +/** + * Returns the 3 best {@link FinderPattern}s from our list of candidates. The "best" are + * those that have been detected at least {@link #CENTER_QUORUM} times, and whose module + * size differs from the average among those patterns the least + */ +- (NSArray *)selectBestPatternsWithError:(NSError **)error { + NSMutableArray *_possibleCenters = [NSMutableArray arrayWithArray:[self possibleCenters]]; + NSUInteger size = [_possibleCenters count]; + + if (size < 3) { + if (error) *error = ZXNotFoundErrorInstance(); + return nil; + } + + /* + * Begin HE modifications to safely detect multiple codes of equal size + */ + if (size == 3) { + return @[[@[_possibleCenters[0], _possibleCenters[1], _possibleCenters[2]] mutableCopy]]; + } + + [_possibleCenters sortUsingFunction:moduleSizeCompare context:nil]; + + /* + * Now lets start: build a list of tuples of three finder locations that + * - feature similar module sizes + * - are placed in a distance so the estimated module count is within the QR specification + * - have similar distance between upper left/right and left top/bottom finder patterns + * - form a triangle with 90° angle (checked by comparing top right/bottom left distance + * with pythagoras) + * + * Note: we allow each point to be used for more than one code region: this might seem + * counterintuitive at first, but the performance penalty is not that big. At this point, + * we cannot make a good quality decision whether the three finders actually represent + * a QR code, or are just by chance layouted so it looks like there might be a QR code there. + * So, if the layout seems right, lets have the decoder try to decode. + */ + + NSMutableArray *results = [NSMutableArray array]; + + for (int i1 = 0; i1 < (size - 2); i1++) { + ZXQRCodeFinderPattern *p1 = self.possibleCenters[i1]; + if (p1 == nil) { + continue; + } + + for (int i2 = i1 + 1; i2 < (size - 1); i2++) { + ZXQRCodeFinderPattern *p2 = self.possibleCenters[i2]; + if (p2 == nil) { + continue; + } + + float vModSize12 = ([p1 estimatedModuleSize] - [p2 estimatedModuleSize]) / MIN([p1 estimatedModuleSize], [p2 estimatedModuleSize]); + float vModSize12A = fabsf([p1 estimatedModuleSize] - [p2 estimatedModuleSize]); + if (vModSize12A > ZX_DIFF_MODSIZE_CUTOFF && vModSize12 >= ZX_DIFF_MODSIZE_CUTOFF_PERCENT) { + break; + } + + for (int i3 = i2 + 1; i3 < size; i3++) { + ZXQRCodeFinderPattern *p3 = self.possibleCenters[i3]; + if (p3 == nil) { + continue; + } + + float vModSize23 = ([p2 estimatedModuleSize] - [p3 estimatedModuleSize]) / MIN([p2 estimatedModuleSize], [p3 estimatedModuleSize]); + float vModSize23A = fabsf([p2 estimatedModuleSize] - [p3 estimatedModuleSize]); + if (vModSize23A > ZX_DIFF_MODSIZE_CUTOFF && vModSize23 >= ZX_DIFF_MODSIZE_CUTOFF_PERCENT) { + break; + } + + NSMutableArray *test = [NSMutableArray arrayWithObjects:p1, p2, p3, nil]; + [ZXResultPoint orderBestPatterns:test]; + + ZXQRCodeFinderPatternInfo *info = [[ZXQRCodeFinderPatternInfo alloc] initWithPatternCenters:test]; + float dA = [ZXResultPoint distance:[info topLeft] pattern2:[info bottomLeft]]; + float dC = [ZXResultPoint distance:[info topRight] pattern2:[info bottomLeft]]; + float dB = [ZXResultPoint distance:[info topLeft] pattern2:[info topRight]]; + + float estimatedModuleCount = (dA + dB) / ([p1 estimatedModuleSize] * 2.0f); + if (estimatedModuleCount > ZX_MAX_MODULE_COUNT_PER_EDGE || estimatedModuleCount < ZX_MIN_MODULE_COUNT_PER_EDGE) { + continue; + } + + float vABBC = fabsf((dA - dB) / MIN(dA, dB)); + if (vABBC >= 0.1f) { + continue; + } + + float dCpy = (float)sqrt(dA * dA + dB * dB); + float vPyC = fabsf((dC - dCpy) / MIN(dC, dCpy)); + + if (vPyC >= 0.1f) { + continue; + } + + [results addObject:test]; + } + } + } + + if ([results count] > 0) { + return results; + } + + if (error) *error = ZXNotFoundErrorInstance(); + return nil; +} + +- (NSArray *)findMulti:(ZXDecodeHints *)hints error:(NSError **)error { + BOOL tryHarder = hints != nil && hints.tryHarder; + BOOL pureBarcode = hints != nil && hints.pureBarcode; + int maxI = self.image.height; + int maxJ = self.image.width; + // We are looking for black/white/black/white/black modules in + // 1:1:3:1:1 ratio; this tracks the number of such modules seen so far + + // Let's assume that the maximum version QR Code we support takes up 1/4 the height of the + // image, and then account for the center being 3 modules in size. This gives the smallest + // number of pixels the center could be, so skip this often. When trying harder, look for all + // QR versions regardless of how dense they are. + int iSkip = (int)(maxI / (ZX_FINDER_PATTERN_MAX_MODULES * 4.0f) * 3); + if (iSkip < ZX_FINDER_PATTERN_MIN_SKIP || tryHarder) { + iSkip = ZX_FINDER_PATTERN_MIN_SKIP; + } + + int stateCount[5]; + for (int i = iSkip - 1; i < maxI; i += iSkip) { + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + int currentState = 0; + + for (int j = 0; j < maxJ; j++) { + if ([self.image getX:j y:i]) { + if ((currentState & 1) == 1) { + currentState++; + } + stateCount[currentState]++; + } else { + if ((currentState & 1) == 0) { + if (currentState == 4) { + if ([ZXQRCodeFinderPatternFinder foundPatternCross:stateCount] && [self handlePossibleCenter:stateCount i:i j:j pureBarcode:pureBarcode]) { + currentState = 0; + stateCount[0] = 0; + stateCount[1] = 0; + stateCount[2] = 0; + stateCount[3] = 0; + stateCount[4] = 0; + } else { + stateCount[0] = stateCount[2]; + stateCount[1] = stateCount[3]; + stateCount[2] = stateCount[4]; + stateCount[3] = 1; + stateCount[4] = 0; + currentState = 3; + } + } else { + stateCount[++currentState]++; + } + } else { + stateCount[currentState]++; + } + } + } + + if ([ZXQRCodeFinderPatternFinder foundPatternCross:stateCount]) { + [self handlePossibleCenter:stateCount i:i j:maxJ pureBarcode:pureBarcode]; + } + } + NSArray *patternInfo = [self selectBestPatternsWithError:error]; + if (!patternInfo) { + return nil; + } + NSMutableArray *result = [NSMutableArray array]; + for (NSMutableArray *pattern in patternInfo) { + [ZXResultPoint orderBestPatterns:pattern]; + [result addObject:[[ZXQRCodeFinderPatternInfo alloc] initWithPatternCenters:pattern]]; + } + + return result; +} + +/** + * A comparator that orders FinderPatterns by their estimated module size. + */ +NSInteger moduleSizeCompare(id center1, id center2, void *context) { + float value = [((ZXQRCodeFinderPattern *)center2) estimatedModuleSize] - [((ZXQRCodeFinderPattern *)center1) estimatedModuleSize]; + return value < 0.0 ? -1 : value > 0.0 ? 1 : 0; +} + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.h b/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.h new file mode 100644 index 0000000..e8c1648 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.h @@ -0,0 +1,89 @@ +// +// ZXingWrapper.h +// +// github:https://github.com/MxABC/LBXScan +// Created by lbxia on 15/1/6. +// Copyright (c) 2015年 lbxia. All rights reserved. +// + +#import +#import + +#import "ZXBarcodeFormat.h" + +#define LBXScan_Define_ZXing + +/*! + * ZXing扫码封装 + */ +@interface ZXingWrapper : NSObject + + + +/** + 初始化ZXing + + @param preView 视频预览视图 + @param block 返回识别结果 + @return 返回封装对象 + */ +- (instancetype)initWithPreView:(UIView*)preView block:(void(^)(ZXBarcodeFormat barcodeFormat,NSString *str,UIImage *scanImg))block; + + + +/** + 设置识别区域,不设置默认全屏识别 + + @param scanRect 识别区域 + */ +- (void)setScanRect:(CGRect)scanRect; + + + + +/*! + * 开始扫码 + */ +- (void)start; + +/*! + * 停止扫码 + */ +- (void)stop; + +/*! + * 打开关闭闪光灯 + * + * @param on_off YES:打开闪光灯,NO:关闭闪光灯 + */ +- (void)openTorch:(BOOL)on_off; + + +/*! + * 根据闪光灯状态,自动切换 + */ +- (void)openOrCloseTorch; + + +/*! + * 生成二维码 + * + * @param str 二维码字符串 + * @param size 二维码图片大小 + * @param format 码的类型 + * @return 返回生成的图像 + */ ++ (UIImage*)createCodeWithString:(NSString*)str size:(CGSize)size CodeFomart:(ZXBarcodeFormat)format; + + + + +/*! + * 识别各种码图片 + * + * @param image 图像 + * @param block 返回识别结果 + */ ++ (void)recognizeImage:(UIImage*)image block:(void(^)(ZXBarcodeFormat barcodeFormat,NSString *str))block; + +@end diff --git a/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.m b/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.m new file mode 100644 index 0000000..7a39672 --- /dev/null +++ b/Pods/LBXScan/LBXScan/LBXZXing/ZXingWrapper.m @@ -0,0 +1,165 @@ +// +// ZXingWrapper.m +// +// +// Created by lbxia on 15/1/6. +// Copyright (c) 2015年 lbxia. All rights reserved. +// + +#import "ZXingWrapper.h" +#import "ZXingObjC.h" +#import "LBXZXCaptureDelegate.h" +#import "LBXZXCapture.h" + + +typedef void(^blockScan)(ZXBarcodeFormat barcodeFormat,NSString *str,UIImage *scanImg); + +@interface ZXingWrapper() +@property (nonatomic, strong) LBXZXCapture *capture; + +@property (nonatomic,copy)blockScan block; + +@property (nonatomic, assign) BOOL bNeedScanResult; + +@end + +@implementation ZXingWrapper + + +- (id)init +{ + if ( self = [super init] ) + { + self.capture = [[LBXZXCapture alloc] init]; + self.capture.camera = self.capture.back; + self.capture.focusMode = AVCaptureFocusModeContinuousAutoFocus; + self.capture.rotation = 90.0f; + + self.capture.delegate = self; + } + return self; +} + +- (id)initWithPreView:(UIView*)preView block:(void(^)(ZXBarcodeFormat barcodeFormat,NSString *str,UIImage *scanImg))block +{ + if (self = [super init]) { + + self.capture = [[LBXZXCapture alloc] init]; + self.capture.camera = self.capture.back; + self.capture.focusMode = AVCaptureFocusModeContinuousAutoFocus; + self.capture.rotation = 90.0f; + + self.capture.delegate = self; + + self.block = block; + + CGRect rect = preView.frame; + rect.origin = CGPointZero; + + self.capture.layer.frame = rect; + //[preView.layer addSublayer:self.capture.layer]; + + [preView.layer insertSublayer:self.capture.layer atIndex:0]; + + } + return self; +} + +- (void)setScanRect:(CGRect)scanRect +{ + self.capture.scanRect = scanRect; +} + +- (void)start +{ + self.bNeedScanResult = YES; + [self.capture start]; + +} + +- (void)stop +{ + self.bNeedScanResult = NO; + [self.capture stop]; +} + +- (void)openTorch:(BOOL)on_off +{ + [self.capture setTorch:on_off]; +} +- (void)openOrCloseTorch +{ + [self.capture changeTorch]; +} + + +#pragma mark - ZXCaptureDelegate Methods + +- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result scanImage:(UIImage *)img +{ + if (!result) return; + + if (self.bNeedScanResult == NO) { + + return; + } + + if ( _block ) + { + [self stop]; + + _block(result.barcodeFormat,result.text,img); + } +} + + ++ (UIImage*)createCodeWithString:(NSString*)str size:(CGSize)size CodeFomart:(ZXBarcodeFormat)format +{ + ZXMultiFormatWriter *writer = [[ZXMultiFormatWriter alloc] init]; + ZXBitMatrix *result = [writer encode:str + format:format + width:size.width + height:size.width + error:nil]; + + if (result) { + ZXImage *image = [ZXImage imageWithMatrix:result]; + return [UIImage imageWithCGImage:image.cgimage]; + } else { + return nil; + } +} + + ++ (void)recognizeImage:(UIImage*)image block:(void(^)(ZXBarcodeFormat barcodeFormat,NSString *str))block; +{ + ZXCGImageLuminanceSource *source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:image.CGImage]; + + ZXHybridBinarizer *binarizer = [[ZXHybridBinarizer alloc] initWithSource: source]; + + ZXBinaryBitmap *bitmap = [[ZXBinaryBitmap alloc] initWithBinarizer:binarizer]; + + NSError *error; + + id reader; + + if (NSClassFromString(@"ZXMultiFormatReader")) { + reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)]; + } + + ZXDecodeHints *_hints = [ZXDecodeHints hints]; + ZXResult *result = [reader decode:bitmap hints:_hints error:&error]; + + if (result == nil) { + + block(kBarcodeFormatQRCode,nil); + return; + } + + block(result.barcodeFormat,result.text); +} + + + + +@end diff --git a/Pods/LBXScan/LICENSE b/Pods/LBXScan/LICENSE new file mode 100644 index 0000000..20efd1b --- /dev/null +++ b/Pods/LBXScan/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/Pods/LBXScan/README-English.md b/Pods/LBXScan/README-English.md new file mode 100644 index 0000000..859d1ac --- /dev/null +++ b/Pods/LBXScan/README-English.md @@ -0,0 +1,107 @@ + + +# iOS barcode and qr code objective-c version +### iOS scanner wrapper +- scanner wrapper with: AVFoundation、ZXing、ZBar +- scan view wrapper +- recognize image + +### 设置参数自定义效果 +- 扫码框周围区域背景色可设置 +- 扫码框颜色可也设置 +- 扫码框4个角的颜色可设置、大小可设置 +- 可设置只识别扫码框内的图像区域 +- 可设置扫码成功后,获取当前图片 +- 动画效果选择: 线条上下移动、网格形式移动、中间线条不移动(一般扫码条形码的效果) + + + +### install with cocoapods +> 可独立安装某一功能,ZXing已经下载到本工程,解决之前版本下载速度慢的问题 + +#### install with cocoapods by git tag +*** +- 安装所有库包括UI (最低系统iOS7) + +```ruby +pod 'LBXScan/All',git:'https://github.com/MxABC/LBXScan.git', tag: '2.0' +``` + +- 只安装系统原生API封装库 (最低系统iOS7) + +```ruby +pod 'LBXScan/LBXNative',git:'https://github.com/MxABC/LBXScan.git', tag: '2.0' +``` + +- 只安装ZXing封装库 (最低系统iOS6) + +```ruby +pod 'LBXScan/LBXZXing',git:'https://github.com/MxABC/LBXScan.git', tag: '2.0' +``` + +- 只安装ZBar封装库 + +```ruby +pod 'LBXScan/LBXZBar',git:'https://github.com/MxABC/LBXScan.git', tag: '2.0' +``` + +- 只安装UI + +```ruby +pod 'LBXScan/UI',git:'https://github.com/MxABC/LBXScan.git', tag: '2.0' +``` +- 安装任意组合 + +> 你可以通过上面的安装方式,安装任意组合 + + +### Demo测试 +- xcode版本:xcode8.3 +- 将工程下载下来,打开DemoTests中 LBXScanDemo.xcworkspace +- Demo提供了选择对应库进行扫码识别、相册选择图片识别、生成条码等测试 + +### 使用 +#### 自定义参数部分介绍 +```obj-c +- (void)custom +{ +//设置扫码区域参数 +LBXScanViewStyle *style = [[LBXScanViewStyle alloc]init]; +style.centerUpOffset = 44; + +//扫码框周围4个角的类型设置为在框的上面 +style.photoframeAngleStyle = LBXScanViewPhotoframeAngleStyle_On; +//扫码框周围4个角绘制线宽度 +style.photoframeLineW = 6; + +//扫码框周围4个角的宽度 +style.photoframeAngleW = 24; + +//扫码框周围4个角的高度 +style.photoframeAngleH = 24; + +//显示矩形框 +style.isNeedShowRetangle = YES; + +//动画类型:网格形式,模仿支付宝 +style.anmiationStyle = LBXScanViewAnimationStyle_NetGrid; + +//网格图片 +style.animationImage = [UIImage imageNamed:@"CodeScan.bundle/qrcode_scan_part_net"];; + +//码框周围4个角的颜色 +style.colorAngle = [UIColor colorWithRed:65./255. green:174./255. blue:57./255. alpha:1.0]; + +//矩形框颜色 +style.colorRetangleLine = [UIColor colorWithRed:247/255. green:202./255. blue:15./255. alpha:1.0]; + +//非矩形框区域颜色 +style.notRecoginitonArea = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6]; + +} +``` + + +# 界面效果 +![image](https://github.com/MxABC/Resource/blob/master/scan12.gif) + diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 1bed932..e4f4295 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -23,6 +23,9 @@ PODS: - JPush (3.1.0): - JCore (~> 1.2.0) - JSONModel (1.7.0) + - LBXScan/LBXZXing (2.3): + - LBXScan/Types (~> 2.2) + - LBXScan/Types (2.3) - LKDBHelper (2.5.1): - LKDBHelper/standard (= 2.5.1) - LKDBHelper/standard (2.5.1): @@ -60,6 +63,7 @@ DEPENDENCIES: - IQKeyboardManager - JPush - JSONModel + - LBXScan/LBXZXing (~> 2.3) - LKDBHelper - Masonry (~> 1.0.0) - MBProgressHUD (~> 0.9.2) @@ -86,6 +90,7 @@ SPEC REPOS: - JCore - JPush - JSONModel + - LBXScan - LKDBHelper - Masonry - MBProgressHUD @@ -112,6 +117,7 @@ SPEC CHECKSUMS: JCore: 467b5b56bd367c548f88ee1b5794d94ee07ab319 JPush: 5921e25ad13e0386351079217b009f2039084eac JSONModel: 840bc0fcffb24b8454d2c026bf26fea454b8e98d + LBXScan: e51449f0832d1fe17da632af0d22adeb3cfa3543 LKDBHelper: 9a276ba51f2e16263d46a9517e16cc9b03472664 Masonry: 7c429b56da9d4ee0bbb3ed77a5ea710d6a5df39e MBProgressHUD: 1569cf7ace17a8bac47aabfbb8580a49690386d1 @@ -130,6 +136,6 @@ SPEC CHECKSUMS: WechatOpenSDK: 676feec516a11173eafd1fe64b10d27babf28701 YTKKeyValueStore: 4d002941540dd5108fa23009b71e0f2f937f7a0f -PODFILE CHECKSUM: 4b1cd3dab10b2ff5d5f5d0c7305d55507309ffdf +PODFILE CHECKSUM: 04731726bf2b2bb62e9d693c6becf4b53e05bcc6 COCOAPODS: 1.5.0 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 68ca5aa..71c8392 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,1216 +7,2218 @@ objects = { /* Begin PBXBuildFile section */ - 009C79BE88C2F4C986644CD3E0B088C2 /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 774A10F51C61AA781BFD1C4397931231 /* JSONModelClassProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 00D9918CA212DF704D4248EF869DB868 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AC5B168B958ECE131EC368A4E10C6DEB /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 01069C1B4E0135AF251E5CE7659768B3 /* UITableView+FDTemplateLayoutCellDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = E3206BC9B15475420835FF224D6604E1 /* UITableView+FDTemplateLayoutCellDebug.m */; }; - 018E193AC91FD48C64A9ED15D58AC95D /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = B416F9C983C43629DD021B63239CC1E0 /* SDWebImageCompat.m */; }; - 02A0ADD96B43A9970DD5C7C6BAEAB761 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 03FF8A989242213A9B392E66E53BE8C1 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 250AC017E1404E43770F53CAC6280DC7 /* UIView+WebCacheOperation.m */; }; - 04A7D6AADAB213CE7D26F8EAD2F87536 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 363026D36FA7E4000010BC1B5CD2B8E3 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 04F3BBE71B24770E40CC66A993AD85D1 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = D6CDF2935BA2A5F043D6242F45854A06 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 059ACAAB4FD2944460415CD3FD7A15F0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 05F4742E8E81FFB81BD1F1DFA9C63484 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FED1ACDE4726A20CC2932BCDC66F5787 /* Security.framework */; }; - 0648973667FB537BDC3ABFA9F3AD2ED8 /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EE88FA017BECDD56594C950358507E0 /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06697BBB6E6D73B5F021E6DACAC5DE45 /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = B2DEBA7CEFB5421B185C9365A7AA8A75 /* JSONAPI.m */; }; - 068EF598E554EC57038ACFB89CC2C47A /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CA55885292577F09084E8F2BB1E84632 /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06FF2586AE76FBBCBF8171F98255D8CB /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3707B0F6D5D2EB50CB0191D8FC9A3E26 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 07159A933B3C47A02FE2B2744ABAAC89 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = C405F8314A0EDA4CCECFACFD56BD6452 /* MJRefreshStateHeader.m */; }; - 08F144BF3E6E8F423644771FDC299B88 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3288F586F676906211064535ACEA59 /* SocketAckManager.swift */; }; - 091D17D5D8F832D28546A72B788CF0AE /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A743B083B30311B1DDC3865184A2E6 /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 09EC74E4AFC1D5951D1F80094D06969A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 0A1E34B4A27DCD62A914F3B028A07E6C /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 74DEFA36B4962F7E3A0B4640337FC908 /* UIView+MJExtension.m */; }; - 0ACBBA158F4635FAE16AB5456ABADCA4 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B8A96A9F8907E36AEE053151EF55E0B /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0AF48B0ADAD7D4F5A2CB22075A3F5FEC /* NSObject+LKDBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E0EDFAA630F61D5988162BCAB78B5FA /* NSObject+LKDBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B1C5725C7BE03D622114275D6FD6EFA /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = A1D013A487C85EC1042B4A1ED71E7C6D /* JSONModelError.m */; }; - 0BD29DA68F0ECBAED7316565DCA70D64 /* YTKKeyValueStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 419688D30BFAF6943FBE6304B83E2FC3 /* YTKKeyValueStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0CDCF95E1063393825F8FC7FFD04726A /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 73A0A8125787204B223B07F7C9F0A42E /* UIButton+WebCache.m */; }; - 0D820188A3982F77A8C2FD47F4249F25 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 002CC32FEB8FB1D1B4D4BA9D7AE0CB41 /* SocketEngineClient.swift */; }; - 0DB2E34289D18AA9810609ADCCBFA181 /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 82C2BD5350645441DD92F95DC5E589DD /* IQBarButtonItem.m */; }; - 0DCFD83A6149FC0514890A5ED67047B5 /* NJKWebViewProgress-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 10209B83220731CD89F3BE7CE9C254D0 /* NJKWebViewProgress-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0EFB524EFDF2F8712A2F5067817A672E /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = CE00515C642F3041D7530F99532A37B1 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0F3DF5C3BEFCC9838B53C37735B414BE /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 577E3F36FE44476EE775746E6BC7F3F2 /* NSLayoutConstraint+MASDebugAdditions.m */; }; - 0FDB2B4F75591851F0F119EAE70B3F63 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 384EDBAD900277643587B535751AFC42 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0FDFFDFAF40F6A37B8911FA7C57428CB /* LKDBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = C98EC4CD7AD6C86DF803FE3B76FCED1A /* LKDBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 101F836F887C01B45F4DCF351EBC28D1 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = F57EAFC722DC8A1A5E24FC9DC97959E0 /* MJRefreshBackNormalFooter.m */; }; - 104BE926FFFB5C942A7A0FAC05920132 /* SocketEnginePacketType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD28F6214D96C6BCC2EAF3C08B2EBA4 /* SocketEnginePacketType.swift */; }; - 13D87E1D99CFD98771E8066E6FF832CD /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB909A57EFF13EAD51EF05B4F73395B /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 13F320C89A0757B4DBD7A1B0C47B7B46 /* Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = D03FDD61963B602D63D86983F58A4B56 /* Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 14441D47B616C056BC4F532352A3091D /* TTTAttributedLabel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CECF499859A92AC25079255ECACA8E36 /* TTTAttributedLabel-dummy.m */; }; - 14479278EA90F38247811468ADD8EBB7 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B077190F4428101E2C3FCA4A0F17CA1 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 148E57B8B5F299475BF5877A2EA6E7C1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70BC8DC64FAC8894D27E1964CC8CD209 /* QuartzCore.framework */; }; - 1563D7F05577852DD479C1BA3CFC24CC /* NJKWebViewProgress-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 27481864BFB4AD24155BCC2551337DB6 /* NJKWebViewProgress-dummy.m */; }; - 15F6265FCE0955CDB4967F7306407D67 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = B755A7EEE0FDDBCCB793F3ED139513EF /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 162595288B55C740806E9BF91E39A9FA /* SocketEngineSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 936CB1BC52F552DA2661695DAD338FA0 /* SocketEngineSpec.swift */; }; - 16AB19AD78FA194D0ED3A8EBE7A347FB /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 10EDF99232E824A4129018791B729BC7 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17E52896A3ABBD4CCAB35046E48BE055 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = B2EF076F89FAD3ACFE9DCCC73E3553A3 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17F033046E658F3BFD0011DCB768CF54 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 964EB9F9E3DFDFBEB0A635FF6F6445AC /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1843E6DF520A5EFE9C83C38E18578E42 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C607C7BF73E5A94800A31DAFFC343CAC /* MJRefreshAutoStateFooter.m */; }; - 19119F01A87FAA55D45B4F11F33B7B3E /* LKDBHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C765CC91B74812227DCE13319608707 /* LKDBHelper.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 19B84B8D631A49492C1DBBE00A7AF097 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 1AB30B2D8CA8C6F55177330FA38BA5B3 /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF23265306A2A5CFD07B28F6BC0D66 /* SSLSecurity.swift */; }; - 1C22674A488487F3510ED9E6C484C937 /* TTTAttributedLabel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 044E5621EF88BE1E4C8B35094500FCA8 /* TTTAttributedLabel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1CA7812A0C2F63BC21BADC1DE3C1F30E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 1ED505CC385A149F4DF8F4B94BA4FC0B /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 498010BF30FB1D6FB301F7B3FD6CFC49 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F150FE6E6E8D78C6DBBA7870EA8E4C4 /* UITableView+FDIndexPathHeightCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F51B36454E6DCF580D43CCFCB03FC536 /* UITableView+FDIndexPathHeightCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 206E174869FE4C5679DC9EFADE9FDC0E /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F53130DDA9FEA279EEACE1E1D479D77 /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 22554065FA07F1BFE5308A685394CB12 /* FMDatabaseQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA25A84A833228F9B77716016FCF329F /* FMDatabaseQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2524EC4EF024A6C067A0FA082084CFB5 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = A77564763595F2220FB4FF9C93274429 /* MJRefreshBackStateFooter.m */; }; - 271DED3D581E835D146A9B5800F50339 /* SocketRocket-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7476095E7330D9DBD36D76CCE3773573 /* SocketRocket-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2854C9B1086758BD2B6681206B6759B4 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 40995236A773C9D30F835E44168085B1 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 291C24EA8B69C1738694B0729ED3ADA4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3693DA67EFBAB281959594641A587872 /* UIKit.framework */; }; - 2AFB0AFA2138181E162CD00669D87FE3 /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 65FA72B7E48A3FABA22AE5D855BB186C /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2B0AD5F72C574005D53D512A8F8E2800 /* FMDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23AAFF4BE17FB72260148442F598E055 /* FMDB.framework */; }; - 2BF9244FC886AC7E571F140F13713AFC /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3949679577E6689BFFF358B9518FE13 /* SSLSecurity.swift */; }; - 2C4EF1B590BD389FF42157519B73A70C /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6191ABE66A1BB9B2F88FFD6AF6186D63 /* SocketEventHandler.swift */; }; - 2C5EA66B987D887948303DB77AF68D61 /* NSObject+LKModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C7B870DA133902EFBA936EF978F45C /* NSObject+LKModel.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 2C70FC786858E6FFD02177DD4DF6DEFB /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C47585F4328CD92273C4B86865F9F95 /* SDWebImageTransition.m */; }; - 2CB401BA28E91577E8318A7BD8D03192 /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = D526289C8F52F38595B594AF6ED917FA /* SDWebImageGIFCoder.m */; }; - 2CEA12D52F3F7AC0669C99A157E19F62 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = D887710C70848A5D7BBB59F3733FA591 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2D407C6492BC569F5361B9210C89A19C /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3484FF439E2DBB5367ED00A1BCD06905 /* IQKeyboardManager.m */; }; - 2EE716A52967138FD6916F5F0F0F63B3 /* Pods-GIGA-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD113136C3BE7E4822B80A29F3DC5E42 /* Pods-GIGA-dummy.m */; }; - 307ADC5FBF528D9C850F5CEB47EFCC99 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE4923BAFE446FDB51B8375C4DA4869 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30D4DCE78AC7DF54F68F633B1F85B131 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 322539ED22E284D2B69C53BB5298C282 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55CDFB91944CA5A1481875292A58F12A /* SocketLogger.swift */; }; - 3345805C0D8E8D0726F7E5981DA61A5F /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = F45B85ABF6C73FC46039EF4A3D28A28D /* UIWebView+AFNetworking.m */; }; - 344DB99F8332029C0391F08B6D0E425C /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5C08FC6773BA7BD235A3B78A7ABCAA /* MJRefreshAutoNormalFooter.m */; }; - 3463AED0AFF441E7AE64C5818A235DEE /* YTKKeyValueStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA85730E7ECFBD1CCEB7260FF00F4C2 /* YTKKeyValueStore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 347945A5FC349A6E31AC7E3403E2CDE5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 35D685CF7C6F73A65AD3DD99674CA78F /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = CB12608CAF6344C9CD54DC1A84A0BEF5 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3619E77A8EC11571EE9F32921DAC0C89 /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 8779B2CA7289D6A7185C91312B6BD88D /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 36E344E5B627E04368ECC96338E17F26 /* JSONModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A3F1A8219D19797685AF2D8E9EAFE675 /* JSONModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37BC04B72C67B4A408D409660D3B790C /* Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC11B08B388CE3D8E34D3E0AC2E3B25C /* Compression.swift */; }; - 37F097E2269EF1BD238AD7449D796445 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = D4BFC19B6137B925C0EDE4EBABA27FC7 /* FMDatabase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 37F6913EE3CD6EB8715086F0C9F6A823 /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 118814FC7D9B5A7CF1BF99F325AF8488 /* JSONValueTransformer.m */; }; - 37FD169854FF4B397051998D611F152A /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = A2092DB43436F5251A059C3C4A62A935 /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3829CBCC3598DB13C2AD3B7383D1F24A /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 60E6BD48D0EAAAD7C2C35A6705DA2EB1 /* MJRefreshFooter.m */; }; - 38E0CD63021889EE46E1A6B9FA0415F5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3693DA67EFBAB281959594641A587872 /* UIKit.framework */; }; - 3A0419540405C51EA35937E39E985E9D /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CD9FF2C9E2179EFB4B65EAA1F59EB227 /* NSImage+WebCache.m */; }; - 3B31BC5E11334050DEE2597D1196D8A1 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = CDF02B7C8432A7AF339B1C46A875FAA1 /* SDWebImagePrefetcher.m */; }; - 3C52DF3086A7BA2E047AFFFCBFEC1E0B /* SocketParsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C722C8355643E88536A2074EFDB9B2DA /* SocketParsable.swift */; }; - 3C9E113B7712442B4BCB59AB7EEC2085 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 967F8C400CE4F9921B132F3F960E9FF0 /* AFURLResponseSerialization.m */; }; - 3DDB894364CEC991E61B04E9036D6D54 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 404662E4EA47719280C225A3F07A8A6A /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DF9076C816AE6338CE95412E588DF54 /* Pods-GIGA-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4333DE13F7B28D62D7251611E26C7D1F /* Pods-GIGA-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3E43906B70EB01C06F3AE17008B853B9 /* FMResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A594A8236E67EB8170C115C30847FF7 /* FMResultSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 40A6216FC50B4540584DA1C45F98F9FD /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 6779C8F389FC4B45319BDA12E59B2BFD /* JSONModelClassProperty.m */; }; - 40A9F401B6A8B531B3CF176B6EA4C0AB /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986BB8C05577A2D5C64F498406015E85 /* SocketIOClient.swift */; }; - 40E6B7A671DFD76170156328D995546B /* NJKWebViewProgress.m in Sources */ = {isa = PBXBuildFile; fileRef = B3FC77617DC552A6560A5396024E9F3E /* NJKWebViewProgress.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 41E9E4524E285B0DC1334FB06772E4A2 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8509BE0EBE02FAB118A15EBE60C8E47 /* Starscream.framework */; }; - 42B30C255DE8D19534405DAD5EA14C91 /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 270472B1F4EA9863212F85E4EAB5B497 /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 431C76067CB09B1FC0E4DD5AEA6B540A /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = CCBD06AABD5DDD4CA2D79364A77DF3BF /* IQUIScrollView+Additions.m */; }; - 432FA22864D148EBD4CB22F55AB68004 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 457ACF9150DCF9AF445B129CC9678FB6 /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 55D47BD7E8E69B61DB9C10FE582F0F77 /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 45AAEFF6FFBCEE5DA0A7377AE556CE7B /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E76FAF8061A10B224E54FE0D78F122 /* UIImage+MultiFormat.m */; }; - 46A64AC807BC0DBFDA09A579EA0CF3E6 /* UITableView+FDIndexPathHeightCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DF7CF70E97B77C95449324D577D2DE5 /* UITableView+FDIndexPathHeightCache.m */; }; - 484CBC296B6A059C5C9EE6DE7FF1FB67 /* FMDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23AAFF4BE17FB72260148442F598E055 /* FMDB.framework */; }; - 4985E014269593640635A8DBD75DA450 /* NSObject+LKModel.h in Headers */ = {isa = PBXBuildFile; fileRef = FB8C8FEB6717D66F14136EF50C148280 /* NSObject+LKModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A712D32646F119F208BBA3D2A7C0672 /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B2009C43A73788FC750D0B1C40ECA60 /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4AA21F40697CB42D7D219ACEDE4FBFCF /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BB129160697EBA00C13DD98D69D252F7 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4AA3A9FC9AAD94C226CA975946C9395B /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = A1476EF51AAC4F331DC16EE15A7C9A52 /* UIRefreshControl+AFNetworking.m */; }; - 4B2CCAA899BA00D1D49EC70C0BCF57BF /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 88446EB28B584D07BED817C62D06D29D /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4C321BA8844AA4C44D4416CC6948DF2B /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D083351E8A8E8A86A59BA3A3863723C4 /* AFNetworking-dummy.m */; }; - 4C5DA96F7CAC26975EEEBD7450FF214D /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C5E794D2376437EFF78B2C7EB9D7060B /* AFURLSessionManager.m */; }; - 4D4F2050654580FE1F1D5F4F82CEDDB8 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = CA9FD8A6D417DF1249A66C83FFBE8E4C /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4EB17293737C717D12298CFFE6A67514 /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = C8B763BF7B2D2A4C39D2DC28299CEF57 /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 511F4CF798D6A4A3688B6BB842C48D87 /* UITableView+FDTemplateLayoutCell.h in Headers */ = {isa = PBXBuildFile; fileRef = F76496371A94D04C6DEB3EBEEB62540B /* UITableView+FDTemplateLayoutCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5239E6CA49837A90A08639E1E4CBB3B1 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F5A09FBDED1F72A04C3E335DE0A1BA /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53BDF81D0A52EA526D597A5C5B139D7F /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 4253E7F7448B089D6F4CDECD149486CB /* MASCompositeConstraint.m */; }; - 53DB4048614C4483D678AF52930E9ECD /* UITableView+FDTemplateLayoutCellDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = EF79A7916BB6B36C2A83C99F45DDA1C3 /* UITableView+FDTemplateLayoutCellDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 572BCA39E6087AD4DE4BD534943A67C9 /* SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = EED26BAA73FE884C227E56BEB5E9D7C5 /* SRWebSocket.m */; }; - 57C1171188E1A77E65C670ED986D46DD /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = EC74917D726BBCA053741855222BD20F /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 57D1433F37CDBBC61AEC35D00F8F5CA7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F6D2D8438420EB7A9186D08660AD7BD6 /* SDWebImageManager.m */; }; - 57E9B041CC1D8988C38DDC97CAEFCD76 /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E917B75DE00F9E5F318667A4D3CA7DB /* MBProgressHUD-dummy.m */; }; - 57FE38F17C0EDD5CF73B2A084A17586E /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4BDE950FE4B829BD4E2D8E0B86A002 /* JSONHTTPClient.m */; }; - 580C49850ED7094BC4D197E27DDB07CE /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2C3B4A8303BF777A59CF2BAC331C8B6 /* SocketPacket.swift */; }; - 58388F773008AF671CE67FE1C902E6CB /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = D143D5CBDD8A310F6BE8B5FE049E63B7 /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 58E6E68D10EF3D64522BD267CC1761A6 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = D1FD9AB8D8A0F476AA2FFFB0AF73984A /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 59F81DE0305CC2AC448D2A3C6B3280A2 /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E421B865FF1305197CC9C5DB303BB22 /* MASConstraint.m */; }; - 5BC8CFF572E6322BA5BDC91D816D94DB /* SocketRocket-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A1F61FFDF1CF20E149F6B0F6B0FF24A /* SocketRocket-dummy.m */; }; - 5BFE1CC79F693B6218B419AE50B2070E /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 79CF50141FCA7A6797717FC93955DAF1 /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5C33A1FFCCF56C70F3BEF5C8A478712B /* UITableView+FDTemplateLayoutCell-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F426661253D1751C24C7C550B0DD3742 /* UITableView+FDTemplateLayoutCell-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5F0B1C5637118C157A9B60D62896F846 /* SocketAckEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82A606DAFFFB4961C3B9C2FA8505535 /* SocketAckEmitter.swift */; }; - 5F6ABD27328146E613415A59A1521EB6 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CFCC52EC62F150CB4DFCDB379045F8F /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 621B413DAEFE75991251ED378822527C /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C8E35BDB3CC1024935C804E53F0DD2 /* MJRefresh-dummy.m */; }; - 6298B1C2234864DA5ED3B5E6398B95AC /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3AB36856959C85924D590AFD2695D2B6 /* MJRefresh.bundle */; }; - 62DBE4193DF3FD638FEA517155B308B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 636BBA734C1A17A734761D674FAE8800 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = EFC686D628AA3C2CFA30D354721530B4 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 639A86F8EDAF569092C61103FFAEA21D /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 7491AD0045ED41AE8F08FD751720691E /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 63BA6FBA10304F4828DE97C0FA63ED9D /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BF67949298271264E085700428A4FCF /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 63F5BA839B931DB6605554B6D4369A0C /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 07BAC4DCA1D385E6719FCD0A2C3518E8 /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6478B0091202F9429D2A61E30BEDA571 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FED1ACDE4726A20CC2932BCDC66F5787 /* Security.framework */; }; - 6595C6295B9EBBF40751A376239681FD /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FC3B9F0418FF6AD9307259ADB289A07 /* UIProgressView+AFNetworking.m */; }; - 665B3B037B98D3E3ADB449A43FF14F42 /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = B37CE92BCFA7B9F94F1EC5EEE702D1C8 /* IQUITextFieldView+Additions.m */; }; - 688E0882DFC8CABA02390F43178CB33F /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = D917488C1503A8C83A348CD03817262E /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6A0B1A0FA7A75C861B9D401D0E8CC95E /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = A38841D1204800C4F712AB1D13E4AC7D /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6AB8F78680B3470391219F11D51A1DE7 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B92D24C35F51B3A3A9626DD861EF1E /* UIImageView+AFNetworking.m */; }; - 6C23BBF56ED4DCC10CA1765A6736D1F8 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = B84232FF804EAAE9753EE17FCA85A8AE /* MASLayoutConstraint.m */; }; - 6D13591A430260C31F6102B30645B5CD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 6E6E8ADF2879B9F6832CE82F2B538366 /* LKDBHelper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 48886EB74B58FC75012D8AB06D74F958 /* LKDBHelper-dummy.m */; }; - 6F5906B58272E07A0850248867562581 /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E7D955074A0ED0B9FF131595E872064 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6F5E56A1D7E89F2B0A2692CF780EFE7C /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 84A34E767AC05FDBD3D849436D0BCCEA /* SDWebImageDownloaderOperation.m */; }; - 6FEA8F22AD821ECF8E74615FD8FE7427 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 6FF8739ADFFE8465389AF3F0603E6F83 /* LKDBUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 00DBB0CB01217AA64958D2E4F6059B2B /* LKDBUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7072311B8847A2004F9C31069CC00E19 /* UITableView+FDKeyedHeightCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 18DDE12559A163C7C94F4FE3A82C3212 /* UITableView+FDKeyedHeightCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7099E4035C06D3116DA2586EFE563C0B /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E7A5DB8DF2295A90EB25F7E495E5F62B /* AFAutoPurgingImageCache.m */; }; - 71E99398CEF7E77AFD550582A21DF6A9 /* SocketEnginePollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4AF1BBB3946B6E0D89CDC1AE59011B0 /* SocketEnginePollable.swift */; }; - 71F6D96E3AEAA07389F37E2C4B63C4F6 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 64835380AC55D938C3E0E9AA529F4D41 /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 72563ADE99DC9E753B27D48B16AA3654 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 72BC0D5210ABDE6396CC75FA6A823FEE /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70BC8DC64FAC8894D27E1964CC8CD209 /* QuartzCore.framework */; }; - 72E566862803FE9B1DE0D4A246E34DA9 /* SocketExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BF77A950CD15978D9DA654DDF789CD /* SocketExtensions.swift */; }; - 72EE4A5DC3076CD8C13717D4DAA37DFD /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 296D773846653A12BF592FA3AEE99EE7 /* IQTextView.m */; }; - 73BBDACC22CCA36A6DAAA167AD780BAF /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C199822C99C320281338D998C03B995 /* MASConstraintMaker.m */; }; - 756DF24546C7D91459DCADC8F1C98660 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 367D41745AB1AEBE8A1FFB6DB552ECEB /* MASViewConstraint.m */; }; - 772785574BC1059C2913576CBFF3AD17 /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = BDB59FA6744E05662DDE8F5FB6697313 /* JSONKeyMapper.m */; }; - 781BC730696BEA5F8680861CE876AA2C /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = C74B6FEF3E092E16E6AA34C13A34D0B9 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7854DF5B9510FA3584D187A9D20B2F18 /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7704E7E2B7BD84344BB610CC27D5A70E /* SocketStringReader.swift */; }; - 78874F1F850E4AEDB8D05955D1736A6F /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E2FB8AE972E929400C566BC03FB6468 /* ImageIO.framework */; }; - 788BA72F67004504FFDFC670048786B5 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = FE403E58475EF64EF393ABA0E2EC5EC1 /* IQKeyboardManager.bundle */; }; - 78AC6714960C42CC866222B6D956EDF6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */; }; - 78D1AB77E0145AD1E77DC9CE0B8C4D49 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 25972EA3E10BED458FF978D175A9C263 /* SDImageCacheConfig.m */; }; - 790B528109D306DAF9105F80D932F218 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5660075EFC0AA10C221C3D12FB6522F3 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7942D242D079A5710A72B659A54D7E26 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = D58D416D0D907E75F8F25DBC31A8F2A0 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7AE9484F09D29428653109D73D4FC488 /* NJKWebViewProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = B8C80B2C162E2DADAE6E64B7C59BD395 /* NJKWebViewProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B7402278FE9063BB449B30F22B09DF7 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = CB4643E8EBAD5EE3D3BEF6DE78EBAA46 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7BD298BE626433E40A97797DFBF271A8 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = C5DC2D40CE636899E96F07F2E86609A7 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C17BEA6034027310D1D205DB2008CA5 /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = AAF305E6DECD78168E49221E61B947D7 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C49A18841060D12A58F92CE62C21F9D /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = E03910B7599DBB9DE52BA6B580D5420C /* IQNSArray+Sort.m */; }; - 7CF3668C8E30DA3CAB92C9C6A8B88B8F /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = BFC2CEE4A1CC40C763FF7873BA8B56D1 /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7EFDAA1642FA83DE777CFD086182D5A4 /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8705B892D0FB23E4B3A26DDB33CBC371 /* MJRefreshAutoGifFooter.m */; }; - 7F66E5779B29E0BC17D565DAD7CDEC1B /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = DCF6F5650FAA9B82ED6F665EAB1DE040 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7FBCD08C954F8BE3AF648806C1ACFF0B /* UITableView+FDTemplateLayoutCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F1558AF059B62809206FC3CD1039CBA /* UITableView+FDTemplateLayoutCell.m */; }; - 7FFE6B83CA9E5A9A1D23F9F7FC320E65 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = A683976152674929538EEEC6EFF05A4B /* SDAnimatedImageRep.m */; }; - 8060025235D93F30A5F10B412DD0822E /* JSONModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 60A50FB199FB6B0C5EA49A62A4C863D8 /* JSONModel-dummy.m */; }; - 8069223DDD6D0F2E1A87D8E66966709B /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CA67BCA7DA83AFB686019666B15E346 /* MJRefreshConst.m */; }; - 80C7997C4D60D2103A63AAE65EA63C8B /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 75491F997888B75AAB2C0AB027F83D5C /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81ABD96C8FA6FF28CFB2A3A78A6EA560 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5925EC6C2B2151154E2F24CC70D04AEC /* SystemConfiguration.framework */; }; - 82C00DBA894D53CDD0AD35BE2BBFEC0B /* SocketIOClientSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79898C8FB8D364D3B8B09502372E9F0B /* SocketIOClientSpec.swift */; }; - 82E73BD4532D89B27F8F209781C134AE /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = EC02366395598C42E28F51101028C3D3 /* SDWebImageImageIOCoder.m */; }; - 83EB76688541963CC6A7837966631AFD /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D1C4ECF2FBF4E01A9207EE8FD4F3FF66 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 85F02B2E2F922F439A12C7CBB077E8DE /* IQKeyboardManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BDBB82B0577F0513EA40C059469FCAD4 /* IQKeyboardManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 86EA527BA1862E06A8E19E0960C66E7E /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 059F55EFCCF65A29688CF615E5AD5415 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 877908A157CA3CC4687710B1F8C43117 /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BC61B5225D9CEE976A35A242843BF85 /* Starscream-dummy.m */; }; - 87C7C6E2F687289E7EFB48EA630B3EB9 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 4895A24A9EA8533671D64541ECA375BD /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 87ECA447DB887426665260651B7F147E /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FD77768BDABBF2BB48928067588B12C /* FMResultSet.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 88DE7BAB1F4999A5F4B617F44E5FD1D3 /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 237BE841F4D7796F3834F60938E612E9 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 89637BFFD180A1E05F04DAF0CF4A6540 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8B941495F77E08AA9AD977942455F90 /* MobileCoreServices.framework */; }; - 89BC1F89CAF0D75A3C9024861100E79C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 8A1EB96C607F92E8AA20676F9A4BC7D9 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 9524B522E6F3A1198F46B4ED841E5662 /* UIButton+AFNetworking.m */; }; - 8A318F056072D4715B58CBDC1A6ACB4C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - 8A6EEF68E7625AB66A3A8DED1594F88F /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 36EBA45514DE97C348F33C685F5897DD /* ViewController+MASAdditions.m */; }; - 8B855A73B75155FB2C0CB05B54FDDE0D /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = D1AF018F0E0542900564BFAF307755AD /* UIScrollView+MJRefresh.m */; }; - 8C9165B82240F78C43F7E7ACFD17612B /* NJKWebViewProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D0587B9F9A54258E4EC092F7FCE94EC /* NJKWebViewProgressView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 8CD45B754192DE834B642975E85257AB /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C89BF4798AB4ED10E9969C07146751 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8D9636C74777C684BDF312EE66F8A585 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FBF2BC661F74DEDD633BF2098800BCB7 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8DC3FC2342EC2E944B3A3E83E2683130 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 5145E6BB9DFB46461BE07ADA20047F2E /* MJRefreshHeader.m */; }; - 8DEFF8A97422F8839254684CE8C88F4E /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B900B84AB25BE438B82CB50415C5ADE5 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8DFCB3EDAF8FA11CB49B473AE187B5F3 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A12862A28052673208D864DF5F8671 /* SocketEngine.swift */; }; - 91F8ACC960F47860C2BFD36E1AB3DC2D /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1512D35F866701255C740BB8D89CB037 /* SDWebImage-dummy.m */; }; - 939EF882233B22D0321A70F6DADED11F /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 531C313E293B098E8DD0AE16F9F05E50 /* AFHTTPSessionManager.m */; }; - 958FEEE31215AB970371D4CBAEB8A4DC /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C52D5FBF7AC49549CACAB8E226E06A55 /* IQTitleBarButtonItem.m */; }; - 95E0F7FDECABE72E262C058CB72C7DFB /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DB5CDE6B616CD12A18C278C6799A0094 /* Toast-dummy.m */; }; - 96E70B43FC04BC99AED1BBD4FB1D7581 /* FMDB-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ACEC95F7E6261C5C5E02E54CAFEA523 /* FMDB-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9701C0D167F477E53632D1A8FBDF6556 /* Socket.IO-Client-Swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CA5AAF13D2E09670AF9CBA0B18BF39F /* Socket.IO-Client-Swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 97A034AF6314B2F2799F157CB5701E9E /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 027B44E48FB40AD9D0DC25B70D6AE8CE /* SocketAnyEvent.swift */; }; - 97D9744D1FA62E10C2F3180A4B0128E5 /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = 6594B566BAF22CF7F3BF954283907D88 /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 980E0C1816124A0343E2EA2CF7F30EE5 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = D1192940DD792A9A986CB6606BFB24E8 /* NSButton+WebCache.m */; }; - 9898B13B5771AC304E096319E72F8098 /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = B6841A5F308297E91E99E7B83292909E /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 98F19C682AC68E9D2E2052F709F42AF9 /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = E88C81586D204E9EC5AB0CBFE3620057 /* JSONModel+networking.m */; }; - 99249B44D65716B5CCA0BFFD5F83062C /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CDD19D40A0561AC2EEC7572402D3D1F /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9939FB017D464F93944D8624AD4EB0D1 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C5AB81B04A2D01A1380ED02CA7F95DE4 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9AC1064802A4D107353A87F2B4A963B0 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F8A4A704B12B0E5FCD4942063E450299 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9ADBC57B36C223E3C5BE5DFCD8197971 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B66D98C970953F228BE3D0F043AA6859 /* UIImageView+WebCache.m */; }; - 9B8D84996694C541CD3434386E0A081A /* FMDatabasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = FC329F809B6649CDA966EB263EF68FB2 /* FMDatabasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C11A290C9C5866A185A54F1EC04E2BB /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 531AF42C28A0891D1E91B6BEA86844D7 /* FMDatabaseAdditions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9C54C073493FCFF4AE07427E9CC72DB2 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E8BF8E1889AB501DDF9C32A0B690F8 /* UIImageView+HighlightedWebCache.m */; }; - A0303675DA1D1590CCCBDAA2B5A7F560 /* Socket.IO-Client-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1501D5687E1AF56AAF3E46B413F8A46B /* Socket.IO-Client-Swift-dummy.m */; }; - A08A8AB356264E248D01F1BC0EF08166 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C0FD05EAF05C6EE6CD501AA135B3FC66 /* Masonry-dummy.m */; }; - A0FB2FBEADC2C2FA597C80290DF6B809 /* SocketManagerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F43E521A7D9B6E90D0A9E791D4C725D /* SocketManagerSpec.swift */; }; - A12A3BC640B690479F345A49C6C48209 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 042DC3BCC2842104D6A45CA51DC3F42C /* AFNetworkReachabilityManager.m */; }; - A1B5D80A8998311B8C9043E6942925E6 /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C79216DF49554E23B9DFC5FAABDB967 /* FMDatabaseQueue.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - A1BB32FF4BE29C004A13F2E03127E8F1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */; }; - A1DF5B0FADB9E502553372C3347042A2 /* SocketIOClientConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 768A5DE5D08824954B4B101A2FB6B2BD /* SocketIOClientConfiguration.swift */; }; - A2D9F9EFFDFE9C19DA842E826B06BCEB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - A3CE2D718CEB5AC059823178404AF0EF /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DCB0BEBBAC1E47DDBB977778143CC25 /* IQKeyboardManager-dummy.m */; }; - A5382D3EA98D2EB1AD9EDA5F2138F00D /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8B56BE8B95141AA7FFDB381009541CA /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A548833BE5FAD40830428F36E77D0F52 /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F75D6F9A7E4B4F68F38B9CF845506873 /* FMDatabaseAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A5B069CA1170E03891AC5648DE5CF87D /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 37359E3E690C6350F9602BFFDBB04147 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A5B3E46D3763A25BD3BAF0CFFDEAA24D /* UITableView+FDTemplateLayoutCell-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B72958B223F8DBC6D1DEBDF0873BBBD4 /* UITableView+FDTemplateLayoutCell-dummy.m */; }; - A6CED0722D83F40F3462956E04841AC8 /* TTTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = D18BF93986D1392783B2FEBA0B4EEBE5 /* TTTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A72D242BEF61E27D6C29092DF4666A4A /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = BCDDB5FF379578ABC9203ED41F2C6152 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A7370CE9231F9A4927142D79021879EC /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D11F0C588A7F5B9D6536F3DFDEFD786 /* MASViewAttribute.m */; }; - A77943B15F7CF5151B637808B40DD722 /* LKDBUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A60255EA01616D51B066606B28E168C /* LKDBUtils.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - A78A1ABBC5D657764E754959BF9BD290 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BEA9D04E7D8139122C3891161371C04F /* SDImageCache.m */; }; - A9545DE6CA040EF32EC94145E3D1F49A /* YTKKeyValueStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 266860A64CA3E38126FD443422246252 /* YTKKeyValueStore.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - AA00DCC0C8174B2D7E48EEC3C768B047 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B2D873DD726E1CB92080AB5A4C458F /* MBProgressHUD.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - AA4959949A290D4B8BE1E31A890D0C80 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = BC38A229ADD93FA75F0CDC8D9BE4FC6A /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AAC6DB8270C474C50F5D71DE9BC73382 /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = D15A13B4D2D795A0C6BFDD4C3D657FCF /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC5F946DEC898FE1FE7BA74426FE6A8D /* LKDBHelper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 61FE2DC3E37626E602B4123EBB968B51 /* LKDBHelper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD868043328B2125E27A5DC14D11958F /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BB3C77E5D6641E78ECDFF85F30BD25A /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADD011E9ABBD96D70AAA32A4B9ACBD02 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A9341A0F668333A93B6FBD08098250C4 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B02D91E02099D3C6A2F988C766032176 /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 81061EAAEC3F61A38F09275305E22D6A /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B05BDA89A18DA866355AD804B694F851 /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 243FE71724C73A1404F864718F47B574 /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B086C8017A694E281B3F30DCCE8FA588 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = FEAAD1709AA2F9B0C1E7F611FA261B98 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B1BDB5153E77DA6754E2364A3BB4D20A /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = C7D7CD906FAB43D44FF0E620B8F6644C /* SDWebImageFrame.m */; }; - B1F714AD50E405F4DD3C865A7D823EAB /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CADC5017C63268D068AD5B7FB33E0BFC /* UIView+WebCache.m */; }; - B21C3C93DAA23B1C331B9326991CDCFC /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = BEDD0B27A048E132CE68F433D20A9480 /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B4137607C73DB4C84CA0EF8163BDD6F0 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2431F4B5AE230C938093F4ACC541DF9C /* WebSocket.swift */; }; - B44383A3FA435C1E986942C817339302 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1942BB9A9B0208E8A598BB2F1563A2D0 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B46FE8C00C2CDDE0B4790FFD3DC961A4 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = C73F80367886F94832EE106D9F164391 /* AFImageDownloader.m */; }; - B646C96E2D7DF54445B3719F800D79E9 /* MBProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FE34AE9B11E8E9CE707D60148CFB286 /* MBProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B7D82E1749DAE5FF0A400678011DECD6 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78F07669D4FDF923215E34924891CA68 /* CoreText.framework */; }; - BA0711638621C2A47AABFF9E03546893 /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = C9CDC1F6DD226D0362ABF5BAC2D55A32 /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BACE840E379E35D62AE29B87B8337CDB /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 26168530D466303D1859051CADEAF5EB /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BAF4176A24E04B8CBE0FA434C1BF810B /* SocketRocket.h in Headers */ = {isa = PBXBuildFile; fileRef = E08E7458F1940F20C0E1BBF7FDD0FDE7 /* SocketRocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC67B107B611B06ABD214407B69B62F /* YTKKeyValueStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E018CB10D71F6E7076E334BE4031987 /* YTKKeyValueStore-dummy.m */; }; - BDB33C3708110C6D755175D1F0A2A70B /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = DDC8D5C54CB2FA432E51D33F63299867 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C0A16E00B4BC2D88A7833D5DAED62942 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CFFA0AAC1274F48CF9BBAF77F583DE9 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C12BAA822391D670C53FF0C2299654AD /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F8965BFE9CC1CE8B5CFC2B14D7E2DA8 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C257BE809D4C4357A8EB7118960E3143 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C55D9F05AB29EF41FFA46E6095CFF72 /* UIActivityIndicatorView+AFNetworking.m */; }; - C25A6DEF8B9F5859BF6E8FACD53F88BB /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 85FA16278B2D2A724F98F1B98A871074 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C2B7F4EB405C401EA53023341C05E15E /* IQPreviousNextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 17CD040301E2941CF1307C11668F0335 /* IQPreviousNextView.m */; }; - C2D7BA9B1354C36D28390C1502A35D91 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF2567DE02E414DB1FBB3C77E2FD44B1 /* CFNetwork.framework */; }; - C480AC5D32406D4901116FCAC5FB0EB5 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE54AA9DF51DD23D24F6D99DBE4D170 /* IQUIViewController+Additions.m */; }; - C49ED0BA3BE26C50F202C5ED5FB85573 /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = BBDC6D1622DB585841784A5DED1346FA /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C4A53AB41B17060209A7059F727FCB9F /* SocketRawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F30327CFECF1D69BC51289B5CCC97712 /* SocketRawView.swift */; }; - C4AA57B938513DE614A7B90AEF5CD858 /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 6388F569E994C890615BAAE8A1012286 /* IQUIView+IQKeyboardToolbar.m */; }; - C5BDD2876FB1BBF95F1EC56250280365 /* SocketIOClientOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90609B4B8F17E6BD520EC73A397904D4 /* SocketIOClientOption.swift */; }; - C605A44DF96E7FCACF7D6E37B62F795D /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 00CC387D226EFBC6389FAA62F3DD873A /* FMDatabasePool.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - C8DF22EAFFC2F81B0426E2165AC93E44 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = ADD95A322AD6CC6DFF9662EE73FD3866 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA0D37AE5433954573D3E37771CDDBFA /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = A21BBBF163BCA4C3910C8490302E3372 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA1E205A4D3A8515ED42F76C2671F1BA /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = B4AA799A01CF6F84D07EBC2151183FE8 /* IQToolbar.m */; }; - CAE88A60F8C6CD6AE662BAFA5ED3B373 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 12BE137618AD905F6C08A0688A5AEC0F /* SDWebImageDownloader.m */; }; - CB52B7EF0160C5FC511C13D7E6D2A8B7 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = AE85EEFEF754EE2C913DA2E906A10FD0 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CC8F9B4A1AC4E276EA8AA4C6F2BF3CD4 /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = B88609AD20FB25EC23E9CB38EFA4261C /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCB74062CE0F4B8E5B7483599BC398DA /* FMDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E5007EEC9570DEC0914742C5AA50210 /* FMDB.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CF4EB3350726A86BCCDF5F363C5FCE72 /* IQPreviousNextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7916596619DEA640BF07E493F03AE462 /* IQPreviousNextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CF957309306A61F1A68EC08E1152AB3E /* SocketManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6DAF6AA9DC71209F96E9D4506478663 /* SocketManager.swift */; }; - D02DEBC241C24DEEFDA13C355197A2FB /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = F665835060F250C5E831A32121C45B5F /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D0E2C9455FAC089FF047113E8B217CC8 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 91A39121A9FBC45737A0102A4364012D /* SDWebImageCoderHelper.m */; }; - D0E7D5B865722A25EC7D91B0FAD8A6CD /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 45879D3B33AD86D331ACA84B5995B4D1 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D1641F0A353E02D971A2E6C004D4D996 /* LKDB+Mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = 670CF36062CD3ECFF8C5C5AABE213403 /* LKDB+Mapping.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D206EDC84CE44D5DC711ADD087BC4B17 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = AFEF7822284D0740E9439FDA575D9C21 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D29CF1B9A1D71268C1F85EA53B32BA24 /* LKDB+Mapping.m in Sources */ = {isa = PBXBuildFile; fileRef = E20BA2B707DD3CA5BBBF617A38FCB880 /* LKDB+Mapping.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - D46545D206874E3A223372C84F1EA73E /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = E43C0234304F095C027CA559CA4E9F0B /* MJRefreshAutoFooter.m */; }; - D4E9B3DE75C23D365E255B6212CB1CB7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - D5153467E7A41556D6ECF2FF3627EF13 /* SRWebSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = CA697CD49B3E51073391142FA485D827 /* SRWebSocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D55F4366DC3D822A511513DF4E5D6AF5 /* SocketEngineWebsocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB6CB6F47D077D87B2488C5A7D01EE4 /* SocketEngineWebsocket.swift */; }; - D5991941DC41DDDDDACAE0B5D47A4639 /* FMDB-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5D2DFF79A26EDAE2E4229FA02DE3ED /* FMDB-dummy.m */; }; - D66E78D63935A98894E702D922AA8B91 /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 874A487F8BFAD83D1F053B4DCD8201A1 /* MJRefreshBackGifFooter.m */; }; - D820DE54D6E9E5C85E0F9BF8A399E5EF /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D16FD952562C34388EC43F2A7733B27 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D8B1525CB3DFCBD8E5032680530413D9 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 21D29A4125F838745482898EE34D680D /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D9F2BA4D713DAC2A85CB4A453240EA3E /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 91DA5B2E5AE56CB9005ECE4644FA3356 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB55C38E306ED2B647AA6E49486483B7 /* NSObject+LKDBHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = BE39E881910D30BFF4517A4177625677 /* NSObject+LKDBHelper.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - DDEA8BEE980D9DD7E9E746DFEAB726E4 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 72575B068A276F2F8A0CF243743B3E74 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DE17E4C2C6EADE5D2D531268B1695405 /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 316C099F7EBA73314DFCC094D555F83B /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DEB92E2DB086E554AEA1DBFA8A9F00D0 /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = CDA517AA74DD3581625EABAFCF57A1F3 /* IQUIView+Hierarchy.m */; }; - DFA0B0C7EC02135911CACDAFD38BE715 /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FF4D47DF573B44C28B3DF814C3E50CB /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E023B49FEB84BA9DC22FBB8CC7B348FD /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CCD140D091E406CA53B6F3992BBDB579 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E05E5C1BD849F31A27B68D75DEF07E30 /* UITableView+FDKeyedHeightCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ECFAC79A556CD170296E2CF2FDE40919 /* UITableView+FDKeyedHeightCache.m */; }; - E26423151F8032E63A36100AABB61D43 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 9265EF5245C8B9E17305393357C5D93F /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E39D9A942BCE728467A42C478816966F /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F6F9763802AC8D472A1FFBF6A867B33D /* JSONModel.m */; }; - E3BB92FE44D2DFF2132BC27C70298513 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3693DA67EFBAB281959594641A587872 /* UIKit.framework */; }; - E3C47E114E924D2F331F9A3F122AEE5C /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = 66D6A876FB337C3A5AEC09F74362A022 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E4AC26FB387427964538FA5FCEA4A8A3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */; }; - E57312010AFB591EE37870F65E651EA6 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 048638E84A58D781817B05B69F5DB76D /* MJRefreshNormalHeader.m */; }; - E5CD5C797956697DDCC98A3EAC7E99E3 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 805D42FFE0EC9DD228E5EB6C75F8E9AA /* AFURLRequestSerialization.m */; }; - E630FECF3706C1EC8EE717263D1B2FF5 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B118355C6E3369C778E749125C4F8AA /* SDWebImageCoder.m */; }; - E72EDE323AC9F92EC8A00A93AC186093 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 463DAC3C5F6EF0A1CB5D363A99DD84AC /* NSArray+MASAdditions.m */; }; - E802560B425A04296159872675948D29 /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CF40AB4FCB400AB1D8CC624FF95B74E4 /* IQKeyboardReturnKeyHandler.m */; }; - E80DB5D9B2D35085282DF057BB540AFE /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 25A4B40FC26E491D355F864AEA121E73 /* MJRefreshBackFooter.m */; }; - E82DEF0A70F9ABCC6EAA900B9BA3AB16 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B946CD9D828545C56B16DD0BAE1A4357 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA0E9DCCA7F7A4B3B582E34AC137C2A3 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852AB63551AC52D340F98C97A94D9FD6 /* SocketTypes.swift */; }; - EA23726556D213DB485BD1791C7164CF /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6E813A4FEA7EAA36447924B0005A89 /* AFNetworkActivityIndicatorManager.m */; }; - EB0A377753BF36E5018176EF7A4AF774 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5D3928FE1E7CA0D8E3A946574DC2F0 /* UIImage+GIF.m */; }; - EBEB72F80DCD10DEB82BF5F856D467FD /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C2F72B6BC0D51790962077A8C13EC05 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ECBA1F4D70AF4600563FD39112D5997B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - ED5DD9E7F5A2A78F8A992072C079515F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70BC8DC64FAC8894D27E1964CC8CD209 /* QuartzCore.framework */; }; - EDE0C584CA148C197740CCB795E2120A /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 07CCB23292D6E83E10E681E65611A521 /* SDWebImageCodersManager.m */; }; - EEDE8B3B8AF5A20C039DB6F1DD25BCC6 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E18D0C002A9B8B1BFB6F6FD63278467 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EF09BB047F4238F812F93E5FA7F31E0E /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = B391B9DE52D6245F6A0358F52F1E44B0 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F03896D18D58C5B06D4485978A8E2660 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */; }; - F1199E40BF416FC1ACA2DDCD7B2E23A1 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = DBF35F229F62DAFB1E3D7FA0942B6D8A /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F11FAB91014130EE233A3429439D38D7 /* FMDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = C53B6F23513590B1B35519E049C3AD72 /* FMDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F1560689B79F19D606B9EA5205BA7C80 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 897350FBCDF747BE59B857BB5740214A /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F26CD9A1DF452688BF3C98BBA9090F92 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 88FA75A73C1252600B984CF5DE17B8CE /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F2DBE008FD27BC11699DB76F11074A94 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4105F4E767CE55C31AE0E2A6D969A996 /* NSData+ImageContentType.m */; }; - F2EFDC17C03449A9A15E26464453103F /* NJKWebViewProgress.h in Headers */ = {isa = PBXBuildFile; fileRef = BB6C3ABE582E083225418DE0C8C70C57 /* NJKWebViewProgress.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F30950E63F3D8D6C07FFB50C5971116E /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = B01D2A082D8362F5E95027DBAE3D1DFD /* AFSecurityPolicy.m */; }; - F35840AED8A0E374320B77F3E86D1FA3 /* TTTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 98D89B37F7C92F976B671CF4941E8120 /* TTTAttributedLabel.m */; }; - F4A57F7C1F8184A6DDEABB07FA6D7083 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 49FC9B7F0D1967826227DEFA8D9EA924 /* NSBundle+MJRefresh.m */; }; - F4B3E44D5D2F6508BC1BB35A9FBDEC70 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6734BB50A15C4D259D3C14C0F70697 /* View+MASAdditions.m */; }; - F4FF072DD1C28A7736B8D1DDC839E424 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */; }; - F54879EEAE223E90AC9674197E6B1ADE /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8574AA1B5AD318AF02BC4D3B68F81E58 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F68EA720B0ED1BF96CEBF07977A1C0A2 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = FC45B739819A1904D554E79520E207DA /* MJRefreshComponent.m */; }; - F82FA69799081C549A687B2B72DB7ECA /* SocketIOStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3859DA0DF93E825130ADB78D0E66166E /* SocketIOStatus.swift */; }; - FA1282B06560C854E5FD9022B8429FFC /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = AF292596176CE1B357AB1A3CC5FC2AA6 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FB9C6242B11049E2F1062D04565E568D /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 214889649505797427D153AFE63862E7 /* UIScrollView+MJExtension.m */; }; - FBE6911E3E07AED7313FC851407687B7 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = BB8ED24222958BA93B420822394B77BC /* UIImage+ForceDecode.m */; }; - FD31283E2A43955C5BA6FA9008EE8D7C /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EB649102BB6022F6927FBD8BF10E3B /* MJRefreshGifHeader.m */; }; + 0000ED9E21A47D261061DB55C53FEDB9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 00E2C1092D2255BB25E45DF004D3E7E5 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 76BFAE3C824CE992C06944187EBE0981 /* UIWebView+AFNetworking.m */; }; + 00ED59EE2784CE922358E57E241A6C75 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E08BFB38983459E0EE437ACEA12B99F /* UIRefreshControl+AFNetworking.m */; }; + 00F544FA7FC8E886BC6711FE0B7BC9C7 /* ZXPDF417ScanningDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 585D2475973CFB76EF9709D76E4C4FCA /* ZXPDF417ScanningDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 017961D5BE65850BA411A7045693EC85 /* ZXDataMatrixEncoderContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 5257B6F43FDF0FAD25094B50F2745284 /* ZXDataMatrixEncoderContext.m */; }; + 01E8819E375EB689FB54D32BF7F4216E /* LKDBUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 859D68675FCAFB6FEF5CAB1173B80AB7 /* LKDBUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0230503CF5A3A9AC3C3873A6436927D5 /* ZXAztecCode.m in Sources */ = {isa = PBXBuildFile; fileRef = D1E941227E84280F17C045C91F1902D8 /* ZXAztecCode.m */; }; + 0243A0672C963B169A395D176606158C /* ZXRSSExpandedPair.h in Headers */ = {isa = PBXBuildFile; fileRef = DBCE45BBF526C98C7E4DF52B780738A8 /* ZXRSSExpandedPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 02521F17C82FFDB7F52E26C8AFB6C37E /* ZXInvertedLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 55DAD4EC88271F955D0E855D4B6D98C9 /* ZXInvertedLuminanceSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 02B6166834FDE582A7475C4D021C532A /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A719998C7423E553C66F59766C89B816 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0341E444CB2B77435FB7A0EFAEE5B63A /* ZXRSSExpandedRow.h in Headers */ = {isa = PBXBuildFile; fileRef = 267EB7B4D76CE8237DC8442293FFDBAF /* ZXRSSExpandedRow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 03748FAD55F48FCF3557A552C0A26D43 /* ZXCharacterSetECI.m in Sources */ = {isa = PBXBuildFile; fileRef = 2741EB74A81A677BD868DAA77B5D50EB /* ZXCharacterSetECI.m */; }; + 03C04D438843E9ABA57B8AAE9B6155EA /* ZXWifiResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 938F35BAAAE72B357005D1264806218D /* ZXWifiResultParser.m */; }; + 03E6C18745D7D3CFAD4F513DE97B954B /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 248CA5F52D608A5643F90F8DE6F4CFCC /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04016CA14595571EAD0F42A11EF05500 /* ZXQRCodeFormatInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = C16ED5D5D117CB740EE9ABEC0EBA1649 /* ZXQRCodeFormatInformation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04064EC74E135332467E5477AAD9ADE3 /* ZXDefaultGridSampler.m in Sources */ = {isa = PBXBuildFile; fileRef = 59539C955D1B0C4B6DBA95D4EE649287 /* ZXDefaultGridSampler.m */; }; + 041299113984B1FB98FE8FD63DD2657E /* ZXInvertedLuminanceSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A6441842DFDFD74CCBE21A6F514D87A6 /* ZXInvertedLuminanceSource.m */; }; + 047D13E2A3E2D35B369E75467D80AB13 /* ZXPDF417CodewordDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F03B59AE965E962B20B8FED9EA332 /* ZXPDF417CodewordDecoder.m */; }; + 04D647F472CAE96F3006BDA55B7E2886 /* ZXGenericGFPoly.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AD9DFB82B3FCD2021AC782115A50DC7 /* ZXGenericGFPoly.m */; }; + 04E5A6920974A68B2D15090CBE56D58B /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A3A240F77B6B92F434EE270B9A53ECB /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 054A7E047A0FB2A2BFA3423CAD1839AF /* ZXDataMatrixWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 585C0E2F4983DDFC75F1316148676D89 /* ZXDataMatrixWriter.m */; }; + 05FC34C7266B4990FFD4B78DF5002EE6 /* ZXPDF417Dimensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 84E95B2303E0B9EF0EE27359A6AE3610 /* ZXPDF417Dimensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0616920BAE64A9CFFCBE26BC50C3C443 /* ZXExpandedProductParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 39160D87A6DA3F92790ACE6B0179BE44 /* ZXExpandedProductParsedResult.m */; }; + 06449B8E96058AB3611908712D4B0B67 /* ZXCodaBarWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E8435BF3B9A2662AF8C6A5D6A78E0A3 /* ZXCodaBarWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06A4B205A1D55D9F31DEEA499B191DD1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */; }; + 06C238A68332A7F2CCE87BF90B63B5A0 /* Socket.IO-Client-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F3856B0D263FC58D95A8AD0D1B21E7A /* Socket.IO-Client-Swift-dummy.m */; }; + 06DBC23FBC38AED250C8A140F8E1220A /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1558559131A84E06FE4C17C8B92D445F /* ImageIO.framework */; }; + 070C04B3F141B19F8475CE84919DC2B2 /* ZXMultiDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F89033611F194CBF26D09D22D99E82B /* ZXMultiDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 07145249B05A14FC7A69318690965DC1 /* ZXSMTPResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F1345578B0AB6291FD34FAE9C96C447F /* ZXSMTPResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 076FC5CA280368A340F893AD9BF3DD05 /* ZXStringUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DD648202AAD9716D02F0B9DA76983E0 /* ZXStringUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 078E5844DDDBD848CA7602B78A155B62 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 07C6E6A1C9069FD456A242D72FE32253 /* ZXErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E261442EB32143E893D1F4DA8DC0276 /* ZXErrors.m */; }; + 0815653B5DF4D512FB219BB2ECF95D2C /* ZXGenericGF.m in Sources */ = {isa = PBXBuildFile; fileRef = E206F8C05E0115971BAF625C4DCD1497 /* ZXGenericGF.m */; }; + 081D8B04B190246D6A588535911C158D /* ZXPlanarYUVLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 80050EF2B399B55821262973D6ADA43F /* ZXPlanarYUVLuminanceSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0854B98C1D8854EC56DC4C964DB86B49 /* ZXDataMatrixTextEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C89E9657E31B58DFE00B9084357756 /* ZXDataMatrixTextEncoder.m */; }; + 086F8F6A904E4D27500CC752AEC9E6BB /* NJKWebViewProgress.h in Headers */ = {isa = PBXBuildFile; fileRef = FDA40E9D2C5D8A0AC4B7B4A19B57FFFE /* NJKWebViewProgress.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 08FD02B7B63343BF27F3A89116996919 /* ZXPDF417DecodedBitStreamParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D61044B83DA2AB51D961F44DCA34B249 /* ZXPDF417DecodedBitStreamParser.m */; }; + 090E3CAF933E0D6BEE6AD4675C1EDE0D /* ZXEAN13Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = DADCEC05EB68EACF4CA2B4C02F0B83A7 /* ZXEAN13Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A6918600CF1ED55AD77072040F53728 /* Toast-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF9A9450B76B010E6A27E2BE82AC6C98 /* Toast-dummy.m */; }; + 0B447317E02FA0A300B5FA7D81F8AC7F /* ZXDetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 19513CB18A035454268A40D605F1B344 /* ZXDetectorResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C0A394B863D13A21C892D7AC4D91D90 /* ZXQRCodeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 22363DC3CC92A8B0401ECA9A3EF8646D /* ZXQRCodeWriter.m */; }; + 0C887DEB9FB6D358004DD0386F4336FC /* ZXPDF417HighLevelEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F775623B11BC2D3021B45C56AD9ACF40 /* ZXPDF417HighLevelEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0CA0F45A6039A156BC557AAD6B2196B5 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1558559131A84E06FE4C17C8B92D445F /* ImageIO.framework */; }; + 0CB26840B2CD2CDB40F8A29A935233E3 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F2C5FF007199CEA3518E6FC9F9700871 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0CC7607C2E4903CE9132B17D88F9EB46 /* ZXPDF417Detector.m in Sources */ = {isa = PBXBuildFile; fileRef = EF7D6FC6B1E1FC691E78D4A92852456B /* ZXPDF417Detector.m */; }; + 0CEB64C65D99E37CF202E65A9961CE20 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = CC6B8A807016524FCBAF17017565E609 /* UIImage+ForceDecode.m */; }; + 0D17159F0F0CF816F62BF8B9913AC5C8 /* ZXQRCodeFinderPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAD218FF47B03FF3AE043A3436E3A0D /* ZXQRCodeFinderPattern.m */; }; + 0D58399A6DC61099900309A4449F7891 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DF91059153F21AF14EB312A6DB0B5502 /* AFURLSessionManager.m */; }; + 0D757E743295B66A7F4163954C393E53 /* ZXRSSFinderPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = F95D3775B12B0FBC4F76366A8A7FA228 /* ZXRSSFinderPattern.m */; }; + 0DD9F8E78451E31753B11952BE1CA5D7 /* ZXAI01weightDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 46AABDEF7F2837A3945CD5B72A801054 /* ZXAI01weightDecoder.m */; }; + 0E06FF0FD4ECE1F83324C6FB26D5D489 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */; }; + 0E153F9B4DAEC9C1BD0998D2EA22DCD7 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D675EB88B5FE30187A06B355F0F3CCA9 /* SDWebImageCoderHelper.m */; }; + 0E1E4648395AA2EE20A6BD675FFF730F /* ZXCaptureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 88F7368BA1F4E884C86CF19DE4116E2F /* ZXCaptureDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E2EF782F412B9E4B62EC9D58313964E /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3FE4CD8A5E9DAC8CA4CA059E57139E /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E4B8913A6194C1F91B73A74CAED0DCB /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = AA90CAD09890A93DE22DF96193FDE32F /* IQBarButtonItem.m */; }; + 0F99D58A41F6E2CFB2BC108CEC770370 /* ZXImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D0E27E66642E304BD21EA1420F9B99E6 /* ZXImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1046B7E99E763A9478CEDEB621A21C5F /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = C515A55A679E5749725EDE2DD579D895 /* View+MASAdditions.m */; }; + 10884584B45C6564993981E004AE6B5B /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 93574EE2DA0422951D812872E110654B /* MJRefresh.bundle */; }; + 108E59FD1C171794D94F1323B27AFFB8 /* ZXMultiFormatWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 67A7AFF07ADA3724E72965FB2447564F /* ZXMultiFormatWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10D5DDC653E3129429EAA5F479578CF7 /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = CB0C6FA3F55EFFAB1555D06598C28905 /* IQUIView+Hierarchy.m */; }; + 10E71691920126D27B9A72D474B3828B /* ZXByteArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B683D5CDF5103810E86EA34F3FA3CCF /* ZXByteArray.m */; }; + 113694C8DC13FAD5A6A813F2B7ECF39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 1180E7653EF29270DABF9A1CE1F7DBE6 /* ZXPDF417ErrorCorrection.m in Sources */ = {isa = PBXBuildFile; fileRef = 830C99480857F63A2C97638E815DFDEC /* ZXPDF417ErrorCorrection.m */; }; + 11EAB2A17E2712DB04831AD0FFD6A5DB /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F53850E7219C55BE5B850DB7ACEBE09 /* AFURLResponseSerialization.m */; }; + 11FD3664C2B75E3AE30CBBF2B6500267 /* ZXBinaryBitmap.m in Sources */ = {isa = PBXBuildFile; fileRef = F78255E6DB06E4BE7660C8930DDB926E /* ZXBinaryBitmap.m */; }; + 1201B1B59F2CBAE4BFF1C769A089F04B /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 81D496F5BF77C54A94097921D27092F2 /* IQToolbar.m */; }; + 12245E86084A5B5356DF2077B1A32177 /* ZXPDF417BarcodeValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 62DD8E2B52965C368A06486D477FFF6E /* ZXPDF417BarcodeValue.m */; }; + 122BACE2B0EF8313BFF1E9058E5789C3 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */; }; + 123BFB4D6A5A03B0BEA5FB60E35BCE57 /* UITableView+FDTemplateLayoutCell-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF5D7B201521512A5C700D172DAF2F90 /* UITableView+FDTemplateLayoutCell-dummy.m */; }; + 1245F5367CBC0C659D1FBBEEFCE0E744 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0920463F74491C55DB9068AF51DB39D6 /* SocketEngineClient.swift */; }; + 12545191DFB2851D52C1ED1D93ECAF61 /* ZXQRCodeFinderPatternInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3828DF5CA0C47E8EC97CBF0165796BC3 /* ZXQRCodeFinderPatternInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 126E1C4B8C5A1CCBB0F162D88BA52607 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = DB96CE5C22BC0BD8718511158396C0FD /* UIImageView+HighlightedWebCache.m */; }; + 127030075369F500A10B6A8332BBEBA8 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = CE49748C28D4E26DCFCE420E89FBEA6C /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12AE2CA2A317A12D59FF508A82F26E54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 12BAC1DCF612652DDA3E854EEA852CF4 /* ZXPDF417DecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 76BD40DACA9171E75DAA6331D1651450 /* ZXPDF417DecodedBitStreamParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1329A5B1B0DC10041BA6F354B73C72F7 /* ZXDataMatrixDefaultPlacement.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B5CAB74EE4D77FFD3EEBCC4A7A0C751 /* ZXDataMatrixDefaultPlacement.m */; }; + 1357320DB65F37DAABB9F0AD9333B597 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 11A7142162FC9EA47BFB9A6DED72DBC6 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1364E587347DB7B32700946C39D69836 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 34E0E96AC3D6E0C135C1474B9E99E0E9 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 137A6E8841A2429C00CBFA701695197E /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 952FF743AF577C64405F324852A0C255 /* AFNetworkReachabilityManager.m */; }; + 137DE5BDCF20530B665451EC6115F568 /* ZXPDF417Dimensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 239C0E4F7521D8E95EF613AF8E41F557 /* ZXPDF417Dimensions.m */; }; + 1381C87BCE649C17E9B889E0399CA179 /* ZXQRCodeMatrixUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E1B789C3043FB090F33F1470E090C56 /* ZXQRCodeMatrixUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13E157842AB42B54F062359AAC2299C7 /* ZXEAN8Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = BDCA3A45E76A903D16393ABF6E696FAD /* ZXEAN8Writer.m */; }; + 145C8B45494D95CD3006FE30992FA4AC /* ZXQRCodeMaskUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BB6CE9214EA8AB66876C167AF588993 /* ZXQRCodeMaskUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1490DD191D19F936E6B1739559C99E1A /* ZXRSSExpandedGeneralAppIdDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E6510BF5D0D6830D5650409EFC7CDC6 /* ZXRSSExpandedGeneralAppIdDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14BC9EC2ED9FDCC51C077E22C1516E36 /* ZXRSSDataCharacter.m in Sources */ = {isa = PBXBuildFile; fileRef = D0DF26BF8D55C7A59F970C7D2E8ED96E /* ZXRSSDataCharacter.m */; }; + 1500362D354156D0722F68DECAB6E430 /* ZXMultiDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E32C1C5A27F32CC54003033BD4B494F /* ZXMultiDetector.m */; }; + 15304B6383EF69EC4E3DE45F8613BE2E /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E4C804748510DA87291035398A53AE /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15A8696D77C1C328CA1F9B3C1E8A8EE9 /* ZXResultPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 1013005211D3D77D44C1591B8966AB36 /* ZXResultPoint.m */; }; + 15B428705051597975139C2DB212F373 /* FMDB-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AE87B8DDB9DF073032D770CD8C0C0C05 /* FMDB-dummy.m */; }; + 15B7F5229A6BAD5ABAD72C952933FC96 /* Toast-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E1CA2E6972145743991FD3D343DF043 /* Toast-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15F1AB626337FECD0B9CFAAD90FAC342 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B8939096BA2BF2487B8738E6BD3072F2 /* AFNetworkActivityIndicatorManager.m */; }; + 16145634E76498599E08EE59BF2BA9D9 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ADF48BE5CBD694F1213EC6A289C9B8A /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1619ED2FD1C355EA0130B3E05D61964B /* ZXIntArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 03C3828079E1442E9180739A8AF872BA /* ZXIntArray.m */; }; + 164AC4F173828D009D726CC958BEC2D0 /* ZXEAN8Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = FB88C933AF10C1078AB540B9322F75D4 /* ZXEAN8Reader.m */; }; + 171711D1CDAE0951DCFDC5F367F840E1 /* ZXDataMatrixReader.h in Headers */ = {isa = PBXBuildFile; fileRef = D8ACFFB0709CAFC05D87FD648213E14C /* ZXDataMatrixReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 185A228F0F839BF661F803C4977BBFCC /* ZXQRCodeMatrixUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D9764AC9909FEFB91D9CF3F0248FE0 /* ZXQRCodeMatrixUtil.m */; }; + 18E044F64226DAE40D9865B638AB9DD0 /* ZXDataMatrixC40Encoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D1419B2A9BA099EEA7911AD5EEF5E4A /* ZXDataMatrixC40Encoder.m */; }; + 194BFF38420B84FEC90E78230049F8E3 /* UITableView+FDIndexPathHeightCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E62451403F39E86819BF52DB1585E9AB /* UITableView+FDIndexPathHeightCache.m */; }; + 1951AB8CB4412CE82DD03CCFCA47CBFD /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 645111D5F231357418BF0742750B400D /* SocketTypes.swift */; }; + 198F0E09657C9C552FE73EB1F1CFA59C /* ZXAI01AndOtherAIs.h in Headers */ = {isa = PBXBuildFile; fileRef = E01907B534984C539F96A49D86CBAE44 /* ZXAI01AndOtherAIs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 19A2D61A783C422B8828408F98E56290 /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E084C32F07AC27EBC5EC845F4957F4C /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 19BDAF08A2C2ECB1CEF7CE715AAE4B1A /* ZXEAN8Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 22AF2499E0B20FD9E6F109DAE83D3498 /* ZXEAN8Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A780116BE09EB8EB8DB5392E7F60ED8 /* JSONModelError.h in Headers */ = {isa = PBXBuildFile; fileRef = 510966428F5451128EE1BC1086B01BE4 /* JSONModelError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B53685E7C9C896EEB4C0763A9C317EF /* FMDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B905722B94AA07A2E7FC79FCB31FA93 /* FMDB.framework */; }; + 1B8CB6ED0FE724C49D662E604382F2B3 /* SocketRocket-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 412B164C0833345984D6418941529C7B /* SocketRocket-dummy.m */; }; + 1C3714DCA485820AF4E14D734DFFF142 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 1C43E4F256605E746DBD9404E22BBBE6 /* ZXAI01393xDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 029DEC3AB19B4BAD32ECBD82D8BAA683 /* ZXAI01393xDecoder.m */; }; + 1E0D2D2C8E89E32D7EB761D831C2A922 /* NJKWebViewProgress.m in Sources */ = {isa = PBXBuildFile; fileRef = 46BC11C5462F8D9083C26EEEEE116177 /* NJKWebViewProgress.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 1E4944B1B0A936AB1A312372241DA81D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4231EFAC746B70BBD8E9CC4D407DF9C1 /* NSData+ImageContentType.m */; }; + 1EAD85048E5A419DD0073DFBD45484F5 /* ZXRSSDataCharacter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0821005DFFA124EFE1E769C35CFDE5AC /* ZXRSSDataCharacter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1EB34504AD478844B411493E8FA20D35 /* ZXAI01393xDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CAE96BD792062429CE1EA9DFD03E46D5 /* ZXAI01393xDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1EE475C1374AD0801F4E702631882891 /* ZXRSSExpandedCurrentParsingState.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AD416757F0438E49C4FB9BCB525AC93 /* ZXRSSExpandedCurrentParsingState.m */; }; + 205C539389D123F0D635AEEE94E23A57 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F768B46D7CF697B15415714D925BA1E8 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2088C8D0DE11BA47793E33945F4E84E0 /* ZXAbstractDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 887C347C37C798794A3400C4788F82AF /* ZXAbstractDoCoMoResultParser.m */; }; + 20B258AEB78903EA92C8201723496832 /* ZXRSSExpandedReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F5BE99075376BD247D7A8FD92EF66BB /* ZXRSSExpandedReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20B46FA558DBDA3CBA354DEB490493E2 /* ZXPDF417ResultMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 94E7CD71392F64ED3AC825DD5A940E9B /* ZXPDF417ResultMetadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20F45621B9D44965AA54D0E9EC9B675C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */; }; + 21207B9714BF03DE4145C14D777D13DE /* ZXQRCodeFinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 94CFF893F9D6E23A88F2A5A0A8C5ED5E /* ZXQRCodeFinderPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 214C23C38D39C303E219473D10E44D5B /* JSONValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 887E4A760843250FA8EF25C97F1326EE /* JSONValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21A0B879F2B7F7DC79E744DD94BE2EBB /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 58328F884F29FB2639A0AD4653DED9AB /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2208BCA0C2F2F769772F02F22CDD7F20 /* ZXITFReader.h in Headers */ = {isa = PBXBuildFile; fileRef = E8EBC4760CA99C02E53DCFEEC7E1C4BB /* ZXITFReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22E4E0F5E42F50FD9B948AB8AAEE698A /* ZXPDF417ResultMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 98CC65FA85FE2ADBCBCE814D21E7A861 /* ZXPDF417ResultMetadata.m */; }; + 230924929DCBF1E60EABEF40EF42D76A /* ZXBookmarkDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = BFE70AEDDCBF7520A3628C3BF897B4FA /* ZXBookmarkDoCoMoResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2360B94E2E9E3595867AC8A477B15720 /* ZXingWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B7F16140A1CB090B3E85EAA664A35A6 /* ZXingWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2382DCF8FC01E93F6B27E85CEACA58F3 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F20E0FDA54EF826C95714A52CE9C09 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 23A330EC869B2344D976D0EA28C956E7 /* ZXBitMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 609452D986F166C3F4D5A91270433EC7 /* ZXBitMatrix.m */; }; + 23AC0D9177E0A94FC02781BAF003F2A3 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 015B8D14A645C8CFF87D3707F0EDA333 /* SocketLogger.swift */; }; + 241A5CB8E943BA47DF202969BF0F3746 /* ZXVINResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7585E4B9773F7B664FB64AFCA7EA1879 /* ZXVINResultParser.m */; }; + 2420AC422D4BA7D37D2DF2658EB29660 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A0F634DD850EAE7CA353C2E86F349468 /* SDWebImage-dummy.m */; }; + 2461DF35C69570CD2CEEB7CA9FB4537C /* ZXPDF417Common.h in Headers */ = {isa = PBXBuildFile; fileRef = C5FA36E99E1568CD05B591F7E08AF238 /* ZXPDF417Common.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24628AD291BBFFC2FE0DC01051F6299E /* ZXOneDimensionalCodeWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 130B45A77410E0950AC225E68E32281C /* ZXOneDimensionalCodeWriter.m */; }; + 24AA095821D4A1EE5818A0374DFCD08B /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = BBD7A1690C374C0D6EB52EA1E5CD8023 /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24C0F6BA7065CEDE1F0DA91475F7B3F4 /* ZXQRCodeAlignmentPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B9F3CB00EC0BDAF08E93B058A767BB2 /* ZXQRCodeAlignmentPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 25559E4E2C354D7D2BBD2D01DCAFE38D /* ZXCalendarParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 07EA8071692902994827F0AC1023B6F4 /* ZXCalendarParsedResult.m */; }; + 266CC0324D1A0024FDE39A2DC8FDE73A /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = ED92E6B7D288035979BF42CB418A9CE2 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 27174122CB2EBE83E32C989DEB4ADA83 /* ZXDataMatrixErrorCorrection.h in Headers */ = {isa = PBXBuildFile; fileRef = A9B1920938E17DFD570D8A1D948CC7AA /* ZXDataMatrixErrorCorrection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 27317A36ACEA8029C3FECFEF468E28CF /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E7B12FDCE45D2B38F779E8EAD8C6264 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2773072CB44B9803154BCC53D116606E /* UITableView+FDTemplateLayoutCellDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D6A9FBDA969B9C0A17DD37367C7D458 /* UITableView+FDTemplateLayoutCellDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28147D66555F4B8B5822544E8B6B080C /* ZXITFWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 97F1AC93F2135443DB33797B991F6A99 /* ZXITFWriter.m */; }; + 2828820A42A647A2E121E7DD78473B38 /* ZXPDF417DetectorResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 85805DF5729E72CA51973DB8C158A2C2 /* ZXPDF417DetectorResult.m */; }; + 285F87D7309720285EE5B833E7CBE178 /* SocketRocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B2AE35E410AC8314C9D3D7EE50DF7A /* SocketRocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28744B437FCF4895E95F8DF66D380600 /* ZXPDF417BoundingBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B9FA5A8045BFC6686E0BE570A614CD3 /* ZXPDF417BoundingBox.m */; }; + 289DA201A0B240DDCDCA4BB5ECB2F49A /* ZXAztecWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3516E36108BFB3AB6CE8344EB628EA89 /* ZXAztecWriter.m */; }; + 28B04892F47BFDE49A39853C7FCCB941 /* ZXURIResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 470E63248005DCBC06296E7CAE7E4645 /* ZXURIResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28D2310906C377A77FED98D3AE53E5F8 /* ZXCode128Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A32B7A436220F9CF9C07B76572C923 /* ZXCode128Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2AB911C03449EF10F97731AFC5C7516D /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C8C3783F0610B08ADD978480B682776 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2AE5FBA24F046F9157DBC6C3B665AC48 /* ZXingObjCQRCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 91DC0E3772AFD8079EF04FD95782DDD4 /* ZXingObjCQRCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2AE9F2C800AA6D4A6EDD9DB4B93DCDCF /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 496E19E4A585F7F89396E45A0F025666 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B26DD5283DB358D724503BD0760F6D6 /* ZXUPCAReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 73C5DF901F143420CE57E21DF5A2FE19 /* ZXUPCAReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B3E666D4FE7F6552C5BAA2BAD8D9B53 /* ZXPDF417BarcodeMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = B6C6EB5F6BB25316EA356942907E1F49 /* ZXPDF417BarcodeMetadata.m */; }; + 2B4297C6F389783DF66B4F9DDFF834D0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */; }; + 2B4C83D570A94C9A8A0D98B49B94C3C9 /* ZXWhiteRectangleDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AC677CDB208825642EDD5F4BCD96A2E /* ZXWhiteRectangleDetector.m */; }; + 2BA19DBF1F1B41C3EA5906C534F5D3E9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 2BF184F06F49DE9A54CE797F4FCE1DEB /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FD9B1F2C384AB4FA9C84A84A04CC9A /* SSLSecurity.swift */; }; + 2C143370823B3FE6C25AC4FCD42224E0 /* ZXSMSParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 38913E8627AAA151B4E455E5C5CF74CD /* ZXSMSParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C7B1F9981AAF7E6DB36F33CB2D6E976 /* JSONModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FC00BBEEEC4C89225F7D537F8B753250 /* JSONModel-dummy.m */; }; + 2DC227122CFB24F03615A0FBAAFC0818 /* ZXEAN13Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CCD0789E77B7F06C5559E5AEF6DD64 /* ZXEAN13Writer.m */; }; + 2E48D7D5AEA6A07171CB8772665D015F /* ZXQRCodeWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 622F976236021DED0BC71A18F37A3BD5 /* ZXQRCodeWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E68973739E2AE713059A22F94238C60 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 86B6E753ADDF97940C05A4C653E7108F /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2EFA8D0D3C31B3A77612C955773F7D36 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = EA3A5D6DB28EFFD10320A14F013B6068 /* MJRefreshBackNormalFooter.m */; }; + 2F6382C4372F2D6B83D8ED88687D3D55 /* ZXQRCodeDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = E712068BED300231FA489F36BB41B8DC /* ZXQRCodeDetector.m */; }; + 2F90D736AF28DA96AB8544A6E8E3D986 /* ZXTextParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 267419113BC2F016BFC104D8575C4462 /* ZXTextParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3019CD18CCB214F7E5B5DE03EAE3A53C /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = ADE4E6FC54086728C0EEE918E57A0D45 /* SDWebImageFrame.m */; }; + 3043589469BB211AB39D54A0922B9D34 /* ZXWifiParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F50C576B0963F7051702D5A33347F18 /* ZXWifiParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30DAA59D2374E9665FE97EDACFCA0BAF /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 57CBC90EF9FB48F676B1D66FB765E5F7 /* UIView+WebCacheOperation.m */; }; + 30E230ACAA6AB5F8BBBEC11E535E6671 /* ZXDataMatrixASCIIEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B1DFA5044A030D67F2C45BB6A2FA642F /* ZXDataMatrixASCIIEncoder.m */; }; + 30EE20E459F1CC664E8F9DDBF372A862 /* ZXMaxiCodeBitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E0188FFF10CCB60C3F41FA0DB33273D6 /* ZXMaxiCodeBitMatrixParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 311B967477C5DC8361F304109A070C93 /* ZXRSSExpandedRow.m in Sources */ = {isa = PBXBuildFile; fileRef = E1F4391819DDD4225BDF036151223EE4 /* ZXRSSExpandedRow.m */; }; + 31616EA5E6B8076A6858FD5F524E115A /* ZXMaxiCodeDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BAD6ACDBC53A067FEF7F34A04942ECE /* ZXMaxiCodeDecoder.m */; }; + 3188B757C2D0D03E8E269A7F716DAC9C /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCDF5213447A628E04D699697D1B7D1 /* SocketIOClient.swift */; }; + 31D52A4583BB36984AEC4C6D71265746 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 178D59A68923C38B4F19249B6B7FE990 /* MJRefreshStateHeader.m */; }; + 31D80FC5690380187E4AFF7648EE5425 /* ZXDataMatrixHighLevelEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AF09E25EE30B9D50C4EB47F6F4C6AEE /* ZXDataMatrixHighLevelEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3248509225F59B637EE3DE3D804DCAAC /* ZXParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = C0889FA5DAABAA6261929DA71F89869A /* ZXParsedResult.m */; }; + 32DCC516E0C351A177097ADDCFD4E4B9 /* FMResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E9C7AC858653DE1292892B6992DB152 /* FMResultSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32E75C107C18B1E7F82D66142E346350 /* ZXUPCEANExtensionSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = EB0366894E0499283BE4B449BC7A6B2D /* ZXUPCEANExtensionSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 332D90D4E1E29F975EFC1A2C57D43F85 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = BB0BFBF29F530CAF6013580F184BD574 /* SDImageCacheConfig.m */; }; + 337BE31D38C56EA27E2A8FBD404F327C /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 22335143070F51F522F445C711096F74 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 33DCCEB071AB90BB0D6C2CBC7C888F7F /* ZXURIParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = B3EEB9294005C5750EF2911ED07DDAED /* ZXURIParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 34A98C5A04E3CCD0550105051C104293 /* ZXDataMatrixDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2E6F4B5C1F9A653817CBC14DE0A616 /* ZXDataMatrixDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 34F0205A2E04BEAAA6F8B7CBE41795EB /* JSONKeyMapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A657F0E7F01EED7AB15C3FE8BD0AAF6B /* JSONKeyMapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3527C1A5E649D245B06E5692B204F3C1 /* SocketManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF18793C84D22F32ECAD06799CFF3D17 /* SocketManager.swift */; }; + 353382B8A15BC55300955FA0C1A10F9E /* LBXZXCaptureDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DF778018EDF24417DD3F99942B884F3E /* LBXZXCaptureDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35631935DA5947708E3A1AF02645F182 /* ZXReedSolomonDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 19490D720868336935EB60BB2F381887 /* ZXReedSolomonDecoder.m */; }; + 359A08BE7D3363731FF5B862178D2C03 /* ZXRSSPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF6BA279450E3190B0CDC82B9F6A6A5 /* ZXRSSPair.m */; }; + 35CCA902DF0D8C0AB9C3A7C8AF4FD40D /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 202FCACE847D9EAB6242DF88431E0F23 /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36068B032EB99BCE0930EF12AA3B33C5 /* ZXPDF417Common.m in Sources */ = {isa = PBXBuildFile; fileRef = 8398B6B20E9939251D23CF6750A00D88 /* ZXPDF417Common.m */; }; + 36071DB4475017296E5FBFF079DF15F0 /* ZXAI013x0xDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = C612D57588F23A5866E45C4835E646C5 /* ZXAI013x0xDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3621B1D5A658B98CCDBBAAE39F617716 /* SocketParsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DE834176952B6A04A8FBAEC4BDB5370 /* SocketParsable.swift */; }; + 364FFF78A00C1470CED2A6FE750A866C /* ZXPDF417ScanningDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B58466B6D94629BA167A6C7B6756F90E /* ZXPDF417ScanningDecoder.m */; }; + 366A0A2B7CC87D039FD802C7FF82BEE7 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B5EDD4CAD43462B4C5BF3031AE64E40 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 367FABA600C3419A12E1C31829E11703 /* LKDBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 59EF2EB3362C0B2ED9F2F3A9977DA345 /* LKDBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 370474488F17310C2E917826EE8B93FB /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2320ED36FC8E744B31FF6741BB85F07A /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3725F0800362C949BC6E1152C369699B /* ZXReedSolomonDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 71939E1412F60A19155773F66E519250 /* ZXReedSolomonDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37863F91F35BA4E1BC07D158BDFDBCE7 /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BED2A24A5D9FC5DE65CDB16E3993529 /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 38D8E6C09D1D142EECFF104C92C2FE3B /* ZXQRCodeDecoderMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = CF4F745BEBFF98E4F773D0BEC2707EC5 /* ZXQRCodeDecoderMetaData.m */; }; + 38F7C78C1407F016F58A448522B0A000 /* ZXURIParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 9972D7F08FB570BEE096D26DB04BA42C /* ZXURIParsedResult.m */; }; + 3949AE5819923AEF1C9F473A853441A2 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0369659D7DD2AF8AC3111E85E262AF41 /* CoreVideo.framework */; }; + 39980DE3500CE06CDAFAC40535CFAE34 /* ZXCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 285B5E000360B7ED322388AE074844A2 /* ZXCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39B87CDA7F6D7D4D08E0D5FF6DD59EE8 /* ZXUPCEANWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E98E60A3E0AADAB41B454C43D92F82C /* ZXUPCEANWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39D416C06B41801B1A99F3239832E886 /* ZXRSS14Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = A849FD8B462BFB2E09656D3DCD53DF72 /* ZXRSS14Reader.m */; }; + 3B46B3F978B488C190FAE610705F3FF7 /* ZXDataMatrixEncoderContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E88AAA11826810C07C533AB0790B65D3 /* ZXDataMatrixEncoderContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BABAE2AD290C7FB4F10D60982216375 /* ZXProductParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 40E760628C8F0B2747D7B87E5073C897 /* ZXProductParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C471B836E94E5FE7C07E5471727CCAC /* ZXPDF417DetectionResultColumn.m in Sources */ = {isa = PBXBuildFile; fileRef = 3183E798A6219D4066F1794704E91DCD /* ZXPDF417DetectionResultColumn.m */; }; + 3C6BC7709AECD8E1B1A179CE2A2AFB5C /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 02EB3F876F91CCE54C8A839D6390D7A5 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C9E55854D24D8CF4CAFD23F1A4BB9A6 /* ZXCodaBarWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 21D5C788A28238416C4B8D3BCFE89377 /* ZXCodaBarWriter.m */; }; + 3CC1558D8899A2E13A968D4C403CD793 /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 45E3CD46940FDD395CACBA1A4A21FD19 /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D767D37F0212CBCC1BF1975BEFBEBBE /* ZXWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 914722339DCB3642FEB6E757F40ABA8D /* ZXWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D7B9AB514124A054C4743DCCE14A7D9 /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 07CAAFBE787F94EBAB0F50E7F7F1CD83 /* IQUIScrollView+Additions.m */; }; + 3DC0CA957A8DC38AC7DA4427355BA481 /* ZXSMSTOMMSTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 235913F3F20DDBFFB7263D921AEF19AF /* ZXSMSTOMMSTOResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3DCF7C6E3D58056FBB2EE6A75575A9D2 /* ZXDecodeHints.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F8703CAB596C7FBFEF9A982B05A00D /* ZXDecodeHints.m */; }; + 3E09002683582BCA4A1F28B6AC43ED5D /* ZXRSSExpandedFieldParser.m in Sources */ = {isa = PBXBuildFile; fileRef = B300485FD71E56862235676F3ED9C010 /* ZXRSSExpandedFieldParser.m */; }; + 3E0D1BB53D02E6ADB21C370D47D9B168 /* TTTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = E9FA6D0C44ACBE1FC9B26E14D165776D /* TTTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3E0ED290E658DACA30B3A07C3962D076 /* ZXBoolArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 79802C836DDD9AFF60A8497B114594C6 /* ZXBoolArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F7946B6980350182019FE263719E5CE /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 77FC00CA12D81353B9F8489133C2DEF3 /* IQUIViewController+Additions.m */; }; + 3FDA1CCC5C9CF26A05D9BC63FD39080D /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D70C968EE0D52159E632EAD33541F1D /* IQTextView.m */; }; + 402EB64C59857FE252DC98844643C420 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5171E517994BE790AD2CC0E312612361 /* UIButton+AFNetworking.m */; }; + 40833895BC473C5CF0E07FB502A96F7A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 40B5A1DF320C92B95B9A544AF8A23B24 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B9B9A99D767D2557E9A88D6F2F0DD46 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 40CDAE3042B8831613E47CEA56966B01 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E3D34627710B673293F9006447215215 /* IQKeyboardManager.m */; }; + 41CF733CFE787A2740740BE8ADBDBD6C /* ZXCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 0432D6495063422ABDDC654AE4F8B470 /* ZXCapture.m */; }; + 41D40A80B513E5E8EB5E3AB335778AA1 /* ZXByteMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = F80E7D7DE4577D633349A0FF231934CE /* ZXByteMatrix.m */; }; + 41EDB9B21D399EF4D91634C25BB355F5 /* ZXErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 324C4E1A9498CE6F5AB03D236EB33020 /* ZXErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41FD4D0D6101210E26DDDCDD17FBB7C3 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E4C0009AC3BB69124F18FD9D2961200A /* UIImageView+AFNetworking.m */; }; + 42CA33FB1078C0D2289E837E16E204EE /* ZXVCardResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A4AD04459334D9EF262092853CC94D /* ZXVCardResultParser.m */; }; + 43762D71F8E603D0955BC62987C6C536 /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 754FC21784F2DBFBEFD47802461F5013 /* FMResultSet.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 43B515EFF247E214FE33401EC8121D8E /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = F8511D0B3E2963CA1CD4AE1B9FA833E3 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4433F4DAF902F9FD2DD8BFA469A5E080 /* ZXRSSExpandedBlockParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 0945410B8D753F082469457C094359D4 /* ZXRSSExpandedBlockParsedResult.m */; }; + 4543B450ACE79BA79F906BF95AE21B59 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 697078F7E74492370116817C140930DA /* SocketEventHandler.swift */; }; + 458CD0F434FE0520CE60FED6A898E456 /* ZXCode128Writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CABAF08106F653D5DF8B4FEB5102E39 /* ZXCode128Writer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 459B8F2D0FA93A1C4ECDA78992E6C0C3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 635A274D0FAAA69FECA7412329502686 /* UIKit.framework */; }; + 4654ED39ED8349B6D7C6D8C7B9AE4ECB /* ZXAztecReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B751927E132E372807C8082B5CEEC23 /* ZXAztecReader.m */; }; + 4660733038D27363E625BC581A310405 /* ZXResult.m in Sources */ = {isa = PBXBuildFile; fileRef = A1B680E7E47A448E6A788774476A57A2 /* ZXResult.m */; }; + 46AAD136547C5FE0EBD8D2AF03DBD85D /* ZXModulusGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DC2DE80246B2BF0B60498166F73679A /* ZXModulusGF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46B64F21093474F5B883124D52BC409A /* ZXAI01AndOtherAIs.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F71177B88BB0E0A87A20AE7F03B39A1 /* ZXAI01AndOtherAIs.m */; }; + 46BD1ED7571B2F79E80D2D1D06A48DAE /* ZXQRCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3278EA5FAB464253D26E64899721E7F7 /* ZXQRCodeReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47669D92FD5B317A4C014D9EF8C4492A /* ZXQRCodeAlignmentPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F87D49283144A1392718A7C4EB86D26 /* ZXQRCodeAlignmentPatternFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47ACE3AC563AF20D4B5214D3E9D54A24 /* IQPreviousNextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2569425A0FA93A78E8B74BA057402124 /* IQPreviousNextView.m */; }; + 47B6240312148D9BC9E8304C28B4F6D0 /* JSONKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CA27166E73856714CABF732CF0143F4 /* JSONKeyMapper.m */; }; + 47C66017AFF8B9C3F94C99C9448C02E6 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = ABC0C3932D4BADAC2D9603EF31642A79 /* SDWebImageCoder.m */; }; + 482B75E0CB8031D3F673F70242FA41FB /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D74289832B8183D20B02960DB44FB6D /* MJRefresh-dummy.m */; }; + 483B369D6217A42012EDEE2BC01E8BC5 /* ZXExpandedProductResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 8197FD370DE00707F2F2BC17FC0043E5 /* ZXExpandedProductResultParser.m */; }; + 487EFA26B8348DD253C758F3F7A5BC3C /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 5352DC6B9113D89A1085F56106CFAC48 /* MBProgressHUD.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 495CFEABBBBA2ADC0B52DEB5CFEB72D6 /* ZXMaxiCodeBitMatrixParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 10551AC9C89F0B2C28B79272A54229A7 /* ZXMaxiCodeBitMatrixParser.m */; }; + 497C18109669EB1CA4777CDCCC305010 /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 12204C88A320C0301A141E6E87004AFD /* Starscream-dummy.m */; }; + 49CD91D6F77E8E088F0A5C59EE86B53C /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B651E4833F9DA640EDAD393921C93D38 /* ViewController+MASAdditions.m */; }; + 49F39244472E3F1C35DD8F20F6F8DA93 /* ZXEmailAddressResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 102E0EC620D38D22A57CAA9F8ED30D9B /* ZXEmailAddressResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A2E07F69738291B00F0EDE3F298DBD6 /* JSONModel+networking.m in Sources */ = {isa = PBXBuildFile; fileRef = 693E8329C711960AE3D2219970BAA72C /* JSONModel+networking.m */; }; + 4A3DD37ABD9A5758C3BE31E8B1CF7B29 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 01AE0C0079CA9AD58E9E0F21D47EBEF7 /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4AAB319F32AA53F947C290C0AD453BA6 /* ZXWifiParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 63EF71061BF1793B6FABE15B3B0E53E3 /* ZXWifiParsedResult.m */; }; + 4B8C563476E17D29285485F08593303C /* ZXMathUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DB26B48C02D2509CCF212DE438EF382C /* ZXMathUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4B90445D4D4407D3ECE08E677CA0A1A2 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = FBD050FC63C7D54F060E2065763BE5E2 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4BA4C634B519E5059CAE8BC4555EC544 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 4C4E70E3516568924C49190DC86851AB /* ZXDataMatrixErrorCorrection.m in Sources */ = {isa = PBXBuildFile; fileRef = 54E0937E501B884E9655E3C8D08BFC91 /* ZXDataMatrixErrorCorrection.m */; }; + 4C9238620CC162EFBDC1C10415DD3251 /* ZXingObjCCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C4E54B4A0D030BF478D24E7F1C954B4 /* ZXingObjCCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4C9681A6187CCB4AAE3E3F5E24A375B2 /* FMDatabasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 699B9450180960A7E88622DB7FFE74A1 /* FMDatabasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4CFFE2226B0FA9D5490DBC04C8D11B5D /* ZXVCardResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B4F2FF1878986DA667A7CA300ED57DD /* ZXVCardResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4D13DF22DDA3666F96593A596958AA04 /* ZXBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = D76C53ACF409ED70426B26C9F9D00B68 /* ZXBinarizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4D49F2DE1333B9A93800D9094DC666BF /* LBXZXCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 9368955A4245EB6352EB3B9F4BBE71EC /* LBXZXCapture.m */; }; + 4D7C5E8BD96C1BC6C0D4ED8B47ABDDC3 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1794291AC6356B32D4FBB406D1E87D /* CoreText.framework */; }; + 4DC714615E227A05423BCA5BE6E20724 /* ZXDefaultGridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = A3625D636A02C0F2E65B79BC3ABA5783 /* ZXDefaultGridSampler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DDD45CE71968BBCA3F298950ACEB0FF /* ZXDataMatrixDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = F72EF6E51567C715E1D018D51FE90A31 /* ZXDataMatrixDecoder.m */; }; + 4E0A460145219AA7F67E936CC5D0F6A5 /* NJKWebViewProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = B19D5D49933050374E27CC5A36A9D058 /* NJKWebViewProgressView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E72AED0E8BCB951E0552BCB50CB334D /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = E9322053895EEE03F75B107018B88171 /* NSImage+WebCache.m */; }; + 4E75F1293990391FB686C2BBD734E715 /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = EDDE0D85E25455E61C59C0DF4310FFA5 /* MJRefreshFooter.m */; }; + 4E8626BB5B57700FCCDCB61B2AF7F7B1 /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = A1F500C7BA7C866D98A220946E05CAC5 /* SDWebImageGIFCoder.m */; }; + 4E9322ED1BFA3AF6C4CCE034A9C9A407 /* LBXScanTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 66D33BE7D27E3630895489EB38C44197 /* LBXScanTypes.m */; }; + 4E9827F96977E8027A84D7FADDE1A691 /* ZXDataMatrixASCIIEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 79A74B0962527E3CB0DE906FAFB94323 /* ZXDataMatrixASCIIEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EC6069A0FA841B755FB769B09796E8E /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = A6E84FFF96FBBB3DBB2CE50E2596FD78 /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EDAA3CBC9D424B3E8A8FDB78AB2C563 /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 95B5D6488D2A9F8A957047341D1B1418 /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4F3E95C9C9604AECDDB0CFFC01266FD8 /* ZXPDF417Codeword.h in Headers */ = {isa = PBXBuildFile; fileRef = F61C96A1EB50890AABE26F8306BD90C0 /* ZXPDF417Codeword.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F63793C6840D0406F6FABB3BE56D525 /* ZXRSSExpandedReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2753D5256EB2B5776BD07162E550277B /* ZXRSSExpandedReader.m */; }; + 4FAACC63EA1935DD5234ADCAC1067961 /* FMDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B905722B94AA07A2E7FC79FCB31FA93 /* FMDB.framework */; }; + 4FD943A725AEFCF61694FF6082CCB49F /* ZXResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 9643D2880EE03EF0A3081B00FE7DA113 /* ZXResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50211E13372A7BB7F52D15ADF482DD83 /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D561C32CB8DBDDB9692DB49D6C7B73 /* IQTitleBarButtonItem.m */; }; + 50B7B54B5D5C314F0A7F1D4484FBE38B /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EE816134A2D9EEC209C05AECBE42499 /* IQUIView+IQKeyboardToolbar.m */; }; + 50F4D6AA95F0E8C47D49D48A07BBA5A0 /* ZXCode128Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 77460A8A994E8D7ED439AB0F63A19E0C /* ZXCode128Writer.m */; }; + 50FADD0D1A73B1AD065B54A6355CAA06 /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 2491CC38C2B789FC40186BCCDF2D82D8 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5117A00713E0CEBABF79657E5B847E05 /* ZXGlobalHistogramBinarizer.m in Sources */ = {isa = PBXBuildFile; fileRef = EFD3B7522DAC4D87AE8F61931C893EF9 /* ZXGlobalHistogramBinarizer.m */; }; + 5155B80278A28ABBEFAAA3B5AB688BCA /* ZXDataMatrixHighLevelEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 00F8C95E50F8763425E1BD4D28EB0464 /* ZXDataMatrixHighLevelEncoder.m */; }; + 517BA94B26A0572AF4B3EE6F8429286C /* FMDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 769202E13791277C39A1C873BFE3BE54 /* FMDB.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51892BE5A970DE3EF15CE6AB462D7FBA /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44CBD3EB20B3CF018557CB282DE81D97 /* AVFoundation.framework */; }; + 51A1474D2305AFE9957BB88DADBF9542 /* ZXingObjCAztec.h in Headers */ = {isa = PBXBuildFile; fileRef = 35F9DFBDCFDC3C0A47A964624B4F9704 /* ZXingObjCAztec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51CF6F14BAF9060B3A36B1D49E35A87D /* ZXPDF417DetectionResultRowIndicatorColumn.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F162C35790ED70293D1A3C5025F5394 /* ZXPDF417DetectionResultRowIndicatorColumn.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52BEFEE2F96056366CE6737A72AB7EE2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 538FADA93B9ED8FF6EBE726DFDEC6722 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = EDE38C961A2038D1AA01A353A609CFED /* SDWebImageImageIOCoder.m */; }; + 53CA2F6F5F2EB2EB3087A54CC995C197 /* ZXExpandedProductParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 5118A816AD33DA493A9F058C0584C931 /* ZXExpandedProductParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53E4371EAC1B99BC5A46C98963D0E99F /* ZXQRCodeMode.m in Sources */ = {isa = PBXBuildFile; fileRef = BE625E3EA6CFC1EE77E64BC2B5D30C2A /* ZXQRCodeMode.m */; }; + 5413A0D9E34F9CE7CAA73261ACE2FE82 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 79E695EB33C23BAC43C22F015E115522 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5463D92BFD765B8FE84B6C61EB0580AF /* ZXQRCodeDataBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 37BB44FDCBA2A3F3BA11224E9BD40C69 /* ZXQRCodeDataBlock.m */; }; + 55714A226363D940B274121222897BCE /* ZXGeoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A7BE92D9A88AAB98280F5BE26B6CC9BB /* ZXGeoResultParser.m */; }; + 573DC1A247FBBCAF3FC01660F8106F63 /* ZXPDF417BarcodeRow.h in Headers */ = {isa = PBXBuildFile; fileRef = F5025D454C6517C33738D9EDE5EDFF3F /* ZXPDF417BarcodeRow.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5742DD733E7EC5A2F097A6DC286C2F85 /* ZXPDF417BarcodeRow.m in Sources */ = {isa = PBXBuildFile; fileRef = 36ADCB783FC73ED76E1B608C1EE147ED /* ZXPDF417BarcodeRow.m */; }; + 576FA432643D0D695F13446285A55594 /* ZXMultiFormatOneDReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FCC3F198D635D8A65345C2D4A225B42 /* ZXMultiFormatOneDReader.m */; }; + 57979623E4937F62C4EF8595EB31B7EC /* LKDBHelper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5464387A08F744A79310765AE072E608 /* LKDBHelper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 57F9EB19DF46EC2590C8B10DB89D146E /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 88FD3FBD15119CB99E9D80D90992E1C8 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5824F5A12616DBC3A9CC47195AC7344F /* ZXPDF417HighLevelEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = EDE72E31C2E3970C191EC54DD35DBD8D /* ZXPDF417HighLevelEncoder.m */; }; + 590CF998ECFFA060696A7F8F8B5A6E8E /* ZXISBNParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 810DE4FE0E235525CA493EA5F5C19046 /* ZXISBNParsedResult.m */; }; + 59141E4AF3C48506B14EF66658CF8010 /* ZXPDF417BoundingBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 0851E17699603C47D519E246AA85E844 /* ZXPDF417BoundingBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 591D24448CA42AA91BBD903CA4A53827 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 59E82FAD1DE511F807B85214312CB475 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7980D5EF9269D296280EE048E6D687D2 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59F1F34EC8668D299B1A1BEA3AD51A98 /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = ADD15CC73D37D63D79884B9AF2970A5D /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59FFE52313B87B9B65A3A95212E2FED8 /* ZXPDF417DetectionResultRowIndicatorColumn.m in Sources */ = {isa = PBXBuildFile; fileRef = 9260C97F834AFDC5E9287A483A3EEB0C /* ZXPDF417DetectionResultRowIndicatorColumn.m */; }; + 5A4C39ACCE4CE7B6C69C736F48087759 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B6CFBDEEF15C5CAC528272DFA72E70D /* AFHTTPSessionManager.m */; }; + 5A62CFC81D529D35D2B708F3B38CB8E6 /* ZXBoolArray.m in Sources */ = {isa = PBXBuildFile; fileRef = D08B329D2BC575B425B77B76FDDA53B8 /* ZXBoolArray.m */; }; + 5A920240A5DAD603C6FEFF093C6DD5F7 /* ZXAI013x0xDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 14A80D785536E522E2A574957742F4D6 /* ZXAI013x0xDecoder.m */; }; + 5B017C612744851F41FA4261F0B26E0D /* ZXGridSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4400DF2CA88D881355B824B1B31C708A /* ZXGridSampler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5B1239AFAE9E2E81EEB051C73A35E18D /* ZXAI01320xDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B041CC04C8BECC46A754D164BCAD3057 /* ZXAI01320xDecoder.m */; }; + 5C9A5F3ED2438CB6E5C9264B78EFACAF /* ZXQRCodeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 278487CDBD6D5B22DB2B92E19CAB4926 /* ZXQRCodeReader.m */; }; + 5CD86742903D65F3E643EC7E18DE9F3B /* Pods-GIGA-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4333DE13F7B28D62D7251611E26C7D1F /* Pods-GIGA-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5DCE79860316F17CCE26AF562BCA3525 /* TTTAttributedLabel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B56E10174EEAF6135A318FC9ED5DC73 /* TTTAttributedLabel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F8322FD7820C499B005750A0A718268 /* ZXDataMatrixVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = E69C2C5A7BFD32C73AB504536434A22E /* ZXDataMatrixVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5FA55EF84822B2052AA3135EC5BA3CF9 /* JSONAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B4D7786EE2660AC3DC4E70BDF860D37 /* JSONAPI.m */; }; + 602342DE53F524C6C771F5201C385566 /* MBProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A5B4D719680B5193F01818BEC9CBCB1F /* MBProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6125E8F17E06CCA90FF36B813FF2C391 /* ZXAztecHighLevelEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = BDE22E9668D0E4B563401B93027B92A4 /* ZXAztecHighLevelEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 616166BD57B8707EC940068BF5E1AA0A /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = AF67FFD3DB88A86F97B87AA371019906 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61C25E571726F566B4F41925B1639B1B /* ZXPDF417BarcodeMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CBE64FD5E0CAEB8CE719061DA45DD9C /* ZXPDF417BarcodeMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61D6D891F5267AB65CD97EC2C0D4BA9C /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = A40463DAC6A4E916654CEF343C61ECED /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61F50D390689E5C9DE2E8F8DFE8C6E64 /* FMDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = BC871066179BE447E2CA99B04F8E4628 /* FMDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 62E84F67014328D5ED1B0F65775CDDFA /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = CE4FC04810BF48929DE497595E3E1A86 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63A7B518E880C7AACABCD20AFA247C8C /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79FE412CCF5EB10F2499FED97EF034ED /* AFSecurityPolicy.m */; }; + 63B05DD8200C971ABDD35B000918A587 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */; }; + 63E5B0A89D51F5D880D1D0C90D8A34E2 /* ZXMonochromeRectangleDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B410EB9C4D5A74AECA61DACE97CA734 /* ZXMonochromeRectangleDetector.m */; }; + 64E810DA08A8065ECF004562FBC5E29C /* UITableView+FDKeyedHeightCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 646B209E896918796E000D73F622D0D7 /* UITableView+FDKeyedHeightCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64FF44C8D750948C28B8091DD8DEAEF7 /* Pods-GIGA-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD113136C3BE7E4822B80A29F3DC5E42 /* Pods-GIGA-dummy.m */; }; + 652DD457D846BA54808C1055274952E3 /* ZXAI01320xDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 60A561785854A3F2E4B9017839350583 /* ZXAI01320xDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6538CFC461D1FB80288ECA206B11C410 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE09343CF77ADDE6B4A2E8E4B156B1CC /* SocketAckManager.swift */; }; + 65399940489E63D7F2757795E5FA7585 /* ZXDataMatrixBitMatrixParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C5E76D9EA1A516638FCCB1DF56749F7 /* ZXDataMatrixBitMatrixParser.m */; }; + 6577428E5885283B560FB24723385635 /* ZXPDF417DetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 90F4A80F4369642483FA571081BD0792 /* ZXPDF417DetectorResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 65AD43F8BB7734430A4B11B134CFA4E0 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 5826DD4C8A1EA288E322FAC3C9EA4691 /* MASLayoutConstraint.m */; }; + 65DADB71E21ADB8D8773FFCA6C5F894C /* ZXAI013x0x1xDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 687392D12DE79F3572E2015961306FC8 /* ZXAI013x0x1xDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66340E06FB146280E83112B966E563C3 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 84ADF7C681046CF307D8934AAB00BA0C /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 665525DD9D8732957752E545B70A9FC3 /* ZXBitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 95B0E8D4B76F1C79F62D3C8D3627C8A7 /* ZXBitArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 67C8CA39AD2250B78156EA6805F1FD69 /* ZXTelParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E2497333F54860347D41674CA272ED18 /* ZXTelParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 687BC988130EF82F37904842B2990463 /* ZXProductResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 973C6EBA1615D36BDFC14E663610CCC4 /* ZXProductResultParser.m */; }; + 6885F9A30752A1960ADEC6689064524A /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 240BAD531BB4B9EEBE08492B619A8762 /* SystemConfiguration.framework */; }; + 68BB2BC495F583B25EE800A2BC7A43FC /* ZXGridSampler.m in Sources */ = {isa = PBXBuildFile; fileRef = BE75A2C9850C8E95D6A3688961790E22 /* ZXGridSampler.m */; }; + 693D8D1FC11728188581439826FDB667 /* ZXResultPointCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C56C2853EE092E9116A433447747F4 /* ZXResultPointCallback.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6945F694ED4434FCC48B8103E638FF82 /* ZXHybridBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 92DF69FA8D4D90C6AC636313847C0EC1 /* ZXHybridBinarizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6946F28650C4B7F1F2422D3EA38D5F7A /* ZXQRCodeFinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = F66CF8827F0B34CFCACD31A5FEE1FFBB /* ZXQRCodeFinderPatternFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 695B15B926033750A60778938829CACE /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FD296265ABE09EAE1B9B8D7B3B6F3F4 /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69655DB7EFE25A40DF19A77A94EE1EC2 /* ZXISBNResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 478C4D8B62BEF9C31111A3C01BC95AC9 /* ZXISBNResultParser.m */; }; + 69D7D7374DE4F1D6AD9C44DBDF2EE192 /* ZXAztecState.m in Sources */ = {isa = PBXBuildFile; fileRef = C10967434C4CA6FC8AE871A1B97C9F43 /* ZXAztecState.m */; }; + 69E753A064765388C9FA44918F81E5A5 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 411CC2AB65DDA90561C1A996DCB39D38 /* MASViewConstraint.m */; }; + 6A5E05D187005E863177B45D58905C71 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 60A8566008F2AD60A21C20D15502D353 /* AFImageDownloader.m */; }; + 6B8EB985AF975FC44766B9B8F1547A7E /* ZXEAN8Writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 31BD563B6469FA9EF68AE77CC8C9C056 /* ZXEAN8Writer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C1A59F113DA3CC594BAD9FECE548A28 /* SocketIOClientSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = F31CBEF84376251F0806EADAD2A08076 /* SocketIOClientSpec.swift */; }; + 6C7C6C542448137FC3B6CEA04386780C /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 336F0381CB9A0395C4BBF4C768C65F74 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C7D22626A2F5AD4BB1ACC02D8F10731 /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF5C7F199322D1BFDDA67CFE14AC9E9 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C92211130872AC5306B6528F3977BB1 /* ZXPDF417ECErrorCorrection.h in Headers */ = {isa = PBXBuildFile; fileRef = B386ADD68A2168AC6CD90FE149EBB1A4 /* ZXPDF417ECErrorCorrection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6CB5C888731E5142C50219D52CB274B8 /* ZXMultipleBarcodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 179AE6112321A9E63ADF069B0BEEC72B /* ZXMultipleBarcodeReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6D2FD545E0B463F0210B5242E1477721 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BE82B9D4079D3983911B8D53A96EFEC /* MJRefreshAutoStateFooter.m */; }; + 6D40381AFBEC7CAF83A9199A0A08B641 /* ZXPDF417Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = C01873263C8FD2C8E73608FA5497003F /* ZXPDF417Reader.m */; }; + 6E560D2FE4A36AB742453E3CF5F4CE68 /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3120B8DB2246172495AEDF42E825FE3A /* MJRefreshAutoNormalFooter.m */; }; + 6E815C943A6D268D625565BE85A98252 /* ZXAztecHighLevelEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DF3BB511F79101FC0344D36A8E097E5 /* ZXAztecHighLevelEncoder.m */; }; + 6EBDFECD251CF9EB4701BBE088CFDEA6 /* ZXAztecBinaryShiftToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 78BC20152075DB6234CD40F5410B0095 /* ZXAztecBinaryShiftToken.m */; }; + 7039F1721793FD779E8F0FCD9FFAEC9B /* ZXEncodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = FE2AD125508AE6E894FE3EC3451B7FC2 /* ZXEncodeHints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 706285072C6DD219003E529981939855 /* ZXAztecDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D34CE6EABED483EF7CD837F56BA870E /* ZXAztecDecoder.m */; }; + 71199890B26E8235C760FC10090D3067 /* ZXQRCodeDataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = CB49B9A7AF95B95F054394597AB570C6 /* ZXQRCodeDataBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7129E11D6A0CEC203AFB749F4F1C4989 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE798D466C89FEA6AB6CDFF361EF31E1 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 717ACA4BC5C80F17D454BA3FFA4BEFAE /* ZXUPCAWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 863EC4B777DF2C869B1BB4CB59BA1E16 /* ZXUPCAWriter.m */; }; + 71B9A63D48135B0FE64609FA8F1A7C3D /* ZXUPCEANWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BB7A98AA89EE65433C671154AA9EF67 /* ZXUPCEANWriter.m */; }; + 71F1CC538AEEEB44DA131E0E1D2659D5 /* ZXQRCodeAlignmentPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = A7D63F4A9BC3FDE37EC6321B924A9C9B /* ZXQRCodeAlignmentPattern.m */; }; + 7203872DAF858D609912A7D0F768FEAF /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFBD5D8A73ECE684FBFA5BFA305674C /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72BA18069C0DFC671464EB497250D358 /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C29E51B904852FD5C10F0044CB6D392 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72C40E38C6C9FB70748E321E6FA762AA /* ZXAI01weightDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BFB470E1E9E4EC099452CE5FDDED518 /* ZXAI01weightDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7315D926EF2DD1D3CF820129392B70B5 /* NJKWebViewProgress-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 56A248AD2B14391AA65B56084DA88713 /* NJKWebViewProgress-dummy.m */; }; + 73273C50AD0AD94F2D8CB5903C2651C0 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA7B07B7621695028B2FE565CE6EE4A /* WebSocket.swift */; }; + 7341E2ECDC0C449A24F1D201E240059F /* ZXRSSExpandedGeneralAppIdDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 012787B59372AB66F03C42636485A397 /* ZXRSSExpandedGeneralAppIdDecoder.m */; }; + 7357C3D72FF425B7A6EEC2CBDF631DC2 /* ZXMultiFinderPatternFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E67332192E4A91BBF32552E970E4DC /* ZXMultiFinderPatternFinder.m */; }; + 736B7EDF2AD8D42409920C482FBEB35A /* ZXURIResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 69CE75FCAC08FBFF4A19F327BF947AEF /* ZXURIResultParser.m */; }; + 73C1E279DD50A3C4C72170DD3A6B3C7B /* ZXCode128Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A66899D553769F07E1441C3B9394C64 /* ZXCode128Reader.m */; }; + 7495F5F35EF054D5CC1F6BBBE5A18A98 /* SocketIOClientOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = E269CAA8DF5F1A3FDB98EDE519EB63FE /* SocketIOClientOption.swift */; }; + 7501331A8CC6BA0792A027098D7C7D84 /* ZXBitSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 2823134BEBE09A1FC0B644A3B421CA23 /* ZXBitSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75D5CD688FAAF760643D48071DA197C3 /* ZXPDF417DetectionResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 61EB05BFA6141DA4009094265FD1CD48 /* ZXPDF417DetectionResult.m */; }; + 75F9CE6C73465F62FABD40FEF93009CB /* ZXUPCEANExtension5Support.m in Sources */ = {isa = PBXBuildFile; fileRef = F91668C823B0AE5F67E3B7ABD277E354 /* ZXUPCEANExtension5Support.m */; }; + 7618689D9E1E437777F947961B1DA1A8 /* ZXQRCodeMultiReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B9AE07D5281C5759D652086455FBEF9 /* ZXQRCodeMultiReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7657FFFA92E7989B21868F397ED39D15 /* ZXRSSExpandedDecodedChar.h in Headers */ = {isa = PBXBuildFile; fileRef = 313E7213920F3488A506D2A1E937EC68 /* ZXRSSExpandedDecodedChar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 766BA37972D9E3CBD39D099A1684DE8B /* ZXQRCodeVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = DCE5D1F46B9AD5E5683541967105617C /* ZXQRCodeVersion.m */; }; + 76BA5CCA7F0BD9E4B4B9C2C466C7DC58 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EB1EC42888716D62C56F080EBFEC574 /* Security.framework */; }; + 78237EC071053B70E167AA5F6F7E4B5C /* ZXGlobalHistogramBinarizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F4D7086ACD27BEF0067A5E009184684 /* ZXGlobalHistogramBinarizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 787250A500D39DCA8F1B83D32D41A791 /* ZXQRCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 83ED92E0DD10D7FAE4AC6D99B8021828 /* ZXQRCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78C391F2C671000F6CA29CB491D3CF9F /* ZXVINParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 229FCA40E8539EFBE4226678A7EA53ED /* ZXVINParsedResult.m */; }; + 78F5D40D5B8E9FC40FB257953EA945BA /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 143FB6B44654C24BB8B89753BFC2F90E /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 790E36B06B42D441FE6D50E5A8DA8FC4 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = BB2D8CB04016D61F7BFC496F3B495021 /* UIView+WebCache.m */; }; + 79355BD5499E59326F5C7BC9CC25F497 /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 0747D4EA06CA97B015B24FCB55985F62 /* FMDatabasePool.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 79E7436378404C9DD06E9F65180D62A4 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 39E95C32A7C1323ABDF30E4F76BFCF1B /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 79FDC95E0D84CD38EB60409B8D475C1F /* ZXVINParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C10DEB7C68E9902DAD88652E1EEFCC9 /* ZXVINParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7A15663A29FCFAC7A0CEDBD4054CD3F2 /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FF962C3B5E9F87BAD0687F98E01A68F /* IQUITextFieldView+Additions.m */; }; + 7A2685E30335AB08F230A5EF4C703DA6 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = D80D98735957E03896AE3A84B4BF36F4 /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7AACE670ABE8A4AF3CE1EA13F169F8FC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */; }; + 7AC960A6348FB810BAD910637E074628 /* ZXRGBLuminanceSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D621010883DE1BE39C63430A1D6B499 /* ZXRGBLuminanceSource.m */; }; + 7B22DC790484F8FCA78B89722AA093D5 /* ZXPerspectiveTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A4F01BFD5CE4F8C310A8F702E11D51 /* ZXPerspectiveTransform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B24431E7D430962537DE32F9254AFDE /* ZXDataMatrixC40Encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 444CBF418CAC87110D897FFCAE82DD3E /* ZXDataMatrixC40Encoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B8B58B92909A3589A4208774B8A4300 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 635A274D0FAAA69FECA7412329502686 /* UIKit.framework */; }; + 7B9FD8963C83EAD768E39632D58C4CDC /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E41F011C85810C2F24051ADF688EAC6 /* IQKeyboardReturnKeyHandler.m */; }; + 7CFCFA61CBF6F981CC10E6E0BC721EB6 /* LBXScan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B68DA9BDB004B69F101D1FA08FCC1374 /* LBXScan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7D8F048F485B282CB394D7859777E936 /* ZXGeoParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = CF4BC743574EA3CBE522BC1296F858D4 /* ZXGeoParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E80DF7477E52BC83231CE99C08C955C /* LKDBHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D19C16AD520047D87A62E87D78B88DC /* LKDBHelper.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7F9B9007891D36363BE6BE0CB08C1006 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = AACA34D95CFD97B77A99CD3EB2150FB4 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7FC1CEA91F90834F660AA84E603B37AD /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FF57359A0BC6E800A9EFDE2F444A6C0 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7FCC75D93EA3270EA7324472F20E6FD4 /* ZXAI013x0x1xDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DDC020CC041CE21BCBE1AFA667268370 /* ZXAI013x0x1xDecoder.m */; }; + 8015903E7E555F98A830619D2AC1DF61 /* ZXAI01392xDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = EE83A59533B6D6B9979E38443BDF496E /* ZXAI01392xDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8047B94832CAC04D252870CD1E5AA050 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 20249BF2579AC39A329C1FC26350A22D /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 805AF4FC4B72F7E340475144B402F0BE /* ZXRSSExpandedFieldParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0837B9947C721571ED0E10CD0BEFC76B /* ZXRSSExpandedFieldParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8085492743111A17C44AE052BF758F37 /* ZXPDF417ECErrorCorrection.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6C9CD3ED0862161499F3FA82C73109 /* ZXPDF417ECErrorCorrection.m */; }; + 80968BCB9F1D1613D254B39D68F13E81 /* ZXPlanarYUVLuminanceSource.m in Sources */ = {isa = PBXBuildFile; fileRef = D9060E0F719533207B55A62D6B86204B /* ZXPlanarYUVLuminanceSource.m */; }; + 80C5C42A0672F22AFA1FE0A00E567E07 /* NJKWebViewProgress-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B792D8AB36054EBD45C94653B554F26F /* NJKWebViewProgress-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80DEF5B5723234A78AFD3AA8F2E35B74 /* ZXBinarizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D320CFA28819D61FB692FC0849DA960 /* ZXBinarizer.m */; }; + 810F48991446EA207F68868C4ACCD792 /* ZXAztecEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D3E1FC166F80EFA174F81A8658281571 /* ZXAztecEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8110B70A3F793DA048829BF8DA69CF8D /* ZXAztecToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FA3A3051CD742F345F9EE5A14E8EF70 /* ZXAztecToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8118B720743D3A2337D2DA590C4F3EAC /* ZXEmailAddressParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 5005F6E8AE6F60BBF0B77AE5C2B3B80E /* ZXEmailAddressParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 81727E0FB34C0FE08D39BDE52687701F /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9B1477E02C9FC7DB75801BF860E2E8 /* UIScrollView+MJExtension.m */; }; + 81790BFE14093CED901966998BBDA7A7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DB635CFC34D6A30EA67D0BE25700F7F4 /* SDWebImageManager.m */; }; + 8232897CAD17822C162EEA3C4E00477B /* ZXQRCodeDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B75928703CCB0D67E3B79FF5B6BEC70 /* ZXQRCodeDecoder.m */; }; + 8234F492BBE286EA25736C05B5728C82 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 99247344EB46502CC5221B2DE032D0EF /* UIView+MJExtension.m */; }; + 82353FE47D60524E4668829EEAC7F5C6 /* ZXQRCodeDataMask.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DA31DB4D2D916ED462A824500A5F3A2 /* ZXQRCodeDataMask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8319020F2483A8059B64A7CE1BC80558 /* ZXPDF417.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DEC5D524DEA95921A68530389F09B4D /* ZXPDF417.m */; }; + 83C45B2227372932D4B69C936DDF74F7 /* SocketAckEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B5524326030982E08D19C6DD79A605 /* SocketAckEmitter.swift */; }; + 83E8C5AAACBA4CF4C6FB8F1CD058572B /* ZXDataMatrixSymbolInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 04187936C4D64135EB529CC632A514C4 /* ZXDataMatrixSymbolInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 84B07844B1C013044F01D7C68E3F1448 /* SocketRawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E4A8D325E6EBFDBECD2C650970CBDF /* SocketRawView.swift */; }; + 854CFE1942538CB9CB69B7F1E02DDCCD /* ZXDataMatrixWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 338FB914BBF542E8B6EDE3D1B25B85AE /* ZXDataMatrixWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8569759499496B1FCD936CB213BAE7CB /* ZXAbstractExpandedDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 497BC13476902C48298CA9EBA5C10239 /* ZXAbstractExpandedDecoder.m */; }; + 859A254DDE770691FCF898EE9AFE1066 /* ZXAztecDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 202B6B8E6F79D8E8165505E726FB999F /* ZXAztecDetector.m */; }; + 85B4CF741E31A20063B1C55E38636946 /* ZXBarcodeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B241E82646F26C23270DD0F25306B8D /* ZXBarcodeFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85C27D27BB3D85E250BBD79B0C26F9CD /* ZXHybridBinarizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A780D1F42790EDF0A5CCB44B32A6A9F /* ZXHybridBinarizer.m */; }; + 85CEA85437A5D1E053C8E87E8D20A7D6 /* ZXPDF417BarcodeMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F487C09C91BF1BB7E08546251F89F67 /* ZXPDF417BarcodeMetadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85FE0DAA3E520C16E1226D70E669B4BB /* ZXGenericGF.h in Headers */ = {isa = PBXBuildFile; fileRef = 089311B62F1C5BB0F120AC6B4ED43CFF /* ZXGenericGF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8712536831207386FCEB0E9D2828AE1A /* ZXMaxiCodeDecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A5B4BD93D1FBC6F4581EAB2435A5F131 /* ZXMaxiCodeDecodedBitStreamParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 87A12972098BD298D80E4C38D94ADBBC /* ZXAztecState.h in Headers */ = {isa = PBXBuildFile; fileRef = AAA0264943D4277E2ED911E5B95C9782 /* ZXAztecState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 87A4427A95A579CC8DF04135529D93F7 /* SocketEngineSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB026A66B6F2535F9EAA5691F683517 /* SocketEngineSpec.swift */; }; + 88148FB4BEC07E6A698231644D115136 /* ZXWhiteRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC5543F20B7E7EA04C3A1A4E43EBA04 /* ZXWhiteRectangleDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8826A0887EEE1A618FA3BA34989E05B5 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5BCCBDFB1C9D318B399428068B1A6A1 /* AFNetworking-dummy.m */; }; + 88A52F2DE87FAAEF79B420CC9B6BDE80 /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D57DAB6BFCB824F15CBA51D5F9992AA /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88E2AAEC30FF97B51CC113174241AEFC /* ZXPDF417Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE79E0DD75E10B9843CD8B26E2BE9F2 /* ZXPDF417Writer.m */; }; + 892469602EA886064AC260E8CC7E6657 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9165CCA443172EAFEA5F67FEC667E494 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A7F22AF5C3F93AC58731C00D8E07BE9 /* JSONModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6D3821B872268A19EE44F9D2588F7A0 /* JSONModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A9EDE9E5548FB6CB498F4EF0798BDC9 /* ZXISBNParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CEC8B4351A5087EFF4C82AEA645A4B3 /* ZXISBNParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AC178C448C151C5ED62AC26BF3B8A16 /* ZXMultiFormatReader.h in Headers */ = {isa = PBXBuildFile; fileRef = F499A1EF2875CEBBC4AA0304788A4A41 /* ZXMultiFormatReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AD9F8FE36978CB4348E402207950883 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B95D0E98143F761DAF81176974CE05D8 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8B6FAC1D4E4E00C17CD80714623899ED /* LBXScan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE748AF72A5FC49C5D85BBD6817EFE20 /* LBXScan-dummy.m */; }; + 8BF472B706C0A855193BF4E9681CA708 /* ZXQRCodeDecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = FC7318D906AE4E6819195F07A7515BEF /* ZXQRCodeDecodedBitStreamParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C526C365681FCEE39A1696DEA7EBAFA /* ZXMaxiCodeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F3CC51DCD3186BB7788B5DECE48B36 /* ZXMaxiCodeReader.m */; }; + 8CDD5683DEF8E858DF5F23DACC45A4F2 /* ZXITFReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B470F703305B8F7168FCA96E9DD96B3 /* ZXITFReader.m */; }; + 8D05D7C2C69AB71DBB1E969DF73992CE /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FBB9755676843B30743EA7966C0286B5 /* CFNetwork.framework */; }; + 8D3D649AC816938B8B78CAEC5CE8962F /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 73114DBF445B889F132749E0B264FDD9 /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D430944975FEA87A7EC8EAF6D7B6CA5 /* ZXPDF417BarcodeValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BBDA3E8B10E3FADF7F89B3702EEF0CB /* ZXPDF417BarcodeValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DBEC830A9D524D060E2E8E3ED35A951 /* ZXQRCodeEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 901E0F1F7B4E32D33B1445F00BAB3D6A /* ZXQRCodeEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8DFF09A9785F9698D17C6D4C6186D8F2 /* ZXCGImageLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B35462DBAAAE8003FB720CDC6C62786 /* ZXCGImageLuminanceSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E196440D023F4F7A14CD043E6E39B2F /* ZXPDF417DetectionResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FBA935B14DF01661DA2725E870860A3 /* ZXPDF417DetectionResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E5FA4446BEF13675307A5F22659BD3E /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ED7B64BA9A55B1F26F1722AB6EE74A13 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E87F17441C19AFF30FC611FE67FF133 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 8EEBDDFC5BBB167C4913C62807AC9C24 /* SocketExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E9F570F0C8FF7E01A8D9117552856F8 /* SocketExtensions.swift */; }; + 8EFDC05AD48B492FCD676D14050A7345 /* NSObject+LKModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E371536297EE73EDA25573988ADB0FF8 /* NSObject+LKModel.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 8FA9EE637CCA93919158C7D1F2B2C123 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C46B1450E5C7D283F392A9ADCEB4DFE /* SDWebImageTransition.m */; }; + 901790CB7729E8871AE5DE99E486792B /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = E7EE73C29C12A420E29202973AB3A065 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 901B19E638D600F0F4F3FC0CF71A0892 /* YTKKeyValueStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E5970EBFD625491CED012161FE21EDF /* YTKKeyValueStore.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 918093B1FE40206F66CB4B708918DD14 /* ZXCode93Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = 91780F76FA729D64DC40C0D86F70021B /* ZXCode93Reader.m */; }; + 918E3ECC0A1EAB3D10048A38522A008E /* ZXWifiResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E7A59810B5A5380436134148AC1E645 /* ZXWifiResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 91DDE6FF0D788AB359CB8E7ACC15BFB3 /* ZXDecoderResult.m in Sources */ = {isa = PBXBuildFile; fileRef = DD8DFFF2272590CA81642BA75E8AC1D6 /* ZXDecoderResult.m */; }; + 9207565E4E52520A01455E5942995436 /* ZXAztecDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A9CA5FF09538D3B7C48A9AF5FBB9221F /* ZXAztecDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92EAD4A2D3217EF1712DEBAA146F4925 /* JSONModelError.m in Sources */ = {isa = PBXBuildFile; fileRef = 69A02C9C6C41A6BD55909C0958CE6ED2 /* JSONModelError.m */; }; + 92F1744A21FDACEF6F6297010D9310B2 /* ZXAddressBookParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = A605A6AD7D5F53CB478E997357A1806B /* ZXAddressBookParsedResult.m */; }; + 93C4308343B23D55C32470E2F9FB5917 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 95FF3C16B3F10DF0EF6D569E78EA0782 /* SDWebImageCodersManager.m */; }; + 94104A13FB72ABF23BCFA2050B032810 /* JSONModelClassProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 799440664117950193264CD9FAE22257 /* JSONModelClassProperty.m */; }; + 94237113054B0D5CE28D86E2C827BD72 /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 13F7B9CBAB0CB01818519C819CAF02C5 /* MJRefreshGifHeader.m */; }; + 946A83F9D55E7732CC74EB6C00DF6223 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BAAD8495FF0A8451A4093707288E6E7 /* FMDatabase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 9486D80CC092F8ACB2355D5C94A155E3 /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 40601347DD17AEE48EB4A05C95CEDE4D /* AFAutoPurgingImageCache.m */; }; + 951D22F9648387ACCCD5795969AEAD02 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EF80E24923EC548EF6E33E2DD36E035 /* SDWebImageDownloader.m */; }; + 955623738E352D34791B6DF3B208638D /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E45E4D6694AC0C97C6A5AF81C604134 /* UIImage+MultiFormat.m */; }; + 95B64DF44D87CC4ACECA016FA498819F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 969B62532328DD39915FACFAAB9C6D1E /* ZXExpandedProductResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = D9CCE994A58013AD9DF38EC59A03E850 /* ZXExpandedProductResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96C8719A776127A45A00C28865C03DC3 /* ZXRGBLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C268F71FA70172C992666B3096D20AB /* ZXRGBLuminanceSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 978176645791C5EE19D0CF1EBDCE7EBC /* ZXByteMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = C91C6B5A3918001519E53DB440411A32 /* ZXByteMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9787E77302F790920E5F650461E8D9CA /* ZXEANManufacturerOrgSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B438DFFD1EE04C86A551BEE91E8A2F /* ZXEANManufacturerOrgSupport.m */; }; + 97E04393A4302FF5715F8F65C610B975 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 97EBD85280DD7B1F9D8EF8688F166FC2 /* JSONModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD5528C0D2E108DE76282C4D370CF27 /* JSONModel.m */; }; + 9800F31C362EB5F09E059F128AFA4BB8 /* UIView+Toast.m in Sources */ = {isa = PBXBuildFile; fileRef = 620646C69C1CD1C0CE91F1E26462E3E8 /* UIView+Toast.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 981C5A17E0DBEB54DDBFA226E911D3F3 /* ZXURLTOResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E092EF878C0C56EBF720EA18E888865 /* ZXURLTOResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9824B3A87FA346E9BEF2F19983D84B3C /* ZXUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 052791EEF6C86CD2DB1E787879E0955A /* ZXUPCEANReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 983123462A43B9162D52FDFE886E0AC7 /* ZXCode39Writer.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F9F6A969CE02922769E4D30F411D49 /* ZXCode39Writer.m */; }; + 983CBB3E64EDB753A4E1847BE402E047 /* ZXDimension.h in Headers */ = {isa = PBXBuildFile; fileRef = E7613E864B947A351D382C0FC0FE150B /* ZXDimension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98655E9ABEE655AC980F3AB422088C38 /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 004F6E5045671D830987CF2BA82B1B56 /* MASConstraint.m */; }; + 9881828CC3B1296ABC3304512700E13C /* FMDatabaseQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = E70EB5BE65F087C48AD9E30596FA715F /* FMDatabaseQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98C310C1B9961619B95A58B61CDAFBE0 /* ZXResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6543EC2D5A66343A23BE1FF5129493BC /* ZXResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98CFDDBFA30FD9C6FAE3B10F4F4115F7 /* ZXQRCodeEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B079BB2612D1053F894188EE8F04B2DA /* ZXQRCodeEncoder.m */; }; + 9914AB5DEFBF7E15AF7C839BB33624BE /* ZXDataMatrixBase256Encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4063220FB7868DB178D9715ABD0541B0 /* ZXDataMatrixBase256Encoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9935E121BBCE28C6BB7247FD0901C8D6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + 99598FB51E665B6DDB29E8179D3A1810 /* ZXGenericMultipleBarcodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = BAE566293D579A7A32CAD1CC1A1A44F0 /* ZXGenericMultipleBarcodeReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 995AF3D2E1623BB1C830ACD3ADF94B53 /* ZXAztecSimpleToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B28802C647811C71CBB2038A358709E /* ZXAztecSimpleToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 998920581E9575A82CF6ACBDA4D3F456 /* ZXDataMatrixTextEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BFF53C2A202E0CC81A9C3D9089AA4ED /* ZXDataMatrixTextEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9994837D5818B55B069C0767791FE87B /* ZXingWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CEFBEF7D6A654F303086039A2A3427C /* ZXingWrapper.m */; }; + 9A7AE8C9966DC22D4821354CDB74E333 /* ZXImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E2520DD73675F766A9D772066624121 /* ZXImage.m */; }; + 9A7E04EB36EE6CC1C1F5FA01C7F58A38 /* ZXingObjCMaxiCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 12B43532712994B7C42D9AF9ED032299 /* ZXingObjCMaxiCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A9931F189A4EF1FABC8C731BC11AEFE /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 95CF6F20DA7D7D257F63CD7A8455C821 /* NSBundle+MJRefresh.m */; }; + 9B36951533A1C00573181520834EEA86 /* ZXDataMatrixBase256Encoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B1A2A3CD6B1092487E88EDA72E8E3EC /* ZXDataMatrixBase256Encoder.m */; }; + 9B6F4B72809EDA47036B9083836AE667 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 635A274D0FAAA69FECA7412329502686 /* UIKit.framework */; }; + 9C40862620C22A2B902911BF29EAD79D /* ZXDataMatrixX12Encoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 732255A23528067DAC958D1EF9B12C93 /* ZXDataMatrixX12Encoder.m */; }; + 9C9207803EFF14A47B2EFA9410263B00 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AF7E228152EC8FCA66D6E5E66939409 /* UIImageView+WebCache.m */; }; + 9CC2E583FE800ADE166A1C9D3580ACF5 /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B43958B9922FD34350604E634E5FC721 /* IQKeyboardManager-dummy.m */; }; + 9D03F88A2FCB4756458FA96EF4597A5B /* ZXDataMatrixDataBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A0910812650DEEBE939D73295D420AB /* ZXDataMatrixDataBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D380619079479C622272E2C77FCD289 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 35585E01D8EFEEBEC799FE84FDF8A47C /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D78AFC0B0AF189B2A50279C25651C18 /* ZXUPCEANReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E285F41A9F8C786ECBCB839D2E7523E /* ZXUPCEANReader.m */; }; + 9DC350CED7B28CF0CD4C71C3806D1A6F /* ZXModulusPoly.m in Sources */ = {isa = PBXBuildFile; fileRef = BE9B6E4BBEB1499F48F9D323F3AD9118 /* ZXModulusPoly.m */; }; + 9DF1CD6D437EF1F3334EF52497102528 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = D3975F2419B8D6B20104A7D872211E48 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E625A2F24BD26E96CCFD7C111B00059 /* Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F082F6A417E526857C5FA44E9DBA532 /* Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9F586A14A643289A77792623EB34351D /* ZXPDF417Writer.h in Headers */ = {isa = PBXBuildFile; fileRef = F2BFC26A47983CB8EC119AED9695ADD7 /* ZXPDF417Writer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FD7C5B0DE582DABA9DF2E876F742F12 /* UITableView+FDIndexPathHeightCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F8C59CE9B10ED445F854EA1D3CBB058C /* UITableView+FDIndexPathHeightCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A0D2068FB749177AAD59EEB97B2A9E14 /* ZXQRCodeFormatInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = A8FFDBA30ABE67DF60944AEBFEA340CF /* ZXQRCodeFormatInformation.m */; }; + A0FDD2A6832EE4854731CDB45C4B5B9F /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = E5D3CC79E85F7918D70BD3A4522AACE6 /* MASConstraintMaker.m */; }; + A13A40DF733172D83C500531D3D5F240 /* ZXITFWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FFA0BB96E3EBED3470673318EE8A438 /* ZXITFWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1F2D0DE1B8DD446E7CDB0058A3B8DFB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */; }; + A29EF1446A12F1B7FBC7E5B336F90255 /* ZXDataMatrixReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 08454D1CB8980B210F9094853CDF4FDC /* ZXDataMatrixReader.m */; }; + A39E1924915C53C49E7220F72AD96BBB /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 73394E3C99C0F7034198B9D0338C2B49 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A4CBB299F1244630410150448F219B08 /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F56ED7BB1C9B9CEBCDE058DB3D75771 /* IQNSArray+Sort.m */; }; + A50EDDF1CB861F8BB3D858AE186FB03B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + A53C63209FFAC17790D496BDF3DEE8C5 /* ZXByteArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FE90B47F16EF45B0A7C27D3A206E6C3 /* ZXByteArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A594BCF59DC413D1B30E4DA2397E16C6 /* ZXingObjCDataMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = AF8181766A212352456EDDBA433246A2 /* ZXingObjCDataMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5FF89D1E926B822DA7B51AB553A7744 /* ZXDataMatrixDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FF25E1BDE0C8AFFEF5B9A142633A7A5 /* ZXDataMatrixDetector.m */; }; + A63D580A2AE9F878C81EC893391C03D9 /* ZXBitMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FC2506E4A42B3837966006D093F8EC8 /* ZXBitMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6CE0B0CE8A6380E5DD50E27597F2040 /* ZXAbstractRSSReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AC58043E8A387745ECF2111F22DC0F3 /* ZXAbstractRSSReader.m */; }; + A707F33AF9BDB27BD95432DFB1E2E97A /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D348C141AC0E517123D21C02ACD9329 /* MobileCoreServices.framework */; }; + A712A87FAE237083DB644C0A2D6408D2 /* ZXVINResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 874DCB011D3306DD0E650FE0D7C29685 /* ZXVINResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A752FFFD5E8C40A7C19452658D664AA8 /* JSONHTTPClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C08014B0933A01D397B8D075C867A21 /* JSONHTTPClient.m */; }; + A7734BC342BF08F031ED1D31CFAE0C99 /* ZXQRCodeBlockPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 85D9B469170FDCAEC5788D34380A15E0 /* ZXQRCodeBlockPair.m */; }; + A7B140E5D1B2CDFD09CAE5543BAFE58F /* ZXMonochromeRectangleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = D20F8B84034184CBBAB843F936A787F9 /* ZXMonochromeRectangleDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A7ED1FA2F59F020062DE3B579AF84F55 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 769E0CC5D44E5F06068AC65B5544743E /* MJRefreshComponent.m */; }; + A8292B18F5B9B0B87ADAA9B6823220EC /* JSONModelClassProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 6712D72897762340266F2A87E45D60AE /* JSONModelClassProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A833B3BF425053CF3DB92B757FAD7768 /* ZXRSSExpandedDecodedChar.m in Sources */ = {isa = PBXBuildFile; fileRef = C52183BB38FB383082491630976C0142 /* ZXRSSExpandedDecodedChar.m */; }; + A8B01631D7088E712E9DCB62A6D874AD /* ZXDecoderResult.h in Headers */ = {isa = PBXBuildFile; fileRef = DC84C765D3E246259B53EE3825C09632 /* ZXDecoderResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8BED069847BB22DD090490591F7866D /* SRWebSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 75F038F0E7FAF63EBA750D91DF06CE21 /* SRWebSocket.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8DA1233E1C289F8B13A4CEE6C1E8D75 /* ZXPDF417Codeword.m in Sources */ = {isa = PBXBuildFile; fileRef = F69FCCE59B874F4C732C7D249770F46C /* ZXPDF417Codeword.m */; }; + A8F21793321B84AF27401100BEA8C7F3 /* ZXAztecDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E965DDA942C48F7D3BABD368A08FFF8 /* ZXAztecDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9397A8C0E6D8187B73BBBF9D1639EBC /* ZXQRCodeErrorCorrectionLevel.m in Sources */ = {isa = PBXBuildFile; fileRef = B589D3C0F29F385CBA34259277066496 /* ZXQRCodeErrorCorrectionLevel.m */; }; + A996D01F1A72BBDBE24ED9DB6E9887F4 /* SocketManagerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3563CE30C7FC383DB5E57A9EFAED2A5D /* SocketManagerSpec.swift */; }; + A9A1B4884406BA13CF99C74C85056DDF /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = B511D89A58E69A73AA9266E378998CB3 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9C9774D6BCA3A159F4DA9D9D0CD4196 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = BEE5EA3A3EA8FD272D48AE637E5243D3 /* NSLayoutConstraint+MASDebugAdditions.m */; }; + AA849A4E8DDA79D2C21020FB0A7623AC /* ZXBitArray.m in Sources */ = {isa = PBXBuildFile; fileRef = AB2178008AF9DA5F005048AEC7DF5133 /* ZXBitArray.m */; }; + AAEE1BA924187FD226827D96E7BBFD72 /* Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5698041AB137552E3373832AD90304 /* Compression.swift */; }; + AB0E805A026ADE3A14D715AB1C2A15E2 /* JSONValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D7697DD5DF625D58F6CE57BB14C297D /* JSONValueTransformer.m */; }; + AB3A971D4A2FEEAE70D027F3C4715B14 /* UITableView+FDTemplateLayoutCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 65FB9A85E34D940326FAD7F5F992BA59 /* UITableView+FDTemplateLayoutCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AB5044B1827EA235284AEAB03E9D4BD5 /* ZXModulusGF.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D920C9AA0C8FDD9CD6D08BC4A83F981 /* ZXModulusGF.m */; }; + AC81D218EAFEF78A56792A1FA636DF9A /* ZXDataMatrixSymbolInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 07C6B44F09A86EF5C27ACF2778099DEB /* ZXDataMatrixSymbolInfo.m */; }; + ACAF9E413787547D405DACA2A235071B /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A4C02D3A79E060D16E49070922498AC /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ACD04EF21E456C574AC64081F77C2B56 /* ZXRSSPair.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E7F4A62E4A63E56908ECD88933E8837 /* ZXRSSPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD0A818DAC472137AB3C7E273C50D83C /* ZXSMSMMSResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 98AE7D5EF6D7FEDB91625641851AF22C /* ZXSMSMMSResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD476A94E27AE0827B306750F8463484 /* ZXPDF417DetectionResultColumn.h in Headers */ = {isa = PBXBuildFile; fileRef = CFE8A54320F9B1DFE54A82556EA7E5D3 /* ZXPDF417DetectionResultColumn.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD4907C12B75D45C1C2EBE1652E9570C /* ZXQRCodeDecodedBitStreamParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E1618865273A37407ECCBB6FE73D7E /* ZXQRCodeDecodedBitStreamParser.m */; }; + AF4632CC7BFCF195AFEB39791DB43951 /* ZXUPCAWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = C97CDBEA6D3D2A8EA447F8A10ED2725E /* ZXUPCAWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AF51B418D6CA69E02289049555F67643 /* SocketRocket-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 33093A6969DCF0577ACC4AFB773BB475 /* SocketRocket-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0281E4D47021BE0F52F6965D9B6AD49 /* TTTAttributedLabel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FE6280647D511E8A1CF5138E9C19EEF /* TTTAttributedLabel-dummy.m */; }; + B048FC5DC10A524F4B3B161FFB89BC80 /* ZXingObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = A29E3B478023A4FB4277FE9E1BE899F2 /* ZXingObjC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B057BBC46DD61B10260D033754D68DB8 /* ZXProductResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DFA91E6480FEE73F386377B85AD82CA /* ZXProductResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0B3A20301514E5A71D837F8871394EB /* ZXSMSParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E15CFA79AAB43D809BEEA665C6B029E /* ZXSMSParsedResult.m */; }; + B0BC6259F0382D9773B8E654F3E97F42 /* JSONModel+networking.h in Headers */ = {isa = PBXBuildFile; fileRef = FD3C532397C903A0F5DADD4C208B2087 /* JSONModel+networking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0E962DF1ABF8E3BCCE2417F3288B893 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C9E154677B670DDA3F46BEE875F6B56 /* SDAnimatedImageRep.m */; }; + B1086F6175428C794D7885D05B5DC67B /* ZXCode39Writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 41D83AA43A5759B1910D7B53E34FCD64 /* ZXCode39Writer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1A2B716293BA4783BAE4D6675390617 /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 91706C8AD7E45476FC3B6520045F128A /* FMDatabaseAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1CA92FCCC65778E67847B884E6D1EE3 /* TTTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = DC57C149910BF3453D9F2ECDF2B4C630 /* TTTAttributedLabel.m */; }; + B26F8142AAD12FEAFF5CC17129EB3087 /* NSObject+LKDBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 56B36467AE75A63FFC84B594640762F2 /* NSObject+LKDBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B356C813D009D8F48B49B93F970B1F1B /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = CFD46D5E3076E4207888D8094E6B31A3 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3766CD47ABAD4FEF5379E0ACDF5FDC0 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 050F5D4A18A243F44CD990ED0FD713A8 /* SocketPacket.swift */; }; + B40BB2C83C01DB238F5617BF46D05448 /* ZXRSSExpandedDecodedInformation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D157DAAB6FAF21BC3BF5539ED1EC0E0 /* ZXRSSExpandedDecodedInformation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B47DB316417A0297987B57A85575A6D9 /* ZXQRCodeBlockPair.h in Headers */ = {isa = PBXBuildFile; fileRef = 0555A175C6506EDB9FA66314527444E0 /* ZXQRCodeBlockPair.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B50A173CC006987E8682D89650F14F63 /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 909EEACC3D53B5C20B405FE99AABA0A6 /* MJRefreshAutoGifFooter.m */; }; + B5394F3850868397AEB071E3FDB0B25A /* ZXResultMetadataType.h in Headers */ = {isa = PBXBuildFile; fileRef = 403E37AA88824C6E1807A9A22B544FDC /* ZXResultMetadataType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B567C8B61C580DE6ECE316D7B8D4FC18 /* ZXDataMatrixDecodedBitStreamParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9994A9404B4EFC309846990C886EB6EC /* ZXDataMatrixDecodedBitStreamParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5CEE9B4820443E56D0E82A7CA8E06A3 /* SSLSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7739B8E5715569FDCB4A5157DB47A572 /* SSLSecurity.swift */; }; + B631B58110CF1C281A0C6617A6A9011F /* ZXRSSExpandedDecodedNumeric.m in Sources */ = {isa = PBXBuildFile; fileRef = 0529DF2E890AB3AF1B781651D27A1982 /* ZXRSSExpandedDecodedNumeric.m */; }; + B6D4958A10D36D6DE6C3064FAD9C1E62 /* ZXByQuadrantReader.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF265594DAF7ED5BAF27F67AA705ED8 /* ZXByQuadrantReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B7170162BEBD63676519BFABE4D76287 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3860605472BB0020FA275E37A39BBFC2 /* MJRefreshHeader.m */; }; + B71FAB1EEC6F67C9CF1F2A4C4990BF4F /* ZXUPCEANExtension2Support.h in Headers */ = {isa = PBXBuildFile; fileRef = 791E3AEA6283D73CA6B2D43C93F9FADB /* ZXUPCEANExtension2Support.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B7423B876A190A6C9851BA4F78CB58D0 /* ZXOneDReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C401B49150060182D6B98AC9E686452 /* ZXOneDReader.m */; }; + B772355201E1F42A4338F747B7006DE7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + B7D315D00FB42B8A164AD9771C685413 /* ZXQRCodeDecoderMetaData.h in Headers */ = {isa = PBXBuildFile; fileRef = D1C76C04BC19CFDA9A046F657930A7F6 /* ZXQRCodeDecoderMetaData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80AA261F7BE797DA797826E9DBA09B0 /* ZXQRCodeAlignmentPatternFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 099FF98B477834609DA28D17D54F8492 /* ZXQRCodeAlignmentPatternFinder.m */; }; + B814C8058A9BD33C02B57C994A7D9AF2 /* ZXDataMatrixVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = BF20AF460CB09D0812ABB529BF3D9C51 /* ZXDataMatrixVersion.m */; }; + B826105B4E974955EA0B83DB1649ACEC /* ZXQRCodeBitMatrixParser.m in Sources */ = {isa = PBXBuildFile; fileRef = EE04FA23838883F895783232C88E0D5E /* ZXQRCodeBitMatrixParser.m */; }; + B875BBAA4920C609184A00E0C79EA587 /* ZXAztecDetectorResult.h in Headers */ = {isa = PBXBuildFile; fileRef = E74E49B61863605A36C4E3C9F2832C55 /* ZXAztecDetectorResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B89E3F69B65F9F1033495F254C6FE7FD /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CCBEC0E54094922227B670E6DB080E9 /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B967DE3AFEE4C96AAB002B8095B6C7C2 /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 92303B24A8D5DC6C6A24C8F20C2E9E3E /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B9F59E8ABD288FA6FE288E4B5182FE8C /* ZXEncodeHints.m in Sources */ = {isa = PBXBuildFile; fileRef = 7249B565C8E3D69892D5BEEC5267321D /* ZXEncodeHints.m */; }; + BABD81F3D2777203AF3704D13ACCDC27 /* ZXMathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3682C86398A3D8CD81BAAEA99EC6CB67 /* ZXMathUtils.m */; }; + BABEE847D58868A5EA5DE63D535B93F8 /* ZXRSSExpandedDecodedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 586B352F25C82EE45AD9D530A76E8947 /* ZXRSSExpandedDecodedObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC9A9AF774231ABA862240CBA53C30BE /* ZXAztecBinaryShiftToken.h in Headers */ = {isa = PBXBuildFile; fileRef = E0FF7B43673CB04DB59F4418B2EEA542 /* ZXAztecBinaryShiftToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD1E9ED7F5339CF30E74A8D6357A1977 /* LKDB+Mapping.m in Sources */ = {isa = PBXBuildFile; fileRef = 1616C6AFF0D30BA7956FE92E35E55C9D /* LKDB+Mapping.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + BE5697087D711839329087D6676E4612 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AB49493C72E91540C35242C5BAD4FCB3 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEADC76C933ECDEC7FB7898EB94DFA9E /* YTKKeyValueStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C06C0FC8EE1C494A50D7E91C80275410 /* YTKKeyValueStore-dummy.m */; }; + BEE7FD5C1C06AF3670E0FB75F996DDF7 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F951FBB93592715C79CB49A74F212457 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BEF50B5785E425A84EAC9904D7F6CF9B /* ZXEAN13Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D52E7B2BF8525DC5516D495D7282480 /* ZXEAN13Reader.m */; }; + BF3BE01EA64CE40E470AB4FD107F36FF /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E524E96BB42E41C1895212420B58739 /* FMDatabaseAdditions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + BF577D8B4EBAB796C0B5142B9FA156BB /* ZXMultiFormatOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F1D96AA24EC4D9E29125F9B66BE2999 /* ZXMultiFormatOneDReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BFA142179E38FDE18B754753B100EA04 /* ZXQRCodeDataMask.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C09C033A731A26153669150888DAF2 /* ZXQRCodeDataMask.m */; }; + BFB56D89B4F56E29E9F259156E5C2A48 /* LKDBHelper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C2CDBD67226720B815F03C1A9C49C8 /* LKDBHelper-dummy.m */; }; + BFBAAA5BAC61F93FD61ED0470380F34E /* UIView+Toast.h in Headers */ = {isa = PBXBuildFile; fileRef = DB5725EAA2D37D63C8B3216CCA38202F /* UIView+Toast.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BFE2AEFE879A355E8856CE2B661834B7 /* ZXBitArrayBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 63BFC98F43CE219C1A220493F6BA002E /* ZXBitArrayBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0948F3883EB111F12F3B093972333A2 /* ZXAztecDetectorResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EE274531929642E26FAC9CEB0CE1D96 /* ZXAztecDetectorResult.m */; }; + C0E60F0CEF08F6B87CA7E77161017610 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F90A2EDD8280C3F6E157F06F89AD2C88 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0F3732315AAEA5E5B25E5C59D7EFBEB /* ZXReedSolomonEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CE49A78ED8CD3469317BF1740F57FEC8 /* ZXReedSolomonEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1117CCC45FA6780A4E9CC0879D5C3EA /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 14464B5FE9352E85A2481638DF324A31 /* MJRefreshBackStateFooter.m */; }; + C18741ABF4CA82275B9E25DF3D9245ED /* ZXQRCodeFinderPatternFinder.m in Sources */ = {isa = PBXBuildFile; fileRef = E55E3943C46C6F5D16EE87894205D0AA /* ZXQRCodeFinderPatternFinder.m */; }; + C1AEBA80A062707BA682306712A8730C /* ZXTextParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F7BE25B41BDBD831AC67465B027F6E0 /* ZXTextParsedResult.m */; }; + C1B9F94970B2DB95017EB3227018A18F /* ZXAI013103decoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C192F2382F4C039C85C70C4DA2A5C7C /* ZXAI013103decoder.m */; }; + C2092485FA10B21CE9CB9B066900E661 /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6963810BB2C1A82ACD63714720A260 /* MBProgressHUD-dummy.m */; }; + C24E8840B121DEB11074874D87329000 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 449F2506A175228D3745E422F9FA4505 /* CoreMedia.framework */; }; + C2B0DA35772F9F6531314F99C5E2BBDD /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = F12009D1C01556CEA7A2D3988A794F73 /* MASCompositeConstraint.m */; }; + C2E5BD6F57260D7EAFBA4B813B3229D5 /* ZXGenericGFPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = DF7A59D4F2E0D7DB79A85E122F8BE6A8 /* ZXGenericGFPoly.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C317DEF82E1FCC4A79E48AFB5A311CD0 /* ZXRSSUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B63F483F4A41FA5865B2584379B9F50 /* ZXRSSUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C422E71E27ABBE6D606E062B525B982B /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BB64B79D1CF75BABB098326BD4EFFB24 /* FMDatabaseQueue.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + C580FB79966082342B33F478A38FAB90 /* ZXDataMatrixEdifactEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D4898026D6A7954E09802DDC74D97432 /* ZXDataMatrixEdifactEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C6360B9860ED4C41DB4A827A54727BF4 /* ZXAddressBookParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = FD499BAC595D6653AFCAF7496EE274FC /* ZXAddressBookParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C69EFE1963CC7EB0BF1871B2CEFF292E /* ZXCode39Reader.m in Sources */ = {isa = PBXBuildFile; fileRef = ED05B441B7D7D284FA548DD27827DA1E /* ZXCode39Reader.m */; }; + C6F66FEEE41420FE8BF1FE589B3C2B9D /* ZXDataMatrixX12Encoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 511FE11D56822DD2C7EEC44121FC64F7 /* ZXDataMatrixX12Encoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C733A3160B98A390F70AC3995352E5A1 /* UITableView+FDKeyedHeightCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8782A7575A373179F4E5803ADB820210 /* UITableView+FDKeyedHeightCache.m */; }; + C74A80546CDF6BB6A89440FA69A9AEA4 /* ZXUPCAReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 99AF4EF91F2DE9DF43B1D24BE3F0F259 /* ZXUPCAReader.m */; }; + C77BD460EB1F294707DE9365F2BDA7C2 /* ZXBinaryBitmap.h in Headers */ = {isa = PBXBuildFile; fileRef = F2748C4C9D212DE00657CF5BE83E3FB4 /* ZXBinaryBitmap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7DC9250FDAFF2AC8BE2012278130782 /* ZXDataMatrixDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 192EEBD3CCFBED410B71949E0998E05D /* ZXDataMatrixDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7F3DE8453708A0A3FA26F146AEBB1BD /* ZXRSSExpandedDecodedInformation.m in Sources */ = {isa = PBXBuildFile; fileRef = BAE0DCB43B9483758316E31E8F367BE8 /* ZXRSSExpandedDecodedInformation.m */; }; + C7F8E19DF007724D472F873813DC9EF8 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = F298804CFB13E8D56C1490A3060E80C8 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7FEF0EF55BC138C7095D0BB3CBFE9E7 /* ZXRSSUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C28B49C4B80D513EAF88F98C85881734 /* ZXRSSUtils.m */; }; + C8A0FAA64E3706CF58898FB38C610EEC /* ZXAztecToken.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B43581CEA2EE0D03C949A7239BCD9F /* ZXAztecToken.m */; }; + C91D1216111E6B2DC6F0717E1A86E5CD /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 232646EC5F31EAA7AF0455FE8C72225D /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9D84AB1705FF017CF7E53F4487E0B54 /* ZXAbstractRSSReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 27E0F0F34C4C74E17FD6318296871814 /* ZXAbstractRSSReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9E5E77581A3F050A79297E916FD46F4 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B961506C39517250A71DF02B7976774 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CA4565F8CB9E78C5CB1B6E33D9B99E6C /* ZXParsedResultType.h in Headers */ = {isa = PBXBuildFile; fileRef = 92C9AAE9DC1DDF0477A47CF84DA2077F /* ZXParsedResultType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CA476856E4164EDEDF8D4221CF2FB977 /* UITableView+FDTemplateLayoutCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 75E16078F463F9E5994EE6ACBDA099CA /* UITableView+FDTemplateLayoutCell.m */; }; + CA8F3D2003D05B66D7BB8E56DF63AB0B /* ZXEmailDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7425BF33143F64193CE5FF99404C2E59 /* ZXEmailDoCoMoResultParser.m */; }; + CAD12EC4165B2CC0B80A5E7168037F4B /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 92FEEDFA83D3A00920E16B9CABEFA1E5 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB1BA39A04D63DE4DBACCD1F14ECBB4A /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = A1996AA7C2137DB7AA8880037F9572EF /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB3028664CA23A1480C18C7A86CFDAF4 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 7047319FE14D03FEB9C8CFEB7BC9FDB9 /* UIActivityIndicatorView+AFNetworking.m */; }; + CB3CA20E3732A095F5515E0621D8719C /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C30575D94B3B61C4EA49629F94F4E7 /* AFURLRequestSerialization.m */; }; + CB4892D447BB6EC251B44C2CE30B4DBC /* ZXQRCode.m in Sources */ = {isa = PBXBuildFile; fileRef = D6DC99BF9244ACBFDEC39A53AA4F2B8D /* ZXQRCode.m */; }; + CB633AF10D27AD0971F3E34470B0BB01 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C318977FCF328523387B6D4A7C4C463B /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB804B5FEE4743D906CA384A7066CAAB /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 234B0B77520F7FB1083EAB0B06567855 /* SDWebImagePrefetcher.m */; }; + CBECB9B6DC9D8CB7360B9F78D95800C2 /* LKDBUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = E3AB84771CDBC97157AFEEF0D298CBC4 /* LKDBUtils.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + CC250020A4F9D0DBC7EE2C4E73FABC32 /* ZXQRCodeDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F35A69CB060517CBAC06B3C7FBB0EFB /* ZXQRCodeDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC37D45550BD8023949D261D159AB47E /* ZXUPCEReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 3513213A0E1A06239AEB5818D047B215 /* ZXUPCEReader.m */; }; + CC678FAF7BBDDBCD6ADFA76B54FA4F8A /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 81A0E384E7C6FB8B202D56044210F6A9 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CD5B234F63B253894801E87B049262FD /* ZXAddressBookDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = CF06188AC07C7C27495C78395626B74D /* ZXAddressBookDoCoMoResultParser.m */; }; + CDB4993924F7B8522FA32BCFFAA7A14F /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A364B76E07EDED5CE6622600D9A01FA6 /* SocketAnyEvent.swift */; }; + CDC48DDA8FFF645BB2FEEE7B76277D35 /* UITableView+FDTemplateLayoutCellDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = E68B3DC05BD9D790DEAAA27A5658A735 /* UITableView+FDTemplateLayoutCellDebug.m */; }; + CDC6FB0F5FCB58B8F964F088730BB34E /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A5D7991606712587CFD0DFE9A5E3DC4 /* NSButton+WebCache.m */; }; + CE00BB2E78F7B40FC22D1501B2DDD0FB /* LKDB+Mapping.h in Headers */ = {isa = PBXBuildFile; fileRef = A23106CA0DB895B05E409ACADA49BB3D /* LKDB+Mapping.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE273EBEF55C902DB2A36A423E4635B6 /* ZXRSSExpandedDecodedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 87BA85B60EAF1C3F2302976138B1A74B /* ZXRSSExpandedDecodedObject.m */; }; + CE457BC7DB6F028124F7598E6D12616C /* ZXDataMatrixBitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 366173D81A4ED097DF635FD4EA4EF986 /* ZXDataMatrixBitMatrixParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE6DD415935ABD034C2AD2C7A500AA49 /* ZXAnyAIDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 701446840081326410A29622ADBEE46B /* ZXAnyAIDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE87FC34E6E0A23CE7CBCE0A7DF5AD27 /* ZXAI013103decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D9275A725164D3FF4B69A0DFA2777191 /* ZXAI013103decoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CEE8A510AA8A32C8946AEB5A435DEC51 /* ZXVEventResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = D33DED6D983D07751C1F44DA86010508 /* ZXVEventResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF432BE06535C2F8B8B33208FF3EE8D0 /* ZXAI01decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 257EDB11649851E0733955A6BFAE808B /* ZXAI01decoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF76306C6168AD7A6C076288CA899B02 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = B16769F5B9B2F193A4AF9386634D9F36 /* UIScrollView+MJRefresh.m */; }; + CF86E1636C529E6A1B07099ED5BC622A /* ZXCode93Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 04E020596EA2153E370B4CA94419609B /* ZXCode93Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFC09D4DDE3E33FB00200C0E03A3B354 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 21B81153AF23CF76DCC9E5AB0BBE5804 /* IQKeyboardManager.bundle */; }; + CFC2D9694194E479075CEAE825FA71E5 /* ZXResultPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 52E8AE4E2BB8AB7B1CBA9EC8A9A42C04 /* ZXResultPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFFF3CB7FAE91A7DCF44A1C79C7B7AFA /* ZXDataMatrixSymbolInfo144.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BFE51EE927D826B37828D85A76B0F5C /* ZXDataMatrixSymbolInfo144.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D014A5430789C5F0FFCF490D53B22897 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F5E3E7A450E3F2F506A4750E78B0CC3F /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D053A597BD250D3BAF1BA8AB4AB96371 /* ZXAnyAIDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8310F7311DA2B88E84CA2119CFD7640F /* ZXAnyAIDecoder.m */; }; + D0742599C8727ACFB6C0AE055E5A77FB /* ZXTelResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E63C2B99195537A79F146DCB9287F32 /* ZXTelResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D07F337EFACD95AFE2C1B5FD1D7FB897 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461834DA994FE18EBE2D48989FEBFC0C /* SocketEngine.swift */; }; + D0E386A9C252107265EC2702F4E40637 /* ZXDecodeHints.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1314B2D906C2F472D05A95CB7DA4ED /* ZXDecodeHints.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D1344503C30625AB5505103408AAD827 /* ZXRSSExpandedBlockParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C40B6AE6D7208B199A009448D839C80 /* ZXRSSExpandedBlockParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D18E5833140D36B4ACB8D2E2294D572B /* LBXZXCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = E9D88C308C13BE4F0E533DBFF7254198 /* LBXZXCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D1AF9F67B318ABDA0C4FCE09D0E16DDB /* ZXBookmarkDoCoMoResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D875EBF70B631CBAC790D0053BBAFECA /* ZXBookmarkDoCoMoResultParser.m */; }; + D1D0715E329BA90B3506296254E0D5EE /* ZXingObjCPDF417.h in Headers */ = {isa = PBXBuildFile; fileRef = 88407759C5E8E0C1FEF9EAB41CE83B1E /* ZXingObjCPDF417.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D27CEF06138C8868FA5310DCE2A12806 /* ZXEmailAddressParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 287DAF48EE194A861DBDD9EE370DE641 /* ZXEmailAddressParsedResult.m */; }; + D2E6B8F0B143775E0EA5DE2F74BF80B9 /* ZXPDF417BarcodeMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 09637B16C908D125DF0B7864F1CC9AF6 /* ZXPDF417BarcodeMatrix.m */; }; + D36031FEBCF5916ECA0D681A02744797 /* LBXScanTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A91826759C3D62F0CED673A1DE3936 /* LBXScanTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D3E588649DF8C08FF628D83A68781EF1 /* ZXUPCEReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AE90821AB70960B2356D5F01B2BFE2F /* ZXUPCEReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D491FD44351A11016A957CA81ABE0EC5 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = C98C8E34977A02E2FCCBF24EBC05E35F /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D4ACEE90357C31D4BF1CB0AD8B5B6A69 /* ZXISBNResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6449BEDC3695C449D8F4F737BDC151C3 /* ZXISBNResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D4E228FF3530F2D0D93071C496E1C8EB /* ZXAbstractDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = DB2ACF264118BE5AAEDE5A3A5B8931EB /* ZXAbstractDoCoMoResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D61B5ED8425310C8F3E2CEDF0071F9BB /* ZXVEventResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 4436BB6A4592B2FC90C4D183E9D01B4B /* ZXVEventResultParser.m */; }; + D65D0DD30BEEE2F98ACD1ADFB51D7085 /* ZXCGImageLuminanceSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 726ACBE484E0CE875DB7C5A4EC9014C1 /* ZXCGImageLuminanceSource.m */; }; + D70B98DD3417421F2D3181551B71657C /* ZXOneDimensionalCodeWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = F4AEF13FBA15A0D252506C11F70DE27F /* ZXOneDimensionalCodeWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D74CC7C57FEC0C821FADB3C39F575FE8 /* ZXTelParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 97120A07517F383800EC11FA12D775F0 /* ZXTelParsedResult.m */; }; + D7C7C251D548C0A5985BA9DED9191E3B /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 87120330F90EE7A00D4FD6085EA8A7C8 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D7DF407CF9892B54E300B16AEE0569B1 /* SocketEnginePacketType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF5E2FD354E3AD4AAD8B25E696EDDB2 /* SocketEnginePacketType.swift */; }; + D815E654A01B0ACE0EE7E13D35EC3C16 /* ZXPDF417CodewordDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FD57D80A4B82AD97932876B827EA76A /* ZXPDF417CodewordDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8AA83B4ABFA7C8F5359B874D3A1FF76 /* ZXAztecEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = CEE80EAC1FE0F2DC614CC7078C7A1C03 /* ZXAztecEncoder.m */; }; + D8FCF9663CA5C3BFD4744B218B33CAD6 /* ZXOneDReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 38C39AEDD97BDBD485D6C7154BACECC9 /* ZXOneDReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D904FE6DC02E6E0AE443E6556F338C0A /* ZXQRCodeMaskUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = D6E504E440ABA1292AEDDB1EC3186A8A /* ZXQRCodeMaskUtil.m */; }; + D9561A7C99AD978BA82BEC10C9DFCE04 /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 919EF3437C8069062405289CF4D9F092 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D9617E15C53681EE7102360D27565D1E /* ZXAddressBookAUResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 0419923E664360BC040CB84E1A475782 /* ZXAddressBookAUResultParser.m */; }; + D985271F97E42D83F184231DCE3E7462 /* ZXAI01392xDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = BF5657DB241358AD9FDAE9890C8ABEEF /* ZXAI01392xDecoder.m */; }; + D9C4FC1FC90DA4C70E5E5FB5968750EC /* YTKKeyValueStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D42458E77F66B16EDEAD4F28893B7E7E /* YTKKeyValueStore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA3F72FA37B1C76AD4F113469FAD49F3 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 24762E712FE35B0B98DBA131383ECE21 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA696CF9F3F7A6DFAE627122B09549DA /* ZXQRCodeDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = EC049E598F3DD86706970EE3B483DEFA /* ZXQRCodeDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA7B73959B1A448517DECD329073FF2A /* FMDB-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 84638A03F2FD43305155579E47619D3E /* FMDB-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA88B3E2E47F15D2C34933AC4A737332 /* ZXQRCodeMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 056143C341215C6A0AF28738796461AE /* ZXQRCodeMode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB396C0846C4080C0DEBDBA030980E4F /* JSONModelLib.h in Headers */ = {isa = PBXBuildFile; fileRef = E3DF9AC48121A71DF66F2AF611AAF2F7 /* JSONModelLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DB70C0344D46C9DBD3DBD9CA84C639D3 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 69764D291C85F1FDF35BE2A9C545CEE9 /* MJRefreshAutoFooter.m */; }; + DBDBBC9D0DFFAC0906128A16AA9A78B7 /* ZXRSS14Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = D6C40D284E1D73C5025FD3E0E1CCBB43 /* ZXRSS14Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DBF928F76E5DA1D06ECF0B0081911114 /* ZXLuminanceSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 44705920CB16B6C84B9EF4086CC761D5 /* ZXLuminanceSource.m */; }; + DC2A6D85806B1FEA530B2888AC931065 /* ZXAztecSimpleToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 7750F613ED29A2D26322E258E8C4D7B7 /* ZXAztecSimpleToken.m */; }; + DCBA94B9BD9E5DD47BAF0C901C85ABC4 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EA1CB2D2B2F80861AD6C1BC9136F4112 /* Masonry-dummy.m */; }; + DCF4C6F43EB2CCAEDB4A876433C05ABB /* JSONHTTPClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 36925CAD9B84F8F3F48AE20228BEF509 /* JSONHTTPClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD27850C6E34681F6704C854510A7866 /* ZXDataMatrixEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = DA5A718164633D231A198797B4A9CE39 /* ZXDataMatrixEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD3AE71DE2039E8CD5C0B231D37C5631 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */; }; + DD90150F490BAE76F0D453455EA73658 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22B5F61E238342B7F2651B4DE5857B44 /* Starscream.framework */; }; + DDE3AC7CA17A63B15423F7A4A31AEAE6 /* ZXParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 8372E75D74E013924560D5687E5C410C /* ZXParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DDFE46D16329A1CAFDE8E07D9F6F8084 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A1F1C5F5EFF4C33056EAF1088E9E7508 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE2534B24D28CAD5D2C0B14445264AE2 /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D0B50681B79F8D39E41675732BE4D6 /* SocketStringReader.swift */; }; + DE32A2993A413AD4A70A33FAB6691987 /* ZXBizcardResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 96BA16BA4887B99913F4FCD4AB7FD99B /* ZXBizcardResultParser.m */; }; + DE45A11F0AEAED5327152BC41FEFE4C1 /* ZXProductParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 51BD5168C9C8B6B7A48A622760B8E087 /* ZXProductParsedResult.m */; }; + DED30C103F9CDE4E0053CE9DCBE20D04 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + DEDB1DD346377084D9B12D417486A181 /* JSONAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = F5DE348ABEF4AEEB28F6FBD506103C1A /* JSONAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DEDD37470134675ED4F8EC518554E5D2 /* ZXMaxiCodeDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A32A95086BFEE989BA9110A456A08E6 /* ZXMaxiCodeDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DEF65EB64591CE2D6F99463627951710 /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = D163AA08EC77D9947EE5573A7EE590E5 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF222AE51D155545CFBD73AF87A3DD2E /* ZXUPCEANExtension5Support.h in Headers */ = {isa = PBXBuildFile; fileRef = AF94683AAB043BAFD7C98D56A6B9F299 /* ZXUPCEANExtension5Support.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF43E16D650023A35F9CD8EAF73785B8 /* ZXGeoParsedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = F125C9C089DA4D43567201F1485C57BC /* ZXGeoParsedResult.m */; }; + DF74915F8F367134FA4277BE9A2F52DB /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E8CA25D03257A99F234AA0E7E688B7B /* UIProgressView+AFNetworking.m */; }; + DF824E7A687730AC8C0D82E617959E9F /* ZXRSSExpandedPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 3090E9B904AB1B164DFEF431FDD79698 /* ZXRSSExpandedPair.m */; }; + DFB76FFA95AFB336F666B20F63C39444 /* ZXRSSExpandedCurrentParsingState.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EE863584B2CE5FF79FA84D75D284787 /* ZXRSSExpandedCurrentParsingState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E0D65A7F368158AF20919447EABA1684 /* ZXEmailAddressResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 083BD5D464E77A7479E80C24C27062C3 /* ZXEmailAddressResultParser.m */; }; + E163727C9170B4464CB7250297A829B4 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EB1EC42888716D62C56F080EBFEC574 /* Security.framework */; }; + E26E326795EDA1C381219EAF939F1B74 /* ZXMaxiCodeDecodedBitStreamParser.m in Sources */ = {isa = PBXBuildFile; fileRef = FD778702C35A82F55E5B0065635FE730 /* ZXMaxiCodeDecodedBitStreamParser.m */; }; + E2CA09BB1F7A39C81FB4D8132B92A359 /* ZXingObjCOneD.h in Headers */ = {isa = PBXBuildFile; fileRef = 11E38139864B924372132AEAA87B24DB /* ZXingObjCOneD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E320DEC88139DC89A673C8150F6A1169 /* UITableView+FDTemplateLayoutCell-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2954D1C7455042E32D975BE36184E2F7 /* UITableView+FDTemplateLayoutCell-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E337E91A8370C5BB12622AC6E18A189B /* ZXDataMatrixSymbolInfo144.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FEE8F9FD0CBC6063EBE78FDF717F5B0 /* ZXDataMatrixSymbolInfo144.m */; }; + E388931A491EFCDD7A4B92836929CB1C /* NSObject+LKDBHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 73FE89B7E2ED57F34CFD8AE3C02ED889 /* NSObject+LKDBHelper.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E40AC5E79BF9DE2489450684BDAD4671 /* ZXURLTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D7FA664D8E8520065963394C33EEA6AC /* ZXURLTOResultParser.m */; }; + E448D5FB85442D010DC68FFDA2DE571E /* JSONModel.h in Headers */ = {isa = PBXBuildFile; fileRef = AED784CAA8D2959F0450D522DFFCED8F /* JSONModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E47B8081CBDDA46D2F0A570DB0572A39 /* ZXAbstractExpandedDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = BC94AB37494391AEF4E2EE0BFB58850D /* ZXAbstractExpandedDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4AB135BE83CC3B34FA5AA61B1677D90 /* Socket.IO-Client-Swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 888F40F9F81D0D0A3492771A2A16A8EF /* Socket.IO-Client-Swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4D49C5F309D5EBA722732930B803786 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = AA7AB3507351BCA6C4527C3BC7312C0F /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4FC555758E18F42C78FC7911E5669BB /* ZXQRCodeVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CB22BCE14EACECFD8F535CE5D81392C /* ZXQRCodeVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E552BCAD950098A51325AB5244034AF3 /* ZXDataMatrixDecodedBitStreamParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 764EBBB80EB48917DC7DEFD4884C727A /* ZXDataMatrixDecodedBitStreamParser.m */; }; + E5DA44E33C8FDB20824D27592C41FE08 /* ZXCharacterSetECI.h in Headers */ = {isa = PBXBuildFile; fileRef = B50F6DB14AA4BF1521ECDA2C83BA1D83 /* ZXCharacterSetECI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E5EBDD83953D2E17DA2025AC0243F3E5 /* IQPreviousNextView.h in Headers */ = {isa = PBXBuildFile; fileRef = A52DB4C293AA3C677B923D21761331BA /* IQPreviousNextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E6D254619488CB7CE6F27274F47D9AB9 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CE43F7A37BA6BC4848BE7C3B4265EE89 /* SDImageCache.m */; }; + E6E4046CE87F092BF609E5BCA3152F68 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 885CC5C7B0CA39367EBA948DF2367B65 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E71A2B242F224F2354702F6DE2E3B99A /* ZXByQuadrantReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A4A17170327EDA50F9392EA804A73E4 /* ZXByQuadrantReader.m */; }; + E771FD3B4BE7F1EFEAE39B65A534D330 /* ZXEANManufacturerOrgSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A0EB3A18258D5F28E5882D5B74216EF /* ZXEANManufacturerOrgSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E77B6ABB0AC7A21F71B54989E8B72311 /* ZXQRCodeMultiReader.m in Sources */ = {isa = PBXBuildFile; fileRef = BF331D85D091C886873AACBA8521FB42 /* ZXQRCodeMultiReader.m */; }; + E780ECCA359E00B11FE6D4F5F94AE3AA /* ZXBizcardResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = AA66F30DD8EC54D685DADC01A7D059EF /* ZXBizcardResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7A7D73ADE45384E37A646D8B17D7774 /* ZXMultiFormatUPCEANReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 501D468C90F4FD85AA177E0B94166125 /* ZXMultiFormatUPCEANReader.m */; }; + E7F72BF560B8B1A12ECC9B24A87FC0F7 /* ZXQRCodeBitMatrixParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 1868B791856C3086A98BF956A3841958 /* ZXQRCodeBitMatrixParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E8031CE350D6AD3EAC28DE6E39103CC8 /* ZXMultiFormatReader.m in Sources */ = {isa = PBXBuildFile; fileRef = B5C161B3A17F0053D10888059B0E0390 /* ZXMultiFormatReader.m */; }; + E8103E369A49C3FAB1E048815628E26E /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = E663718B0995C70CF5CADA3EDEEBDA16 /* SDWebImageDownloaderOperation.m */; }; + E847A30B5A0E54B474076185A75E3C6F /* ZXBitArrayBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 4622950ED6DD64E0457786C3F6DDB3DD /* ZXBitArrayBuilder.m */; }; + E887EB54D7A5D4132B0AE0CC28B6C984 /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 29470A1C268C0A1F1C7B973C23A1F7A8 /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E91C1774AAFB30CA789730C35866A158 /* ZXSMTPResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CBA6DCA9300BCF2EF0155B4180E1B4D /* ZXSMTPResultParser.m */; }; + E9C6A13686CEA7217767CE7ACCFEE249 /* ZXCodaBarReader.h in Headers */ = {isa = PBXBuildFile; fileRef = DF83506140AC0E523AFCA4AA5F101ADB /* ZXCodaBarReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9DFA226A33F536E50D19EC5A7D17DED /* SocketIOStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 633ED391CA5537F706E648B064B3C5A7 /* SocketIOStatus.swift */; }; + EAD3823EB5260D6488EB46459FCFCAFA /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B5B119F06A6B8358EDCBA101FBC565A7 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EAE661E14451AB678CF9F209A8871C01 /* ZXPDF417Detector.h in Headers */ = {isa = PBXBuildFile; fileRef = D29AD0080BCE0785070F2CCE5E2A98A1 /* ZXPDF417Detector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB2F7B1E7FAD2BA860CD74037B3E2F6A /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 222C872FBA997E76330938B9E40A8682 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB39031121BBC0DB7E53884D7518B15B /* ZXAI01decoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 82A0A0268CD5C11EE39566CEFC051FCC /* ZXAI01decoder.m */; }; + EB951ACB50E3FE6A853DFB4DDB2E77A8 /* SocketEngineWebsocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF6F053DFBF0307477DF134AE5D856D /* SocketEngineWebsocket.swift */; }; + EC0F5152CA743490D954C6FD10064F23 /* ZXAddressBookAUResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 58152A29FD0754C8C6A60CB925ECBC14 /* ZXAddressBookAUResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC276D99797A5947F84D1AB0BDD5B215 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 915CC73C8057CA2817230A48BC6A391F /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC7D17FE2711C8D82918606F046B3E97 /* ZXUPCEANExtension2Support.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F1FD21A8EC878A093097A79EAE9794 /* ZXUPCEANExtension2Support.m */; }; + ECB10E82B16BC43A414F07DD978D2E33 /* ZXAztecReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 289025C9E451189A3ED0A2EC1C7D5D08 /* ZXAztecReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED0E54165F2CD68DF828A45E198649E6 /* ZXCalendarParsedResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 854337CBDE790AC6A849C488D88DD95A /* ZXCalendarParsedResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED159AC56D7FABFB161CF365E5D083C2 /* NJKWebViewProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E4B09EF879FBFE955837502D34D1D94 /* NJKWebViewProgressView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + ED9011138298605948BC522466ADEE5A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + EE57C4E1072D696BD8271EA8D97D8712 /* ZXSMSTOMMSTOResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = CB225636F78714CDD7C23A1CDED2950F /* ZXSMSTOMMSTOResultParser.m */; }; + EE58BB78F1C469E67F8A0366B591A129 /* ZXMultiFormatUPCEANReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 21468CDD938A989703138053AE77030C /* ZXMultiFormatUPCEANReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EEDC5683FF36946364A3C8344630705B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = B9B74C9E2B2FBDE9323B830B5DA70875 /* MJRefreshBackFooter.m */; }; + EEF9EAFD9C41D216358A69A9832976B5 /* ZXPDF417Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DFD2AAF89151AC91154C3F2CBA601F3 /* ZXPDF417Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF75902B18FB401741AF57D2C8DE97EF /* ZXAddressBookDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0777A67F01AC971695E18A08A98D4887 /* ZXAddressBookDoCoMoResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF75D2BC8ABF049BD048E7C9F32DBAE6 /* ZXCode39Reader.h in Headers */ = {isa = PBXBuildFile; fileRef = 122B6F4C1CA16FE50862CDD2A4393CCD /* ZXCode39Reader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF873453BEEE867C2F8C43660CEB4A78 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C00DAF50A01872D19E25D7471E10CD9 /* MJRefreshNormalHeader.m */; }; + EFCD757A09DE5104AABE56A9A5F0B283 /* ZXPerspectiveTransform.m in Sources */ = {isa = PBXBuildFile; fileRef = 65E17E7519CE6AE45BDA3805E3DD573F /* ZXPerspectiveTransform.m */; }; + F024CC151BA9C2DCEEEDB1857C832CB8 /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 4222704655BCC2B7F4DD2BACB2C4AB0C /* MJRefreshConst.m */; }; + F0899E97EF9D85A2C56087BE042E45BD /* YTKKeyValueStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C642BCE8751CFC9BC013D0BEA36D455B /* YTKKeyValueStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0F866DEA9A3649D79D45313A434B44F /* NSObject+LKModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 0261143F731CF8A7A25FC2017DEA766E /* NSObject+LKModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F1060140AE84EB6DC294469065230715 /* ZXModulusPoly.h in Headers */ = {isa = PBXBuildFile; fileRef = DBF88A9781D801A31F8EF26E52BA46E1 /* ZXModulusPoly.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F1A67CDA78C57CE8E65AD8EB230BC24E /* SocketEnginePollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F92E90DB24B107777D3809F3BF15DEE /* SocketEnginePollable.swift */; }; + F1D57D554CA4714B5416999B93FBAB54 /* ZXDataMatrixDataBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 09641018C9FF907DE85D6D78C7B3A4AA /* ZXDataMatrixDataBlock.m */; }; + F1F7EA0A021AF4A11E1C1D221186B378 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FB61DDB2E7A09B5F41E3BB2AA655388 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F1FEFCC47B84063C09BB15EFC61C6347 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3854EE037BCFCFBE75285E6DAF8AB535 /* UIButton+WebCache.m */; }; + F203AE2DFE177121F02FED459BB84687 /* ZXCodaBarReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 2496264F0AEA771F215049454D226C60 /* ZXCodaBarReader.m */; }; + F2B27FE21DE67A8FC4FF1C83C15BF57E /* ZXTelResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = A91BF9681A7A223AEA3D079A4CF53340 /* ZXTelResultParser.m */; }; + F2D2FE3B9DB1610D8EFAB393A3412DB7 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9100592460B4D50C5A7AFF91703629A2 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3411A3199EF156A6FA8410E2AFBD498 /* ZXDataMatrixDefaultPlacement.h in Headers */ = {isa = PBXBuildFile; fileRef = 781061E8CBBE400CA3C48F949E3433F9 /* ZXDataMatrixDefaultPlacement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3828E4AE119C25F440502A955636D95 /* ZXMaxiCodeReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 535DA116BAAB37F8CF70E83072E83A05 /* ZXMaxiCodeReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F396A2DD2B4E525CE65223F308CBE755 /* ZXLuminanceSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 5057D117FDFC92545A80B8426FD78378 /* ZXLuminanceSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3B0CDDB431A0EC25F89BBFCED02400A /* ZXPDF417.h in Headers */ = {isa = PBXBuildFile; fileRef = CF50F39459202862E20B8C58DA748AD4 /* ZXPDF417.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F41FA61294C6ABEEAEDC06A420AD696E /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 63EDB2249CF51415D65BA08E28489D71 /* MJRefreshBackGifFooter.m */; }; + F45F46F25C98F06E54806AE8938BC1AF /* ZXBitSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 290A16571BB7520DECA3387040A15502 /* ZXBitSource.m */; }; + F49F47AFAD2D3D8854BD0B3CE4B6746C /* SocketIOClientConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A448F51B392A1B9BD7106633EF062E2 /* SocketIOClientConfiguration.swift */; }; + F53E3A2A1B6B94BF66E65E3A048C6769 /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A1725A50F6434DA07CB5D66F836BB43D /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F5485D59518D671416CA6384506B9357 /* ZXAztecCode.h in Headers */ = {isa = PBXBuildFile; fileRef = C4BB8EA3DE2CFA86580C6439A7B6AA78 /* ZXAztecCode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F5577C693F3C4420996A1D213A58E160 /* ZXPDF417ErrorCorrection.h in Headers */ = {isa = PBXBuildFile; fileRef = 65DD34D63236EF6FCFD051AF525BC0D2 /* ZXPDF417ErrorCorrection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F56C6E43364273BBC683BFB665474A22 /* ZXDimension.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FE42BE7BCA3CE402490A8B69B7CE40C /* ZXDimension.m */; }; + F58D221824568EA7E38192C619CBE122 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AFD87FE1A7D3CA4E660728863DA59FD /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F69D5706B6378625288304ECCEE950CB /* ZXStringUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F34F2EF45A13B35D16AF0C93736418D /* ZXStringUtils.m */; }; + F6CC713842A0E6058D732A18EA198BBE /* ZXRSSFinderPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 59CCB593B1DE9C198FF201163EFEDBF2 /* ZXRSSFinderPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F70096947E7F91201BC9FACCF008FE9C /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 487563F965DF353FF2A0C6737EBC43AC /* NSArray+MASAdditions.m */; }; + F737E60C98B60846FF5C659B592F37E5 /* ZXGenericMultipleBarcodeReader.m in Sources */ = {isa = PBXBuildFile; fileRef = FDC286719F3D12D3031C6AF4E4CA9F42 /* ZXGenericMultipleBarcodeReader.m */; }; + F7A5376102E8A5DDE3B67B1F01497D03 /* IQKeyboardManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DB3698AA6971F6CC730B057DE45FF66D /* IQKeyboardManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F7FC2DCB2D02DD52F9F733EB52177CC9 /* SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 89A4FB5318F041C2B8128B21D9041281 /* SRWebSocket.m */; }; + F8304A21D9A946D5427654E384E43549 /* ZXEAN13Writer.h in Headers */ = {isa = PBXBuildFile; fileRef = 195EDA9DAC14879762DC64F44F971E28 /* ZXEAN13Writer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F867ED173D4B0920CAB4F91AE032F6E5 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF7086537D9860DBA1838A2CF738478 /* SDWebImageCompat.m */; }; + F87FADD74353A77EE8D4138D8D048776 /* ZXIntArray.h in Headers */ = {isa = PBXBuildFile; fileRef = EDA5B7474BF04615A19FDD06655BD282 /* ZXIntArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F8A7F36435DBE9032B5C003C531491EE /* ZXReader.h in Headers */ = {isa = PBXBuildFile; fileRef = FDCD5113FECC761B95401D1081DAAE46 /* ZXReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9907950B02A484F2A05246D7645DFC6 /* ZXAztecWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2405D3601EAFE080F875AB04D1E1E56A /* ZXAztecWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9A94F5870BF1F51D62AAB43BDBEBDE2 /* ZXQRCodeFinderPatternInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAB10ACA72A07CB48983B9EE04817C6 /* ZXQRCodeFinderPatternInfo.m */; }; + F9F580E9A55FB9E211E73BEDC0DFE3D9 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DD5409A692C83437C558559DD416E60 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FA4D5BB0A7CC863C9B52E990ED4002CB /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EF62BFCE82564E335A65CB3784EA01F /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FAB04BE86174037AD5E9B3A8F55F537F /* ZXMultiFinderPatternFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = DB7CC752C2DB1864FF638CB915DA6773 /* ZXMultiFinderPatternFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FAB3DA08A21A0B281718F6917C922815 /* ZXSMSMMSResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 0192CAFAE90CB2862C47450C6E61048B /* ZXSMSMMSResultParser.m */; }; + FABDC970968F0D4859F0BD67A03D3BDA /* ZXDataMatrixEdifactEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = AD01537600F1A880767C84B81F08E093 /* ZXDataMatrixEdifactEncoder.m */; }; + FB1802782C09F43938EDAEAD30BEDA76 /* ZXReedSolomonEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = EE2049030398CDE661B0B7C3C283BDDD /* ZXReedSolomonEncoder.m */; }; + FB9F59605DF451DA9A944D335D27203C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */; }; + FC283D1BA2F662B3502607AB7F337A25 /* ZXDetectorResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B34300FE923A79BD2BCE7C5D6584292 /* ZXDetectorResult.m */; }; + FCB209DFAFF4721A4AA51197AB2D7016 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 62DB1127BBB610074D9DD441518B890A /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FCE43D464D18874613D40BCAF034A404 /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 448563F35B5EBE456D58CC5DB9B6E732 /* MASViewAttribute.m */; }; + FD43E2938AA74FFAEF5D8586F123633E /* ZXEmailDoCoMoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D599C849A81087BE4C9522B4A37FC9F /* ZXEmailDoCoMoResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FD7A36750DCF463CEA1958FE5CA5A1B1 /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1289BA734A4A2D403F72FC21D6E271E6 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FDD8EA80A701E1FDE822BACDE407CE53 /* ZXUPCEANExtensionSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 063322A1ADA284D45655C332FDE0E76E /* ZXUPCEANExtensionSupport.m */; }; + FDE10165B2A62756247FD9DA4503D9BD /* ZXGeoResultParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B9D75D4563F947C4DE7C065F52E210E /* ZXGeoResultParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FDFCBD17D90E97102EEEAE34EC5D7052 /* ZXResultParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B02D371A5D3120103B193250201C8A1 /* ZXResultParser.m */; }; + FE66EF8D47514D23E7551E2C95C765D8 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CAF15FF37FEE65A4BD8CB5EB924D9792 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FECC3B1D6A518337B348474CDB24756F /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A59DFE19B9EBF62E4DDFDCB70E98F /* UIImage+GIF.m */; }; + FED8C903661CCC5A88D7D830D020845A /* ZXMultiFormatWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87E787E2C141BAA67804F927DE99336B /* ZXMultiFormatWriter.m */; }; + FEDF18C5BE342834EEC1EAB9DE4C30DF /* ZXRSSExpandedDecodedNumeric.h in Headers */ = {isa = PBXBuildFile; fileRef = BC14B8BC598E29944651EDC8E5BF3E98 /* ZXRSSExpandedDecodedNumeric.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF12B4BE37652AC565ED618C106CFE10 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 13F4310737FA0422C581F7E03BEF1C03 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF6F1B87F7E92DA128CF3AB4F5EC7F6E /* ZXQRCodeErrorCorrectionLevel.h in Headers */ = {isa = PBXBuildFile; fileRef = CADA9EFA3FCABD0FAC6FE8DC1B421D8F /* ZXQRCodeErrorCorrectionLevel.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 01E07FDE67675FAB1B4CDDB0CFB15A5A /* PBXContainerItemProxy */ = { + 1D2F327649D188F8E7A87E0E78333C51 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E14A62900910444707A5504D25EC98DC; - remoteInfo = MJRefresh; - }; - 02AD085923257926101043ECBDA0B642 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D52144DE9D7255DE912490FF5A806573; - remoteInfo = Masonry; - }; - 0CB6BCAA410A24DDCAB7891977A91996 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 251BAD17812F7EBF6532EACF66F941C3; - remoteInfo = FMDB; - }; - 174E6C2171B05DD68BDA9FF3114D98FD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 43F697FCA8E9557F575EBF7DC785AFD4; - remoteInfo = YTKKeyValueStore; - }; - 1E4EF142FFB1473CAEC44BD562F17C8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 251BAD17812F7EBF6532EACF66F941C3; - remoteInfo = FMDB; - }; - 42C98B0B09DABB12204DFF9FDEFE2BEB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6B1714E816AE794962516E2ECBB40A5A; - remoteInfo = MBProgressHUD; - }; - 476568165F539EF85B0F5D26800B1E50 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 203E2ACFC533A5A3C189DF6DCDF9A3CA; - remoteInfo = Toast; - }; - 565145C78EF9F332BB48DEDC973C1DA9 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D55833EC3DE9EBD9B329CAEB983D5A9D; - remoteInfo = IQKeyboardManager; - }; - 7CEAB308D3E048B456470272A1F49E79 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = F4160500DCEA3DA3E93FBA579E88CA0A; - remoteInfo = AFNetworking; - }; - 88165B3DC6F1DD9D85F485FF523A7B7F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = E0D1006C742EBDDD3F2BF40A564ACBCB; - remoteInfo = Starscream; - }; - 8A906A446E3695C9C80C35AF0D8D128A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 251BAD17812F7EBF6532EACF66F941C3; - remoteInfo = FMDB; - }; - 96033F3DE39CB124CE5C342CDB6D3638 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 6B8D192C8CBB4BF55A7F9B79C12280DB; + remoteGlobalIDString = 3FDA1ED51BACF2A55760CB610A5952FE; remoteInfo = SocketRocket; }; - 9C3EF21F4556D671BA3BE7400A55E897 /* PBXContainerItemProxy */ = { + 2476A57611200FCAEFC4EFD6299AEEF1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 826EFF975442065A54A0B2D3103EE6A4; - remoteInfo = NJKWebViewProgress; - }; - AC37C85FA38ECD5BF75ADA47577069D8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC3688684BF42A20A8998F31DDA51A49; + remoteGlobalIDString = F6E4F5C61825ACB370E59562B9CDB407; remoteInfo = JSONModel; }; - BC9806EDCB11E0B99C6381C9C331547D /* PBXContainerItemProxy */ = { + 28AB62E59D5B56A11A9D6BEC31639603 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 1EB527CCE1B0F3D64088AFF319F1FBA4; + remoteGlobalIDString = 1BEA4448CAF18B76846444E6AE7C7546; + remoteInfo = Toast; + }; + 2A81C06EF24F92E12936E5618B2D9D14 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = FA1290BD9C46E61BF154FE7DDA8D128C; + remoteInfo = NJKWebViewProgress; + }; + 56AC3DA124BDAD9919E16A985BA30E57 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A938F7AB77B92F5273D43659F12031AD; + remoteInfo = IQKeyboardManager; + }; + 65F705FA74A8D963D2A4A5D17D9ECB2D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0656CD2BE0FB0A99456605A137B14A8A; + remoteInfo = "UITableView+FDTemplateLayoutCell"; + }; + 768EE0E3734BED2F0B36E60B6B9C3FBA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = EAE60BD2ADA8DCB217E116ADB628185C; + remoteInfo = AFNetworking; + }; + 78A5F4FB9778A8500F6313408930292B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0F3C96ED140272710A6DBB0D5160C4BE; + remoteInfo = YTKKeyValueStore; + }; + 80EAEA3E8FC7515D044B9838BA9A31D4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 01B52F53C563BB35B7989239BE79A18B; + remoteInfo = FMDB; + }; + 9F9E08DB86D1C18DBB762180583184D4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = FF7468B4F5259B98018DD1ABAD2D2593; + remoteInfo = Masonry; + }; + C71BD7E816CFE5489EBA3E0BB9FC7D35 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 01B52F53C563BB35B7989239BE79A18B; + remoteInfo = FMDB; + }; + D0DE694AD89D8DB3722F059818E43A67 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = B18ACDBC4A945B03194AEC88D59D9CA9; + remoteInfo = MBProgressHUD; + }; + D5C6E922B97256B5D5C69552F034D503 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 16F68B5CBE5CC3F4678A1D70F1C55D39; remoteInfo = TTTAttributedLabel; }; - C76985D2A0135055E2ABBA833FC64D06 /* PBXContainerItemProxy */ = { + DC7F748D13F710EF89792A351A4CCF33 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E0D1006C742EBDDD3F2BF40A564ACBCB; - remoteInfo = Starscream; + remoteGlobalIDString = 54B4749AF88450A71D699C9EBA4EA9C0; + remoteInfo = LBXScan; }; - D4BE66B430547E25A22F38975F6DA9C5 /* PBXContainerItemProxy */ = { + ED0D36E2BF7DE830DA2E9FCF4F733E75 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = CCA9C33B127D6C859A3F8AFBEFCBABF0; + remoteGlobalIDString = F021BBC57C82DEFE283FCD90518F5AC4; remoteInfo = LKDBHelper; }; - DA15677B5BEEF2B52CC8D1DB79DA0071 /* PBXContainerItemProxy */ = { + EE991CE7F6A19903FFA81C36F6325083 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 3578E512F8C94E9B49F88CAA98690402; - remoteInfo = "Socket.IO-Client-Swift"; - }; - DED752E9FC0AA5300D528DB0E9124181 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = D90CADD9FA47277BDDDE85CFC0082CA0; + remoteGlobalIDString = 1833D3C7CD0433421BD88C8B00B8D75C; remoteInfo = SDWebImage; }; - F3C75840DD6E63711A0AEAEDF330E105 /* PBXContainerItemProxy */ = { + F123EE9B5973A4871BCCBF0BAD58A6F6 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 57DFE3ED684FE796F4717C7ABAE517F8; - remoteInfo = "UITableView+FDTemplateLayoutCell"; + remoteGlobalIDString = 01B52F53C563BB35B7989239BE79A18B; + remoteInfo = FMDB; + }; + F5FD1299D9F05F7D5DDAFA6FC4DA3F29 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 546B747B9DB0515E059EEBA0B9E98B42; + remoteInfo = MJRefresh; + }; + F6E9B6DA89ED17A96F9D64422AE14881 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FF23E172EC401782F56F65C2FF4688A; + remoteInfo = "Socket.IO-Client-Swift"; + }; + FABC6CACB674D4021F3BDC76346F539F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 701274A44ABD738F6AFAB306D4FC0A44; + remoteInfo = Starscream; + }; + FC87DE2B7484657C155DF737C56F5803 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 701274A44ABD738F6AFAB306D4FC0A44; + remoteInfo = Starscream; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 000DFBF02B432D3298058B56ED47BA1B /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = ""; }; - 002CC32FEB8FB1D1B4D4BA9D7AE0CB41 /* SocketEngineClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineClient.swift; path = Source/SocketIO/Engine/SocketEngineClient.swift; sourceTree = ""; }; - 00CC387D226EFBC6389FAA62F3DD873A /* FMDatabasePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabasePool.m; path = src/fmdb/FMDatabasePool.m; sourceTree = ""; }; - 00DBB0CB01217AA64958D2E4F6059B2B /* LKDBUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKDBUtils.h; path = LKDBHelper/Helper/LKDBUtils.h; sourceTree = ""; }; - 027B44E48FB40AD9D0DC25B70D6AE8CE /* SocketAnyEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAnyEvent.swift; path = Source/SocketIO/Client/SocketAnyEvent.swift; sourceTree = ""; }; - 029A3331019368C8C30B8DA9778E0794 /* MJRefresh.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh.framework; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 03EF23265306A2A5CFD07B28F6BC0D66 /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Sources/SSLSecurity.swift; sourceTree = ""; }; - 042DC3BCC2842104D6A45CA51DC3F42C /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; - 044E5621EF88BE1E4C8B35094500FCA8 /* TTTAttributedLabel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTTAttributedLabel-umbrella.h"; sourceTree = ""; }; - 048638E84A58D781817B05B69F5DB76D /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; - 053338AFC5DFA5DC334E688DA16499C6 /* FMDB.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FMDB.xcconfig; sourceTree = ""; }; - 05657BFF7C0A29CF6F1BE61DB6523EC4 /* WXApiObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApiObject.h; path = WechatSDK1.8.2/WXApiObject.h; sourceTree = ""; }; - 059F55EFCCF65A29688CF615E5AD5415 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; - 06F7DF71211917C6613F190B1D9CEA2B /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking.framework; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 07A743B083B30311B1DDC3865184A2E6 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; - 07BAC4DCA1D385E6719FCD0A2C3518E8 /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = ""; }; - 07CCB23292D6E83E10E681E65611A521 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; - 0B2F88F5CE468EE56C4A34CF3433FFE0 /* SocketRocket.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SocketRocket.modulemap; sourceTree = ""; }; - 0B853C173AC47459374FA5127503AA4D /* JPUSHService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = JPUSHService.h; sourceTree = ""; }; - 0D16FD952562C34388EC43F2A7733B27 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = ""; }; - 0EE88FA017BECDD56594C950358507E0 /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.h; sourceTree = ""; }; - 0F329A9EA016DA0D20BA2C5C7D0DAC79 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SocketIO.framework; path = "Socket.IO-Client-Swift.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 10209B83220731CD89F3BE7CE9C254D0 /* NJKWebViewProgress-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NJKWebViewProgress-umbrella.h"; sourceTree = ""; }; - 10EDF99232E824A4129018791B729BC7 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; - 118814FC7D9B5A7CF1BF99F325AF8488 /* JSONValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONValueTransformer.m; path = JSONModel/JSONModelTransformations/JSONValueTransformer.m; sourceTree = ""; }; - 11CBDFE3700AD26E36AFB9E669E902DD /* MBProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MBProgressHUD.modulemap; sourceTree = ""; }; - 12BE137618AD905F6C08A0688A5AEC0F /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; - 1501D5687E1AF56AAF3E46B413F8A46B /* Socket.IO-Client-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Socket.IO-Client-Swift-dummy.m"; sourceTree = ""; }; - 1512D35F866701255C740BB8D89CB037 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 17CD040301E2941CF1307C11668F0335 /* IQPreviousNextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQPreviousNextView.m; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.m; sourceTree = ""; }; - 18230792D7301ED554D8EBE3D27C83C6 /* YTKKeyValueStore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YTKKeyValueStore.xcconfig; sourceTree = ""; }; - 18DDE12559A163C7C94F4FE3A82C3212 /* UITableView+FDKeyedHeightCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDKeyedHeightCache.h"; path = "Classes/UITableView+FDKeyedHeightCache.h"; sourceTree = ""; }; - 1942BB9A9B0208E8A598BB2F1563A2D0 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; - 1B118355C6E3369C778E749125C4F8AA /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; - 1B2009C43A73788FC750D0B1C40ECA60 /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; - 1B4BDE950FE4B829BD4E2D8E0B86A002 /* JSONHTTPClient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONHTTPClient.m; path = JSONModel/JSONModelNetworking/JSONHTTPClient.m; sourceTree = ""; }; - 1CA5AAF13D2E09670AF9CBA0B18BF39F /* Socket.IO-Client-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-umbrella.h"; sourceTree = ""; }; - 1D11F0C588A7F5B9D6536F3DFDEFD786 /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; - 206777951591DDC2438D5F454A71CB8A /* IQKeyboardManager.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.xcconfig; sourceTree = ""; }; - 214889649505797427D153AFE63862E7 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + 004F6E5045671D830987CF2BA82B1B56 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; + 00F8C95E50F8763425E1BD4D28EB0464 /* ZXDataMatrixHighLevelEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixHighLevelEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.m; sourceTree = ""; }; + 012787B59372AB66F03C42636485A397 /* ZXRSSExpandedGeneralAppIdDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedGeneralAppIdDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.m; sourceTree = ""; }; + 013777DCCD1ECAC13DCF051BEFB038CA /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; + 015B8D14A645C8CFF87D3707F0EDA333 /* SocketLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketLogger.swift; path = Source/SocketIO/Util/SocketLogger.swift; sourceTree = ""; }; + 0192CAFAE90CB2862C47450C6E61048B /* ZXSMSMMSResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXSMSMMSResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.m; sourceTree = ""; }; + 01AE0C0079CA9AD58E9E0F21D47EBEF7 /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; + 01CC4847595A600A6F7A4AC54DD76D94 /* libWeChatSDK.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libWeChatSDK.a; path = WechatSDK1.8.2/libWeChatSDK.a; sourceTree = ""; }; + 0261143F731CF8A7A25FC2017DEA766E /* NSObject+LKModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+LKModel.h"; path = "LKDBHelper/Helper/NSObject+LKModel.h"; sourceTree = ""; }; + 029DEC3AB19B4BAD32ECBD82D8BAA683 /* ZXAI01393xDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01393xDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.m; sourceTree = ""; }; + 02EB3F876F91CCE54C8A839D6390D7A5 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + 02F88EB2E69381607336D7A30F9B4F54 /* Pods_GIGA.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GIGA.framework; path = "Pods-GIGA.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0369659D7DD2AF8AC3111E85E262AF41 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/CoreVideo.framework; sourceTree = DEVELOPER_DIR; }; + 03C3828079E1442E9180739A8AF872BA /* ZXIntArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXIntArray.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.m; sourceTree = ""; }; + 03EBC956C1D11E846DAB8041CAB8952F /* MBProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.xcconfig; sourceTree = ""; }; + 0414764905B2B0FF38AE7C13ECC40826 /* SocketRocket.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SocketRocket.modulemap; sourceTree = ""; }; + 04187936C4D64135EB529CC632A514C4 /* ZXDataMatrixSymbolInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixSymbolInfo.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.h; sourceTree = ""; }; + 0419923E664360BC040CB84E1A475782 /* ZXAddressBookAUResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAddressBookAUResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.m; sourceTree = ""; }; + 0432D6495063422ABDDC654AE4F8B470 /* ZXCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCapture.m; path = LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.m; sourceTree = ""; }; + 04E020596EA2153E370B4CA94419609B /* ZXCode93Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCode93Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.h; sourceTree = ""; }; + 050F5D4A18A243F44CD990ED0FD713A8 /* SocketPacket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketPacket.swift; path = Source/SocketIO/Parse/SocketPacket.swift; sourceTree = ""; }; + 0513E585A677A67FB93767E315B26865 /* NJKWebViewProgress.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NJKWebViewProgress.xcconfig; sourceTree = ""; }; + 052791EEF6C86CD2DB1E787879E0955A /* ZXUPCEANReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEANReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.h; sourceTree = ""; }; + 0529DF2E890AB3AF1B781651D27A1982 /* ZXRSSExpandedDecodedNumeric.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedDecodedNumeric.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.m; sourceTree = ""; }; + 0555A175C6506EDB9FA66314527444E0 /* ZXQRCodeBlockPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeBlockPair.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.h; sourceTree = ""; }; + 056143C341215C6A0AF28738796461AE /* ZXQRCodeMode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeMode.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.h; sourceTree = ""; }; + 063322A1ADA284D45655C332FDE0E76E /* ZXUPCEANExtensionSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEANExtensionSupport.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.m; sourceTree = ""; }; + 0733D9959D7D57A038684144B9787970 /* JSONModel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JSONModel.xcconfig; sourceTree = ""; }; + 0747D4EA06CA97B015B24FCB55985F62 /* FMDatabasePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabasePool.m; path = src/fmdb/FMDatabasePool.m; sourceTree = ""; }; + 0777A67F01AC971695E18A08A98D4887 /* ZXAddressBookDoCoMoResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAddressBookDoCoMoResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.h; sourceTree = ""; }; + 07C6B44F09A86EF5C27ACF2778099DEB /* ZXDataMatrixSymbolInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixSymbolInfo.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo.m; sourceTree = ""; }; + 07CAAFBE787F94EBAB0F50E7F7F1CD83 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = ""; }; + 07EA8071692902994827F0AC1023B6F4 /* ZXCalendarParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCalendarParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.m; sourceTree = ""; }; + 0821005DFFA124EFE1E769C35CFDE5AC /* ZXRSSDataCharacter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSDataCharacter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.h; sourceTree = ""; }; + 0837B9947C721571ED0E10CD0BEFC76B /* ZXRSSExpandedFieldParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedFieldParser.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.h; sourceTree = ""; }; + 083BD5D464E77A7479E80C24C27062C3 /* ZXEmailAddressResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEmailAddressResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.m; sourceTree = ""; }; + 08454D1CB8980B210F9094853CDF4FDC /* ZXDataMatrixReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixReader.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.m; sourceTree = ""; }; + 0851E17699603C47D519E246AA85E844 /* ZXPDF417BoundingBox.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417BoundingBox.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.h; sourceTree = ""; }; + 089311B62F1C5BB0F120AC6B4ED43CFF /* ZXGenericGF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGenericGF.h; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.h; sourceTree = ""; }; + 08A4F01BFD5CE4F8C310A8F702E11D51 /* ZXPerspectiveTransform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPerspectiveTransform.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.h; sourceTree = ""; }; + 08DD40F0011A8931DC463C4414CA18BD /* SocketRocket-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-prefix.pch"; sourceTree = ""; }; + 0920463F74491C55DB9068AF51DB39D6 /* SocketEngineClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineClient.swift; path = Source/SocketIO/Engine/SocketEngineClient.swift; sourceTree = ""; }; + 0945410B8D753F082469457C094359D4 /* ZXRSSExpandedBlockParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedBlockParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.m; sourceTree = ""; }; + 09637B16C908D125DF0B7864F1CC9AF6 /* ZXPDF417BarcodeMatrix.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417BarcodeMatrix.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.m; sourceTree = ""; }; + 09641018C9FF907DE85D6D78C7B3A4AA /* ZXDataMatrixDataBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixDataBlock.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.m; sourceTree = ""; }; + 099FF98B477834609DA28D17D54F8492 /* ZXQRCodeAlignmentPatternFinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeAlignmentPatternFinder.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.m; sourceTree = ""; }; + 0A66899D553769F07E1441C3B9394C64 /* ZXCode128Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCode128Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.m; sourceTree = ""; }; + 0B1A2A3CD6B1092487E88EDA72E8E3EC /* ZXDataMatrixBase256Encoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixBase256Encoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.m; sourceTree = ""; }; + 0B3F57FF8C5CE705D7BA3F15CEBC9E87 /* IQKeyboardManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManager.modulemap; sourceTree = ""; }; + 0B470F703305B8F7168FCA96E9DD96B3 /* ZXITFReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXITFReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.m; sourceTree = ""; }; + 0B4D7786EE2660AC3DC4E70BDF860D37 /* JSONAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONAPI.m; path = JSONModel/JSONModelNetworking/JSONAPI.m; sourceTree = ""; }; + 0CBA6DCA9300BCF2EF0155B4180E1B4D /* ZXSMTPResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXSMTPResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.m; sourceTree = ""; }; + 0D14B74F7C07C073476B4274CF8C5A19 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0DFA91E6480FEE73F386377B85AD82CA /* ZXProductResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXProductResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.h; sourceTree = ""; }; + 0DFD2AAF89151AC91154C3F2CBA601F3 /* ZXPDF417Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Reader.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.h; sourceTree = ""; }; + 0E32C1C5A27F32CC54003033BD4B494F /* ZXMultiDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiDetector.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.m; sourceTree = ""; }; + 0E5698041AB137552E3373832AD90304 /* Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Compression.swift; path = Sources/Compression.swift; sourceTree = ""; }; + 0E7A59810B5A5380436134148AC1E645 /* ZXWifiResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXWifiResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.h; sourceTree = ""; }; + 0EF80E24923EC548EF6E33E2DD36E035 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; + 0F50C576B0963F7051702D5A33347F18 /* ZXWifiParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXWifiParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.h; sourceTree = ""; }; + 0F6DD1021CBBDB8B2572A03DCA7C12F9 /* FMDB-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FMDB-prefix.pch"; sourceTree = ""; }; + 0FE42BE7BCA3CE402490A8B69B7CE40C /* ZXDimension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDimension.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.m; sourceTree = ""; }; + 1013005211D3D77D44C1591B8966AB36 /* ZXResultPoint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXResultPoint.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.m; sourceTree = ""; }; + 102E0EC620D38D22A57CAA9F8ED30D9B /* ZXEmailAddressResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEmailAddressResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressResultParser.h; sourceTree = ""; }; + 10551AC9C89F0B2C28B79272A54229A7 /* ZXMaxiCodeBitMatrixParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMaxiCodeBitMatrixParser.m; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.m; sourceTree = ""; }; + 11A7142162FC9EA47BFB9A6DED72DBC6 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; + 11E38139864B924372132AEAA87B24DB /* ZXingObjCOneD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCOneD.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXingObjCOneD.h; sourceTree = ""; }; + 120BA624AE647B5ABA6B42796EA80AED /* FMDB.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FMDB.modulemap; sourceTree = ""; }; + 12204C88A320C0301A141E6E87004AFD /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; }; + 122B6F4C1CA16FE50862CDD2A4393CCD /* ZXCode39Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCode39Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.h; sourceTree = ""; }; + 1289BA734A4A2D403F72FC21D6E271E6 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = ""; }; + 12B43532712994B7C42D9AF9ED032299 /* ZXingObjCMaxiCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCMaxiCode.h; path = LBXScan/LBXZXing/ZXingObjc/maxicode/ZXingObjCMaxiCode.h; sourceTree = ""; }; + 130B45A77410E0950AC225E68E32281C /* ZXOneDimensionalCodeWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXOneDimensionalCodeWriter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.m; sourceTree = ""; }; + 13E1618865273A37407ECCBB6FE73D7E /* ZXQRCodeDecodedBitStreamParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDecodedBitStreamParser.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.m; sourceTree = ""; }; + 13F4310737FA0422C581F7E03BEF1C03 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; + 13F7B9CBAB0CB01818519C819CAF02C5 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; + 143FB6B44654C24BB8B89753BFC2F90E /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; + 14464B5FE9352E85A2481638DF324A31 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; + 149ED688511312E137DA74ABF4A7D5DF /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = JSONModel.framework; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 14A80D785536E522E2A574957742F4D6 /* ZXAI013x0xDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI013x0xDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.m; sourceTree = ""; }; + 1558559131A84E06FE4C17C8B92D445F /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + 1616C6AFF0D30BA7956FE92E35E55C9D /* LKDB+Mapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "LKDB+Mapping.m"; path = "LKDBHelper/Helper/LKDB+Mapping.m"; sourceTree = ""; }; + 1698054241CF0AFCAA137F12BB563CFD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 16B438DFFD1EE04C86A551BEE91E8A2F /* ZXEANManufacturerOrgSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEANManufacturerOrgSupport.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.m; sourceTree = ""; }; + 178D59A68923C38B4F19249B6B7FE990 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; + 179AE6112321A9E63ADF069B0BEEC72B /* ZXMultipleBarcodeReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultipleBarcodeReader.h; path = LBXScan/LBXZXing/ZXingObjc/multi/ZXMultipleBarcodeReader.h; sourceTree = ""; }; + 17B2AE35E410AC8314C9D3D7EE50DF7A /* SocketRocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SocketRocket.h; path = SocketRocket/SocketRocket.h; sourceTree = ""; }; + 17D561C32CB8DBDDB9692DB49D6C7B73 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = ""; }; + 18653B1A7B81EC7FA4D888702040D042 /* Masonry.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.xcconfig; sourceTree = ""; }; + 1868B791856C3086A98BF956A3841958 /* ZXQRCodeBitMatrixParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeBitMatrixParser.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.h; sourceTree = ""; }; + 192EEBD3CCFBED410B71949E0998E05D /* ZXDataMatrixDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixDetector.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.h; sourceTree = ""; }; + 19490D720868336935EB60BB2F381887 /* ZXReedSolomonDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXReedSolomonDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.m; sourceTree = ""; }; + 19513CB18A035454268A40D605F1B344 /* ZXDetectorResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDetectorResult.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.h; sourceTree = ""; }; + 195EDA9DAC14879762DC64F44F971E28 /* ZXEAN13Writer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEAN13Writer.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.h; sourceTree = ""; }; + 197B0CA737D48087000F5D18E12A4555 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1AC58043E8A387745ECF2111F22DC0F3 /* ZXAbstractRSSReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAbstractRSSReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.m; sourceTree = ""; }; + 1ADF48BE5CBD694F1213EC6A289C9B8A /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; + 1B2F7A05CD667B7F4431FA132E462FC9 /* MJRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.xcconfig; sourceTree = ""; }; + 1B683D5CDF5103810E86EA34F3FA3CCF /* ZXByteArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXByteArray.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.m; sourceTree = ""; }; + 1BAD6ACDBC53A067FEF7F34A04942ECE /* ZXMaxiCodeDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMaxiCodeDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.m; sourceTree = ""; }; + 1C40B6AE6D7208B199A009448D839C80 /* ZXRSSExpandedBlockParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedBlockParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedBlockParsedResult.h; sourceTree = ""; }; + 1C9E154677B670DDA3F46BEE875F6B56 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = ""; }; + 1CABAF08106F653D5DF8B4FEB5102E39 /* ZXCode128Writer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCode128Writer.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.h; sourceTree = ""; }; + 1D9B1477E02C9FC7DB75801BF860E2E8 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + 1DC2DE80246B2BF0B60498166F73679A /* ZXModulusGF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXModulusGF.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.h; sourceTree = ""; }; + 1EF5C7F199322D1BFDDA67CFE14AC9E9 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; + 1F34F2EF45A13B35D16AF0C93736418D /* ZXStringUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXStringUtils.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.m; sourceTree = ""; }; + 1F7390F506C3088DB3094023E4E32781 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1FA3A3051CD742F345F9EE5A14E8EF70 /* ZXAztecToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecToken.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.h; sourceTree = ""; }; + 1FD296265ABE09EAE1B9B8D7B3B6F3F4 /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = ""; }; + 1FE90B47F16EF45B0A7C27D3A206E6C3 /* ZXByteArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXByteArray.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXByteArray.h; sourceTree = ""; }; + 20249BF2579AC39A329C1FC26350A22D /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + 202B6B8E6F79D8E8165505E726FB999F /* ZXAztecDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecDetector.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.m; sourceTree = ""; }; + 202FCACE847D9EAB6242DF88431E0F23 /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; + 20B0A7CB9E750DAA0BAC23565173A38C /* JSONModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JSONModel.modulemap; sourceTree = ""; }; + 21468CDD938A989703138053AE77030C /* ZXMultiFormatUPCEANReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiFormatUPCEANReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.h; sourceTree = ""; }; 218B6E61733A5B9138CB4D0815133580 /* Pods-GIGA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GIGA.debug.xcconfig"; sourceTree = ""; }; - 21D29A4125F838745482898EE34D680D /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; - 22776590D888620F659DDF182BE8BEFC /* TTTAttributedLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TTTAttributedLabel.framework; path = TTTAttributedLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 22A12862A28052673208D864DF5F8671 /* SocketEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngine.swift; path = Source/SocketIO/Engine/SocketEngine.swift; sourceTree = ""; }; - 2347C099D7F33A036587B18EE3CEFEB6 /* YTKKeyValueStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YTKKeyValueStore.modulemap; sourceTree = ""; }; - 237BE841F4D7796F3834F60938E612E9 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; - 23AAFF4BE17FB72260148442F598E055 /* FMDB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FMDB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 23E3DFBE5E063BE6E4D93A3E77F032ED /* NJKWebViewProgress.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = NJKWebViewProgress.framework; path = NJKWebViewProgress.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2431F4B5AE230C938093F4ACC541DF9C /* WebSocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = Sources/WebSocket.swift; sourceTree = ""; }; - 243FE71724C73A1404F864718F47B574 /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = ""; }; - 2493EEFA5275F1BFBB2AF35F11BED82C /* Masonry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Masonry.framework; path = Masonry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 24B2D873DD726E1CB92080AB5A4C458F /* MBProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; - 250AC017E1404E43770F53CAC6280DC7 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 25972EA3E10BED458FF978D175A9C263 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; - 25A4B40FC26E491D355F864AEA121E73 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; - 26168530D466303D1859051CADEAF5EB /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 266860A64CA3E38126FD443422246252 /* YTKKeyValueStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YTKKeyValueStore.m; path = YTKKeyValueStore/YTKKeyValueStore.m; sourceTree = ""; }; - 270472B1F4EA9863212F85E4EAB5B497 /* Starscream-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-umbrella.h"; sourceTree = ""; }; - 27481864BFB4AD24155BCC2551337DB6 /* NJKWebViewProgress-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NJKWebViewProgress-dummy.m"; sourceTree = ""; }; - 296D773846653A12BF592FA3AEE99EE7 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyboardManager/IQTextView/IQTextView.m; sourceTree = ""; }; - 2B6CE4C2E0F43E8B914EC3D2DA1985F3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2C765CC91B74812227DCE13319608707 /* LKDBHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKDBHelper.m; path = LKDBHelper/Helper/LKDBHelper.m; sourceTree = ""; }; - 2CDD19D40A0561AC2EEC7572402D3D1F /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = ""; }; - 2E0EDFAA630F61D5988162BCAB78B5FA /* NSObject+LKDBHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+LKDBHelper.h"; path = "LKDBHelper/Helper/NSObject+LKDBHelper.h"; sourceTree = ""; }; - 2E18D0C002A9B8B1BFB6F6FD63278467 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; - 2E3AF8E64808C4D50ED1EE668DCDFBBA /* SocketRocket-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-prefix.pch"; sourceTree = ""; }; - 2E917B75DE00F9E5F318667A4D3CA7DB /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = ""; }; - 2FB887DABDFF1B6A7789155364DD4D45 /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = ""; }; - 2FD77768BDABBF2BB48928067588B12C /* FMResultSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMResultSet.m; path = src/fmdb/FMResultSet.m; sourceTree = ""; }; - 316C099F7EBA73314DFCC094D555F83B /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; - 32C89BF4798AB4ED10E9969C07146751 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; - 3484FF439E2DBB5367ED00A1BCD06905 /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyboardManager/IQKeyboardManager.m; sourceTree = ""; }; - 363026D36FA7E4000010BC1B5CD2B8E3 /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; - 367D41745AB1AEBE8A1FFB6DB552ECEB /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; - 3693DA67EFBAB281959594641A587872 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 36C94757ECFB0CDBFD720B0C11F08BC1 /* MBProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.xcconfig; sourceTree = ""; }; - 36EBA45514DE97C348F33C685F5897DD /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; - 3707B0F6D5D2EB50CB0191D8FC9A3E26 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = ""; }; - 37359E3E690C6350F9602BFFDBB04147 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; - 3761E6FC8FB2C049CFB42B5DF219C572 /* SocketRocket.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SocketRocket.xcconfig; sourceTree = ""; }; - 384EDBAD900277643587B535751AFC42 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; - 3859DA0DF93E825130ADB78D0E66166E /* SocketIOStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOStatus.swift; path = Source/SocketIO/Client/SocketIOStatus.swift; sourceTree = ""; }; - 3AB36856959C85924D590AFD2695D2B6 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; - 3D3288F586F676906211064535ACEA59 /* SocketAckManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAckManager.swift; path = Source/SocketIO/Ack/SocketAckManager.swift; sourceTree = ""; }; - 3DCB0BEBBAC1E47DDBB977778143CC25 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = ""; }; - 3DF7CF70E97B77C95449324D577D2DE5 /* UITableView+FDIndexPathHeightCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDIndexPathHeightCache.m"; path = "Classes/UITableView+FDIndexPathHeightCache.m"; sourceTree = ""; }; - 3E2FB8AE972E929400C566BC03FB6468 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - 3F9C38A75057CBD015D16FAA76005ECB /* FMDB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FMDB.framework; path = FMDB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3FC3B9F0418FF6AD9307259ADB289A07 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; - 404662E4EA47719280C225A3F07A8A6A /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; - 40995236A773C9D30F835E44168085B1 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; - 4105F4E767CE55C31AE0E2A6D969A996 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; - 419688D30BFAF6943FBE6304B83E2FC3 /* YTKKeyValueStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKKeyValueStore.h; path = YTKKeyValueStore/YTKKeyValueStore.h; sourceTree = ""; }; - 4253E7F7448B089D6F4CDECD149486CB /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; - 42D7E898DE58FC64D5A1CAC1E601DEF1 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 21B81153AF23CF76DCC9E5AB0BBE5804 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyboardManager/Resources/IQKeyboardManager.bundle; sourceTree = ""; }; + 21D5C788A28238416C4B8D3BCFE89377 /* ZXCodaBarWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCodaBarWriter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.m; sourceTree = ""; }; + 222C872FBA997E76330938B9E40A8682 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + 22335143070F51F522F445C711096F74 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; + 22363DC3CC92A8B0401ECA9A3EF8646D /* ZXQRCodeWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeWriter.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.m; sourceTree = ""; }; + 229FCA40E8539EFBE4226678A7EA53ED /* ZXVINParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXVINParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.m; sourceTree = ""; }; + 22AF2499E0B20FD9E6F109DAE83D3498 /* ZXEAN8Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEAN8Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.h; sourceTree = ""; }; + 22B5F61E238342B7F2651B4DE5857B44 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2320ED36FC8E744B31FF6741BB85F07A /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; + 232646EC5F31EAA7AF0455FE8C72225D /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyboardManager/IQTextView/IQTextView.h; sourceTree = ""; }; + 234B0B77520F7FB1083EAB0B06567855 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; + 235913F3F20DDBFFB7263D921AEF19AF /* ZXSMSTOMMSTOResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXSMSTOMMSTOResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.h; sourceTree = ""; }; + 239C0E4F7521D8E95EF613AF8E41F557 /* ZXPDF417Dimensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Dimensions.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.m; sourceTree = ""; }; + 2405D3601EAFE080F875AB04D1E1E56A /* ZXAztecWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecWriter.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.h; sourceTree = ""; }; + 240BAD531BB4B9EEBE08492B619A8762 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 24762E712FE35B0B98DBA131383ECE21 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; + 248CA5F52D608A5643F90F8DE6F4CFCC /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; + 2491CC38C2B789FC40186BCCDF2D82D8 /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + 2496264F0AEA771F215049454D226C60 /* ZXCodaBarReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCodaBarReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.m; sourceTree = ""; }; + 251B13B990BC2201FC5B2E947865EEB6 /* UITableView_FDTemplateLayoutCell.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = UITableView_FDTemplateLayoutCell.framework; path = "UITableView+FDTemplateLayoutCell.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2569425A0FA93A78E8B74BA057402124 /* IQPreviousNextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQPreviousNextView.m; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.m; sourceTree = ""; }; + 257EDB11649851E0733955A6BFAE808B /* ZXAI01decoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01decoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.h; sourceTree = ""; }; + 267419113BC2F016BFC104D8575C4462 /* ZXTextParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXTextParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.h; sourceTree = ""; }; + 267EB7B4D76CE8237DC8442293FFDBAF /* ZXRSSExpandedRow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedRow.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.h; sourceTree = ""; }; + 26DCFD25FCBCA4E28F0BC003760D39C3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2741EB74A81A677BD868DAA77B5D50EB /* ZXCharacterSetECI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCharacterSetECI.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.m; sourceTree = ""; }; + 2753D5256EB2B5776BD07162E550277B /* ZXRSSExpandedReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.m; sourceTree = ""; }; + 278487CDBD6D5B22DB2B92E19CAB4926 /* ZXQRCodeReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeReader.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.m; sourceTree = ""; }; + 27E0F0F34C4C74E17FD6318296871814 /* ZXAbstractRSSReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAbstractRSSReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXAbstractRSSReader.h; sourceTree = ""; }; + 27F20E0FDA54EF826C95714A52CE9C09 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + 2823134BEBE09A1FC0B644A3B421CA23 /* ZXBitSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBitSource.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.h; sourceTree = ""; }; + 285B5E000360B7ED322388AE074844A2 /* ZXCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCapture.h; path = LBXScan/LBXZXing/ZXingObjc/client/ZXCapture.h; sourceTree = ""; }; + 287DAF48EE194A861DBDD9EE370DE641 /* ZXEmailAddressParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEmailAddressParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.m; sourceTree = ""; }; + 289025C9E451189A3ED0A2EC1C7D5D08 /* ZXAztecReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecReader.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.h; sourceTree = ""; }; + 290A16571BB7520DECA3387040A15502 /* ZXBitSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBitSource.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitSource.m; sourceTree = ""; }; + 29470A1C268C0A1F1C7B973C23A1F7A8 /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = ""; }; + 2954D1C7455042E32D975BE36184E2F7 /* UITableView+FDTemplateLayoutCell-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UITableView+FDTemplateLayoutCell-umbrella.h"; sourceTree = ""; }; + 2A0910812650DEEBE939D73295D420AB /* ZXDataMatrixDataBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixDataBlock.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDataBlock.h; sourceTree = ""; }; + 2A3A240F77B6B92F434EE270B9A53ECB /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; + 2A448F51B392A1B9BD7106633EF062E2 /* SocketIOClientConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientConfiguration.swift; path = Source/SocketIO/Client/SocketIOClientConfiguration.swift; sourceTree = ""; }; + 2A4C02D3A79E060D16E49070922498AC /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = ""; }; + 2A7F9D989C3B23E308A42E02AA98964B /* Bugly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bugly.framework; sourceTree = ""; }; + 2AD416757F0438E49C4FB9BCB525AC93 /* ZXRSSExpandedCurrentParsingState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedCurrentParsingState.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.m; sourceTree = ""; }; + 2AFD87FE1A7D3CA4E660728863DA59FD /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + 2B410EB9C4D5A74AECA61DACE97CA734 /* ZXMonochromeRectangleDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMonochromeRectangleDetector.m; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.m; sourceTree = ""; }; + 2B63F483F4A41FA5865B2584379B9F50 /* ZXRSSUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSUtils.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.h; sourceTree = ""; }; + 2B7F16140A1CB090B3E85EAA664A35A6 /* ZXingWrapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingWrapper.h; path = LBXScan/LBXZXing/ZXingWrapper.h; sourceTree = ""; }; + 2B961506C39517250A71DF02B7976774 /* MBProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; + 2B9AE07D5281C5759D652086455FBEF9 /* ZXQRCodeMultiReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeMultiReader.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.h; sourceTree = ""; }; + 2C00DAF50A01872D19E25D7471E10CD9 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; + 2C29E51B904852FD5C10F0044CB6D392 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; + 2C46B1450E5C7D283F392A9ADCEB4DFE /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; + 2C4E54B4A0D030BF478D24E7F1C954B4 /* ZXingObjCCore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCCore.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXingObjCCore.h; sourceTree = ""; }; + 2CEC8B4351A5087EFF4C82AEA645A4B3 /* ZXISBNParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXISBNParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.h; sourceTree = ""; }; + 2CEFBEF7D6A654F303086039A2A3427C /* ZXingWrapper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXingWrapper.m; path = LBXScan/LBXZXing/ZXingWrapper.m; sourceTree = ""; }; + 2D52E7B2BF8525DC5516D495D7282480 /* ZXEAN13Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEAN13Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.m; sourceTree = ""; }; + 2D920C9AA0C8FDD9CD6D08BC4A83F981 /* ZXModulusGF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXModulusGF.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusGF.m; sourceTree = ""; }; + 2E084C32F07AC27EBC5EC845F4957F4C /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; + 2E08BFB38983459E0EE437ACEA12B99F /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + 2E45E4D6694AC0C97C6A5AF81C604134 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + 2E98E60A3E0AADAB41B454C43D92F82C /* ZXUPCEANWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEANWriter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.h; sourceTree = ""; }; + 2E9C7AC858653DE1292892B6992DB152 /* FMResultSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMResultSet.h; path = src/fmdb/FMResultSet.h; sourceTree = ""; }; + 3090E9B904AB1B164DFEF431FDD79698 /* ZXRSSExpandedPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedPair.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.m; sourceTree = ""; }; + 30CEA94078A37E1B37CDDDA1C1834BFF /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; + 3120B8DB2246172495AEDF42E825FE3A /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; + 313E7213920F3488A506D2A1E937EC68 /* ZXRSSExpandedDecodedChar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedDecodedChar.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.h; sourceTree = ""; }; + 3183E798A6219D4066F1794704E91DCD /* ZXPDF417DetectionResultColumn.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417DetectionResultColumn.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.m; sourceTree = ""; }; + 31BD563B6469FA9EF68AE77CC8C9C056 /* ZXEAN8Writer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEAN8Writer.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.h; sourceTree = ""; }; + 324C4E1A9498CE6F5AB03D236EB33020 /* ZXErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXErrors.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.h; sourceTree = ""; }; + 3278EA5FAB464253D26E64899721E7F7 /* ZXQRCodeReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeReader.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeReader.h; sourceTree = ""; }; + 32C56C2853EE092E9116A433447747F4 /* ZXResultPointCallback.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXResultPointCallback.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResultPointCallback.h; sourceTree = ""; }; + 33093A6969DCF0577ACC4AFB773BB475 /* SocketRocket-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-umbrella.h"; sourceTree = ""; }; + 336F0381CB9A0395C4BBF4C768C65F74 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + 338FB914BBF542E8B6EDE3D1B25B85AE /* ZXDataMatrixWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixWriter.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.h; sourceTree = ""; }; + 34CCD0789E77B7F06C5559E5AEF6DD64 /* ZXEAN13Writer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEAN13Writer.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Writer.m; sourceTree = ""; }; + 34E0E96AC3D6E0C135C1474B9E99E0E9 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; + 350C60BDB8C307BD30635D48AB2EB920 /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = ""; }; + 3513213A0E1A06239AEB5818D047B215 /* ZXUPCEReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.m; sourceTree = ""; }; + 3516E36108BFB3AB6CE8344EB628EA89 /* ZXAztecWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecWriter.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecWriter.m; sourceTree = ""; }; + 35585E01D8EFEEBEC799FE84FDF8A47C /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + 3563CE30C7FC383DB5E57A9EFAED2A5D /* SocketManagerSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketManagerSpec.swift; path = Source/SocketIO/Manager/SocketManagerSpec.swift; sourceTree = ""; }; + 35F9DFBDCFDC3C0A47A964624B4F9704 /* ZXingObjCAztec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCAztec.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXingObjCAztec.h; sourceTree = ""; }; + 366173D81A4ED097DF635FD4EA4EF986 /* ZXDataMatrixBitMatrixParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixBitMatrixParser.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.h; sourceTree = ""; }; + 3682C86398A3D8CD81BAAEA99EC6CB67 /* ZXMathUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMathUtils.m; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.m; sourceTree = ""; }; + 36925CAD9B84F8F3F48AE20228BEF509 /* JSONHTTPClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONHTTPClient.h; path = JSONModel/JSONModelNetworking/JSONHTTPClient.h; sourceTree = ""; }; + 36ADCB783FC73ED76E1B608C1EE147ED /* ZXPDF417BarcodeRow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417BarcodeRow.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.m; sourceTree = ""; }; + 36D9764AC9909FEFB91D9CF3F0248FE0 /* ZXQRCodeMatrixUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeMatrixUtil.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.m; sourceTree = ""; }; + 37BB44FDCBA2A3F3BA11224E9BD40C69 /* ZXQRCodeDataBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDataBlock.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.m; sourceTree = ""; }; + 3828DF5CA0C47E8EC97CBF0165796BC3 /* ZXQRCodeFinderPatternInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeFinderPatternInfo.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.h; sourceTree = ""; }; + 3854EE037BCFCFBE75285E6DAF8AB535 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + 3860605472BB0020FA275E37A39BBFC2 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; + 38913E8627AAA151B4E455E5C5CF74CD /* ZXSMSParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXSMSParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.h; sourceTree = ""; }; + 38C39AEDD97BDBD485D6C7154BACECC9 /* ZXOneDReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXOneDReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.h; sourceTree = ""; }; + 38EAC8B7CB1278F54E9415250546A952 /* IQKeyboardManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManager.framework; path = IQKeyboardManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 39160D87A6DA3F92790ACE6B0179BE44 /* ZXExpandedProductParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXExpandedProductParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.m; sourceTree = ""; }; + 39E95C32A7C1323ABDF30E4F76BFCF1B /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; + 3AF09E25EE30B9D50C4EB47F6F4C6AEE /* ZXDataMatrixHighLevelEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixHighLevelEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixHighLevelEncoder.h; sourceTree = ""; }; + 3AF7E228152EC8FCA66D6E5E66939409 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + 3B9B9A99D767D2557E9A88D6F2F0DD46 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + 3BFE51EE927D826B37828D85A76B0F5C /* ZXDataMatrixSymbolInfo144.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixSymbolInfo144.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.h; sourceTree = ""; }; + 3CB22BCE14EACECFD8F535CE5D81392C /* ZXQRCodeVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeVersion.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.h; sourceTree = ""; }; + 3CBE64FD5E0CAEB8CE719061DA45DD9C /* ZXPDF417BarcodeMatrix.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417BarcodeMatrix.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeMatrix.h; sourceTree = ""; }; + 3D12153DC4D2C4B99BE3D68592D1F73A /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3D157DAAB6FAF21BC3BF5539ED1EC0E0 /* ZXRSSExpandedDecodedInformation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedDecodedInformation.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.h; sourceTree = ""; }; + 3DD648202AAD9716D02F0B9DA76983E0 /* ZXStringUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXStringUtils.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXStringUtils.h; sourceTree = ""; }; + 3E2520DD73675F766A9D772066624121 /* ZXImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXImage.m; path = LBXScan/LBXZXing/ZXingObjc/client/ZXImage.m; sourceTree = ""; }; + 3E261442EB32143E893D1F4DA8DC0276 /* ZXErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXErrors.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXErrors.m; sourceTree = ""; }; + 3E41F011C85810C2F24051ADF688EAC6 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.m; sourceTree = ""; }; + 3E8435BF3B9A2662AF8C6A5D6A78E0A3 /* ZXCodaBarWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCodaBarWriter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarWriter.h; sourceTree = ""; }; + 3EE522AA06CD2B0D9B45221D43D2DAA2 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = ""; }; + 3F162C35790ED70293D1A3C5025F5394 /* ZXPDF417DetectionResultRowIndicatorColumn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417DetectionResultRowIndicatorColumn.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.h; sourceTree = ""; }; + 3F3856B0D263FC58D95A8AD0D1B21E7A /* Socket.IO-Client-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Socket.IO-Client-Swift-dummy.m"; sourceTree = ""; }; + 3F87D49283144A1392718A7C4EB86D26 /* ZXQRCodeAlignmentPatternFinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeAlignmentPatternFinder.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPatternFinder.h; sourceTree = ""; }; + 3FE6280647D511E8A1CF5138E9C19EEF /* TTTAttributedLabel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TTTAttributedLabel-dummy.m"; sourceTree = ""; }; + 3FEE8F9FD0CBC6063EBE78FDF717F5B0 /* ZXDataMatrixSymbolInfo144.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixSymbolInfo144.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixSymbolInfo144.m; sourceTree = ""; }; + 3FF57359A0BC6E800A9EFDE2F444A6C0 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; + 403E37AA88824C6E1807A9A22B544FDC /* ZXResultMetadataType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXResultMetadataType.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResultMetadataType.h; sourceTree = ""; }; + 40601347DD17AEE48EB4A05C95CEDE4D /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; + 4063220FB7868DB178D9715ABD0541B0 /* ZXDataMatrixBase256Encoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixBase256Encoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixBase256Encoder.h; sourceTree = ""; }; + 40C567CB0D40A4C93AA26ED05D62717E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 40E760628C8F0B2747D7B87E5073C897 /* ZXProductParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXProductParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.h; sourceTree = ""; }; + 411CC2AB65DDA90561C1A996DCB39D38 /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; + 412B164C0833345984D6418941529C7B /* SocketRocket-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SocketRocket-dummy.m"; sourceTree = ""; }; + 41D83AA43A5759B1910D7B53E34FCD64 /* ZXCode39Writer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCode39Writer.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.h; sourceTree = ""; }; + 4222704655BCC2B7F4DD2BACB2C4AB0C /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; + 4231EFAC746B70BBD8E9CC4D407DF9C1 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; 4333DE13F7B28D62D7251611E26C7D1F /* Pods-GIGA-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GIGA-umbrella.h"; sourceTree = ""; }; - 435EA74A816C71AE5579FF600A20AF60 /* LKDBHelper-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LKDBHelper-prefix.pch"; sourceTree = ""; }; - 45879D3B33AD86D331ACA84B5995B4D1 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; - 463DAC3C5F6EF0A1CB5D363A99DD84AC /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; - 46F020E16865FD56CE53816167224099 /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = ""; }; - 4819F4658B859A7A2B63B28F360E7FFD /* UITableView_FDTemplateLayoutCell.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = UITableView_FDTemplateLayoutCell.framework; path = "UITableView+FDTemplateLayoutCell.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 4840A6FC48CB8E524D7A7D2DEF0DC1A0 /* NJKWebViewProgress.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = NJKWebViewProgress.modulemap; sourceTree = ""; }; - 48886EB74B58FC75012D8AB06D74F958 /* LKDBHelper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LKDBHelper-dummy.m"; sourceTree = ""; }; - 4895A24A9EA8533671D64541ECA375BD /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; - 498010BF30FB1D6FB301F7B3FD6CFC49 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; - 49FC9B7F0D1967826227DEFA8D9EA924 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; - 4A22823A58050582ED95D1A767F76671 /* TTTAttributedLabel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTTAttributedLabel-prefix.pch"; sourceTree = ""; }; + 43C89E9657E31B58DFE00B9084357756 /* ZXDataMatrixTextEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixTextEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.m; sourceTree = ""; }; + 4400DF2CA88D881355B824B1B31C708A /* ZXGridSampler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGridSampler.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.h; sourceTree = ""; }; + 4436BB6A4592B2FC90C4D183E9D01B4B /* ZXVEventResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXVEventResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.m; sourceTree = ""; }; + 444CBF418CAC87110D897FFCAE82DD3E /* ZXDataMatrixC40Encoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixC40Encoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.h; sourceTree = ""; }; + 44705920CB16B6C84B9EF4086CC761D5 /* ZXLuminanceSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXLuminanceSource.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.m; sourceTree = ""; }; + 448563F35B5EBE456D58CC5DB9B6E732 /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; + 449F2506A175228D3745E422F9FA4505 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/CoreMedia.framework; sourceTree = DEVELOPER_DIR; }; + 44CBD3EB20B3CF018557CB282DE81D97 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 4536A2ED882A400458EBD3A0C3F37E7A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 45E3CD46940FDD395CACBA1A4A21FD19 /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = ""; }; + 461834DA994FE18EBE2D48989FEBFC0C /* SocketEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngine.swift; path = Source/SocketIO/Engine/SocketEngine.swift; sourceTree = ""; }; + 4622950ED6DD64E0457786C3F6DDB3DD /* ZXBitArrayBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBitArrayBuilder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.m; sourceTree = ""; }; + 46AABDEF7F2837A3945CD5B72A801054 /* ZXAI01weightDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01weightDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.m; sourceTree = ""; }; + 46BC11C5462F8D9083C26EEEEE116177 /* NJKWebViewProgress.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NJKWebViewProgress.m; path = NJKWebViewProgress/NJKWebViewProgress.m; sourceTree = ""; }; + 470E63248005DCBC06296E7CAE7E4645 /* ZXURIResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXURIResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.h; sourceTree = ""; }; + 478C4D8B62BEF9C31111A3C01BC95AC9 /* ZXISBNResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXISBNResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.m; sourceTree = ""; }; + 487563F965DF353FF2A0C6737EBC43AC /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; + 496E19E4A585F7F89396E45A0F025666 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; + 497BC13476902C48298CA9EBA5C10239 /* ZXAbstractExpandedDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAbstractExpandedDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.m; sourceTree = ""; }; 4A26F8EC0D0C0834C08E37EF1C0D560D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4AE90821AB70960B2356D5F01B2BFE2F /* ZXUPCEReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEReader.h; sourceTree = ""; }; + 4B56E10174EEAF6135A318FC9ED5DC73 /* TTTAttributedLabel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTTAttributedLabel-umbrella.h"; sourceTree = ""; }; + 4B6CFBDEEF15C5CAC528272DFA72E70D /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + 4B9F3CB00EC0BDAF08E93B058A767BB2 /* ZXQRCodeAlignmentPattern.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeAlignmentPattern.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.h; sourceTree = ""; }; 4BB8C4AE22CA2904E7813EFEAFE8A067 /* Pods-GIGA.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GIGA.modulemap"; sourceTree = ""; }; - 4C2F72B6BC0D51790962077A8C13EC05 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; - 4C5390F4E86B7D09F66AD00A442AB988 /* Starscream-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-prefix.pch"; sourceTree = ""; }; - 4CFCC52EC62F150CB4DFCDB379045F8F /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; - 4F5A634FE6A212612B8063E798439185 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 4F7775A169B588C5C2BEC8EE5864E3E3 /* UITableView+FDTemplateLayoutCell-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UITableView+FDTemplateLayoutCell-prefix.pch"; sourceTree = ""; }; - 5145E6BB9DFB46461BE07ADA20047F2E /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; - 5290E81387FC7DE33A6834ABB78CD62C /* LKDBHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LKDBHelper.framework; path = LKDBHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 531AF42C28A0891D1E91B6BEA86844D7 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseAdditions.m; path = src/fmdb/FMDatabaseAdditions.m; sourceTree = ""; }; - 531C313E293B098E8DD0AE16F9F05E50 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; - 53F4D20C7F0D216C630BE1353AC09D55 /* Starscream.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.xcconfig; sourceTree = ""; }; - 547FB455959DBDAB1B311703DC4655D1 /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 558D6E7CB99E8F711140222C4C7FD6C0 /* TTTAttributedLabel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TTTAttributedLabel.xcconfig; sourceTree = ""; }; - 55CDFB91944CA5A1481875292A58F12A /* SocketLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketLogger.swift; path = Source/SocketIO/Util/SocketLogger.swift; sourceTree = ""; }; - 55D47BD7E8E69B61DB9C10FE582F0F77 /* Masonry-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-umbrella.h"; sourceTree = ""; }; - 5660075EFC0AA10C221C3D12FB6522F3 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; - 56C7B870DA133902EFBA936EF978F45C /* NSObject+LKModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+LKModel.m"; path = "LKDBHelper/Helper/NSObject+LKModel.m"; sourceTree = ""; }; - 577E3F36FE44476EE775746E6BC7F3F2 /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; - 5842466C4060B5C8F8FB2C92F2D73D97 /* libjpush-ios-3.1.0.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = "libjpush-ios-3.1.0.a"; sourceTree = ""; }; - 58A1949C3F564FD801440AEA4D4E3C27 /* UITableView+FDTemplateLayoutCell.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "UITableView+FDTemplateLayoutCell.modulemap"; sourceTree = ""; }; - 5925EC6C2B2151154E2F24CC70D04AEC /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 59B9D327C5265DEE8087CB64AB64426F /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Starscream.modulemap; sourceTree = ""; }; - 59E8BF8E1889AB501DDF9C32A0B690F8 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 5A1F61FFDF1CF20E149F6B0F6B0FF24A /* SocketRocket-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SocketRocket-dummy.m"; sourceTree = ""; }; - 5B8A96A9F8907E36AEE053151EF55E0B /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; - 5BC61B5225D9CEE976A35A242843BF85 /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; }; - 5CFFA0AAC1274F48CF9BBAF77F583DE9 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; - 5EA0FD074C76AC8611D95613CDEB4311 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5F1558AF059B62809206FC3CD1039CBA /* UITableView+FDTemplateLayoutCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDTemplateLayoutCell.m"; path = "Classes/UITableView+FDTemplateLayoutCell.m"; sourceTree = ""; }; - 60A50FB199FB6B0C5EA49A62A4C863D8 /* JSONModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JSONModel-dummy.m"; sourceTree = ""; }; - 60E6BD48D0EAAAD7C2C35A6705DA2EB1 /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; - 6191ABE66A1BB9B2F88FFD6AF6186D63 /* SocketEventHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEventHandler.swift; path = Source/SocketIO/Client/SocketEventHandler.swift; sourceTree = ""; }; - 61C2C19E65EA773F183A0CC25BA57237 /* Masonry.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.xcconfig; sourceTree = ""; }; - 61FE2DC3E37626E602B4123EBB968B51 /* LKDBHelper-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LKDBHelper-umbrella.h"; sourceTree = ""; }; - 6388F569E994C890615BAAE8A1012286 /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = ""; }; - 64835380AC55D938C3E0E9AA529F4D41 /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; - 64EB649102BB6022F6927FBD8BF10E3B /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; - 65743645C0D98AA50085F327714FEF8F /* WXApi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApi.h; path = WechatSDK1.8.2/WXApi.h; sourceTree = ""; }; - 6594B566BAF22CF7F3BF954283907D88 /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/UIView+Toast.m"; sourceTree = ""; }; - 65FA72B7E48A3FABA22AE5D855BB186C /* JSONModelError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelError.h; path = JSONModel/JSONModel/JSONModelError.h; sourceTree = ""; }; - 66D6A876FB337C3A5AEC09F74362A022 /* JSONModel+networking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "JSONModel+networking.h"; path = "JSONModel/JSONModelNetworking/JSONModel+networking.h"; sourceTree = ""; }; - 670CF36062CD3ECFF8C5C5AABE213403 /* LKDB+Mapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "LKDB+Mapping.h"; path = "LKDBHelper/Helper/LKDB+Mapping.h"; sourceTree = ""; }; - 6779C8F389FC4B45319BDA12E59B2BFD /* JSONModelClassProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModelClassProperty.m; path = JSONModel/JSONModel/JSONModelClassProperty.m; sourceTree = ""; }; - 67C8BFEE51B5F26E6EB7520C972CD09A /* SocketRocket.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SocketRocket.framework; path = SocketRocket.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 69E99651489B054F900280430368B177 /* Masonry.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Masonry.modulemap; sourceTree = ""; }; - 6B7E3C04DF72633F51BBA78A08B8EF61 /* IQKeyboardManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManager.modulemap; sourceTree = ""; }; - 6C55D9F05AB29EF41FFA46E6095CFF72 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; - 6C79216DF49554E23B9DFC5FAABDB967 /* FMDatabaseQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseQueue.m; path = src/fmdb/FMDatabaseQueue.m; sourceTree = ""; }; - 6C9A66715097B49E44CC06CFE998E3B8 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = ""; }; - 6E421B865FF1305197CC9C5DB303BB22 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; - 6F43E521A7D9B6E90D0A9E791D4C725D /* SocketManagerSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketManagerSpec.swift; path = Source/SocketIO/Manager/SocketManagerSpec.swift; sourceTree = ""; }; - 6F53130DDA9FEA279EEACE1E1D479D77 /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; - 6FF4D47DF573B44C28B3DF814C3E50CB /* JSONValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONValueTransformer.h; path = JSONModel/JSONModelTransformations/JSONValueTransformer.h; sourceTree = ""; }; - 70BC8DC64FAC8894D27E1964CC8CD209 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 71B92D24C35F51B3A3A9626DD861EF1E /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; - 720A2501ACCEF31CAEFCF72E5A1755D8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 72575B068A276F2F8A0CF243743B3E74 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; - 727870954CC82AAEDD7172910D081D2F /* YTKKeyValueStore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YTKKeyValueStore-prefix.pch"; sourceTree = ""; }; - 72F5A09FBDED1F72A04C3E335DE0A1BA /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = ""; }; - 73A0A8125787204B223B07F7C9F0A42E /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; - 7476095E7330D9DBD36D76CCE3773573 /* SocketRocket-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-umbrella.h"; sourceTree = ""; }; - 7491AD0045ED41AE8F08FD751720691E /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = ""; }; - 74C8E35BDB3CC1024935C804E53F0DD2 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; - 74DEFA36B4962F7E3A0B4640337FC908 /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; - 7544FB7D9022E74937D8BE12C05191AA /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = ""; }; - 75491F997888B75AAB2C0AB027F83D5C /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; - 768A5DE5D08824954B4B101A2FB6B2BD /* SocketIOClientConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientConfiguration.swift; path = Source/SocketIO/Client/SocketIOClientConfiguration.swift; sourceTree = ""; }; - 7704E7E2B7BD84344BB610CC27D5A70E /* SocketStringReader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketStringReader.swift; path = Source/SocketIO/Util/SocketStringReader.swift; sourceTree = ""; }; - 774A10F51C61AA781BFD1C4397931231 /* JSONModelClassProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelClassProperty.h; path = JSONModel/JSONModel/JSONModelClassProperty.h; sourceTree = ""; }; - 78F07669D4FDF923215E34924891CA68 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; - 7916596619DEA640BF07E493F03AE462 /* IQPreviousNextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQPreviousNextView.h; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.h; sourceTree = ""; }; - 793A3F963E71FCAB028E34329D122155 /* FMDB-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FMDB-prefix.pch"; sourceTree = ""; }; - 79898C8FB8D364D3B8B09502372E9F0B /* SocketIOClientSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientSpec.swift; path = Source/SocketIO/Client/SocketIOClientSpec.swift; sourceTree = ""; }; - 79CF50141FCA7A6797717FC93955DAF1 /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = ""; }; - 7B077190F4428101E2C3FCA4A0F17CA1 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyboardManager/IQKeyboardManager.h; sourceTree = ""; }; - 7BD28F6214D96C6BCC2EAF3C08B2EBA4 /* SocketEnginePacketType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEnginePacketType.swift; path = Source/SocketIO/Engine/SocketEnginePacketType.swift; sourceTree = ""; }; - 7C57BCFDE1C485BAE504B6F82A3BCAC0 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 7D0587B9F9A54258E4EC092F7FCE94EC /* NJKWebViewProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NJKWebViewProgressView.m; path = NJKWebViewProgress/NJKWebViewProgressView.m; sourceTree = ""; }; - 7D5D3928FE1E7CA0D8E3A946574DC2F0 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; - 7E7D955074A0ED0B9FF131595E872064 /* JSONModelLib.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelLib.h; path = JSONModel/JSONModelLib.h; sourceTree = ""; }; - 7E9D6482F9A7BDDA51F2CA23CC989F00 /* Socket.IO-Client-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-prefix.pch"; sourceTree = ""; }; - 7F2A106A290EC7B512FC0E8A9C14E807 /* MJRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.xcconfig; sourceTree = ""; }; - 7F8965BFE9CC1CE8B5CFC2B14D7E2DA8 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; - 805D42FFE0EC9DD228E5EB6C75F8E9AA /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; - 81061EAAEC3F61A38F09275305E22D6A /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; - 82167F073127B543CC843A71E2E2F134 /* libjcore-ios-1.2.2.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = "libjcore-ios-1.2.2.a"; sourceTree = ""; }; - 82C2BD5350645441DD92F95DC5E589DD /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.m; sourceTree = ""; }; - 84A34E767AC05FDBD3D849436D0BCCEA /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 852AB63551AC52D340F98C97A94D9FD6 /* SocketTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = Source/SocketIO/Util/SocketTypes.swift; sourceTree = ""; }; - 8574AA1B5AD318AF02BC4D3B68F81E58 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; - 85FA16278B2D2A724F98F1B98A871074 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; - 86A54BF6E391B76DFBE0F0695DB27785 /* Socket.IO-Client-Swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Socket.IO-Client-Swift.xcconfig"; sourceTree = ""; }; - 8705B892D0FB23E4B3A26DDB33CBC371 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; - 874A487F8BFAD83D1F053B4DCD8201A1 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; - 8779B2CA7289D6A7185C91312B6BD88D /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.h; sourceTree = ""; }; - 88446EB28B584D07BED817C62D06D29D /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; - 88FA75A73C1252600B984CF5DE17B8CE /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; - 897350FBCDF747BE59B857BB5740214A /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; - 8999757F73DE228D5570C79E04DDE6E3 /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; - 8A60255EA01616D51B066606B28E168C /* LKDBUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKDBUtils.m; path = LKDBHelper/Helper/LKDBUtils.m; sourceTree = ""; }; - 8B5E70F380A1881B0AE8CC9EF93F5CC3 /* LKDBHelper.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LKDBHelper.xcconfig; sourceTree = ""; }; - 8B7517F6F47C3E3DBDDC7897D5532B4E /* TTTAttributedLabel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TTTAttributedLabel.modulemap; sourceTree = ""; }; + 4BC5543F20B7E7EA04C3A1A4E43EBA04 /* ZXWhiteRectangleDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXWhiteRectangleDetector.h; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.h; sourceTree = ""; }; + 4C192F2382F4C039C85C70C4DA2A5C7C /* ZXAI013103decoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI013103decoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.m; sourceTree = ""; }; + 4C9F03B59AE965E962B20B8FED9EA332 /* ZXPDF417CodewordDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417CodewordDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.m; sourceTree = ""; }; + 4D57DAB6BFCB824F15CBA51D5F9992AA /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = ""; }; + 4E274EDDB8E3984229A093237F0D8250 /* MBProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MBProgressHUD.modulemap; sourceTree = ""; }; + 4E7B12FDCE45D2B38F779E8EAD8C6264 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = ""; }; + 4EE274531929642E26FAC9CEB0CE1D96 /* ZXAztecDetectorResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecDetectorResult.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.m; sourceTree = ""; }; + 4F4D7086ACD27BEF0067A5E009184684 /* ZXGlobalHistogramBinarizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGlobalHistogramBinarizer.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.h; sourceTree = ""; }; + 4F53850E7219C55BE5B850DB7ACEBE09 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + 4FF25E1BDE0C8AFFEF5B9A142633A7A5 /* ZXDataMatrixDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixDetector.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/detector/ZXDataMatrixDetector.m; sourceTree = ""; }; + 4FFA0BB96E3EBED3470673318EE8A438 /* ZXITFWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXITFWriter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.h; sourceTree = ""; }; + 5005F6E8AE6F60BBF0B77AE5C2B3B80E /* ZXEmailAddressParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEmailAddressParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailAddressParsedResult.h; sourceTree = ""; }; + 501D468C90F4FD85AA177E0B94166125 /* ZXMultiFormatUPCEANReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiFormatUPCEANReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatUPCEANReader.m; sourceTree = ""; }; + 5057D117FDFC92545A80B8426FD78378 /* ZXLuminanceSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXLuminanceSource.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXLuminanceSource.h; sourceTree = ""; }; + 50FD9B1F2C384AB4FA9C84A84A04CC9A /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Source/SocketIO/Util/SSLSecurity.swift; sourceTree = ""; }; + 510966428F5451128EE1BC1086B01BE4 /* JSONModelError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelError.h; path = JSONModel/JSONModel/JSONModelError.h; sourceTree = ""; }; + 5118A816AD33DA493A9F058C0584C931 /* ZXExpandedProductParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXExpandedProductParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductParsedResult.h; sourceTree = ""; }; + 511FE11D56822DD2C7EEC44121FC64F7 /* ZXDataMatrixX12Encoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixX12Encoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.h; sourceTree = ""; }; + 5171E517994BE790AD2CC0E312612361 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + 51BD5168C9C8B6B7A48A622760B8E087 /* ZXProductParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXProductParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductParsedResult.m; sourceTree = ""; }; + 51F4E27FD53F67DBA72BBDCD4DF94543 /* LBXScan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LBXScan.modulemap; sourceTree = ""; }; + 5257B6F43FDF0FAD25094B50F2745284 /* ZXDataMatrixEncoderContext.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixEncoderContext.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.m; sourceTree = ""; }; + 52D37B7629842C40600F0591B04D55BF /* Toast.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast.framework; path = Toast.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 52E8AE4E2BB8AB7B1CBA9EC8A9A42C04 /* ZXResultPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXResultPoint.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResultPoint.h; sourceTree = ""; }; + 5352DC6B9113D89A1085F56106CFAC48 /* MBProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; + 535DA116BAAB37F8CF70E83072E83A05 /* ZXMaxiCodeReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMaxiCodeReader.h; path = LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.h; sourceTree = ""; }; + 53F3CC51DCD3186BB7788B5DECE48B36 /* ZXMaxiCodeReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMaxiCodeReader.m; path = LBXScan/LBXZXing/ZXingObjc/maxicode/ZXMaxiCodeReader.m; sourceTree = ""; }; + 5464387A08F744A79310765AE072E608 /* LKDBHelper-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LKDBHelper-umbrella.h"; sourceTree = ""; }; + 54E0937E501B884E9655E3C8D08BFC91 /* ZXDataMatrixErrorCorrection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixErrorCorrection.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.m; sourceTree = ""; }; + 55DAD4EC88271F955D0E855D4B6D98C9 /* ZXInvertedLuminanceSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXInvertedLuminanceSource.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.h; sourceTree = ""; }; + 56A248AD2B14391AA65B56084DA88713 /* NJKWebViewProgress-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NJKWebViewProgress-dummy.m"; sourceTree = ""; }; + 56B36467AE75A63FFC84B594640762F2 /* NSObject+LKDBHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+LKDBHelper.h"; path = "LKDBHelper/Helper/NSObject+LKDBHelper.h"; sourceTree = ""; }; + 56C04120E618AB8195CE06F53AFDDA25 /* YTKKeyValueStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YTKKeyValueStore.modulemap; sourceTree = ""; }; + 56EB7F49FC0F0364431B785203A747F0 /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking.framework; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 57CBC90EF9FB48F676B1D66FB765E5F7 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 57E2550013B3B536C16FCA75E5155FF8 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Starscream.framework; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 57F5BF2DC8AB7CC32D954D4F87FC431A /* Starscream.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.xcconfig; sourceTree = ""; }; + 58152A29FD0754C8C6A60CB925ECBC14 /* ZXAddressBookAUResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAddressBookAUResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookAUResultParser.h; sourceTree = ""; }; + 5826DD4C8A1EA288E322FAC3C9EA4691 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; + 58328F884F29FB2639A0AD4653DED9AB /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = ""; }; + 585C0E2F4983DDFC75F1316148676D89 /* ZXDataMatrixWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixWriter.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixWriter.m; sourceTree = ""; }; + 585D2475973CFB76EF9709D76E4C4FCA /* ZXPDF417ScanningDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417ScanningDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.h; sourceTree = ""; }; + 586B352F25C82EE45AD9D530A76E8947 /* ZXRSSExpandedDecodedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedDecodedObject.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.h; sourceTree = ""; }; + 58D0B50681B79F8D39E41675732BE4D6 /* SocketStringReader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketStringReader.swift; path = Source/SocketIO/Util/SocketStringReader.swift; sourceTree = ""; }; + 59539C955D1B0C4B6DBA95D4EE649287 /* ZXDefaultGridSampler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDefaultGridSampler.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.m; sourceTree = ""; }; + 59CCB593B1DE9C198FF201163EFEDBF2 /* ZXRSSFinderPattern.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSFinderPattern.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.h; sourceTree = ""; }; + 59EF2EB3362C0B2ED9F2F3A9977DA345 /* LKDBHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKDBHelper.h; path = LKDBHelper/Helper/LKDBHelper.h; sourceTree = ""; }; + 5A67163823E503ACFE3547B596008EEE /* JPUSHService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = JPUSHService.h; sourceTree = ""; }; + 5B02D371A5D3120103B193250201C8A1 /* ZXResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.m; sourceTree = ""; }; + 5B5CAB74EE4D77FFD3EEBCC4A7A0C751 /* ZXDataMatrixDefaultPlacement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixDefaultPlacement.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.m; sourceTree = ""; }; + 5B75928703CCB0D67E3B79FF5B6BEC70 /* ZXQRCodeDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.m; sourceTree = ""; }; + 5B905722B94AA07A2E7FC79FCB31FA93 /* FMDB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FMDB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5BAAD8495FF0A8451A4093707288E6E7 /* FMDatabase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabase.m; path = src/fmdb/FMDatabase.m; sourceTree = ""; }; + 5C10DEB7C68E9902DAD88652E1EEFCC9 /* ZXVINParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXVINParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINParsedResult.h; sourceTree = ""; }; + 5C268F71FA70172C992666B3096D20AB /* ZXRGBLuminanceSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRGBLuminanceSource.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.h; sourceTree = ""; }; + 5CB026A66B6F2535F9EAA5691F683517 /* SocketEngineSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineSpec.swift; path = Source/SocketIO/Engine/SocketEngineSpec.swift; sourceTree = ""; }; + 5D1314B2D906C2F472D05A95CB7DA4ED /* ZXDecodeHints.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDecodeHints.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXDecodeHints.h; sourceTree = ""; }; + 5D19C16AD520047D87A62E87D78B88DC /* LKDBHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKDBHelper.m; path = LKDBHelper/Helper/LKDBHelper.m; sourceTree = ""; }; + 5DE79E0DD75E10B9843CD8B26E2BE9F2 /* ZXPDF417Writer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Writer.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.m; sourceTree = ""; }; + 5DE834176952B6A04A8FBAEC4BDB5370 /* SocketParsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketParsable.swift; path = Source/SocketIO/Parse/SocketParsable.swift; sourceTree = ""; }; + 5E15CFA79AAB43D809BEEA665C6B029E /* ZXSMSParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXSMSParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSParsedResult.m; sourceTree = ""; }; + 5E5970EBFD625491CED012161FE21EDF /* YTKKeyValueStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YTKKeyValueStore.m; path = YTKKeyValueStore/YTKKeyValueStore.m; sourceTree = ""; }; + 5EE816134A2D9EEC209C05AECBE42499 /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = ""; }; + 5EF62BFCE82564E335A65CB3784EA01F /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = ""; }; + 5F082F6A417E526857C5FA44E9DBA532 /* Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Toast.h; path = "Toast-Framework/Toast.h"; sourceTree = ""; }; + 5F1D96AA24EC4D9E29125F9B66BE2999 /* ZXMultiFormatOneDReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiFormatOneDReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.h; sourceTree = ""; }; + 5F92E90DB24B107777D3809F3BF15DEE /* SocketEnginePollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEnginePollable.swift; path = Source/SocketIO/Engine/SocketEnginePollable.swift; sourceTree = ""; }; + 5FB61DDB2E7A09B5F41E3BB2AA655388 /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; + 5FD57D80A4B82AD97932876B827EA76A /* ZXPDF417CodewordDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417CodewordDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417CodewordDecoder.h; sourceTree = ""; }; + 609452D986F166C3F4D5A91270433EC7 /* ZXBitMatrix.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBitMatrix.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.m; sourceTree = ""; }; + 60A561785854A3F2E4B9017839350583 /* ZXAI01320xDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01320xDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.h; sourceTree = ""; }; + 60A8566008F2AD60A21C20D15502D353 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; + 61EB05BFA6141DA4009094265FD1CD48 /* ZXPDF417DetectionResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417DetectionResult.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.m; sourceTree = ""; }; + 620646C69C1CD1C0CE91F1E26462E3E8 /* UIView+Toast.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+Toast.m"; path = "Toast/UIView+Toast.m"; sourceTree = ""; }; + 622F976236021DED0BC71A18F37A3BD5 /* ZXQRCodeWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeWriter.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/ZXQRCodeWriter.h; sourceTree = ""; }; + 6282CC5CEF7E3B986992AA06E148ACA7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 62C2CDBD67226720B815F03C1A9C49C8 /* LKDBHelper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LKDBHelper-dummy.m"; sourceTree = ""; }; + 62DB1127BBB610074D9DD441518B890A /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + 62DD8E2B52965C368A06486D477FFF6E /* ZXPDF417BarcodeValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417BarcodeValue.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.m; sourceTree = ""; }; + 633ED391CA5537F706E648B064B3C5A7 /* SocketIOStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOStatus.swift; path = Source/SocketIO/Client/SocketIOStatus.swift; sourceTree = ""; }; + 635A274D0FAAA69FECA7412329502686 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 63BFC98F43CE219C1A220493F6BA002E /* ZXBitArrayBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBitArrayBuilder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXBitArrayBuilder.h; sourceTree = ""; }; + 63EDB2249CF51415D65BA08E28489D71 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; + 63EF71061BF1793B6FABE15B3B0E53E3 /* ZXWifiParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXWifiParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiParsedResult.m; sourceTree = ""; }; + 6449BEDC3695C449D8F4F737BDC151C3 /* ZXISBNResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXISBNResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNResultParser.h; sourceTree = ""; }; + 645111D5F231357418BF0742750B400D /* SocketTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = Source/SocketIO/Util/SocketTypes.swift; sourceTree = ""; }; + 646B209E896918796E000D73F622D0D7 /* UITableView+FDKeyedHeightCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDKeyedHeightCache.h"; path = "Classes/UITableView+FDKeyedHeightCache.h"; sourceTree = ""; }; + 6543EC2D5A66343A23BE1FF5129493BC /* ZXResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXResultParser.h; sourceTree = ""; }; + 65A4AD04459334D9EF262092853CC94D /* ZXVCardResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXVCardResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.m; sourceTree = ""; }; + 65C30575D94B3B61C4EA49629F94F4E7 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + 65DD34D63236EF6FCFD051AF525BC0D2 /* ZXPDF417ErrorCorrection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417ErrorCorrection.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.h; sourceTree = ""; }; + 65E17E7519CE6AE45BDA3805E3DD573F /* ZXPerspectiveTransform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPerspectiveTransform.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXPerspectiveTransform.m; sourceTree = ""; }; + 65FB9A85E34D940326FAD7F5F992BA59 /* UITableView+FDTemplateLayoutCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDTemplateLayoutCell.h"; path = "Classes/UITableView+FDTemplateLayoutCell.h"; sourceTree = ""; }; + 6651F559AD252C655A9499B183453B3A /* Starscream-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-prefix.pch"; sourceTree = ""; }; + 66D33BE7D27E3630895489EB38C44197 /* LBXScanTypes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LBXScanTypes.m; path = LBXScan/LBXScanTypes.m; sourceTree = ""; }; + 6712D72897762340266F2A87E45D60AE /* JSONModelClassProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelClassProperty.h; path = JSONModel/JSONModel/JSONModelClassProperty.h; sourceTree = ""; }; + 67682C7B8DD8B0F36F701655BF4262EE /* YTKKeyValueStore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YTKKeyValueStore-prefix.pch"; sourceTree = ""; }; + 67A7AFF07ADA3724E72965FB2447564F /* ZXMultiFormatWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiFormatWriter.h; path = LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.h; sourceTree = ""; }; + 687392D12DE79F3572E2015961306FC8 /* ZXAI013x0x1xDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI013x0x1xDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.h; sourceTree = ""; }; + 693E8329C711960AE3D2219970BAA72C /* JSONModel+networking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "JSONModel+networking.m"; path = "JSONModel/JSONModelNetworking/JSONModel+networking.m"; sourceTree = ""; }; + 697078F7E74492370116817C140930DA /* SocketEventHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEventHandler.swift; path = Source/SocketIO/Client/SocketEventHandler.swift; sourceTree = ""; }; + 69764D291C85F1FDF35BE2A9C545CEE9 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; + 699B9450180960A7E88622DB7FFE74A1 /* FMDatabasePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabasePool.h; path = src/fmdb/FMDatabasePool.h; sourceTree = ""; }; + 69A02C9C6C41A6BD55909C0958CE6ED2 /* JSONModelError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModelError.m; path = JSONModel/JSONModel/JSONModelError.m; sourceTree = ""; }; + 69A32B7A436220F9CF9C07B76572C923 /* ZXCode128Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCode128Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Reader.h; sourceTree = ""; }; + 69CE75FCAC08FBFF4A19F327BF947AEF /* ZXURIResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXURIResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIResultParser.m; sourceTree = ""; }; + 6A088F28BFD7B6C6CCEB1861DB0090F6 /* Socket.IO-Client-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-prefix.pch"; sourceTree = ""; }; + 6A5D7991606712587CFD0DFE9A5E3DC4 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; + 6A70E94641E26AE47CF88A806AF6612C /* LBXScan.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LBXScan.framework; path = LBXScan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6A780D1F42790EDF0A5CCB44B32A6A9F /* ZXHybridBinarizer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXHybridBinarizer.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.m; sourceTree = ""; }; + 6AC677CDB208825642EDD5F4BCD96A2E /* ZXWhiteRectangleDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXWhiteRectangleDetector.m; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXWhiteRectangleDetector.m; sourceTree = ""; }; + 6B836748A7FBCCB6413D869804B397EB /* Masonry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Masonry.framework; path = Masonry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6B9D75D4563F947C4DE7C065F52E210E /* ZXGeoResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGeoResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.h; sourceTree = ""; }; + 6B9FA5A8045BFC6686E0BE570A614CD3 /* ZXPDF417BoundingBox.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417BoundingBox.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BoundingBox.m; sourceTree = ""; }; + 6BBDA3E8B10E3FADF7F89B3702EEF0CB /* ZXPDF417BarcodeValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417BarcodeValue.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeValue.h; sourceTree = ""; }; + 6BFF53C2A202E0CC81A9C3D9089AA4ED /* ZXDataMatrixTextEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixTextEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixTextEncoder.h; sourceTree = ""; }; + 6C5E76D9EA1A516638FCCB1DF56749F7 /* ZXDataMatrixBitMatrixParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixBitMatrixParser.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixBitMatrixParser.m; sourceTree = ""; }; + 6CA27166E73856714CABF732CF0143F4 /* JSONKeyMapper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONKeyMapper.m; path = JSONModel/JSONModelTransformations/JSONKeyMapper.m; sourceTree = ""; }; + 6CCBEC0E54094922227B670E6DB080E9 /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.h; sourceTree = ""; }; + 6CF5E2FD354E3AD4AAD8B25E696EDDB2 /* SocketEnginePacketType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEnginePacketType.swift; path = Source/SocketIO/Engine/SocketEnginePacketType.swift; sourceTree = ""; }; + 6D74289832B8183D20B02960DB44FB6D /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; + 6DEC5D524DEA95921A68530389F09B4D /* ZXPDF417.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.m; sourceTree = ""; }; + 6E092EF878C0C56EBF720EA18E888865 /* ZXURLTOResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXURLTOResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.h; sourceTree = ""; }; + 6E8CA25D03257A99F234AA0E7E688B7B /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + 6E97EAE0A8D0A8FE97D3C042BEF63960 /* Socket.IO-Client-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Socket.IO-Client-Swift.modulemap"; sourceTree = ""; }; + 6EE5AC70172636793C97057451F9977B /* UTDID.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UTDID.framework; path = thirdparties/UTDID.framework; sourceTree = ""; }; + 6F56ED7BB1C9B9CEBCDE058DB3D75771 /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.m"; sourceTree = ""; }; + 6F5BE99075376BD247D7A8FD92EF66BB /* ZXRSSExpandedReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedReader.h; sourceTree = ""; }; + 6FBA935B14DF01661DA2725E870860A3 /* ZXPDF417DetectionResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417DetectionResult.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResult.h; sourceTree = ""; }; + 6FC2506E4A42B3837966006D093F8EC8 /* ZXBitMatrix.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBitMatrix.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitMatrix.h; sourceTree = ""; }; + 701446840081326410A29622ADBEE46B /* ZXAnyAIDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAnyAIDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.h; sourceTree = ""; }; + 7047319FE14D03FEB9C8CFEB7BC9FDB9 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + 71939E1412F60A19155773F66E519250 /* ZXReedSolomonDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXReedSolomonDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonDecoder.h; sourceTree = ""; }; + 7249B565C8E3D69892D5BEEC5267321D /* ZXEncodeHints.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEncodeHints.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.m; sourceTree = ""; }; + 726ACBE484E0CE875DB7C5A4EC9014C1 /* ZXCGImageLuminanceSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCGImageLuminanceSource.m; path = LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.m; sourceTree = ""; }; + 73114DBF445B889F132749E0B264FDD9 /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyboardManager/IQToolbar/IQToolbar.h; sourceTree = ""; }; + 732255A23528067DAC958D1EF9B12C93 /* ZXDataMatrixX12Encoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixX12Encoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixX12Encoder.m; sourceTree = ""; }; + 73394E3C99C0F7034198B9D0338C2B49 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + 73C5DF901F143420CE57E21DF5A2FE19 /* ZXUPCAReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCAReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.h; sourceTree = ""; }; + 73FE89B7E2ED57F34CFD8AE3C02ED889 /* NSObject+LKDBHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+LKDBHelper.m"; path = "LKDBHelper/Helper/NSObject+LKDBHelper.m"; sourceTree = ""; }; + 7425BF33143F64193CE5FF99404C2E59 /* ZXEmailDoCoMoResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEmailDoCoMoResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.m; sourceTree = ""; }; + 75128EF31C6D82A44B728BBBC0594214 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 754FC21784F2DBFBEFD47802461F5013 /* FMResultSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMResultSet.m; path = src/fmdb/FMResultSet.m; sourceTree = ""; }; + 7585E4B9773F7B664FB64AFCA7EA1879 /* ZXVINResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXVINResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.m; sourceTree = ""; }; + 75E16078F463F9E5994EE6ACBDA099CA /* UITableView+FDTemplateLayoutCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDTemplateLayoutCell.m"; path = "Classes/UITableView+FDTemplateLayoutCell.m"; sourceTree = ""; }; + 75F038F0E7FAF63EBA750D91DF06CE21 /* SRWebSocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRWebSocket.h; path = SocketRocket/SRWebSocket.h; sourceTree = ""; }; + 75F52EEA397EEE02870D0EDD6D0B364D /* UITableView+FDTemplateLayoutCell-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UITableView+FDTemplateLayoutCell-prefix.pch"; sourceTree = ""; }; + 764EBBB80EB48917DC7DEFD4884C727A /* ZXDataMatrixDecodedBitStreamParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixDecodedBitStreamParser.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.m; sourceTree = ""; }; + 769202E13791277C39A1C873BFE3BE54 /* FMDB.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDB.h; path = src/fmdb/FMDB.h; sourceTree = ""; }; + 769E0CC5D44E5F06068AC65B5544743E /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; + 76BD40DACA9171E75DAA6331D1651450 /* ZXPDF417DecodedBitStreamParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417DecodedBitStreamParser.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.h; sourceTree = ""; }; + 76BFAE3C824CE992C06944187EBE0981 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; + 7739B8E5715569FDCB4A5157DB47A572 /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Sources/SSLSecurity.swift; sourceTree = ""; }; + 77460A8A994E8D7ED439AB0F63A19E0C /* ZXCode128Writer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCode128Writer.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode128Writer.m; sourceTree = ""; }; + 7750F613ED29A2D26322E258E8C4D7B7 /* ZXAztecSimpleToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecSimpleToken.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.m; sourceTree = ""; }; + 77C6FE3C71048FC13BDFE75FDD624DB0 /* MJRefresh.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh.framework; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 77FC00CA12D81353B9F8489133C2DEF3 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.m"; sourceTree = ""; }; + 781061E8CBBE400CA3C48F949E3433F9 /* ZXDataMatrixDefaultPlacement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixDefaultPlacement.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixDefaultPlacement.h; sourceTree = ""; }; + 78BC20152075DB6234CD40F5410B0095 /* ZXAztecBinaryShiftToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecBinaryShiftToken.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.m; sourceTree = ""; }; + 791E3AEA6283D73CA6B2D43C93F9FADB /* ZXUPCEANExtension2Support.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEANExtension2Support.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.h; sourceTree = ""; }; + 794EB6EDFAB588BA552A834A08BADBF4 /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MBProgressHUD.framework; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 79802C836DDD9AFF60A8497B114594C6 /* ZXBoolArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBoolArray.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.h; sourceTree = ""; }; + 7980D5EF9269D296280EE048E6D687D2 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; + 799440664117950193264CD9FAE22257 /* JSONModelClassProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModelClassProperty.m; path = JSONModel/JSONModel/JSONModelClassProperty.m; sourceTree = ""; }; + 79A74B0962527E3CB0DE906FAFB94323 /* ZXDataMatrixASCIIEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixASCIIEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.h; sourceTree = ""; }; + 79E695EB33C23BAC43C22F015E115522 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; + 79FE412CCF5EB10F2499FED97EF034ED /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + 7A9339DF6CB574A5346814889C803896 /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; + 7AD9DFB82B3FCD2021AC782115A50DC7 /* ZXGenericGFPoly.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGenericGFPoly.m; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.m; sourceTree = ""; }; + 7B241E82646F26C23270DD0F25306B8D /* ZXBarcodeFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBarcodeFormat.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXBarcodeFormat.h; sourceTree = ""; }; + 7B28802C647811C71CBB2038A358709E /* ZXAztecSimpleToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecSimpleToken.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecSimpleToken.h; sourceTree = ""; }; + 7B34300FE923A79BD2BCE7C5D6584292 /* ZXDetectorResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDetectorResult.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDetectorResult.m; sourceTree = ""; }; + 7B495DB1DDBCF9A902C16E605E698C67 /* WXApi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApi.h; path = WechatSDK1.8.2/WXApi.h; sourceTree = ""; }; + 7B4F2FF1878986DA667A7CA300ED57DD /* ZXVCardResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXVCardResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVCardResultParser.h; sourceTree = ""; }; + 7B751927E132E372807C8082B5CEEC23 /* ZXAztecReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecReader.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecReader.m; sourceTree = ""; }; + 7BB7A98AA89EE65433C671154AA9EF67 /* ZXUPCEANWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEANWriter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANWriter.m; sourceTree = ""; }; + 7BE82B9D4079D3983911B8D53A96EFEC /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; + 7BED2A24A5D9FC5DE65CDB16E3993529 /* Starscream-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-umbrella.h"; sourceTree = ""; }; + 7BFB470E1E9E4EC099452CE5FDDED518 /* ZXAI01weightDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01weightDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01weightDecoder.h; sourceTree = ""; }; + 7C3FE4CD8A5E9DAC8CA4CA059E57139E /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = ""; }; + 7D1419B2A9BA099EEA7911AD5EEF5E4A /* ZXDataMatrixC40Encoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixC40Encoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixC40Encoder.m; sourceTree = ""; }; + 7D320CFA28819D61FB692FC0849DA960 /* ZXBinarizer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBinarizer.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.m; sourceTree = ""; }; + 7D621010883DE1BE39C63430A1D6B499 /* ZXRGBLuminanceSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRGBLuminanceSource.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXRGBLuminanceSource.m; sourceTree = ""; }; + 7D70C968EE0D52159E632EAD33541F1D /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyboardManager/IQTextView/IQTextView.m; sourceTree = ""; }; + 7DD5409A692C83437C558559DD416E60 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + 7DF7086537D9860DBA1838A2CF738478 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 7E1CA2E6972145743991FD3D343DF043 /* Toast-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-umbrella.h"; sourceTree = ""; }; + 7E3D66FD38AD1D0531E69B0CE20E9322 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7E6510BF5D0D6830D5650409EFC7CDC6 /* ZXRSSExpandedGeneralAppIdDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedGeneralAppIdDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedGeneralAppIdDecoder.h; sourceTree = ""; }; + 7F98EE491F1B375848361DC7AEB1B92F /* LKDBHelper.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LKDBHelper.xcconfig; sourceTree = ""; }; + 7FCC3F198D635D8A65345C2D4A225B42 /* ZXMultiFormatOneDReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiFormatOneDReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXMultiFormatOneDReader.m; sourceTree = ""; }; + 80050EF2B399B55821262973D6ADA43F /* ZXPlanarYUVLuminanceSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPlanarYUVLuminanceSource.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.h; sourceTree = ""; }; + 810DE4FE0E235525CA493EA5F5C19046 /* ZXISBNParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXISBNParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXISBNParsedResult.m; sourceTree = ""; }; + 8197FD370DE00707F2F2BC17FC0043E5 /* ZXExpandedProductResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXExpandedProductResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.m; sourceTree = ""; }; + 81A0E384E7C6FB8B202D56044210F6A9 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; + 81D496F5BF77C54A94097921D27092F2 /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyboardManager/IQToolbar/IQToolbar.m; sourceTree = ""; }; + 82A0A0268CD5C11EE39566CEFC051FCC /* ZXAI01decoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01decoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01decoder.m; sourceTree = ""; }; + 830C99480857F63A2C97638E815DFDEC /* ZXPDF417ErrorCorrection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417ErrorCorrection.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417ErrorCorrection.m; sourceTree = ""; }; + 8310F7311DA2B88E84CA2119CFD7640F /* ZXAnyAIDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAnyAIDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAnyAIDecoder.m; sourceTree = ""; }; + 8372E75D74E013924560D5687E5C410C /* ZXParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.h; sourceTree = ""; }; + 8398B6B20E9939251D23CF6750A00D88 /* ZXPDF417Common.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Common.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.m; sourceTree = ""; }; + 83ED92E0DD10D7FAE4AC6D99B8021828 /* ZXQRCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCode.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.h; sourceTree = ""; }; + 83F8703CAB596C7FBFEF9A982B05A00D /* ZXDecodeHints.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDecodeHints.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXDecodeHints.m; sourceTree = ""; }; + 84638A03F2FD43305155579E47619D3E /* FMDB-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FMDB-umbrella.h"; sourceTree = ""; }; + 849AD7977D6514419C3163A657A47A0A /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; + 84ADF7C681046CF307D8934AAB00BA0C /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + 84E95B2303E0B9EF0EE27359A6AE3610 /* ZXPDF417Dimensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Dimensions.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417Dimensions.h; sourceTree = ""; }; + 854337CBDE790AC6A849C488D88DD95A /* ZXCalendarParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCalendarParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXCalendarParsedResult.h; sourceTree = ""; }; + 85805DF5729E72CA51973DB8C158A2C2 /* ZXPDF417DetectorResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417DetectorResult.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.m; sourceTree = ""; }; + 859D68675FCAFB6FEF5CAB1173B80AB7 /* LKDBUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKDBUtils.h; path = LKDBHelper/Helper/LKDBUtils.h; sourceTree = ""; }; + 85D9B469170FDCAEC5788D34380A15E0 /* ZXQRCodeBlockPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeBlockPair.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeBlockPair.m; sourceTree = ""; }; + 863EC4B777DF2C869B1BB4CB59BA1E16 /* ZXUPCAWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCAWriter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.m; sourceTree = ""; }; + 86B6E753ADDF97940C05A4C653E7108F /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + 87120330F90EE7A00D4FD6085EA8A7C8 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + 874DCB011D3306DD0E650FE0D7C29685 /* ZXVINResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXVINResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVINResultParser.h; sourceTree = ""; }; + 8782A7575A373179F4E5803ADB820210 /* UITableView+FDKeyedHeightCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDKeyedHeightCache.m"; path = "Classes/UITableView+FDKeyedHeightCache.m"; sourceTree = ""; }; + 87BA85B60EAF1C3F2302976138B1A74B /* ZXRSSExpandedDecodedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedDecodedObject.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedObject.m; sourceTree = ""; }; + 87E787E2C141BAA67804F927DE99336B /* ZXMultiFormatWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiFormatWriter.m; path = LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatWriter.m; sourceTree = ""; }; + 87F9F6A969CE02922769E4D30F411D49 /* ZXCode39Writer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCode39Writer.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Writer.m; sourceTree = ""; }; + 88407759C5E8E0C1FEF9EAB41CE83B1E /* ZXingObjCPDF417.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCPDF417.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXingObjCPDF417.h; sourceTree = ""; }; + 885CC5C7B0CA39367EBA948DF2367B65 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; + 8877A064A7870C495A887E8D1A642DD5 /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Starscream.modulemap; sourceTree = ""; }; + 887C347C37C798794A3400C4788F82AF /* ZXAbstractDoCoMoResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAbstractDoCoMoResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.m; sourceTree = ""; }; + 887E4A760843250FA8EF25C97F1326EE /* JSONValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONValueTransformer.h; path = JSONModel/JSONModelTransformations/JSONValueTransformer.h; sourceTree = ""; }; + 888F40F9F81D0D0A3492771A2A16A8EF /* Socket.IO-Client-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-umbrella.h"; sourceTree = ""; }; + 88A91826759C3D62F0CED673A1DE3936 /* LBXScanTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LBXScanTypes.h; path = LBXScan/LBXScanTypes.h; sourceTree = ""; }; + 88F7368BA1F4E884C86CF19DE4116E2F /* ZXCaptureDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCaptureDelegate.h; path = LBXScan/LBXZXing/ZXingObjc/client/ZXCaptureDelegate.h; sourceTree = ""; }; + 88FD3FBD15119CB99E9D80D90992E1C8 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; + 89A4FB5318F041C2B8128B21D9041281 /* SRWebSocket.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRWebSocket.m; path = SocketRocket/SRWebSocket.m; sourceTree = ""; }; + 8A0EB3A18258D5F28E5882D5B74216EF /* ZXEANManufacturerOrgSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEANManufacturerOrgSupport.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEANManufacturerOrgSupport.h; sourceTree = ""; }; + 8A32A95086BFEE989BA9110A456A08E6 /* ZXMaxiCodeDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMaxiCodeDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecoder.h; sourceTree = ""; }; + 8ADDD36454D390960AFDDF9340ACC212 /* UMAnalytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMAnalytics.framework; sourceTree = ""; }; + 8B35462DBAAAE8003FB720CDC6C62786 /* ZXCGImageLuminanceSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCGImageLuminanceSource.h; path = LBXScan/LBXZXing/ZXingObjc/client/ZXCGImageLuminanceSource.h; sourceTree = ""; }; + 8B5EDD4CAD43462B4C5BF3031AE64E40 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; + 8BB6CE9214EA8AB66876C167AF588993 /* ZXQRCodeMaskUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeMaskUtil.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.h; sourceTree = ""; }; 8BBB7F3A03E7F2608FE52B0194635075 /* Pods-GIGA-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GIGA-acknowledgements.markdown"; sourceTree = ""; }; - 8BF67949298271264E085700428A4FCF /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; - 8C47585F4328CD92273C4B86865F9F95 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = ""; }; - 8CC12A9C12532CB9C97DB1F60227C686 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8E6E813A4FEA7EAA36447924B0005A89 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; - 9000E691EFB3E3B3FF8C0EB04CFB70DB /* JSONModel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JSONModel.xcconfig; sourceTree = ""; }; - 90609B4B8F17E6BD520EC73A397904D4 /* SocketIOClientOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientOption.swift; path = Source/SocketIO/Client/SocketIOClientOption.swift; sourceTree = ""; }; - 91A39121A9FBC45737A0102A4364012D /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; - 91DA5B2E5AE56CB9005ECE4644FA3356 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; - 9265EF5245C8B9E17305393357C5D93F /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; - 935FBB07F207A53D79856BDDE153E292 /* JSONModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = JSONModel.framework; path = JSONModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 936CB1BC52F552DA2661695DAD338FA0 /* SocketEngineSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineSpec.swift; path = Source/SocketIO/Engine/SocketEngineSpec.swift; sourceTree = ""; }; + 8C63B24E653A33063238765577E8CAFB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8C8C3783F0610B08ADD978480B682776 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 8D348C141AC0E517123D21C02ACD9329 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 8D36A1C2ADDA3E56029534C48A04FF1D /* TTTAttributedLabel.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TTTAttributedLabel.xcconfig; sourceTree = ""; }; + 8D7697DD5DF625D58F6CE57BB14C297D /* JSONValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONValueTransformer.m; path = JSONModel/JSONModelTransformations/JSONValueTransformer.m; sourceTree = ""; }; + 8DF3BB511F79101FC0344D36A8E097E5 /* ZXAztecHighLevelEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecHighLevelEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.m; sourceTree = ""; }; + 8E4B09EF879FBFE955837502D34D1D94 /* NJKWebViewProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NJKWebViewProgressView.m; path = NJKWebViewProgress/NJKWebViewProgressView.m; sourceTree = ""; }; + 8E524E96BB42E41C1895212420B58739 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseAdditions.m; path = src/fmdb/FMDatabaseAdditions.m; sourceTree = ""; }; + 8E7F4A62E4A63E56908ECD88933E8837 /* ZXRSSPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSPair.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.h; sourceTree = ""; }; + 8E965DDA942C48F7D3BABD368A08FFF8 /* ZXAztecDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecDetector.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/detector/ZXAztecDetector.h; sourceTree = ""; }; + 8EB1EC42888716D62C56F080EBFEC574 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 8EE863584B2CE5FF79FA84D75D284787 /* ZXRSSExpandedCurrentParsingState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedCurrentParsingState.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedCurrentParsingState.h; sourceTree = ""; }; + 8F35A69CB060517CBAC06B3C7FBB0EFB /* ZXQRCodeDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoder.h; sourceTree = ""; }; + 8F71177B88BB0E0A87A20AE7F03B39A1 /* ZXAI01AndOtherAIs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01AndOtherAIs.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.m; sourceTree = ""; }; + 8F7BE25B41BDBD831AC67465B027F6E0 /* ZXTextParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXTextParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTextParsedResult.m; sourceTree = ""; }; + 8F89033611F194CBF26D09D22D99E82B /* ZXMultiDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiDetector.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiDetector.h; sourceTree = ""; }; + 8FD5528C0D2E108DE76282C4D370CF27 /* JSONModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModel.m; path = JSONModel/JSONModel/JSONModel.m; sourceTree = ""; }; + 8FF962C3B5E9F87BAD0687F98E01A68F /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = ""; }; + 901E0F1F7B4E32D33B1445F00BAB3D6A /* ZXQRCodeEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.h; sourceTree = ""; }; + 909EEACC3D53B5C20B405FE99AABA0A6 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; + 90F4A80F4369642483FA571081BD0792 /* ZXPDF417DetectorResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417DetectorResult.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417DetectorResult.h; sourceTree = ""; }; + 9100592460B4D50C5A7AFF91703629A2 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + 914722339DCB3642FEB6E757F40ABA8D /* ZXWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXWriter.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXWriter.h; sourceTree = ""; }; + 915CC73C8057CA2817230A48BC6A391F /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; + 9165CCA443172EAFEA5F67FEC667E494 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; + 91706C8AD7E45476FC3B6520045F128A /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseAdditions.h; path = src/fmdb/FMDatabaseAdditions.h; sourceTree = ""; }; + 91780F76FA729D64DC40C0D86F70021B /* ZXCode93Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCode93Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode93Reader.m; sourceTree = ""; }; + 919EF3437C8069062405289CF4D9F092 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; + 91B5524326030982E08D19C6DD79A605 /* SocketAckEmitter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAckEmitter.swift; path = Source/SocketIO/Ack/SocketAckEmitter.swift; sourceTree = ""; }; + 91DC0E3772AFD8079EF04FD95782DDD4 /* ZXingObjCQRCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCQRCode.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/ZXingObjCQRCode.h; sourceTree = ""; }; + 92303B24A8D5DC6C6A24C8F20C2E9E3E /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; + 9260C97F834AFDC5E9287A483A3EEB0C /* ZXPDF417DetectionResultRowIndicatorColumn.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417DetectionResultRowIndicatorColumn.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultRowIndicatorColumn.m; sourceTree = ""; }; + 92C9AAE9DC1DDF0477A47CF84DA2077F /* ZXParsedResultType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXParsedResultType.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResultType.h; sourceTree = ""; }; + 92DF69FA8D4D90C6AC636313847C0EC1 /* ZXHybridBinarizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXHybridBinarizer.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXHybridBinarizer.h; sourceTree = ""; }; + 92FEEDFA83D3A00920E16B9CABEFA1E5 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; + 93574EE2DA0422951D812872E110654B /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; + 9368955A4245EB6352EB3B9F4BBE71EC /* LBXZXCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LBXZXCapture.m; path = LBXScan/LBXZXing/LBXZXCapture.m; sourceTree = ""; }; + 938F35BAAAE72B357005D1264806218D /* ZXWifiResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXWifiResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXWifiResultParser.m; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 93BF77A950CD15978D9DA654DDF789CD /* SocketExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketExtensions.swift; path = Source/SocketIO/Util/SocketExtensions.swift; sourceTree = ""; }; - 9524B522E6F3A1198F46B4ED841E5662 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + 94CFF893F9D6E23A88F2A5A0A8C5ED5E /* ZXQRCodeFinderPattern.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeFinderPattern.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.h; sourceTree = ""; }; + 94E7CD71392F64ED3AC825DD5A940E9B /* ZXPDF417ResultMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417ResultMetadata.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.h; sourceTree = ""; }; + 952FF743AF577C64405F324852A0C255 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; 9574A12E8279712E0544674068BEC2E1 /* Pods-GIGA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GIGA.release.xcconfig"; sourceTree = ""; }; - 96351089BE56F809A66D4165730BDD76 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = ""; }; - 964EB9F9E3DFDFBEB0A635FF6F6445AC /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; - 967F8C400CE4F9921B132F3F960E9FF0 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; - 986BB8C05577A2D5C64F498406015E85 /* SocketIOClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClient.swift; path = Source/SocketIO/Client/SocketIOClient.swift; sourceTree = ""; }; - 98D89B37F7C92F976B671CF4941E8120 /* TTTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TTTAttributedLabel.m; path = TTTAttributedLabel/TTTAttributedLabel.m; sourceTree = ""; }; - 99792AD152EC0F67CE203E29D0DACFC0 /* YTKKeyValueStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YTKKeyValueStore.framework; path = YTKKeyValueStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9A3CCB6C657E89D308B34C47CC5B789F /* NJKWebViewProgress-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NJKWebViewProgress-prefix.pch"; sourceTree = ""; }; - 9A594A8236E67EB8170C115C30847FF7 /* FMResultSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMResultSet.h; path = src/fmdb/FMResultSet.h; sourceTree = ""; }; - 9ACEC95F7E6261C5C5E02E54CAFEA523 /* FMDB-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FMDB-umbrella.h"; sourceTree = ""; }; + 95B0E8D4B76F1C79F62D3C8D3627C8A7 /* ZXBitArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBitArray.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.h; sourceTree = ""; }; + 95B5D6488D2A9F8A957047341D1B1418 /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = ""; }; + 95CF6F20DA7D7D257F63CD7A8455C821 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; + 95FF3C16B3F10DF0EF6D569E78EA0782 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = ""; }; + 9643D2880EE03EF0A3081B00FE7DA113 /* ZXResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXResult.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResult.h; sourceTree = ""; }; + 96BA16BA4887B99913F4FCD4AB7FD99B /* ZXBizcardResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBizcardResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.m; sourceTree = ""; }; + 96D38E5E642795832255E9825CD80F42 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + 97120A07517F383800EC11FA12D775F0 /* ZXTelParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXTelParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.m; sourceTree = ""; }; + 973C6EBA1615D36BDFC14E663610CCC4 /* ZXProductResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXProductResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXProductResultParser.m; sourceTree = ""; }; + 97F1AC93F2135443DB33797B991F6A99 /* ZXITFWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXITFWriter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXITFWriter.m; sourceTree = ""; }; + 98AE7D5EF6D7FEDB91625641851AF22C /* ZXSMSMMSResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXSMSMMSResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSMMSResultParser.h; sourceTree = ""; }; + 98CC65FA85FE2ADBCBCE814D21E7A861 /* ZXPDF417ResultMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417ResultMetadata.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417ResultMetadata.m; sourceTree = ""; }; + 99247344EB46502CC5221B2DE032D0EF /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; + 9972D7F08FB570BEE096D26DB04BA42C /* ZXURIParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXURIParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.m; sourceTree = ""; }; + 9994A9404B4EFC309846990C886EB6EC /* ZXDataMatrixDecodedBitStreamParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixDecodedBitStreamParser.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecodedBitStreamParser.h; sourceTree = ""; }; + 99AF4EF91F2DE9DF43B1D24BE3F0F259 /* ZXUPCAReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCAReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAReader.m; sourceTree = ""; }; + 99C40C91334B69C1D3D909F15E8B8784 /* LBXScan.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LBXScan.xcconfig; sourceTree = ""; }; + 9A4A17170327EDA50F9392EA804A73E4 /* ZXByQuadrantReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXByQuadrantReader.m; path = LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.m; sourceTree = ""; }; 9B08C8E485946B27165B1EE380D12B99 /* Pods-GIGA-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GIGA-frameworks.sh"; sourceTree = ""; }; - 9BB3C77E5D6641E78ECDFF85F30BD25A /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; - 9C199822C99C320281338D998C03B995 /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; - 9CA67BCA7DA83AFB686019666B15E346 /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; - 9D4B692446F5B3A848158599E0258088 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9DBF7AFC604013C37D42D03D54C2B42A /* FMDB.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FMDB.modulemap; sourceTree = ""; }; - 9E018CB10D71F6E7076E334BE4031987 /* YTKKeyValueStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YTKKeyValueStore-dummy.m"; sourceTree = ""; }; - 9E5007EEC9570DEC0914742C5AA50210 /* FMDB.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDB.h; path = src/fmdb/FMDB.h; sourceTree = ""; }; - 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 9FE34AE9B11E8E9CE707D60148CFB286 /* MBProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-umbrella.h"; sourceTree = ""; }; - A087BAC4F72D6A1D75482DB745BF663D /* IQKeyboardManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManager.framework; path = IQKeyboardManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A0E77CB702D048DE8D95D7B71073CB5A /* MBProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MBProgressHUD.framework; path = MBProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A1476EF51AAC4F331DC16EE15A7C9A52 /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; - A1D013A487C85EC1042B4A1ED71E7C6D /* JSONModelError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModelError.m; path = JSONModel/JSONModel/JSONModelError.m; sourceTree = ""; }; - A1E47E6E0B0C4589F0066EB47D2EFB1E /* NJKWebViewProgress.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NJKWebViewProgress.xcconfig; sourceTree = ""; }; - A2092DB43436F5251A059C3C4A62A935 /* JSONModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModel.h; path = JSONModel/JSONModel/JSONModel.h; sourceTree = ""; }; - A21BBBF163BCA4C3910C8490302E3372 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; - A2D6F39FC472C9C3E27C6635ECE723DE /* JSONModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONModel-prefix.pch"; sourceTree = ""; }; - A38841D1204800C4F712AB1D13E4AC7D /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; - A3F1A8219D19797685AF2D8E9EAFE675 /* JSONModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONModel-umbrella.h"; sourceTree = ""; }; - A683976152674929538EEEC6EFF05A4B /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = ""; }; - A6DAF6AA9DC71209F96E9D4506478663 /* SocketManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketManager.swift; path = Source/SocketIO/Manager/SocketManager.swift; sourceTree = ""; }; - A71A2EDB7D80E8B54C1540FA4E2B8A8D /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = ""; }; - A77564763595F2220FB4FF9C93274429 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; - A9341A0F668333A93B6FBD08098250C4 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; - AAF305E6DECD78168E49221E61B947D7 /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + 9C08014B0933A01D397B8D075C867A21 /* JSONHTTPClient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONHTTPClient.m; path = JSONModel/JSONModelNetworking/JSONHTTPClient.m; sourceTree = ""; }; + 9C401B49150060182D6B98AC9E686452 /* ZXOneDReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXOneDReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDReader.m; sourceTree = ""; }; + 9C712E59659A99F86AFAA0B58C0DFDB4 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SocketIO.framework; path = "Socket.IO-Client-Swift.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9CF6BA279450E3190B0CDC82B9F6A6A5 /* ZXRSSPair.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSPair.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSPair.m; sourceTree = ""; }; + 9D34CE6EABED483EF7CD837F56BA870E /* ZXAztecDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.m; sourceTree = ""; }; + 9D599C849A81087BE4C9522B4A37FC9F /* ZXEmailDoCoMoResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEmailDoCoMoResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXEmailDoCoMoResultParser.h; sourceTree = ""; }; + 9D6A9FBDA969B9C0A17DD37367C7D458 /* UITableView+FDTemplateLayoutCellDebug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDTemplateLayoutCellDebug.h"; path = "Classes/UITableView+FDTemplateLayoutCellDebug.h"; sourceTree = ""; }; + 9DA31DB4D2D916ED462A824500A5F3A2 /* ZXQRCodeDataMask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDataMask.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.h; sourceTree = ""; }; + 9E1B789C3043FB090F33F1470E090C56 /* ZXQRCodeMatrixUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeMatrixUtil.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMatrixUtil.h; sourceTree = ""; }; + 9E285F41A9F8C786ECBCB839D2E7523E /* ZXUPCEANReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEANReader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANReader.m; sourceTree = ""; }; + 9E63C2B99195537A79F146DCB9287F32 /* ZXTelResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXTelResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.h; sourceTree = ""; }; + 9E9F570F0C8FF7E01A8D9117552856F8 /* SocketExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketExtensions.swift; path = Source/SocketIO/Util/SocketExtensions.swift; sourceTree = ""; }; + 9F487C09C91BF1BB7E08546251F89F67 /* ZXPDF417BarcodeMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417BarcodeMetadata.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.h; sourceTree = ""; }; + A00BFC9C88717D14B3A38DDBA026EC02 /* NJKWebViewProgress-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NJKWebViewProgress-prefix.pch"; sourceTree = ""; }; + A0F634DD850EAE7CA353C2E86F349468 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + A1725A50F6434DA07CB5D66F836BB43D /* Masonry-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-umbrella.h"; sourceTree = ""; }; + A1996AA7C2137DB7AA8880037F9572EF /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = ""; }; + A1B680E7E47A448E6A788774476A57A2 /* ZXResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXResult.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXResult.m; sourceTree = ""; }; + A1F1C5F5EFF4C33056EAF1088E9E7508 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; + A1F500C7BA7C866D98A220946E05CAC5 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; + A23106CA0DB895B05E409ACADA49BB3D /* LKDB+Mapping.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "LKDB+Mapping.h"; path = "LKDBHelper/Helper/LKDB+Mapping.h"; sourceTree = ""; }; + A29E3B478023A4FB4277FE9E1BE899F2 /* ZXingObjC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjC.h; path = LBXScan/LBXZXing/ZXingObjc/ZXingObjC.h; sourceTree = ""; }; + A2F2DAC00021411F4AF5F6FAC3BE4A94 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + A359CB7F1A4A59988CE455850F4BE8BB /* NJKWebViewProgress.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = NJKWebViewProgress.framework; path = NJKWebViewProgress.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A3625D636A02C0F2E65B79BC3ABA5783 /* ZXDefaultGridSampler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDefaultGridSampler.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDefaultGridSampler.h; sourceTree = ""; }; + A364B76E07EDED5CE6622600D9A01FA6 /* SocketAnyEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAnyEvent.swift; path = Source/SocketIO/Client/SocketAnyEvent.swift; sourceTree = ""; }; + A3C43BAFFC6BDA58CF469DA602D71A44 /* TTTAttributedLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TTTAttributedLabel.framework; path = TTTAttributedLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A40463DAC6A4E916654CEF343C61ECED /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; + A52DB4C293AA3C677B923D21761331BA /* IQPreviousNextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQPreviousNextView.h; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.h; sourceTree = ""; }; + A5B4BD93D1FBC6F4581EAB2435A5F131 /* ZXMaxiCodeDecodedBitStreamParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMaxiCodeDecodedBitStreamParser.h; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.h; sourceTree = ""; }; + A5B4D719680B5193F01818BEC9CBCB1F /* MBProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-umbrella.h"; sourceTree = ""; }; + A605A6AD7D5F53CB478E997357A1806B /* ZXAddressBookParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAddressBookParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.m; sourceTree = ""; }; + A6441842DFDFD74CCBE21A6F514D87A6 /* ZXInvertedLuminanceSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXInvertedLuminanceSource.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXInvertedLuminanceSource.m; sourceTree = ""; }; + A657F0E7F01EED7AB15C3FE8BD0AAF6B /* JSONKeyMapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONKeyMapper.h; path = JSONModel/JSONModelTransformations/JSONKeyMapper.h; sourceTree = ""; }; + A6A01C46E262767595CA64143AAF6C86 /* FMDB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FMDB.framework; path = FMDB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A6D3821B872268A19EE44F9D2588F7A0 /* JSONModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONModel-umbrella.h"; sourceTree = ""; }; + A6E56698796C576CBF735BC5B1FCD3D5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A6E84FFF96FBBB3DBB2CE50E2596FD78 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = ""; }; + A719998C7423E553C66F59766C89B816 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; + A79EFE14BBDF9C55ED15A3764AC1BF0F /* SocketRocket.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SocketRocket.framework; path = SocketRocket.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A7BE92D9A88AAB98280F5BE26B6CC9BB /* ZXGeoResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGeoResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoResultParser.m; sourceTree = ""; }; + A7D63F4A9BC3FDE37EC6321B924A9C9B /* ZXQRCodeAlignmentPattern.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeAlignmentPattern.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeAlignmentPattern.m; sourceTree = ""; }; + A849FD8B462BFB2E09656D3DCD53DF72 /* ZXRSS14Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSS14Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.m; sourceTree = ""; }; + A8E4C804748510DA87291035398A53AE /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + A8FFDBA30ABE67DF60944AEBFEA340CF /* ZXQRCodeFormatInformation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeFormatInformation.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.m; sourceTree = ""; }; + A90CAF9315D25AD78A6FDCE407EE1C42 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A91BF9681A7A223AEA3D079A4CF53340 /* ZXTelResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXTelResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelResultParser.m; sourceTree = ""; }; + A9B1920938E17DFD570D8A1D948CC7AA /* ZXDataMatrixErrorCorrection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixErrorCorrection.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixErrorCorrection.h; sourceTree = ""; }; + A9B43581CEA2EE0D03C949A7239BCD9F /* ZXAztecToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecToken.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecToken.m; sourceTree = ""; }; + A9CA5FF09538D3B7C48A9AF5FBB9221F /* ZXAztecDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/decoder/ZXAztecDecoder.h; sourceTree = ""; }; + AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + AA29DD0E0EAA7C717EB5BF59D7AD96DB /* UITableView+FDTemplateLayoutCell.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "UITableView+FDTemplateLayoutCell.modulemap"; sourceTree = ""; }; + AA2E6F4B5C1F9A653817CBC14DE0A616 /* ZXDataMatrixDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.h; sourceTree = ""; }; + AA66F30DD8EC54D685DADC01A7D059EF /* ZXBizcardResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBizcardResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXBizcardResultParser.h; sourceTree = ""; }; + AA7AB3507351BCA6C4527C3BC7312C0F /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = ""; }; + AA90CAD09890A93DE22DF96193FDE32F /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.m; sourceTree = ""; }; + AAA0264943D4277E2ED911E5B95C9782 /* ZXAztecState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecState.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.h; sourceTree = ""; }; + AACA34D95CFD97B77A99CD3EB2150FB4 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; + AB2178008AF9DA5F005048AEC7DF5133 /* ZXBitArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBitArray.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBitArray.m; sourceTree = ""; }; AB2DF74840B542C3AD232BD2BD39EDAC /* Pods-GIGA-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GIGA-acknowledgements.plist"; sourceTree = ""; }; - ABEE1B30110BC813D624D9257CEA50D1 /* LKDBHelper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LKDBHelper.modulemap; sourceTree = ""; }; - AC5B168B958ECE131EC368A4E10C6DEB /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; - ADA2CB35E59C1515D5BED389D956661B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - ADD95A322AD6CC6DFF9662EE73FD3866 /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; - AE85EEFEF754EE2C913DA2E906A10FD0 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = ""; }; - AF292596176CE1B357AB1A3CC5FC2AA6 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = ""; }; - AFEF7822284D0740E9439FDA575D9C21 /* MBProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; - B01D2A082D8362F5E95027DBAE3D1DFD /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; - B2DEBA7CEFB5421B185C9365A7AA8A75 /* JSONAPI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONAPI.m; path = JSONModel/JSONModelNetworking/JSONAPI.m; sourceTree = ""; }; - B2EF076F89FAD3ACFE9DCCC73E3553A3 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; - B37CE92BCFA7B9F94F1EC5EEE702D1C8 /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = ""; }; - B391B9DE52D6245F6A0358F52F1E44B0 /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = ""; }; - B3FC77617DC552A6560A5396024E9F3E /* NJKWebViewProgress.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NJKWebViewProgress.m; path = NJKWebViewProgress/NJKWebViewProgress.m; sourceTree = ""; }; - B416F9C983C43629DD021B63239CC1E0 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; - B4AA799A01CF6F84D07EBC2151183FE8 /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyboardManager/IQToolbar/IQToolbar.m; sourceTree = ""; }; - B4AF1BBB3946B6E0D89CDC1AE59011B0 /* SocketEnginePollable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEnginePollable.swift; path = Source/SocketIO/Engine/SocketEnginePollable.swift; sourceTree = ""; }; - B66D98C970953F228BE3D0F043AA6859 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; - B6841A5F308297E91E99E7B83292909E /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = ""; }; - B72958B223F8DBC6D1DEBDF0873BBBD4 /* UITableView+FDTemplateLayoutCell-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UITableView+FDTemplateLayoutCell-dummy.m"; sourceTree = ""; }; - B755A7EEE0FDDBCCB793F3ED139513EF /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; - B84232FF804EAAE9753EE17FCA85A8AE /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; - B88609AD20FB25EC23E9CB38EFA4261C /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; - B8B56BE8B95141AA7FFDB381009541CA /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; - B8C80B2C162E2DADAE6E64B7C59BD395 /* NJKWebViewProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NJKWebViewProgressView.h; path = NJKWebViewProgress/NJKWebViewProgressView.h; sourceTree = ""; }; - B900B84AB25BE438B82CB50415C5ADE5 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = ""; }; - B946CD9D828545C56B16DD0BAE1A4357 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - B9995F667229F5D1A39B33E48EA6FCD5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B9B3DFA903870C5127C0EB7DCA2CD096 /* WechatAuthSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WechatAuthSDK.h; path = WechatSDK1.8.2/WechatAuthSDK.h; sourceTree = ""; }; - BB129160697EBA00C13DD98D69D252F7 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; - BB6C3ABE582E083225418DE0C8C70C57 /* NJKWebViewProgress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NJKWebViewProgress.h; path = NJKWebViewProgress/NJKWebViewProgress.h; sourceTree = ""; }; - BB8ED24222958BA93B420822394B77BC /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; - BBDC6D1622DB585841784A5DED1346FA /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = ""; }; - BC38A229ADD93FA75F0CDC8D9BE4FC6A /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; - BC5C08FC6773BA7BD235A3B78A7ABCAA /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; - BC5D2DFF79A26EDAE2E4229FA02DE3ED /* FMDB-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FMDB-dummy.m"; sourceTree = ""; }; - BCDDB5FF379578ABC9203ED41F2C6152 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; - BDB59FA6744E05662DDE8F5FB6697313 /* JSONKeyMapper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONKeyMapper.m; path = JSONModel/JSONModelTransformations/JSONKeyMapper.m; sourceTree = ""; }; - BDBB82B0577F0513EA40C059469FCAD4 /* IQKeyboardManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-umbrella.h"; sourceTree = ""; }; - BE39E881910D30BFF4517A4177625677 /* NSObject+LKDBHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+LKDBHelper.m"; path = "LKDBHelper/Helper/NSObject+LKDBHelper.m"; sourceTree = ""; }; - BEA40D79454E792C12261F3AF180920F /* Pods_GIGA.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_GIGA.framework; path = "Pods-GIGA.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - BEA9D04E7D8139122C3891161371C04F /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; - BEDD0B27A048E132CE68F433D20A9480 /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = ""; }; - BFC2CEE4A1CC40C763FF7873BA8B56D1 /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyboardManager/IQToolbar/IQToolbar.h; sourceTree = ""; }; - C0FD05EAF05C6EE6CD501AA135B3FC66 /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; - C1ADBB706FDB59836CD7FB8B56580BFE /* Toast.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Toast.modulemap; sourceTree = ""; }; - C35DDEF1EDC8880803553CEF5DDDCA6A /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; - C3CE92694B37B4E144AB7C2A657FB9EA /* libWeChatSDK.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libWeChatSDK.a; path = WechatSDK1.8.2/libWeChatSDK.a; sourceTree = ""; }; - C405F8314A0EDA4CCECFACFD56BD6452 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; - C49E0B9B92E3FB3DF23C94F2D7F2B819 /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = ""; }; - C4E76FAF8061A10B224E54FE0D78F122 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; - C52D5FBF7AC49549CACAB8E226E06A55 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = ""; }; - C53B6F23513590B1B35519E049C3AD72 /* FMDatabase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabase.h; path = src/fmdb/FMDatabase.h; sourceTree = ""; }; - C5AB81B04A2D01A1380ED02CA7F95DE4 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; - C5DC2D40CE636899E96F07F2E86609A7 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; - C5E794D2376437EFF78B2C7EB9D7060B /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; - C607C7BF73E5A94800A31DAFFC343CAC /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; - C722C8355643E88536A2074EFDB9B2DA /* SocketParsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketParsable.swift; path = Source/SocketIO/Parse/SocketParsable.swift; sourceTree = ""; }; - C73F80367886F94832EE106D9F164391 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; - C74B6FEF3E092E16E6AA34C13A34D0B9 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = ""; }; - C7D7CD906FAB43D44FF0E620B8F6644C /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; - C8B763BF7B2D2A4C39D2DC28299CEF57 /* JSONAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONAPI.h; path = JSONModel/JSONModelNetworking/JSONAPI.h; sourceTree = ""; }; - C933FC7192774929912447057B8E4562 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C98EC4CD7AD6C86DF803FE3B76FCED1A /* LKDBHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKDBHelper.h; path = LKDBHelper/Helper/LKDBHelper.h; sourceTree = ""; }; - C9CDC1F6DD226D0362ABF5BAC2D55A32 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; - CA55885292577F09084E8F2BB1E84632 /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; - CA697CD49B3E51073391142FA485D827 /* SRWebSocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRWebSocket.h; path = SocketRocket/SRWebSocket.h; sourceTree = ""; }; - CA9FD8A6D417DF1249A66C83FFBE8E4C /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; - CADC5017C63268D068AD5B7FB33E0BFC /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; - CB12608CAF6344C9CD54DC1A84A0BEF5 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; - CB4643E8EBAD5EE3D3BEF6DE78EBAA46 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; - CBE54AA9DF51DD23D24F6D99DBE4D170 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.m"; sourceTree = ""; }; - CC29AB6DCE0390D33472279DBF9F826F /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; - CCB297EBF9711390A31826257A45DFED /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CCBD06AABD5DDD4CA2D79364A77DF3BF /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = ""; }; - CCD140D091E406CA53B6F3992BBDB579 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = ""; }; - CD9FF2C9E2179EFB4B65EAA1F59EB227 /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; - CDA517AA74DD3581625EABAFCF57A1F3 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = ""; }; - CDF02B7C8432A7AF339B1C46A875FAA1 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; - CE00515C642F3041D7530F99532A37B1 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; - CECF499859A92AC25079255ECACA8E36 /* TTTAttributedLabel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TTTAttributedLabel-dummy.m"; sourceTree = ""; }; - CF27FA729B2DA26B0CE791FB3E90BC05 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - CF40AB4FCB400AB1D8CC624FF95B74E4 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.m; sourceTree = ""; }; - D03FDD61963B602D63D86983F58A4B56 /* Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Toast.h; path = "Toast-Framework/Toast.h"; sourceTree = ""; }; - D04F3E0E968470EBB1EC4F70818FABF3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D083351E8A8E8A86A59BA3A3863723C4 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; - D1192940DD792A9A986CB6606BFB24E8 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = ""; }; - D143D5CBDD8A310F6BE8B5FE049E63B7 /* JSONKeyMapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONKeyMapper.h; path = JSONModel/JSONModelTransformations/JSONKeyMapper.h; sourceTree = ""; }; - D15A13B4D2D795A0C6BFDD4C3D657FCF /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyboardManager/IQTextView/IQTextView.h; sourceTree = ""; }; - D18BF93986D1392783B2FEBA0B4EEBE5 /* TTTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TTTAttributedLabel.h; path = TTTAttributedLabel/TTTAttributedLabel.h; sourceTree = ""; }; - D1AF018F0E0542900564BFAF307755AD /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; - D1C4ECF2FBF4E01A9207EE8FD4F3FF66 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; - D1FD9AB8D8A0F476AA2FFFB0AF73984A /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; - D2C3B4A8303BF777A59CF2BAC331C8B6 /* SocketPacket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketPacket.swift; path = Source/SocketIO/Parse/SocketPacket.swift; sourceTree = ""; }; - D4BFC19B6137B925C0EDE4EBABA27FC7 /* FMDatabase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabase.m; path = src/fmdb/FMDatabase.m; sourceTree = ""; }; - D526289C8F52F38595B594AF6ED917FA /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = ""; }; - D58D416D0D907E75F8F25DBC31A8F2A0 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; - D6CDF2935BA2A5F043D6242F45854A06 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; - D7AFFE638A1D3629C5C2E838084B7CB7 /* UITableView+FDTemplateLayoutCell.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "UITableView+FDTemplateLayoutCell.xcconfig"; sourceTree = ""; }; - D82A606DAFFFB4961C3B9C2FA8505535 /* SocketAckEmitter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAckEmitter.swift; path = Source/SocketIO/Ack/SocketAckEmitter.swift; sourceTree = ""; }; - D8509BE0EBE02FAB118A15EBE60C8E47 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D887710C70848A5D7BBB59F3733FA591 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; - D8B941495F77E08AA9AD977942455F90 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; - D917488C1503A8C83A348CD03817262E /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.h"; sourceTree = ""; }; - D9976EC54E15F0720C2031B0C2BE45A7 /* Bugly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bugly.framework; sourceTree = ""; }; - D9BDB47A250C4BB9FE058D907EC81077 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; - DA25A84A833228F9B77716016FCF329F /* FMDatabaseQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseQueue.h; path = src/fmdb/FMDatabaseQueue.h; sourceTree = ""; }; - DB5CDE6B616CD12A18C278C6799A0094 /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = ""; }; - DBF35F229F62DAFB1E3D7FA0942B6D8A /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; - DC11B08B388CE3D8E34D3E0AC2E3B25C /* Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Compression.swift; path = Sources/Compression.swift; sourceTree = ""; }; - DCF6F5650FAA9B82ED6F665EAB1DE040 /* JSONHTTPClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONHTTPClient.h; path = JSONModel/JSONModelNetworking/JSONHTTPClient.h; sourceTree = ""; }; - DDC8D5C54CB2FA432E51D33F63299867 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; - DDE1008593C16D5180F63ED51EC27802 /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Starscream.framework; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DE39B5880E93ED7DB42C862E7B216691 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E03910B7599DBB9DE52BA6B580D5420C /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.m"; sourceTree = ""; }; - E08E7458F1940F20C0E1BBF7FDD0FDE7 /* SocketRocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SocketRocket.h; path = SocketRocket/SocketRocket.h; sourceTree = ""; }; - E20BA2B707DD3CA5BBBF617A38FCB880 /* LKDB+Mapping.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "LKDB+Mapping.m"; path = "LKDBHelper/Helper/LKDB+Mapping.m"; sourceTree = ""; }; - E2ED3BE7480909B51B50DE2998A28003 /* Socket.IO-Client-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Socket.IO-Client-Swift.modulemap"; sourceTree = ""; }; - E3206BC9B15475420835FF224D6604E1 /* UITableView+FDTemplateLayoutCellDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDTemplateLayoutCellDebug.m"; path = "Classes/UITableView+FDTemplateLayoutCellDebug.m"; sourceTree = ""; }; - E34D12543D1E0D6B0197D19F99328425 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; - E3949679577E6689BFFF358B9518FE13 /* SSLSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSLSecurity.swift; path = Source/SocketIO/Util/SSLSecurity.swift; sourceTree = ""; }; - E43C0234304F095C027CA559CA4E9F0B /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; - E64BCF4BA39828C61CC26523596F36BC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E6841BB55B15555FACC1C2407F11D87A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E7A5DB8DF2295A90EB25F7E495E5F62B /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; - E84CE3A7FDCD3AE81A473F6C746504A2 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E860149186CE6E56BAAEE62CA5ABDF8E /* MBProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-prefix.pch"; sourceTree = ""; }; - E88C81586D204E9EC5AB0CBFE3620057 /* JSONModel+networking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "JSONModel+networking.m"; path = "JSONModel/JSONModelNetworking/JSONModel+networking.m"; sourceTree = ""; }; - EAB6CB6F47D077D87B2488C5A7D01EE4 /* SocketEngineWebsocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineWebsocket.swift; path = Source/SocketIO/Engine/SocketEngineWebsocket.swift; sourceTree = ""; }; - EAB909A57EFF13EAD51EF05B4F73395B /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.h"; sourceTree = ""; }; - EC02366395598C42E28F51101028C3D3 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; - EC74917D726BBCA053741855222BD20F /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/UIView+Toast.h"; sourceTree = ""; }; - ECFAC79A556CD170296E2CF2FDE40919 /* UITableView+FDKeyedHeightCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDKeyedHeightCache.m"; path = "Classes/UITableView+FDKeyedHeightCache.m"; sourceTree = ""; }; - EEB3011FEE0FAEAB95CDBD6F94B6266A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - EED26BAA73FE884C227E56BEB5E9D7C5 /* SRWebSocket.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRWebSocket.m; path = SocketRocket/SRWebSocket.m; sourceTree = ""; }; - EF79A7916BB6B36C2A83C99F45DDA1C3 /* UITableView+FDTemplateLayoutCellDebug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDTemplateLayoutCellDebug.h"; path = "Classes/UITableView+FDTemplateLayoutCellDebug.h"; sourceTree = ""; }; - EFC686D628AA3C2CFA30D354721530B4 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; - F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - F0A568A70445E76EE1B2DC6996139B64 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; - F270EF20130EC0714D627B3FC934F8B8 /* JSONModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JSONModel.modulemap; sourceTree = ""; }; - F30327CFECF1D69BC51289B5CCC97712 /* SocketRawView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketRawView.swift; path = Source/SocketIO/Client/SocketRawView.swift; sourceTree = ""; }; - F426661253D1751C24C7C550B0DD3742 /* UITableView+FDTemplateLayoutCell-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UITableView+FDTemplateLayoutCell-umbrella.h"; sourceTree = ""; }; - F45B85ABF6C73FC46039EF4A3D28A28D /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; - F51B36454E6DCF580D43CCFCB03FC536 /* UITableView+FDIndexPathHeightCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDIndexPathHeightCache.h"; path = "Classes/UITableView+FDIndexPathHeightCache.h"; sourceTree = ""; }; - F57EAFC722DC8A1A5E24FC9DC97959E0 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; - F665835060F250C5E831A32121C45B5F /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; - F6D2D8438420EB7A9186D08660AD7BD6 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; - F6F9763802AC8D472A1FFBF6A867B33D /* JSONModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JSONModel.m; path = JSONModel/JSONModel/JSONModel.m; sourceTree = ""; }; - F73DA4A37A5395D46FB30B61FCEADF0E /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = ""; }; - F75D6F9A7E4B4F68F38B9CF845506873 /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseAdditions.h; path = src/fmdb/FMDatabaseAdditions.h; sourceTree = ""; }; - F76496371A94D04C6DEB3EBEEB62540B /* UITableView+FDTemplateLayoutCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDTemplateLayoutCell.h"; path = "Classes/UITableView+FDTemplateLayoutCell.h"; sourceTree = ""; }; + AB49493C72E91540C35242C5BAD4FCB3 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + ABC0C3932D4BADAC2D9603EF31642A79 /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = ""; }; + ABF265594DAF7ED5BAF27F67AA705ED8 /* ZXByQuadrantReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXByQuadrantReader.h; path = LBXScan/LBXZXing/ZXingObjc/multi/ZXByQuadrantReader.h; sourceTree = ""; }; + AD01537600F1A880767C84B81F08E093 /* ZXDataMatrixEdifactEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixEdifactEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.m; sourceTree = ""; }; + ADD15CC73D37D63D79884B9AF2970A5D /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; + ADE4E6FC54086728C0EEE918E57A0D45 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = ""; }; + AE72CDF71FC6F3212622FADC1252AF59 /* libjcore-ios-1.2.2.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = "libjcore-ios-1.2.2.a"; sourceTree = ""; }; + AE87B8DDB9DF073032D770CD8C0C0C05 /* FMDB-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FMDB-dummy.m"; sourceTree = ""; }; + AED784CAA8D2959F0450D522DFFCED8F /* JSONModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModel.h; path = JSONModel/JSONModel/JSONModel.h; sourceTree = ""; }; + AF67FFD3DB88A86F97B87AA371019906 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; + AF8181766A212352456EDDBA433246A2 /* ZXingObjCDataMatrix.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXingObjCDataMatrix.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXingObjCDataMatrix.h; sourceTree = ""; }; + AF94683AAB043BAFD7C98D56A6B9F299 /* ZXUPCEANExtension5Support.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEANExtension5Support.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.h; sourceTree = ""; }; + AFAB10ACA72A07CB48983B9EE04817C6 /* ZXQRCodeFinderPatternInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeFinderPatternInfo.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternInfo.m; sourceTree = ""; }; + B01401140320D07C8A62D408F3E0DA71 /* Socket.IO-Client-Swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Socket.IO-Client-Swift.xcconfig"; sourceTree = ""; }; + B041CC04C8BECC46A754D164BCAD3057 /* ZXAI01320xDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01320xDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01320xDecoder.m; sourceTree = ""; }; + B079BB2612D1053F894188EE8F04B2DA /* ZXQRCodeEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeEncoder.m; sourceTree = ""; }; + B090A0962E08A4B1D14C9F0B5B13AA88 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = ""; }; + B16769F5B9B2F193A4AF9386634D9F36 /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; + B19D5D49933050374E27CC5A36A9D058 /* NJKWebViewProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NJKWebViewProgressView.h; path = NJKWebViewProgress/NJKWebViewProgressView.h; sourceTree = ""; }; + B1DFA5044A030D67F2C45BB6A2FA642F /* ZXDataMatrixASCIIEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixASCIIEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixASCIIEncoder.m; sourceTree = ""; }; + B300485FD71E56862235676F3ED9C010 /* ZXRSSExpandedFieldParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedFieldParser.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedFieldParser.m; sourceTree = ""; }; + B386ADD68A2168AC6CD90FE149EBB1A4 /* ZXPDF417ECErrorCorrection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417ECErrorCorrection.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.h; sourceTree = ""; }; + B3EEB9294005C5750EF2911ED07DDAED /* ZXURIParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXURIParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURIParsedResult.h; sourceTree = ""; }; + B43958B9922FD34350604E634E5FC721 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = ""; }; + B50F6DB14AA4BF1521ECDA2C83BA1D83 /* ZXCharacterSetECI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCharacterSetECI.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXCharacterSetECI.h; sourceTree = ""; }; + B511D89A58E69A73AA9266E378998CB3 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.h"; sourceTree = ""; }; + B58466B6D94629BA167A6C7B6756F90E /* ZXPDF417ScanningDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417ScanningDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417ScanningDecoder.m; sourceTree = ""; }; + B589D3C0F29F385CBA34259277066496 /* ZXQRCodeErrorCorrectionLevel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeErrorCorrectionLevel.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.m; sourceTree = ""; }; + B5B119F06A6B8358EDCBA101FBC565A7 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + B5C161B3A17F0053D10888059B0E0390 /* ZXMultiFormatReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiFormatReader.m; path = LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.m; sourceTree = ""; }; + B651E4833F9DA640EDAD393921C93D38 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; + B68DA9BDB004B69F101D1FA08FCC1374 /* LBXScan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LBXScan-umbrella.h"; sourceTree = ""; }; + B6C6EB5F6BB25316EA356942907E1F49 /* ZXPDF417BarcodeMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417BarcodeMetadata.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417BarcodeMetadata.m; sourceTree = ""; }; + B791735EB4C9484A7C8D303FBFB1FCD6 /* SocketRocket.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SocketRocket.xcconfig; sourceTree = ""; }; + B792D8AB36054EBD45C94653B554F26F /* NJKWebViewProgress-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NJKWebViewProgress-umbrella.h"; sourceTree = ""; }; + B8939096BA2BF2487B8738E6BD3072F2 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + B95D0E98143F761DAF81176974CE05D8 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; + B9B74C9E2B2FBDE9323B830B5DA70875 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; + BAB0F73AE2B4C8776A06C452DBCF0FA3 /* Toast-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-prefix.pch"; sourceTree = ""; }; + BAE0DCB43B9483758316E31E8F367BE8 /* ZXRSSExpandedDecodedInformation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedDecodedInformation.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedInformation.m; sourceTree = ""; }; + BAE566293D579A7A32CAD1CC1A1A44F0 /* ZXGenericMultipleBarcodeReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGenericMultipleBarcodeReader.h; path = LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.h; sourceTree = ""; }; + BB0BFBF29F530CAF6013580F184BD574 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; + BB2D8CB04016D61F7BFC496F3B495021 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; + BB64B79D1CF75BABB098326BD4EFFB24 /* FMDatabaseQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseQueue.m; path = src/fmdb/FMDatabaseQueue.m; sourceTree = ""; }; + BBD3C01D9E4A75C78DD068F21C86BD4A /* LBXScan-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LBXScan-prefix.pch"; sourceTree = ""; }; + BBD7A1690C374C0D6EB52EA1E5CD8023 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; + BC14B8BC598E29944651EDC8E5BF3E98 /* ZXRSSExpandedDecodedNumeric.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedDecodedNumeric.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedNumeric.h; sourceTree = ""; }; + BC3F543F9DD927FDD2F604B031EEC06B /* FMDB.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FMDB.xcconfig; sourceTree = ""; }; + BC871066179BE447E2CA99B04F8E4628 /* FMDatabase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabase.h; path = src/fmdb/FMDatabase.h; sourceTree = ""; }; + BC94AB37494391AEF4E2EE0BFB58850D /* ZXAbstractExpandedDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAbstractExpandedDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAbstractExpandedDecoder.h; sourceTree = ""; }; + BCFBD5D8A73ECE684FBFA5BFA305674C /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; + BDCA3A45E76A903D16393ABF6E696FAD /* ZXEAN8Writer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEAN8Writer.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Writer.m; sourceTree = ""; }; + BDE22E9668D0E4B563401B93027B92A4 /* ZXAztecHighLevelEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecHighLevelEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecHighLevelEncoder.h; sourceTree = ""; }; + BE625E3EA6CFC1EE77E64BC2B5D30C2A /* ZXQRCodeMode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeMode.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeMode.m; sourceTree = ""; }; + BE75A2C9850C8E95D6A3688961790E22 /* ZXGridSampler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGridSampler.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXGridSampler.m; sourceTree = ""; }; + BE9B6E4BBEB1499F48F9D323F3AD9118 /* ZXModulusPoly.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXModulusPoly.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.m; sourceTree = ""; }; + BEE5EA3A3EA8FD272D48AE637E5243D3 /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; + BF20AF460CB09D0812ABB529BF3D9C51 /* ZXDataMatrixVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixVersion.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.m; sourceTree = ""; }; + BF331D85D091C886873AACBA8521FB42 /* ZXQRCodeMultiReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeMultiReader.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/ZXQRCodeMultiReader.m; sourceTree = ""; }; + BF5657DB241358AD9FDAE9890C8ABEEF /* ZXAI01392xDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI01392xDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.m; sourceTree = ""; }; + BFCDF5213447A628E04D699697D1B7D1 /* SocketIOClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClient.swift; path = Source/SocketIO/Client/SocketIOClient.swift; sourceTree = ""; }; + BFE70AEDDCBF7520A3628C3BF897B4FA /* ZXBookmarkDoCoMoResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBookmarkDoCoMoResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.h; sourceTree = ""; }; + C01873263C8FD2C8E73608FA5497003F /* ZXPDF417Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Reader.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Reader.m; sourceTree = ""; }; + C06C0FC8EE1C494A50D7E91C80275410 /* YTKKeyValueStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YTKKeyValueStore-dummy.m"; sourceTree = ""; }; + C0889FA5DAABAA6261929DA71F89869A /* ZXParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXParsedResult.m; sourceTree = ""; }; + C0AF03AF045FEDB54969A733A7676799 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C10967434C4CA6FC8AE871A1B97C9F43 /* ZXAztecState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecState.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecState.m; sourceTree = ""; }; + C16ED5D5D117CB740EE9ABEC0EBA1649 /* ZXQRCodeFormatInformation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeFormatInformation.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeFormatInformation.h; sourceTree = ""; }; + C26CFBB175279564D8DE5AA2CA29BF96 /* SecurityEnvSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SecurityEnvSDK.framework; path = thirdparties/SecurityEnvSDK.framework; sourceTree = ""; }; + C28769783EFCE774343708B28B72E7F9 /* LKDBHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LKDBHelper.framework; path = LKDBHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C28B49C4B80D513EAF88F98C85881734 /* ZXRSSUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSUtils.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSUtils.m; sourceTree = ""; }; + C318977FCF328523387B6D4A7C4C463B /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; + C3F1FD21A8EC878A093097A79EAE9794 /* ZXUPCEANExtension2Support.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEANExtension2Support.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension2Support.m; sourceTree = ""; }; + C4BB8EA3DE2CFA86580C6439A7B6AA78 /* ZXAztecCode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecCode.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.h; sourceTree = ""; }; + C4C04B219504C42089316DBDB847F874 /* JSONModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JSONModel-prefix.pch"; sourceTree = ""; }; + C515A55A679E5749725EDE2DD579D895 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; + C52183BB38FB383082491630976C0142 /* ZXRSSExpandedDecodedChar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedDecodedChar.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXRSSExpandedDecodedChar.m; sourceTree = ""; }; + C5BCCBDFB1C9D318B399428068B1A6A1 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; + C5FA36E99E1568CD05B591F7E08AF238 /* ZXPDF417Common.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Common.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Common.h; sourceTree = ""; }; + C612D57588F23A5866E45C4835E646C5 /* ZXAI013x0xDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI013x0xDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0xDecoder.h; sourceTree = ""; }; + C642BCE8751CFC9BC013D0BEA36D455B /* YTKKeyValueStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YTKKeyValueStore.h; path = YTKKeyValueStore/YTKKeyValueStore.h; sourceTree = ""; }; + C90718282B911DA283EED1944D1918DD /* WechatAuthSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WechatAuthSDK.h; path = WechatSDK1.8.2/WechatAuthSDK.h; sourceTree = ""; }; + C91C6B5A3918001519E53DB440411A32 /* ZXByteMatrix.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXByteMatrix.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXByteMatrix.h; sourceTree = ""; }; + C97CDBEA6D3D2A8EA447F8A10ED2725E /* ZXUPCAWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCAWriter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCAWriter.h; sourceTree = ""; }; + C98C8E34977A02E2FCCBF24EBC05E35F /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + CADA9EFA3FCABD0FAC6FE8DC1B421D8F /* ZXQRCodeErrorCorrectionLevel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeErrorCorrectionLevel.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeErrorCorrectionLevel.h; sourceTree = ""; }; + CAE96BD792062429CE1EA9DFD03E46D5 /* ZXAI01393xDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01393xDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01393xDecoder.h; sourceTree = ""; }; + CAF15FF37FEE65A4BD8CB5EB924D9792 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + CB0C6FA3F55EFFAB1555D06598C28905 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = ""; }; + CB0DA24613011BCBD6A23C6806D0252A /* LKDBHelper-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LKDBHelper-prefix.pch"; sourceTree = ""; }; + CB225636F78714CDD7C23A1CDED2950F /* ZXSMSTOMMSTOResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXSMSTOMMSTOResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMSTOMMSTOResultParser.m; sourceTree = ""; }; + CB49B9A7AF95B95F054394597AB570C6 /* ZXQRCodeDataBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDataBlock.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataBlock.h; sourceTree = ""; }; + CBE4DD051D156374F9F74E20A99E5C56 /* YTKKeyValueStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YTKKeyValueStore.framework; path = YTKKeyValueStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + CC6B8A807016524FCBAF17017565E609 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = ""; }; + CE43F7A37BA6BC4848BE7C3B4265EE89 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; + CE49748C28D4E26DCFCE420E89FBEA6C /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + CE49A78ED8CD3469317BF1740F57FEC8 /* ZXReedSolomonEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXReedSolomonEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.h; sourceTree = ""; }; + CE4FC04810BF48929DE497595E3E1A86 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; + CEE80EAC1FE0F2DC614CC7078C7A1C03 /* ZXAztecEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.m; sourceTree = ""; }; + CF06188AC07C7C27495C78395626B74D /* ZXAddressBookDoCoMoResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAddressBookDoCoMoResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookDoCoMoResultParser.m; sourceTree = ""; }; + CF4BC743574EA3CBE522BC1296F858D4 /* ZXGeoParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGeoParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.h; sourceTree = ""; }; + CF4F745BEBFF98E4F773D0BEC2707EC5 /* ZXQRCodeDecoderMetaData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDecoderMetaData.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.m; sourceTree = ""; }; + CF50F39459202862E20B8C58DA748AD4 /* ZXPDF417.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417.h; sourceTree = ""; }; + CFD46D5E3076E4207888D8094E6B31A3 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; + CFE8A54320F9B1DFE54A82556EA7E5D3 /* ZXPDF417DetectionResultColumn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417DetectionResultColumn.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DetectionResultColumn.h; sourceTree = ""; }; + D0088684BFACBC1E3A55A5FCB840D795 /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = ""; }; + D08B329D2BC575B425B77B76FDDA53B8 /* ZXBoolArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBoolArray.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXBoolArray.m; sourceTree = ""; }; + D0DF26BF8D55C7A59F970C7D2E8ED96E /* ZXRSSDataCharacter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSDataCharacter.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSDataCharacter.m; sourceTree = ""; }; + D0E27E66642E304BD21EA1420F9B99E6 /* ZXImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXImage.h; path = LBXScan/LBXZXing/ZXingObjc/client/ZXImage.h; sourceTree = ""; }; + D163AA08EC77D9947EE5573A7EE590E5 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; + D1C76C04BC19CFDA9A046F657930A7F6 /* ZXQRCodeDecoderMetaData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDecoderMetaData.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecoderMetaData.h; sourceTree = ""; }; + D1E941227E84280F17C045C91F1902D8 /* ZXAztecCode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAztecCode.m; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecCode.m; sourceTree = ""; }; + D20F8B84034184CBBAB843F936A787F9 /* ZXMonochromeRectangleDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMonochromeRectangleDetector.h; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMonochromeRectangleDetector.h; sourceTree = ""; }; + D29AD0080BCE0785070F2CCE5E2A98A1 /* ZXPDF417Detector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Detector.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.h; sourceTree = ""; }; + D2B901F35DBA98ACD6B3ADFF00C15E6D /* TTTAttributedLabel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TTTAttributedLabel.modulemap; sourceTree = ""; }; + D2FB3BEA2B955286DFF270B0F74B1368 /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = ""; }; + D33DED6D983D07751C1F44DA86010508 /* ZXVEventResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXVEventResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXVEventResultParser.h; sourceTree = ""; }; + D3975F2419B8D6B20104A7D872211E48 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; + D3E1FC166F80EFA174F81A8658281571 /* ZXAztecEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecEncoder.h; sourceTree = ""; }; + D42458E77F66B16EDEAD4F28893B7E7E /* YTKKeyValueStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YTKKeyValueStore-umbrella.h"; sourceTree = ""; }; + D4898026D6A7954E09802DDC74D97432 /* ZXDataMatrixEdifactEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixEdifactEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEdifactEncoder.h; sourceTree = ""; }; + D52F046D041BF9D9D3D2F6A1709A4D95 /* YTKKeyValueStore.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YTKKeyValueStore.xcconfig; sourceTree = ""; }; + D61044B83DA2AB51D961F44DCA34B249 /* ZXPDF417DecodedBitStreamParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417DecodedBitStreamParser.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417DecodedBitStreamParser.m; sourceTree = ""; }; + D675EB88B5FE30187A06B355F0F3CCA9 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = ""; }; + D6C40D284E1D73C5025FD3E0E1CCBB43 /* ZXRSS14Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSS14Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSS14Reader.h; sourceTree = ""; }; + D6DC99BF9244ACBFDEC39A53AA4F2B8D /* ZXQRCode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCode.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCode.m; sourceTree = ""; }; + D6E504E440ABA1292AEDDB1EC3186A8A /* ZXQRCodeMaskUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeMaskUtil.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/encoder/ZXQRCodeMaskUtil.m; sourceTree = ""; }; + D76C53ACF409ED70426B26C9F9D00B68 /* ZXBinarizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBinarizer.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXBinarizer.h; sourceTree = ""; }; + D7FA664D8E8520065963394C33EEA6AC /* ZXURLTOResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXURLTOResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXURLTOResultParser.m; sourceTree = ""; }; + D80D98735957E03896AE3A84B4BF36F4 /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.h"; sourceTree = ""; }; + D875EBF70B631CBAC790D0053BBAFECA /* ZXBookmarkDoCoMoResultParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBookmarkDoCoMoResultParser.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXBookmarkDoCoMoResultParser.m; sourceTree = ""; }; + D8ACFFB0709CAFC05D87FD648213E14C /* ZXDataMatrixReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixReader.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/ZXDataMatrixReader.h; sourceTree = ""; }; + D9060E0F719533207B55A62D6B86204B /* ZXPlanarYUVLuminanceSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPlanarYUVLuminanceSource.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXPlanarYUVLuminanceSource.m; sourceTree = ""; }; + D9275A725164D3FF4B69A0DFA2777191 /* ZXAI013103decoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI013103decoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013103decoder.h; sourceTree = ""; }; + D93FF457E74024D9B4CA312E8A0487A2 /* WXApiObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApiObject.h; path = WechatSDK1.8.2/WXApiObject.h; sourceTree = ""; }; + D9CCE994A58013AD9DF38EC59A03E850 /* ZXExpandedProductResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXExpandedProductResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXExpandedProductResultParser.h; sourceTree = ""; }; + DA01C144A28B7CAC321EC6840A0D9275 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DA5A718164633D231A198797B4A9CE39 /* ZXDataMatrixEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoder.h; sourceTree = ""; }; + DAA5E1AD39BE407D72A4B3832128CC6C /* Masonry.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Masonry.modulemap; sourceTree = ""; }; + DADCEC05EB68EACF4CA2B4C02F0B83A7 /* ZXEAN13Reader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEAN13Reader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN13Reader.h; sourceTree = ""; }; + DB26B48C02D2509CCF212DE438EF382C /* ZXMathUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMathUtils.h; path = LBXScan/LBXZXing/ZXingObjc/common/detector/ZXMathUtils.h; sourceTree = ""; }; + DB2ACF264118BE5AAEDE5A3A5B8931EB /* ZXAbstractDoCoMoResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAbstractDoCoMoResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAbstractDoCoMoResultParser.h; sourceTree = ""; }; + DB3698AA6971F6CC730B057DE45FF66D /* IQKeyboardManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-umbrella.h"; sourceTree = ""; }; + DB5725EAA2D37D63C8B3216CCA38202F /* UIView+Toast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+Toast.h"; path = "Toast/UIView+Toast.h"; sourceTree = ""; }; + DB635CFC34D6A30EA67D0BE25700F7F4 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + DB7CC752C2DB1864FF638CB915DA6773 /* ZXMultiFinderPatternFinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiFinderPatternFinder.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.h; sourceTree = ""; }; + DB96CE5C22BC0BD8718511158396C0FD /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + DBCE45BBF526C98C7E4DF52B780738A8 /* ZXRSSExpandedPair.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXRSSExpandedPair.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedPair.h; sourceTree = ""; }; + DBF88A9781D801A31F8EF26E52BA46E1 /* ZXModulusPoly.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXModulusPoly.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXModulusPoly.h; sourceTree = ""; }; + DC57C149910BF3453D9F2ECDF2B4C630 /* TTTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TTTAttributedLabel.m; path = TTTAttributedLabel/TTTAttributedLabel.m; sourceTree = ""; }; + DC84C765D3E246259B53EE3825C09632 /* ZXDecoderResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDecoderResult.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.h; sourceTree = ""; }; + DCE5D1F46B9AD5E5683541967105617C /* ZXQRCodeVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeVersion.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeVersion.m; sourceTree = ""; }; + DCF6F053DFBF0307477DF134AE5D856D /* SocketEngineWebsocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineWebsocket.swift; path = Source/SocketIO/Engine/SocketEngineWebsocket.swift; sourceTree = ""; }; + DD8DFFF2272590CA81642BA75E8AC1D6 /* ZXDecoderResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDecoderResult.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXDecoderResult.m; sourceTree = ""; }; + DDC020CC041CE21BCBE1AFA667268370 /* ZXAI013x0x1xDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXAI013x0x1xDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI013x0x1xDecoder.m; sourceTree = ""; }; + DF18793C84D22F32ECAD06799CFF3D17 /* SocketManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketManager.swift; path = Source/SocketIO/Manager/SocketManager.swift; sourceTree = ""; }; + DF5D7B201521512A5C700D172DAF2F90 /* UITableView+FDTemplateLayoutCell-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UITableView+FDTemplateLayoutCell-dummy.m"; sourceTree = ""; }; + DF778018EDF24417DD3F99942B884F3E /* LBXZXCaptureDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LBXZXCaptureDelegate.h; path = LBXScan/LBXZXing/LBXZXCaptureDelegate.h; sourceTree = ""; }; + DF7A59D4F2E0D7DB79A85E122F8BE6A8 /* ZXGenericGFPoly.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXGenericGFPoly.h; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGFPoly.h; sourceTree = ""; }; + DF83506140AC0E523AFCA4AA5F101ADB /* ZXCodaBarReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXCodaBarReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCodaBarReader.h; sourceTree = ""; }; + DF91059153F21AF14EB312A6DB0B5502 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + E0188FFF10CCB60C3F41FA0DB33273D6 /* ZXMaxiCodeBitMatrixParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMaxiCodeBitMatrixParser.h; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeBitMatrixParser.h; sourceTree = ""; }; + E01907B534984C539F96A49D86CBAE44 /* ZXAI01AndOtherAIs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01AndOtherAIs.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01AndOtherAIs.h; sourceTree = ""; }; + E0327F685ACB807EADF939F1B4628C2D /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + E06A59DFE19B9EBF62E4DDFDCB70E98F /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + E0FF7B43673CB04DB59F4418B2EEA542 /* ZXAztecBinaryShiftToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecBinaryShiftToken.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/encoder/ZXAztecBinaryShiftToken.h; sourceTree = ""; }; + E1E67332192E4A91BBF32552E970E4DC /* ZXMultiFinderPatternFinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMultiFinderPatternFinder.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/multi/detector/ZXMultiFinderPatternFinder.m; sourceTree = ""; }; + E1F4391819DDD4225BDF036151223EE4 /* ZXRSSExpandedRow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSExpandedRow.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/ZXRSSExpandedRow.m; sourceTree = ""; }; + E206F8C05E0115971BAF625C4DCD1497 /* ZXGenericGF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGenericGF.m; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXGenericGF.m; sourceTree = ""; }; + E2497333F54860347D41674CA272ED18 /* ZXTelParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXTelParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXTelParsedResult.h; sourceTree = ""; }; + E269CAA8DF5F1A3FDB98EDE519EB63FE /* SocketIOClientOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientOption.swift; path = Source/SocketIO/Client/SocketIOClientOption.swift; sourceTree = ""; }; + E29E80A59D84FC676861AFDA9265796A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E2E383C17ED8079D78E6A75D6794D7CC /* Toast.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Toast.xcconfig; sourceTree = ""; }; + E371536297EE73EDA25573988ADB0FF8 /* NSObject+LKModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+LKModel.m"; path = "LKDBHelper/Helper/NSObject+LKModel.m"; sourceTree = ""; }; + E3AB84771CDBC97157AFEEF0D298CBC4 /* LKDBUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKDBUtils.m; path = LKDBHelper/Helper/LKDBUtils.m; sourceTree = ""; }; + E3D34627710B673293F9006447215215 /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyboardManager/IQKeyboardManager.m; sourceTree = ""; }; + E3DF9AC48121A71DF66F2AF611AAF2F7 /* JSONModelLib.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONModelLib.h; path = JSONModel/JSONModelLib.h; sourceTree = ""; }; + E4C0009AC3BB69124F18FD9D2961200A /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + E55E3943C46C6F5D16EE87894205D0AA /* ZXQRCodeFinderPatternFinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeFinderPatternFinder.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.m; sourceTree = ""; }; + E5D3CC79E85F7918D70BD3A4522AACE6 /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; + E62451403F39E86819BF52DB1585E9AB /* UITableView+FDIndexPathHeightCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDIndexPathHeightCache.m"; path = "Classes/UITableView+FDIndexPathHeightCache.m"; sourceTree = ""; }; + E663718B0995C70CF5CADA3EDEEBDA16 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + E68B3DC05BD9D790DEAAA27A5658A735 /* UITableView+FDTemplateLayoutCellDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+FDTemplateLayoutCellDebug.m"; path = "Classes/UITableView+FDTemplateLayoutCellDebug.m"; sourceTree = ""; }; + E69C2C5A7BFD32C73AB504536434A22E /* ZXDataMatrixVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixVersion.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixVersion.h; sourceTree = ""; }; + E70EB5BE65F087C48AD9E30596FA715F /* FMDatabaseQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseQueue.h; path = src/fmdb/FMDatabaseQueue.h; sourceTree = ""; }; + E712068BED300231FA489F36BB41B8DC /* ZXQRCodeDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDetector.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.m; sourceTree = ""; }; + E74E49B61863605A36C4E3C9F2832C55 /* ZXAztecDetectorResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAztecDetectorResult.h; path = LBXScan/LBXZXing/ZXingObjc/aztec/ZXAztecDetectorResult.h; sourceTree = ""; }; + E7613E864B947A351D382C0FC0FE150B /* ZXDimension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDimension.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXDimension.h; sourceTree = ""; }; + E7C09C033A731A26153669150888DAF2 /* ZXQRCodeDataMask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeDataMask.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDataMask.m; sourceTree = ""; }; + E7EE73C29C12A420E29202973AB3A065 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + E88AAA11826810C07C533AB0790B65D3 /* ZXDataMatrixEncoderContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXDataMatrixEncoderContext.h; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/encoder/ZXDataMatrixEncoderContext.h; sourceTree = ""; }; + E8EBC4760CA99C02E53DCFEEC7E1C4BB /* ZXITFReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXITFReader.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXITFReader.h; sourceTree = ""; }; + E9322053895EEE03F75B107018B88171 /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; + E9D88C308C13BE4F0E533DBFF7254198 /* LBXZXCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LBXZXCapture.h; path = LBXScan/LBXZXing/LBXZXCapture.h; sourceTree = ""; }; + E9FA6D0C44ACBE1FC9B26E14D165776D /* TTTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TTTAttributedLabel.h; path = TTTAttributedLabel/TTTAttributedLabel.h; sourceTree = ""; }; + EA03E8D5F65C226379EBBD40A4694353 /* UITableView+FDTemplateLayoutCell.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "UITableView+FDTemplateLayoutCell.xcconfig"; sourceTree = ""; }; + EA1CB2D2B2F80861AD6C1BC9136F4112 /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; + EA3A5D6DB28EFFD10320A14F013B6068 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; + EA5B112AF008CD40CD016759A5C5D487 /* LKDBHelper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LKDBHelper.modulemap; sourceTree = ""; }; + EB0366894E0499283BE4B449BC7A6B2D /* ZXUPCEANExtensionSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXUPCEANExtensionSupport.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtensionSupport.h; sourceTree = ""; }; + EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + EC049E598F3DD86706970EE3B483DEFA /* ZXQRCodeDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDetector.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeDetector.h; sourceTree = ""; }; + EC7649297B578937DD09B1AC3B327EEB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ED05B441B7D7D284FA548DD27827DA1E /* ZXCode39Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXCode39Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXCode39Reader.m; sourceTree = ""; }; + ED6963810BB2C1A82ACD63714720A260 /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = ""; }; + ED7B64BA9A55B1F26F1722AB6EE74A13 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + ED92E6B7D288035979BF42CB418A9CE2 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyboardManager/IQKeyboardManager.h; sourceTree = ""; }; + EDA5B7474BF04615A19FDD06655BD282 /* ZXIntArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXIntArray.h; path = LBXScan/LBXZXing/ZXingObjc/common/ZXIntArray.h; sourceTree = ""; }; + EDDE0D85E25455E61C59C0DF4310FFA5 /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; + EDE38C961A2038D1AA01A353A609CFED /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = ""; }; + EDE72E31C2E3970C191EC54DD35DBD8D /* ZXPDF417HighLevelEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417HighLevelEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.m; sourceTree = ""; }; + EE04FA23838883F895783232C88E0D5E /* ZXQRCodeBitMatrixParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeBitMatrixParser.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeBitMatrixParser.m; sourceTree = ""; }; + EE1794291AC6356B32D4FBB406D1E87D /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; + EE2049030398CDE661B0B7C3C283BDDD /* ZXReedSolomonEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXReedSolomonEncoder.m; path = LBXScan/LBXZXing/ZXingObjc/common/reedsolomon/ZXReedSolomonEncoder.m; sourceTree = ""; }; + EE748AF72A5FC49C5D85BBD6817EFE20 /* LBXScan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LBXScan-dummy.m"; sourceTree = ""; }; + EE798D466C89FEA6AB6CDFF361EF31E1 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + EE83A59533B6D6B9979E38443BDF496E /* ZXAI01392xDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAI01392xDecoder.h; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/expanded/decoders/ZXAI01392xDecoder.h; sourceTree = ""; }; + EF7D6FC6B1E1FC691E78D4A92852456B /* ZXPDF417Detector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Detector.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/detector/ZXPDF417Detector.m; sourceTree = ""; }; + EFD3B7522DAC4D87AE8F61931C893EF9 /* ZXGlobalHistogramBinarizer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGlobalHistogramBinarizer.m; path = LBXScan/LBXZXing/ZXingObjc/common/ZXGlobalHistogramBinarizer.m; sourceTree = ""; }; + F0A9E7BD20A5FD5852F4F43A8CEF86FE /* libjpush-ios-3.1.0.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = "libjpush-ios-3.1.0.a"; sourceTree = ""; }; + F0E4A8D325E6EBFDBECD2C650970CBDF /* SocketRawView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketRawView.swift; path = Source/SocketIO/Client/SocketRawView.swift; sourceTree = ""; }; + F12009D1C01556CEA7A2D3988A794F73 /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; + F125C9C089DA4D43567201F1485C57BC /* ZXGeoParsedResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGeoParsedResult.m; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXGeoParsedResult.m; sourceTree = ""; }; + F1345578B0AB6291FD34FAE9C96C447F /* ZXSMTPResultParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXSMTPResultParser.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXSMTPResultParser.h; sourceTree = ""; }; + F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + F2748C4C9D212DE00657CF5BE83E3FB4 /* ZXBinaryBitmap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXBinaryBitmap.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXBinaryBitmap.h; sourceTree = ""; }; + F298804CFB13E8D56C1490A3060E80C8 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; + F2BFC26A47983CB8EC119AED9695ADD7 /* ZXPDF417Writer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Writer.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/ZXPDF417Writer.h; sourceTree = ""; }; + F2C5FF007199CEA3518E6FC9F9700871 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; + F31CBEF84376251F0806EADAD2A08076 /* SocketIOClientSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientSpec.swift; path = Source/SocketIO/Client/SocketIOClientSpec.swift; sourceTree = ""; }; + F499A1EF2875CEBBC4AA0304788A4A41 /* ZXMultiFormatReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXMultiFormatReader.h; path = LBXScan/LBXZXing/ZXingObjc/ZXMultiFormatReader.h; sourceTree = ""; }; + F4AEF13FBA15A0D252506C11F70DE27F /* ZXOneDimensionalCodeWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXOneDimensionalCodeWriter.h; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXOneDimensionalCodeWriter.h; sourceTree = ""; }; + F5025D454C6517C33738D9EDE5EDFF3F /* ZXPDF417BarcodeRow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417BarcodeRow.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417BarcodeRow.h; sourceTree = ""; }; + F5DE348ABEF4AEEB28F6FBD506103C1A /* JSONAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JSONAPI.h; path = JSONModel/JSONModelNetworking/JSONAPI.h; sourceTree = ""; }; + F5E3E7A450E3F2F506A4750E78B0CC3F /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + F5E94E4212716C7AB9D7D0E2B64A071A /* IQKeyboardManager.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.xcconfig; sourceTree = ""; }; + F61C463512AFB050C8626DA1E66B6C90 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F61C96A1EB50890AABE26F8306BD90C0 /* ZXPDF417Codeword.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417Codeword.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.h; sourceTree = ""; }; + F66CF8827F0B34CFCACD31A5FEE1FFBB /* ZXQRCodeFinderPatternFinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeFinderPatternFinder.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPatternFinder.h; sourceTree = ""; }; + F69FCCE59B874F4C732C7D249770F46C /* ZXPDF417Codeword.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417Codeword.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ZXPDF417Codeword.m; sourceTree = ""; }; + F72EF6E51567C715E1D018D51FE90A31 /* ZXDataMatrixDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXDataMatrixDecoder.m; path = LBXScan/LBXZXing/ZXingObjc/datamatrix/decoder/ZXDataMatrixDecoder.m; sourceTree = ""; }; + F768B46D7CF697B15415714D925BA1E8 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = ""; }; + F775623B11BC2D3021B45C56AD9ACF40 /* ZXPDF417HighLevelEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXPDF417HighLevelEncoder.h; path = LBXScan/LBXZXing/ZXingObjc/pdf417/encoder/ZXPDF417HighLevelEncoder.h; sourceTree = ""; }; + F78255E6DB06E4BE7660C8930DDB926E /* ZXBinaryBitmap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXBinaryBitmap.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXBinaryBitmap.m; sourceTree = ""; }; + F80E7D7DE4577D633349A0FF231934CE /* ZXByteMatrix.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXByteMatrix.m; path = LBXScan/LBXZXing/ZXingObjc/core/ZXByteMatrix.m; sourceTree = ""; }; F8242C88C595688B579B2B397424ADC8 /* Pods-GIGA-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GIGA-resources.sh"; sourceTree = ""; }; - F8A4A704B12B0E5FCD4942063E450299 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; - FAA85730E7ECFBD1CCEB7260FF00F4C2 /* YTKKeyValueStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YTKKeyValueStore-umbrella.h"; sourceTree = ""; }; - FB8C8FEB6717D66F14136EF50C148280 /* NSObject+LKModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+LKModel.h"; path = "LKDBHelper/Helper/NSObject+LKModel.h"; sourceTree = ""; }; - FBF2BC661F74DEDD633BF2098800BCB7 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; - FC329F809B6649CDA966EB263EF68FB2 /* FMDatabasePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabasePool.h; path = src/fmdb/FMDatabasePool.h; sourceTree = ""; }; - FC45B739819A1904D554E79520E207DA /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; + F8511D0B3E2963CA1CD4AE1B9FA833E3 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.h; sourceTree = ""; }; + F8C59CE9B10ED445F854EA1D3CBB058C /* UITableView+FDIndexPathHeightCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+FDIndexPathHeightCache.h"; path = "Classes/UITableView+FDIndexPathHeightCache.h"; sourceTree = ""; }; + F90A2EDD8280C3F6E157F06F89AD2C88 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; + F91668C823B0AE5F67E3B7ABD277E354 /* ZXUPCEANExtension5Support.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXUPCEANExtension5Support.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXUPCEANExtension5Support.m; sourceTree = ""; }; + F951FBB93592715C79CB49A74F212457 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + F95D3775B12B0FBC4F76366A8A7FA228 /* ZXRSSFinderPattern.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXRSSFinderPattern.m; path = LBXScan/LBXZXing/ZXingObjc/oned/rss/ZXRSSFinderPattern.m; sourceTree = ""; }; + FB3EFE16F11E70763CE1F088F3AEC58D /* TTTAttributedLabel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TTTAttributedLabel-prefix.pch"; sourceTree = ""; }; + FB88C933AF10C1078AB540B9322F75D4 /* ZXEAN8Reader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXEAN8Reader.m; path = LBXScan/LBXZXing/ZXingObjc/oned/ZXEAN8Reader.m; sourceTree = ""; }; + FBAD218FF47B03FF3AE043A3436E3A0D /* ZXQRCodeFinderPattern.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXQRCodeFinderPattern.m; path = LBXScan/LBXZXing/ZXingObjc/qrcode/detector/ZXQRCodeFinderPattern.m; sourceTree = ""; }; + FBB9755676843B30743EA7966C0286B5 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + FBD050FC63C7D54F060E2065763BE5E2 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + FBE51C41B549098018472918F4A59E5C /* MBProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-prefix.pch"; sourceTree = ""; }; + FC00BBEEEC4C89225F7D537F8B753250 /* JSONModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JSONModel-dummy.m"; sourceTree = ""; }; + FC7318D906AE4E6819195F07A7515BEF /* ZXQRCodeDecodedBitStreamParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXQRCodeDecodedBitStreamParser.h; path = LBXScan/LBXZXing/ZXingObjc/qrcode/decoder/ZXQRCodeDecodedBitStreamParser.h; sourceTree = ""; }; FD113136C3BE7E4822B80A29F3DC5E42 /* Pods-GIGA-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GIGA-dummy.m"; sourceTree = ""; }; - FE403E58475EF64EF393ABA0E2EC5EC1 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyboardManager/Resources/IQKeyboardManager.bundle; sourceTree = ""; }; - FEAAD1709AA2F9B0C1E7F611FA261B98 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; - FED1ACDE4726A20CC2932BCDC66F5787 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - FEE4923BAFE446FDB51B8375C4DA4869 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; - FF2567DE02E414DB1FBB3C77E2FD44B1 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - FF6734BB50A15C4D259D3C14C0F70697 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; + FD3C532397C903A0F5DADD4C208B2087 /* JSONModel+networking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "JSONModel+networking.h"; path = "JSONModel/JSONModelNetworking/JSONModel+networking.h"; sourceTree = ""; }; + FD499BAC595D6653AFCAF7496EE274FC /* ZXAddressBookParsedResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXAddressBookParsedResult.h; path = LBXScan/LBXZXing/ZXingObjc/client/result/ZXAddressBookParsedResult.h; sourceTree = ""; }; + FD778702C35A82F55E5B0065635FE730 /* ZXMaxiCodeDecodedBitStreamParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXMaxiCodeDecodedBitStreamParser.m; path = LBXScan/LBXZXing/ZXingObjc/maxicode/decoder/ZXMaxiCodeDecodedBitStreamParser.m; sourceTree = ""; }; + FDA40E9D2C5D8A0AC4B7B4A19B57FFFE /* NJKWebViewProgress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NJKWebViewProgress.h; path = NJKWebViewProgress/NJKWebViewProgress.h; sourceTree = ""; }; + FDA7B07B7621695028B2FE565CE6EE4A /* WebSocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = Sources/WebSocket.swift; sourceTree = ""; }; + FDC286719F3D12D3031C6AF4E4CA9F42 /* ZXGenericMultipleBarcodeReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXGenericMultipleBarcodeReader.m; path = LBXScan/LBXZXing/ZXingObjc/multi/ZXGenericMultipleBarcodeReader.m; sourceTree = ""; }; + FDCD5113FECC761B95401D1081DAAE46 /* ZXReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXReader.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXReader.h; sourceTree = ""; }; + FE09343CF77ADDE6B4A2E8E4B156B1CC /* SocketAckManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAckManager.swift; path = Source/SocketIO/Ack/SocketAckManager.swift; sourceTree = ""; }; + FE2AD125508AE6E894FE3EC3451B7FC2 /* ZXEncodeHints.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ZXEncodeHints.h; path = LBXScan/LBXZXing/ZXingObjc/core/ZXEncodeHints.h; sourceTree = ""; }; + FE9567EAD0ABEFD610EF93BDEAB89EF2 /* NJKWebViewProgress.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = NJKWebViewProgress.modulemap; sourceTree = ""; }; + FF6C9CD3ED0862161499F3FA82C73109 /* ZXPDF417ECErrorCorrection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ZXPDF417ECErrorCorrection.m; path = LBXScan/LBXZXing/ZXingObjc/pdf417/decoder/ec/ZXPDF417ECErrorCorrection.m; sourceTree = ""; }; + FF9A9450B76B010E6A27E2BE82AC6C98 /* Toast-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-dummy.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 081BAF7030A01DB5133B8E011BB888BF /* Frameworks */ = { + 0D781F8CDFB4E5B287E1F80B7519E0E8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 484CBC296B6A059C5C9EE6DE7FF1FB67 /* FMDB.framework in Frameworks */, - 89BC1F89CAF0D75A3C9024861100E79C /* Foundation.framework in Frameworks */, + 95B64DF44D87CC4ACECA016FA498819F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 092CD07E711BB27E0075AC3ADF20915B /* Frameworks */ = { + 17181CF799976D86AA613B06C8DC525F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C2D7BA9B1354C36D28390C1502A35D91 /* CFNetwork.framework in Frameworks */, - 6FEA8F22AD821ECF8E74615FD8FE7427 /* Foundation.framework in Frameworks */, - 05F4742E8E81FFB81BD1F1DFA9C63484 /* Security.framework in Frameworks */, + 52BEFEE2F96056366CE6737A72AB7EE2 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 0F13FDE48FAA625D37D626F69DA46819 /* Frameworks */ = { + 201C4131525D709A2C0FE414167327DC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D4E9B3DE75C23D365E255B6212CB1CB7 /* Foundation.framework in Frameworks */, + 63B05DD8200C971ABDD35B000918A587 /* CoreGraphics.framework in Frameworks */, + B772355201E1F42A4338F747B7006DE7 /* Foundation.framework in Frameworks */, + A707F33AF9BDB27BD95432DFB1E2E97A /* MobileCoreServices.framework in Frameworks */, + 76BA5CCA7F0BD9E4B4B9C2C466C7DC58 /* Security.framework in Frameworks */, + 6885F9A30752A1960ADEC6689064524A /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1AAD91176E5F5F9AD062AD678F6746E4 /* Frameworks */ = { + 2D116F4789C634DBBF4D9815E617E62A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A2D9F9EFFDFE9C19DA842E826B06BCEB /* Foundation.framework in Frameworks */, + FB9F59605DF451DA9A944D335D27203C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 59DA24E1BFBF4DF2381ED2E0EE6964A0 /* Frameworks */ = { + 3A7D6E70DA2F5E0F418BCB15090269FF /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 347945A5FC349A6E31AC7E3403E2CDE5 /* Foundation.framework in Frameworks */, + 4BA4C634B519E5059CAE8BC4555EC544 /* Foundation.framework in Frameworks */, + 7B8B58B92909A3589A4208774B8A4300 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6DE9B3A8689C804A43D970F1265675A4 /* Frameworks */ = { + 402A767BFFBEC1C17F7C77A70A3F5158 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78AC6714960C42CC866222B6D956EDF6 /* CoreGraphics.framework in Frameworks */, - 09EC74E4AFC1D5951D1F80094D06969A /* Foundation.framework in Frameworks */, - 89637BFFD180A1E05F04DAF0CF4A6540 /* MobileCoreServices.framework in Frameworks */, - 6478B0091202F9429D2A61E30BEDA571 /* Security.framework in Frameworks */, - 81ABD96C8FA6FF28CFB2A3A78A6EA560 /* SystemConfiguration.framework in Frameworks */, + DD3AE71DE2039E8CD5C0B231D37C5631 /* CoreGraphics.framework in Frameworks */, + 4D7C5E8BD96C1BC6C0D4ED8B47ABDDC3 /* CoreText.framework in Frameworks */, + 97E04393A4302FF5715F8F65C610B975 /* Foundation.framework in Frameworks */, + 7AACE670ABE8A4AF3CE1EA13F169F8FC /* QuartzCore.framework in Frameworks */, + 459B8F2D0FA93A1C4ECDA78992E6C0C3 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 718E88DD1843C285DD139D86BA77F7FB /* Frameworks */ = { + 4330790BF93619542494717EF5872A17 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 059ACAAB4FD2944460415CD3FD7A15F0 /* Foundation.framework in Frameworks */, + 12AE2CA2A317A12D59FF508A82F26E54 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 77A4F3ABB18A1CBD901A6D7F4564A99A /* Frameworks */ = { + 53B548AE094C80BC15CFBFA6BFEBA6B6 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2B0AD5F72C574005D53D512A8F8E2800 /* FMDB.framework in Frameworks */, - 02A0ADD96B43A9970DD5C7C6BAEAB761 /* Foundation.framework in Frameworks */, + A50EDDF1CB861F8BB3D858AE186FB03B /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 77DFA32B5A12FCE9A60389FE17A7F94B /* Frameworks */ = { + 6512FEC7FBC6EDECD9B82EF4A1C957F1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 8A318F056072D4715B58CBDC1A6ACB4C /* Foundation.framework in Frameworks */, - 78874F1F850E4AEDB8D05955D1736A6F /* ImageIO.framework in Frameworks */, + 40833895BC473C5CF0E07FB502A96F7A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 81F903C6F2439B4DE4CACDA906440A2D /* Frameworks */ = { + 666394A079C4D1571C47CC2BDC42F11F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 30D4DCE78AC7DF54F68F633B1F85B131 /* Foundation.framework in Frameworks */, + 2B4297C6F389783DF66B4F9DDFF834D0 /* CoreGraphics.framework in Frameworks */, + 8E87F17441C19AFF30FC611FE67FF133 /* Foundation.framework in Frameworks */, + 06A4B205A1D55D9F31DEEA499B191DD1 /* QuartzCore.framework in Frameworks */, + 9B6F4B72809EDA47036B9083836AE667 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8944C0B131AF550CF6CC8073435E22F2 /* Frameworks */ = { + AEAC7297197C204CA26767EDBD8C65D3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A1BB32FF4BE29C004A13F2E03127E8F1 /* CoreGraphics.framework in Frameworks */, - 6D13591A430260C31F6102B30645B5CD /* Foundation.framework in Frameworks */, - 148E57B8B5F299475BF5877A2EA6E7C1 /* QuartzCore.framework in Frameworks */, - 291C24EA8B69C1738694B0729ED3ADA4 /* UIKit.framework in Frameworks */, + 2BA19DBF1F1B41C3EA5906C534F5D3E9 /* Foundation.framework in Frameworks */, + DD90150F490BAE76F0D453455EA73658 /* Starscream.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CECDEE34E27741BF2EF71AF71CDA5FC /* Frameworks */ = { + AF90F114733E66CF03CAF8093803FAB0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 19B84B8D631A49492C1DBBE00A7AF097 /* Foundation.framework in Frameworks */, + 1B53685E7C9C896EEB4C0763A9C317EF /* FMDB.framework in Frameworks */, + 113694C8DC13FAD5A6A813F2B7ECF39A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 924592AD76A1CAF35F2E54F909E21BCC /* Frameworks */ = { + B8B095A708D89B92B57C68E6CD9B6F61 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1CA7812A0C2F63BC21BADC1DE3C1F30E /* Foundation.framework in Frameworks */, - ED5DD9E7F5A2A78F8A992072C079515F /* QuartzCore.framework in Frameworks */, + 51892BE5A970DE3EF15CE6AB462D7FBA /* AVFoundation.framework in Frameworks */, + 122BACE2B0EF8313BFF1E9058E5789C3 /* CoreGraphics.framework in Frameworks */, + C24E8840B121DEB11074874D87329000 /* CoreMedia.framework in Frameworks */, + 3949AE5819923AEF1C9F473A853441A2 /* CoreVideo.framework in Frameworks */, + ED9011138298605948BC522466ADEE5A /* Foundation.framework in Frameworks */, + 06DBC23FBC38AED250C8A140F8E1220A /* ImageIO.framework in Frameworks */, + 20F45621B9D44965AA54D0E9EC9B675C /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 975519A8DD8D28FC91AEE205A5ED5A3F /* Frameworks */ = { + C1767DBAD5191FDAA8D776AB397B33AD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 62DBE4193DF3FD638FEA517155B308B9 /* Foundation.framework in Frameworks */, - 41E9E4524E285B0DC1334FB06772E4A2 /* Starscream.framework in Frameworks */, + 4FAACC63EA1935DD5234ADCAC1067961 /* FMDB.framework in Frameworks */, + 9935E121BBCE28C6BB7247FD0901C8D6 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9FE6CEF1763E05FB90653801CE3E2B5B /* Frameworks */ = { + C1AE280510D0059781AB44BF58B67C7D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E4AC26FB387427964538FA5FCEA4A8A3 /* CoreGraphics.framework in Frameworks */, - ECBA1F4D70AF4600563FD39112D5997B /* Foundation.framework in Frameworks */, + 0E06FF0FD4ECE1F83324C6FB26D5D489 /* CoreGraphics.framework in Frameworks */, + 078E5844DDDBD848CA7602B78A155B62 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E7CEC03E6403E87DB68C93D8409CC6A1 /* Frameworks */ = { + DC7C609367479420D4D1BADE316B9AC5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F03896D18D58C5B06D4485978A8E2660 /* CoreGraphics.framework in Frameworks */, - B7D82E1749DAE5FF0A400678011DECD6 /* CoreText.framework in Frameworks */, - F4FF072DD1C28A7736B8D1DDC839E424 /* Foundation.framework in Frameworks */, - 72BC0D5210ABDE6396CC75FA6A823FEE /* QuartzCore.framework in Frameworks */, - E3BB92FE44D2DFF2132BC27C70298513 /* UIKit.framework in Frameworks */, + 591D24448CA42AA91BBD903CA4A53827 /* Foundation.framework in Frameworks */, + A1F2D0DE1B8DD446E7CDB0058A3B8DFB /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - EEFB61A65EB8DA6653B544822EB9CE44 /* Frameworks */ = { + DD5C9024F378E063738F6EFE4D234528 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 72563ADE99DC9E753B27D48B16AA3654 /* Foundation.framework in Frameworks */, + 1C3714DCA485820AF4E14D734DFFF142 /* Foundation.framework in Frameworks */, + 0CA0F45A6039A156BC557AAD6B2196B5 /* ImageIO.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F6EC657AC5A7BEE9A3D288B582F4C5E9 /* Frameworks */ = { + F5984E20EC27C71E4066B3F1D4D03D30 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 432FA22864D148EBD4CB22F55AB68004 /* Foundation.framework in Frameworks */, - 38E0CD63021889EE46E1A6B9FA0415F5 /* UIKit.framework in Frameworks */, + 0000ED9E21A47D261061DB55C53FEDB9 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FBDA3FA5D995945512D0D2AF828AC0A1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D05D7C2C69AB71DBB1E969DF73992CE /* CFNetwork.framework in Frameworks */, + DED30C103F9CDE4E0053CE9DCBE20D04 /* Foundation.framework in Frameworks */, + E163727C9170B4464CB7250297A829B4 /* Security.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 013670849AE4267794D106DE6D68390F /* UMCCommon */ = { + 03CF47B3D75C108E16CDBD53851FD32B /* Frameworks */ = { isa = PBXGroup; children = ( - D2A62A7B2591E116CD2CB1E591BABAED /* Frameworks */, + B090A0962E08A4B1D14C9F0B5B13AA88 /* UMCommon.framework */, ); - name = UMCCommon; - path = UMCCommon; + name = Frameworks; sourceTree = ""; }; - 0664FE391669606C208EA556EBDD28A5 /* standard */ = { + 043C501A6C92CE1D85CEF10562DECB85 /* Support Files */ = { isa = PBXGroup; children = ( - 670CF36062CD3ECFF8C5C5AABE213403 /* LKDB+Mapping.h */, - E20BA2B707DD3CA5BBBF617A38FCB880 /* LKDB+Mapping.m */, - C98EC4CD7AD6C86DF803FE3B76FCED1A /* LKDBHelper.h */, - 2C765CC91B74812227DCE13319608707 /* LKDBHelper.m */, - 00DBB0CB01217AA64958D2E4F6059B2B /* LKDBUtils.h */, - 8A60255EA01616D51B066606B28E168C /* LKDBUtils.m */, - 2E0EDFAA630F61D5988162BCAB78B5FA /* NSObject+LKDBHelper.h */, - BE39E881910D30BFF4517A4177625677 /* NSObject+LKDBHelper.m */, - FB8C8FEB6717D66F14136EF50C148280 /* NSObject+LKModel.h */, - 56C7B870DA133902EFBA936EF978F45C /* NSObject+LKModel.m */, - ); - name = standard; - sourceTree = ""; - }; - 0A1A7675F7A7DD5E2EA307B7ECB550F9 /* Resources */ = { - isa = PBXGroup; - children = ( - FE403E58475EF64EF393ABA0E2EC5EC1 /* IQKeyboardManager.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 0B18D1637A92C37E605C2538A55FC3F5 /* Support Files */ = { - isa = PBXGroup; - children = ( - 9D4B692446F5B3A848158599E0258088 /* Info.plist */, - 6B7E3C04DF72633F51BBA78A08B8EF61 /* IQKeyboardManager.modulemap */, - 206777951591DDC2438D5F454A71CB8A /* IQKeyboardManager.xcconfig */, - 3DCB0BEBBAC1E47DDBB977778143CC25 /* IQKeyboardManager-dummy.m */, - 96351089BE56F809A66D4165730BDD76 /* IQKeyboardManager-prefix.pch */, - BDBB82B0577F0513EA40C059469FCAD4 /* IQKeyboardManager-umbrella.h */, + EC7649297B578937DD09B1AC3B327EEB /* Info.plist */, + D0088684BFACBC1E3A55A5FCB840D795 /* MJRefresh.modulemap */, + 1B2F7A05CD667B7F4431FA132E462FC9 /* MJRefresh.xcconfig */, + 6D74289832B8183D20B02960DB44FB6D /* MJRefresh-dummy.m */, + 30CEA94078A37E1B37CDDDA1C1834BFF /* MJRefresh-prefix.pch */, + F768B46D7CF697B15415714D925BA1E8 /* MJRefresh-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/IQKeyboardManager"; + path = "../Target Support Files/MJRefresh"; sourceTree = ""; }; - 0C0EA7F3A802D825B66C8E23BA35A161 /* Support Files */ = { + 07D2ADB1B13705CC6166A4AD779D683B /* Frameworks */ = { isa = PBXGroup; children = ( - 9DBF7AFC604013C37D42D03D54C2B42A /* FMDB.modulemap */, - 053338AFC5DFA5DC334E688DA16499C6 /* FMDB.xcconfig */, - BC5D2DFF79A26EDAE2E4229FA02DE3ED /* FMDB-dummy.m */, - 793A3F963E71FCAB028E34329D122155 /* FMDB-prefix.pch */, - 9ACEC95F7E6261C5C5E02E54CAFEA523 /* FMDB-umbrella.h */, - CF27FA729B2DA26B0CE791FB3E90BC05 /* Info.plist */, + 2A7F9D989C3B23E308A42E02AA98964B /* Bugly.framework */, ); - name = "Support Files"; - path = "../Target Support Files/FMDB"; + name = Frameworks; sourceTree = ""; }; - 0E2DC586C78EE009373398774B584AAB /* WechatOpenSDK */ = { + 0F551DD932EF8AA7DB75FE4A60AE3735 /* YTKKeyValueStore */ = { isa = PBXGroup; children = ( - B9B3DFA903870C5127C0EB7DCA2CD096 /* WechatAuthSDK.h */, - 65743645C0D98AA50085F327714FEF8F /* WXApi.h */, - 05657BFF7C0A29CF6F1BE61DB6523EC4 /* WXApiObject.h */, - 19001728FBAA40E025B61CB70702C2CE /* Frameworks */, + C642BCE8751CFC9BC013D0BEA36D455B /* YTKKeyValueStore.h */, + 5E5970EBFD625491CED012161FE21EDF /* YTKKeyValueStore.m */, + 71586D0D244F73DBC1091872BF3102F8 /* Support Files */, ); - name = WechatOpenSDK; - path = WechatOpenSDK; + name = YTKKeyValueStore; + path = YTKKeyValueStore; sourceTree = ""; }; - 0EF92FF4BFE7198041C98370B38AC200 /* SocketRocket */ = { + 12AE0D69F66BE61895061C26269F0316 /* FMDB */ = { isa = PBXGroup; children = ( - E08E7458F1940F20C0E1BBF7FDD0FDE7 /* SocketRocket.h */, - CA697CD49B3E51073391142FA485D827 /* SRWebSocket.h */, - EED26BAA73FE884C227E56BEB5E9D7C5 /* SRWebSocket.m */, - 61689A30C6F58A44CA0916A9797C0BC4 /* Support Files */, + EBFBE77ECE4B10793B3468FAF56DBBA4 /* standard */, + 6D587FD965795733C1DE918D1E854B2D /* Support Files */, + ); + name = FMDB; + path = FMDB; + sourceTree = ""; + }; + 160DD7E11644E822656E36ADDEBFC4D0 /* SocketRocket */ = { + isa = PBXGroup; + children = ( + 17B2AE35E410AC8314C9D3D7EE50DF7A /* SocketRocket.h */, + 75F038F0E7FAF63EBA750D91DF06CE21 /* SRWebSocket.h */, + 89A4FB5318F041C2B8128B21D9041281 /* SRWebSocket.m */, + 1C321EC33F22D263F1AFB3715A2465FA /* Support Files */, ); name = SocketRocket; path = SocketRocket; sourceTree = ""; }; - 11B681A4FA849059ADA6D37CE843A314 /* Frameworks */ = { + 16B09E7EB7890600D4E4281569B583A1 /* Frameworks */ = { isa = PBXGroup; children = ( - F73DA4A37A5395D46FB30B61FCEADF0E /* SecurityEnvSDK.framework */, - 000DFBF02B432D3298058B56ED47BA1B /* UTDID.framework */, + 01CC4847595A600A6F7A4AC54DD76D94 /* libWeChatSDK.a */, ); name = Frameworks; sourceTree = ""; }; - 18E1175011CBB9572369C6CA9BE3815C /* Starscream */ = { + 16C4B235E82266386B5CD4EE96545C13 /* Support Files */ = { isa = PBXGroup; children = ( - DC11B08B388CE3D8E34D3E0AC2E3B25C /* Compression.swift */, - 03EF23265306A2A5CFD07B28F6BC0D66 /* SSLSecurity.swift */, - 2431F4B5AE230C938093F4ACC541DF9C /* WebSocket.swift */, - C7192BD386630DD39E6C218B6259B956 /* Support Files */, + 75128EF31C6D82A44B728BBBC0594214 /* Info.plist */, + EA5B112AF008CD40CD016759A5C5D487 /* LKDBHelper.modulemap */, + 7F98EE491F1B375848361DC7AEB1B92F /* LKDBHelper.xcconfig */, + 62C2CDBD67226720B815F03C1A9C49C8 /* LKDBHelper-dummy.m */, + CB0DA24613011BCBD6A23C6806D0252A /* LKDBHelper-prefix.pch */, + 5464387A08F744A79310765AE072E608 /* LKDBHelper-umbrella.h */, ); - name = Starscream; - path = Starscream; + name = "Support Files"; + path = "../Target Support Files/LKDBHelper"; sourceTree = ""; }; - 19001728FBAA40E025B61CB70702C2CE /* Frameworks */ = { + 19C95B1B0C9B462099454E2E50E0D4DD /* Core */ = { isa = PBXGroup; children = ( - C3CE92694B37B4E144AB7C2A657FB9EA /* libWeChatSDK.a */, + 885CC5C7B0CA39367EBA948DF2367B65 /* NSButton+WebCache.h */, + 6A5D7991606712587CFD0DFE9A5E3DC4 /* NSButton+WebCache.m */, + 7DD5409A692C83437C558559DD416E60 /* NSData+ImageContentType.h */, + 4231EFAC746B70BBD8E9CC4D407DF9C1 /* NSData+ImageContentType.m */, + 11A7142162FC9EA47BFB9A6DED72DBC6 /* NSImage+WebCache.h */, + E9322053895EEE03F75B107018B88171 /* NSImage+WebCache.m */, + A6E84FFF96FBBB3DBB2CE50E2596FD78 /* SDAnimatedImageRep.h */, + 1C9E154677B670DDA3F46BEE875F6B56 /* SDAnimatedImageRep.m */, + ED7B64BA9A55B1F26F1722AB6EE74A13 /* SDImageCache.h */, + CE43F7A37BA6BC4848BE7C3B4265EE89 /* SDImageCache.m */, + 81A0E384E7C6FB8B202D56044210F6A9 /* SDImageCacheConfig.h */, + BB0BFBF29F530CAF6013580F184BD574 /* SDImageCacheConfig.m */, + 79E695EB33C23BAC43C22F015E115522 /* SDWebImageCoder.h */, + ABC0C3932D4BADAC2D9603EF31642A79 /* SDWebImageCoder.m */, + AA7AB3507351BCA6C4527C3BC7312C0F /* SDWebImageCoderHelper.h */, + D675EB88B5FE30187A06B355F0F3CCA9 /* SDWebImageCoderHelper.m */, + A1F1C5F5EFF4C33056EAF1088E9E7508 /* SDWebImageCodersManager.h */, + 95FF3C16B3F10DF0EF6D569E78EA0782 /* SDWebImageCodersManager.m */, + 3B9B9A99D767D2557E9A88D6F2F0DD46 /* SDWebImageCompat.h */, + 7DF7086537D9860DBA1838A2CF738478 /* SDWebImageCompat.m */, + FBD050FC63C7D54F060E2065763BE5E2 /* SDWebImageDownloader.h */, + 0EF80E24923EC548EF6E33E2DD36E035 /* SDWebImageDownloader.m */, + EE798D466C89FEA6AB6CDFF361EF31E1 /* SDWebImageDownloaderOperation.h */, + E663718B0995C70CF5CADA3EDEEBDA16 /* SDWebImageDownloaderOperation.m */, + 58328F884F29FB2639A0AD4653DED9AB /* SDWebImageFrame.h */, + ADE4E6FC54086728C0EEE918E57A0D45 /* SDWebImageFrame.m */, + 24762E712FE35B0B98DBA131383ECE21 /* SDWebImageGIFCoder.h */, + A1F500C7BA7C866D98A220946E05CAC5 /* SDWebImageGIFCoder.m */, + 2A4C02D3A79E060D16E49070922498AC /* SDWebImageImageIOCoder.h */, + EDE38C961A2038D1AA01A353A609CFED /* SDWebImageImageIOCoder.m */, + B5B119F06A6B8358EDCBA101FBC565A7 /* SDWebImageManager.h */, + DB635CFC34D6A30EA67D0BE25700F7F4 /* SDWebImageManager.m */, + CE49748C28D4E26DCFCE420E89FBEA6C /* SDWebImageOperation.h */, + 222C872FBA997E76330938B9E40A8682 /* SDWebImagePrefetcher.h */, + 234B0B77520F7FB1083EAB0B06567855 /* SDWebImagePrefetcher.m */, + 4E7B12FDCE45D2B38F779E8EAD8C6264 /* SDWebImageTransition.h */, + 2C46B1450E5C7D283F392A9ADCEB4DFE /* SDWebImageTransition.m */, + 2AFD87FE1A7D3CA4E660728863DA59FD /* UIButton+WebCache.h */, + 3854EE037BCFCFBE75285E6DAF8AB535 /* UIButton+WebCache.m */, + 22335143070F51F522F445C711096F74 /* UIImage+ForceDecode.h */, + CC6B8A807016524FCBAF17017565E609 /* UIImage+ForceDecode.m */, + 02EB3F876F91CCE54C8A839D6390D7A5 /* UIImage+GIF.h */, + E06A59DFE19B9EBF62E4DDFDCB70E98F /* UIImage+GIF.m */, + 20249BF2579AC39A329C1FC26350A22D /* UIImage+MultiFormat.h */, + 2E45E4D6694AC0C97C6A5AF81C604134 /* UIImage+MultiFormat.m */, + 8C8C3783F0610B08ADD978480B682776 /* UIImageView+HighlightedWebCache.h */, + DB96CE5C22BC0BD8718511158396C0FD /* UIImageView+HighlightedWebCache.m */, + 87120330F90EE7A00D4FD6085EA8A7C8 /* UIImageView+WebCache.h */, + 3AF7E228152EC8FCA66D6E5E66939409 /* UIImageView+WebCache.m */, + 7980D5EF9269D296280EE048E6D687D2 /* UIView+WebCache.h */, + BB2D8CB04016D61F7BFC496F3B495021 /* UIView+WebCache.m */, + AB49493C72E91540C35242C5BAD4FCB3 /* UIView+WebCacheOperation.h */, + 57CBC90EF9FB48F676B1D66FB765E5F7 /* UIView+WebCacheOperation.m */, ); - name = Frameworks; + name = Core; sourceTree = ""; }; - 1B05F3E81A737E1A62ACE47B8D59B181 /* JPush */ = { + 1C321EC33F22D263F1AFB3715A2465FA /* Support Files */ = { isa = PBXGroup; children = ( - 0B853C173AC47459374FA5127503AA4D /* JPUSHService.h */, - F3CDD0BE903CBFB244CDB880490A04EC /* Frameworks */, + 1F7390F506C3088DB3094023E4E32781 /* Info.plist */, + 0414764905B2B0FF38AE7C13ECC40826 /* SocketRocket.modulemap */, + B791735EB4C9484A7C8D303FBFB1FCD6 /* SocketRocket.xcconfig */, + 412B164C0833345984D6418941529C7B /* SocketRocket-dummy.m */, + 08DD40F0011A8931DC463C4414CA18BD /* SocketRocket-prefix.pch */, + 33093A6969DCF0577ACC4AFB773BB475 /* SocketRocket-umbrella.h */, ); - name = JPush; - path = JPush; + name = "Support Files"; + path = "../Target Support Files/SocketRocket"; sourceTree = ""; }; 204D78156C2EC3DBC444EB544EC0A6C9 /* Targets Support Files */ = { @@ -1227,826 +2229,1317 @@ name = "Targets Support Files"; sourceTree = ""; }; - 2205098B27469BCD7B87D25D45F35101 /* Support Files */ = { + 2269F3292F201D8192CC08F9A2AD4016 /* MJRefresh */ = { isa = PBXGroup; children = ( - E6841BB55B15555FACC1C2407F11D87A /* Info.plist */, - 11CBDFE3700AD26E36AFB9E669E902DD /* MBProgressHUD.modulemap */, - 36C94757ECFB0CDBFD720B0C11F08BC1 /* MBProgressHUD.xcconfig */, - 2E917B75DE00F9E5F318667A4D3CA7DB /* MBProgressHUD-dummy.m */, - E860149186CE6E56BAAEE62CA5ABDF8E /* MBProgressHUD-prefix.pch */, - 9FE34AE9B11E8E9CE707D60148CFB286 /* MBProgressHUD-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/MBProgressHUD"; - sourceTree = ""; - }; - 22EFAB1A8ADE6944D33D4F20BE2ED3DA /* JCore */ = { - isa = PBXGroup; - children = ( - 6135153B546AEC4D283A511C77C42214 /* Frameworks */, - ); - name = JCore; - path = JCore; - sourceTree = ""; - }; - 231E9889CD1CCB432A0BAA13B0E113FE /* MJRefresh */ = { - isa = PBXGroup; - children = ( - CB12608CAF6344C9CD54DC1A84A0BEF5 /* MJRefresh.h */, - 91DA5B2E5AE56CB9005ECE4644FA3356 /* MJRefreshAutoFooter.h */, - E43C0234304F095C027CA559CA4E9F0B /* MJRefreshAutoFooter.m */, - 45879D3B33AD86D331ACA84B5995B4D1 /* MJRefreshAutoGifFooter.h */, - 8705B892D0FB23E4B3A26DDB33CBC371 /* MJRefreshAutoGifFooter.m */, - B8B56BE8B95141AA7FFDB381009541CA /* MJRefreshAutoNormalFooter.h */, - BC5C08FC6773BA7BD235A3B78A7ABCAA /* MJRefreshAutoNormalFooter.m */, - C9CDC1F6DD226D0362ABF5BAC2D55A32 /* MJRefreshAutoStateFooter.h */, - C607C7BF73E5A94800A31DAFFC343CAC /* MJRefreshAutoStateFooter.m */, - 81061EAAEC3F61A38F09275305E22D6A /* MJRefreshBackFooter.h */, - 25A4B40FC26E491D355F864AEA121E73 /* MJRefreshBackFooter.m */, - D887710C70848A5D7BBB59F3733FA591 /* MJRefreshBackGifFooter.h */, - 874A487F8BFAD83D1F053B4DCD8201A1 /* MJRefreshBackGifFooter.m */, - 964EB9F9E3DFDFBEB0A635FF6F6445AC /* MJRefreshBackNormalFooter.h */, - F57EAFC722DC8A1A5E24FC9DC97959E0 /* MJRefreshBackNormalFooter.m */, - 498010BF30FB1D6FB301F7B3FD6CFC49 /* MJRefreshBackStateFooter.h */, - A77564763595F2220FB4FF9C93274429 /* MJRefreshBackStateFooter.m */, - BCDDB5FF379578ABC9203ED41F2C6152 /* MJRefreshComponent.h */, - FC45B739819A1904D554E79520E207DA /* MJRefreshComponent.m */, - 4C2F72B6BC0D51790962077A8C13EC05 /* MJRefreshConst.h */, - 9CA67BCA7DA83AFB686019666B15E346 /* MJRefreshConst.m */, - BC38A229ADD93FA75F0CDC8D9BE4FC6A /* MJRefreshFooter.h */, - 60E6BD48D0EAAAD7C2C35A6705DA2EB1 /* MJRefreshFooter.m */, - A38841D1204800C4F712AB1D13E4AC7D /* MJRefreshGifHeader.h */, - 64EB649102BB6022F6927FBD8BF10E3B /* MJRefreshGifHeader.m */, - 64835380AC55D938C3E0E9AA529F4D41 /* MJRefreshHeader.h */, - 5145E6BB9DFB46461BE07ADA20047F2E /* MJRefreshHeader.m */, - D58D416D0D907E75F8F25DBC31A8F2A0 /* MJRefreshNormalHeader.h */, - 048638E84A58D781817B05B69F5DB76D /* MJRefreshNormalHeader.m */, - DDC8D5C54CB2FA432E51D33F63299867 /* MJRefreshStateHeader.h */, - C405F8314A0EDA4CCECFACFD56BD6452 /* MJRefreshStateHeader.m */, - D1FD9AB8D8A0F476AA2FFFB0AF73984A /* NSBundle+MJRefresh.h */, - 49FC9B7F0D1967826227DEFA8D9EA924 /* NSBundle+MJRefresh.m */, - F665835060F250C5E831A32121C45B5F /* UIScrollView+MJExtension.h */, - 214889649505797427D153AFE63862E7 /* UIScrollView+MJExtension.m */, - CE00515C642F3041D7530F99532A37B1 /* UIScrollView+MJRefresh.h */, - D1AF018F0E0542900564BFAF307755AD /* UIScrollView+MJRefresh.m */, - 316C099F7EBA73314DFCC094D555F83B /* UIView+MJExtension.h */, - 74DEFA36B4962F7E3A0B4640337FC908 /* UIView+MJExtension.m */, - FCCB57F67790368B6E845405EBA032D6 /* Resources */, - 95FEF0CE2F0A92C7121D81C2CB15AC44 /* Support Files */, + 1EF5C7F199322D1BFDDA67CFE14AC9E9 /* MJRefresh.h */, + 2E084C32F07AC27EBC5EC845F4957F4C /* MJRefreshAutoFooter.h */, + 69764D291C85F1FDF35BE2A9C545CEE9 /* MJRefreshAutoFooter.m */, + 496E19E4A585F7F89396E45A0F025666 /* MJRefreshAutoGifFooter.h */, + 909EEACC3D53B5C20B405FE99AABA0A6 /* MJRefreshAutoGifFooter.m */, + 39E95C32A7C1323ABDF30E4F76BFCF1B /* MJRefreshAutoNormalFooter.h */, + 3120B8DB2246172495AEDF42E825FE3A /* MJRefreshAutoNormalFooter.m */, + 92303B24A8D5DC6C6A24C8F20C2E9E3E /* MJRefreshAutoStateFooter.h */, + 7BE82B9D4079D3983911B8D53A96EFEC /* MJRefreshAutoStateFooter.m */, + 2C29E51B904852FD5C10F0044CB6D392 /* MJRefreshBackFooter.h */, + B9B74C9E2B2FBDE9323B830B5DA70875 /* MJRefreshBackFooter.m */, + 34E0E96AC3D6E0C135C1474B9E99E0E9 /* MJRefreshBackGifFooter.h */, + 63EDB2249CF51415D65BA08E28489D71 /* MJRefreshBackGifFooter.m */, + 1ADF48BE5CBD694F1213EC6A289C9B8A /* MJRefreshBackNormalFooter.h */, + EA3A5D6DB28EFFD10320A14F013B6068 /* MJRefreshBackNormalFooter.m */, + A719998C7423E553C66F59766C89B816 /* MJRefreshBackStateFooter.h */, + 14464B5FE9352E85A2481638DF324A31 /* MJRefreshBackStateFooter.m */, + D163AA08EC77D9947EE5573A7EE590E5 /* MJRefreshComponent.h */, + 769E0CC5D44E5F06068AC65B5544743E /* MJRefreshComponent.m */, + 88FD3FBD15119CB99E9D80D90992E1C8 /* MJRefreshConst.h */, + 4222704655BCC2B7F4DD2BACB2C4AB0C /* MJRefreshConst.m */, + CE4FC04810BF48929DE497595E3E1A86 /* MJRefreshFooter.h */, + EDDE0D85E25455E61C59C0DF4310FFA5 /* MJRefreshFooter.m */, + 3FF57359A0BC6E800A9EFDE2F444A6C0 /* MJRefreshGifHeader.h */, + 13F7B9CBAB0CB01818519C819CAF02C5 /* MJRefreshGifHeader.m */, + 2320ED36FC8E744B31FF6741BB85F07A /* MJRefreshHeader.h */, + 3860605472BB0020FA275E37A39BBFC2 /* MJRefreshHeader.m */, + 8B5EDD4CAD43462B4C5BF3031AE64E40 /* MJRefreshNormalHeader.h */, + 2C00DAF50A01872D19E25D7471E10CD9 /* MJRefreshNormalHeader.m */, + AACA34D95CFD97B77A99CD3EB2150FB4 /* MJRefreshStateHeader.h */, + 178D59A68923C38B4F19249B6B7FE990 /* MJRefreshStateHeader.m */, + 2A3A240F77B6B92F434EE270B9A53ECB /* NSBundle+MJRefresh.h */, + 95CF6F20DA7D7D257F63CD7A8455C821 /* NSBundle+MJRefresh.m */, + 202FCACE847D9EAB6242DF88431E0F23 /* UIScrollView+MJExtension.h */, + 1D9B1477E02C9FC7DB75801BF860E2E8 /* UIScrollView+MJExtension.m */, + BCFBD5D8A73ECE684FBFA5BFA305674C /* UIScrollView+MJRefresh.h */, + B16769F5B9B2F193A4AF9386634D9F36 /* UIScrollView+MJRefresh.m */, + CFD46D5E3076E4207888D8094E6B31A3 /* UIView+MJExtension.h */, + 99247344EB46502CC5221B2DE032D0EF /* UIView+MJExtension.m */, + 97183FEE94E98D480AEFD02413128333 /* Resources */, + 043C501A6C92CE1D85CEF10562DECB85 /* Support Files */, ); name = MJRefresh; path = MJRefresh; sourceTree = ""; }; - 337E1E73A7CE2DEDA6F9FB1837F71269 /* Support Files */ = { + 2669FE09D19074727E52B81A6972B867 /* JPush */ = { isa = PBXGroup; children = ( - CCB297EBF9711390A31826257A45DFED /* Info.plist */, - 58A1949C3F564FD801440AEA4D4E3C27 /* UITableView+FDTemplateLayoutCell.modulemap */, - D7AFFE638A1D3629C5C2E838084B7CB7 /* UITableView+FDTemplateLayoutCell.xcconfig */, - B72958B223F8DBC6D1DEBDF0873BBBD4 /* UITableView+FDTemplateLayoutCell-dummy.m */, - 4F7775A169B588C5C2BEC8EE5864E3E3 /* UITableView+FDTemplateLayoutCell-prefix.pch */, - F426661253D1751C24C7C550B0DD3742 /* UITableView+FDTemplateLayoutCell-umbrella.h */, + 5A67163823E503ACFE3547B596008EEE /* JPUSHService.h */, + 3604765D4AF77FEC091B7E767ED5EDCD /* Frameworks */, + ); + name = JPush; + path = JPush; + sourceTree = ""; + }; + 29C94DAB3DF0034FBE256F7CB816B0F9 /* LKDBHelper */ = { + isa = PBXGroup; + children = ( + AF67C8E6F6B65E5B1CF8D56D2D8360ED /* standard */, + 16C4B235E82266386B5CD4EE96545C13 /* Support Files */, + ); + name = LKDBHelper; + path = LKDBHelper; + sourceTree = ""; + }; + 2A79D46B034D02006F22AB0DA866270B /* Support Files */ = { + isa = PBXGroup; + children = ( + A90CAF9315D25AD78A6FDCE407EE1C42 /* Info.plist */, + DAA5E1AD39BE407D72A4B3832128CC6C /* Masonry.modulemap */, + 18653B1A7B81EC7FA4D888702040D042 /* Masonry.xcconfig */, + EA1CB2D2B2F80861AD6C1BC9136F4112 /* Masonry-dummy.m */, + 849AD7977D6514419C3163A657A47A0A /* Masonry-prefix.pch */, + A1725A50F6434DA07CB5D66F836BB43D /* Masonry-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/UITableView+FDTemplateLayoutCell"; + path = "../Target Support Files/Masonry"; sourceTree = ""; }; - 33D4CBA68C2A74D2CBF4FC67C67DB070 /* Pods */ = { + 32F6B7E3A85840132B6D0AF6494FCB65 /* Starscream */ = { isa = PBXGroup; children = ( - A633D579D4B888F7971A6C11883C1718 /* AFNetworking */, - FBDA7C8860678A5E3250E18D9655919E /* Bugly */, - CCA25ECCC450E021E069120D409442A4 /* FMDB */, - 794AD9C3DAC5F29468B7EB72907FDA6E /* IQKeyboardManager */, - 22EFAB1A8ADE6944D33D4F20BE2ED3DA /* JCore */, - 1B05F3E81A737E1A62ACE47B8D59B181 /* JPush */, - E63D2863D5FB7DC212A24B273C014E03 /* JSONModel */, - AD0DF298644AA6EFB83ADF5D1723BD32 /* LKDBHelper */, - 81A5C6070FCB3F6939686860D1F6C46B /* Masonry */, - 4A2373D34CC5044D9944C2330307DC57 /* MBProgressHUD */, - 231E9889CD1CCB432A0BAA13B0E113FE /* MJRefresh */, - 85A26EC9BC9FA781385D9AC8F9C05D82 /* NJKWebViewProgress */, - 4E14C5E5AA1EAFC384548D710ACC3AC0 /* SDWebImage */, - A8FCFF06C4D1130E14692E5D37CE3D59 /* Socket.IO-Client-Swift */, - 0EF92FF4BFE7198041C98370B38AC200 /* SocketRocket */, - 18E1175011CBB9572369C6CA9BE3815C /* Starscream */, - E0AB66D2C96E63CD3CA32758697A0143 /* Toast */, - C64A38BCDA1A3F78AC00751F0655D817 /* TTTAttributedLabel */, - E1DEBC0332688293576CF0781BF2B546 /* UITableView+FDTemplateLayoutCell */, - 3FA6FECB2F4E709818F954A6F37A1BEF /* UMCAnalytics */, - 013670849AE4267794D106DE6D68390F /* UMCCommon */, - 34BF9873AA18621242204EC26A23EAFF /* UMCSecurityPlugins */, - 0E2DC586C78EE009373398774B584AAB /* WechatOpenSDK */, - 4BD68F65A4F8243DB4D58D528B382734 /* YTKKeyValueStore */, + 0E5698041AB137552E3373832AD90304 /* Compression.swift */, + 7739B8E5715569FDCB4A5157DB47A572 /* SSLSecurity.swift */, + FDA7B07B7621695028B2FE565CE6EE4A /* WebSocket.swift */, + 429DC6ED94944DE8FC4DCC56CF57579E /* Support Files */, ); - name = Pods; + name = Starscream; + path = Starscream; sourceTree = ""; }; - 34BF9873AA18621242204EC26A23EAFF /* UMCSecurityPlugins */ = { + 35F6FB5B9F1B6D3EF2E8F4F23EDDDD97 /* ProgressView */ = { isa = PBXGroup; children = ( - 11B681A4FA849059ADA6D37CE843A314 /* Frameworks */, + B19D5D49933050374E27CC5A36A9D058 /* NJKWebViewProgressView.h */, + 8E4B09EF879FBFE955837502D34D1D94 /* NJKWebViewProgressView.m */, ); - name = UMCSecurityPlugins; - path = UMCSecurityPlugins; + name = ProgressView; sourceTree = ""; }; - 3C6ECA84E263337ACC001FB248021E44 /* Support Files */ = { + 3604765D4AF77FEC091B7E767ED5EDCD /* Frameworks */ = { isa = PBXGroup; children = ( - 8CC12A9C12532CB9C97DB1F60227C686 /* Info.plist */, - 4840A6FC48CB8E524D7A7D2DEF0DC1A0 /* NJKWebViewProgress.modulemap */, - A1E47E6E0B0C4589F0066EB47D2EFB1E /* NJKWebViewProgress.xcconfig */, - 27481864BFB4AD24155BCC2551337DB6 /* NJKWebViewProgress-dummy.m */, - 9A3CCB6C657E89D308B34C47CC5B789F /* NJKWebViewProgress-prefix.pch */, - 10209B83220731CD89F3BE7CE9C254D0 /* NJKWebViewProgress-umbrella.h */, + F0A9E7BD20A5FD5852F4F43A8CEF86FE /* libjpush-ios-3.1.0.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 38ED195F8198A4B63D4FD69E3835FF15 /* Support Files */ = { + isa = PBXGroup; + children = ( + F61C463512AFB050C8626DA1E66B6C90 /* Info.plist */, + 51F4E27FD53F67DBA72BBDCD4DF94543 /* LBXScan.modulemap */, + 99C40C91334B69C1D3D909F15E8B8784 /* LBXScan.xcconfig */, + EE748AF72A5FC49C5D85BBD6817EFE20 /* LBXScan-dummy.m */, + BBD3C01D9E4A75C78DD068F21C86BD4A /* LBXScan-prefix.pch */, + B68DA9BDB004B69F101D1FA08FCC1374 /* LBXScan-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/NJKWebViewProgress"; + path = "../Target Support Files/LBXScan"; sourceTree = ""; }; - 3CD692616588D8B0B76B05D8F9BBFE7E /* Products */ = { + 3B2B419113BEC5CB996D2F14B2F6827D /* TTTAttributedLabel */ = { isa = PBXGroup; children = ( - 06F7DF71211917C6613F190B1D9CEA2B /* AFNetworking.framework */, - 3F9C38A75057CBD015D16FAA76005ECB /* FMDB.framework */, - A087BAC4F72D6A1D75482DB745BF663D /* IQKeyboardManager.framework */, - 935FBB07F207A53D79856BDDE153E292 /* JSONModel.framework */, - 5290E81387FC7DE33A6834ABB78CD62C /* LKDBHelper.framework */, - 2493EEFA5275F1BFBB2AF35F11BED82C /* Masonry.framework */, - A0E77CB702D048DE8D95D7B71073CB5A /* MBProgressHUD.framework */, - 029A3331019368C8C30B8DA9778E0794 /* MJRefresh.framework */, - 23E3DFBE5E063BE6E4D93A3E77F032ED /* NJKWebViewProgress.framework */, - BEA40D79454E792C12261F3AF180920F /* Pods_GIGA.framework */, - E84CE3A7FDCD3AE81A473F6C746504A2 /* SDWebImage.framework */, - 0F329A9EA016DA0D20BA2C5C7D0DAC79 /* SocketIO.framework */, - 67C8BFEE51B5F26E6EB7520C972CD09A /* SocketRocket.framework */, - DDE1008593C16D5180F63ED51EC27802 /* Starscream.framework */, - 547FB455959DBDAB1B311703DC4655D1 /* Toast.framework */, - 22776590D888620F659DDF182BE8BEFC /* TTTAttributedLabel.framework */, - 4819F4658B859A7A2B63B28F360E7FFD /* UITableView_FDTemplateLayoutCell.framework */, - 99792AD152EC0F67CE203E29D0DACFC0 /* YTKKeyValueStore.framework */, + E9FA6D0C44ACBE1FC9B26E14D165776D /* TTTAttributedLabel.h */, + DC57C149910BF3453D9F2ECDF2B4C630 /* TTTAttributedLabel.m */, + B95103A38187DC5B1D9ECDB97106424C /* Support Files */, ); - name = Products; + name = TTTAttributedLabel; + path = TTTAttributedLabel; sourceTree = ""; }; - 3FA6FECB2F4E709818F954A6F37A1BEF /* UMCAnalytics */ = { + 3E3625EE8290A2E0171187A12427C4A6 /* Core */ = { isa = PBXGroup; children = ( - D4D12C5B91A26ECDA4A6A7DBDF734592 /* Frameworks */, + FDA40E9D2C5D8A0AC4B7B4A19B57FFFE /* NJKWebViewProgress.h */, + 46BC11C5462F8D9083C26EEEEE116177 /* NJKWebViewProgress.m */, + ); + name = Core; + sourceTree = ""; + }; + 429DC6ED94944DE8FC4DCC56CF57579E /* Support Files */ = { + isa = PBXGroup; + children = ( + 8C63B24E653A33063238765577E8CAFB /* Info.plist */, + 8877A064A7870C495A887E8D1A642DD5 /* Starscream.modulemap */, + 57F5BF2DC8AB7CC32D954D4F87FC431A /* Starscream.xcconfig */, + 12204C88A320C0301A141E6E87004AFD /* Starscream-dummy.m */, + 6651F559AD252C655A9499B183453B3A /* Starscream-prefix.pch */, + 7BED2A24A5D9FC5DE65CDB16E3993529 /* Starscream-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Starscream"; + sourceTree = ""; + }; + 52B04B6E2E2E4269F8F730AFDDB3D23B /* Types */ = { + isa = PBXGroup; + children = ( + 88A91826759C3D62F0CED673A1DE3936 /* LBXScanTypes.h */, + 66D33BE7D27E3630895489EB38C44197 /* LBXScanTypes.m */, + ); + name = Types; + sourceTree = ""; + }; + 541A032234A4C435AEAFBB3AF2116D25 /* UMCAnalytics */ = { + isa = PBXGroup; + children = ( + A46B744A8486F54B7741D1AF6EF3519D /* Frameworks */, ); name = UMCAnalytics; path = UMCAnalytics; sourceTree = ""; }; - 44CAD7891D251809201C7D44DC9CDB01 /* Reachability */ = { + 65BD502401EFFA2F5336628B0E61158E /* Serialization */ = { isa = PBXGroup; children = ( - FBF2BC661F74DEDD633BF2098800BCB7 /* AFNetworkReachabilityManager.h */, - 042DC3BCC2842104D6A45CA51DC3F42C /* AFNetworkReachabilityManager.m */, + C98C8E34977A02E2FCCBF24EBC05E35F /* AFURLRequestSerialization.h */, + 65C30575D94B3B61C4EA49629F94F4E7 /* AFURLRequestSerialization.m */, + 86B6E753ADDF97940C05A4C653E7108F /* AFURLResponseSerialization.h */, + 4F53850E7219C55BE5B850DB7ACEBE09 /* AFURLResponseSerialization.m */, + ); + name = Serialization; + sourceTree = ""; + }; + 68F2009C9581183540BED36611704FF5 /* Support Files */ = { + isa = PBXGroup; + children = ( + A6E56698796C576CBF735BC5B1FCD3D5 /* Info.plist */, + 4E274EDDB8E3984229A093237F0D8250 /* MBProgressHUD.modulemap */, + 03EBC956C1D11E846DAB8041CAB8952F /* MBProgressHUD.xcconfig */, + ED6963810BB2C1A82ACD63714720A260 /* MBProgressHUD-dummy.m */, + FBE51C41B549098018472918F4A59E5C /* MBProgressHUD-prefix.pch */, + A5B4D719680B5193F01818BEC9CBCB1F /* MBProgressHUD-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/MBProgressHUD"; + sourceTree = ""; + }; + 6D587FD965795733C1DE918D1E854B2D /* Support Files */ = { + isa = PBXGroup; + children = ( + 120BA624AE647B5ABA6B42796EA80AED /* FMDB.modulemap */, + BC3F543F9DD927FDD2F604B031EEC06B /* FMDB.xcconfig */, + AE87B8DDB9DF073032D770CD8C0C0C05 /* FMDB-dummy.m */, + 0F6DD1021CBBDB8B2572A03DCA7C12F9 /* FMDB-prefix.pch */, + 84638A03F2FD43305155579E47619D3E /* FMDB-umbrella.h */, + 197B0CA737D48087000F5D18E12A4555 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FMDB"; + sourceTree = ""; + }; + 6F72BDA77DDE3C8CCA20BA6548A25928 /* LBXZXing */ = { + isa = PBXGroup; + children = ( + E9D88C308C13BE4F0E533DBFF7254198 /* LBXZXCapture.h */, + 9368955A4245EB6352EB3B9F4BBE71EC /* LBXZXCapture.m */, + DF778018EDF24417DD3F99942B884F3E /* LBXZXCaptureDelegate.h */, + DB2ACF264118BE5AAEDE5A3A5B8931EB /* ZXAbstractDoCoMoResultParser.h */, + 887C347C37C798794A3400C4788F82AF /* ZXAbstractDoCoMoResultParser.m */, + BC94AB37494391AEF4E2EE0BFB58850D /* ZXAbstractExpandedDecoder.h */, + 497BC13476902C48298CA9EBA5C10239 /* ZXAbstractExpandedDecoder.m */, + 27E0F0F34C4C74E17FD6318296871814 /* ZXAbstractRSSReader.h */, + 1AC58043E8A387745ECF2111F22DC0F3 /* ZXAbstractRSSReader.m */, + 58152A29FD0754C8C6A60CB925ECBC14 /* ZXAddressBookAUResultParser.h */, + 0419923E664360BC040CB84E1A475782 /* ZXAddressBookAUResultParser.m */, + 0777A67F01AC971695E18A08A98D4887 /* ZXAddressBookDoCoMoResultParser.h */, + CF06188AC07C7C27495C78395626B74D /* ZXAddressBookDoCoMoResultParser.m */, + FD499BAC595D6653AFCAF7496EE274FC /* ZXAddressBookParsedResult.h */, + A605A6AD7D5F53CB478E997357A1806B /* ZXAddressBookParsedResult.m */, + D9275A725164D3FF4B69A0DFA2777191 /* ZXAI013103decoder.h */, + 4C192F2382F4C039C85C70C4DA2A5C7C /* ZXAI013103decoder.m */, + 60A561785854A3F2E4B9017839350583 /* ZXAI01320xDecoder.h */, + B041CC04C8BECC46A754D164BCAD3057 /* ZXAI01320xDecoder.m */, + EE83A59533B6D6B9979E38443BDF496E /* ZXAI01392xDecoder.h */, + BF5657DB241358AD9FDAE9890C8ABEEF /* ZXAI01392xDecoder.m */, + CAE96BD792062429CE1EA9DFD03E46D5 /* ZXAI01393xDecoder.h */, + 029DEC3AB19B4BAD32ECBD82D8BAA683 /* ZXAI01393xDecoder.m */, + 687392D12DE79F3572E2015961306FC8 /* ZXAI013x0x1xDecoder.h */, + DDC020CC041CE21BCBE1AFA667268370 /* ZXAI013x0x1xDecoder.m */, + C612D57588F23A5866E45C4835E646C5 /* ZXAI013x0xDecoder.h */, + 14A80D785536E522E2A574957742F4D6 /* ZXAI013x0xDecoder.m */, + E01907B534984C539F96A49D86CBAE44 /* ZXAI01AndOtherAIs.h */, + 8F71177B88BB0E0A87A20AE7F03B39A1 /* ZXAI01AndOtherAIs.m */, + 257EDB11649851E0733955A6BFAE808B /* ZXAI01decoder.h */, + 82A0A0268CD5C11EE39566CEFC051FCC /* ZXAI01decoder.m */, + 7BFB470E1E9E4EC099452CE5FDDED518 /* ZXAI01weightDecoder.h */, + 46AABDEF7F2837A3945CD5B72A801054 /* ZXAI01weightDecoder.m */, + 701446840081326410A29622ADBEE46B /* ZXAnyAIDecoder.h */, + 8310F7311DA2B88E84CA2119CFD7640F /* ZXAnyAIDecoder.m */, + E0FF7B43673CB04DB59F4418B2EEA542 /* ZXAztecBinaryShiftToken.h */, + 78BC20152075DB6234CD40F5410B0095 /* ZXAztecBinaryShiftToken.m */, + C4BB8EA3DE2CFA86580C6439A7B6AA78 /* ZXAztecCode.h */, + D1E941227E84280F17C045C91F1902D8 /* ZXAztecCode.m */, + A9CA5FF09538D3B7C48A9AF5FBB9221F /* ZXAztecDecoder.h */, + 9D34CE6EABED483EF7CD837F56BA870E /* ZXAztecDecoder.m */, + 8E965DDA942C48F7D3BABD368A08FFF8 /* ZXAztecDetector.h */, + 202B6B8E6F79D8E8165505E726FB999F /* ZXAztecDetector.m */, + E74E49B61863605A36C4E3C9F2832C55 /* ZXAztecDetectorResult.h */, + 4EE274531929642E26FAC9CEB0CE1D96 /* ZXAztecDetectorResult.m */, + D3E1FC166F80EFA174F81A8658281571 /* ZXAztecEncoder.h */, + CEE80EAC1FE0F2DC614CC7078C7A1C03 /* ZXAztecEncoder.m */, + BDE22E9668D0E4B563401B93027B92A4 /* ZXAztecHighLevelEncoder.h */, + 8DF3BB511F79101FC0344D36A8E097E5 /* ZXAztecHighLevelEncoder.m */, + 289025C9E451189A3ED0A2EC1C7D5D08 /* ZXAztecReader.h */, + 7B751927E132E372807C8082B5CEEC23 /* ZXAztecReader.m */, + 7B28802C647811C71CBB2038A358709E /* ZXAztecSimpleToken.h */, + 7750F613ED29A2D26322E258E8C4D7B7 /* ZXAztecSimpleToken.m */, + AAA0264943D4277E2ED911E5B95C9782 /* ZXAztecState.h */, + C10967434C4CA6FC8AE871A1B97C9F43 /* ZXAztecState.m */, + 1FA3A3051CD742F345F9EE5A14E8EF70 /* ZXAztecToken.h */, + A9B43581CEA2EE0D03C949A7239BCD9F /* ZXAztecToken.m */, + 2405D3601EAFE080F875AB04D1E1E56A /* ZXAztecWriter.h */, + 3516E36108BFB3AB6CE8344EB628EA89 /* ZXAztecWriter.m */, + 7B241E82646F26C23270DD0F25306B8D /* ZXBarcodeFormat.h */, + D76C53ACF409ED70426B26C9F9D00B68 /* ZXBinarizer.h */, + 7D320CFA28819D61FB692FC0849DA960 /* ZXBinarizer.m */, + F2748C4C9D212DE00657CF5BE83E3FB4 /* ZXBinaryBitmap.h */, + F78255E6DB06E4BE7660C8930DDB926E /* ZXBinaryBitmap.m */, + 95B0E8D4B76F1C79F62D3C8D3627C8A7 /* ZXBitArray.h */, + AB2178008AF9DA5F005048AEC7DF5133 /* ZXBitArray.m */, + 63BFC98F43CE219C1A220493F6BA002E /* ZXBitArrayBuilder.h */, + 4622950ED6DD64E0457786C3F6DDB3DD /* ZXBitArrayBuilder.m */, + 6FC2506E4A42B3837966006D093F8EC8 /* ZXBitMatrix.h */, + 609452D986F166C3F4D5A91270433EC7 /* ZXBitMatrix.m */, + 2823134BEBE09A1FC0B644A3B421CA23 /* ZXBitSource.h */, + 290A16571BB7520DECA3387040A15502 /* ZXBitSource.m */, + AA66F30DD8EC54D685DADC01A7D059EF /* ZXBizcardResultParser.h */, + 96BA16BA4887B99913F4FCD4AB7FD99B /* ZXBizcardResultParser.m */, + BFE70AEDDCBF7520A3628C3BF897B4FA /* ZXBookmarkDoCoMoResultParser.h */, + D875EBF70B631CBAC790D0053BBAFECA /* ZXBookmarkDoCoMoResultParser.m */, + 79802C836DDD9AFF60A8497B114594C6 /* ZXBoolArray.h */, + D08B329D2BC575B425B77B76FDDA53B8 /* ZXBoolArray.m */, + ABF265594DAF7ED5BAF27F67AA705ED8 /* ZXByQuadrantReader.h */, + 9A4A17170327EDA50F9392EA804A73E4 /* ZXByQuadrantReader.m */, + 1FE90B47F16EF45B0A7C27D3A206E6C3 /* ZXByteArray.h */, + 1B683D5CDF5103810E86EA34F3FA3CCF /* ZXByteArray.m */, + C91C6B5A3918001519E53DB440411A32 /* ZXByteMatrix.h */, + F80E7D7DE4577D633349A0FF231934CE /* ZXByteMatrix.m */, + 854337CBDE790AC6A849C488D88DD95A /* ZXCalendarParsedResult.h */, + 07EA8071692902994827F0AC1023B6F4 /* ZXCalendarParsedResult.m */, + 285B5E000360B7ED322388AE074844A2 /* ZXCapture.h */, + 0432D6495063422ABDDC654AE4F8B470 /* ZXCapture.m */, + 88F7368BA1F4E884C86CF19DE4116E2F /* ZXCaptureDelegate.h */, + 8B35462DBAAAE8003FB720CDC6C62786 /* ZXCGImageLuminanceSource.h */, + 726ACBE484E0CE875DB7C5A4EC9014C1 /* ZXCGImageLuminanceSource.m */, + B50F6DB14AA4BF1521ECDA2C83BA1D83 /* ZXCharacterSetECI.h */, + 2741EB74A81A677BD868DAA77B5D50EB /* ZXCharacterSetECI.m */, + DF83506140AC0E523AFCA4AA5F101ADB /* ZXCodaBarReader.h */, + 2496264F0AEA771F215049454D226C60 /* ZXCodaBarReader.m */, + 3E8435BF3B9A2662AF8C6A5D6A78E0A3 /* ZXCodaBarWriter.h */, + 21D5C788A28238416C4B8D3BCFE89377 /* ZXCodaBarWriter.m */, + 69A32B7A436220F9CF9C07B76572C923 /* ZXCode128Reader.h */, + 0A66899D553769F07E1441C3B9394C64 /* ZXCode128Reader.m */, + 1CABAF08106F653D5DF8B4FEB5102E39 /* ZXCode128Writer.h */, + 77460A8A994E8D7ED439AB0F63A19E0C /* ZXCode128Writer.m */, + 122B6F4C1CA16FE50862CDD2A4393CCD /* ZXCode39Reader.h */, + ED05B441B7D7D284FA548DD27827DA1E /* ZXCode39Reader.m */, + 41D83AA43A5759B1910D7B53E34FCD64 /* ZXCode39Writer.h */, + 87F9F6A969CE02922769E4D30F411D49 /* ZXCode39Writer.m */, + 04E020596EA2153E370B4CA94419609B /* ZXCode93Reader.h */, + 91780F76FA729D64DC40C0D86F70021B /* ZXCode93Reader.m */, + 79A74B0962527E3CB0DE906FAFB94323 /* ZXDataMatrixASCIIEncoder.h */, + B1DFA5044A030D67F2C45BB6A2FA642F /* ZXDataMatrixASCIIEncoder.m */, + 4063220FB7868DB178D9715ABD0541B0 /* ZXDataMatrixBase256Encoder.h */, + 0B1A2A3CD6B1092487E88EDA72E8E3EC /* ZXDataMatrixBase256Encoder.m */, + 366173D81A4ED097DF635FD4EA4EF986 /* ZXDataMatrixBitMatrixParser.h */, + 6C5E76D9EA1A516638FCCB1DF56749F7 /* ZXDataMatrixBitMatrixParser.m */, + 444CBF418CAC87110D897FFCAE82DD3E /* ZXDataMatrixC40Encoder.h */, + 7D1419B2A9BA099EEA7911AD5EEF5E4A /* ZXDataMatrixC40Encoder.m */, + 2A0910812650DEEBE939D73295D420AB /* ZXDataMatrixDataBlock.h */, + 09641018C9FF907DE85D6D78C7B3A4AA /* ZXDataMatrixDataBlock.m */, + 9994A9404B4EFC309846990C886EB6EC /* ZXDataMatrixDecodedBitStreamParser.h */, + 764EBBB80EB48917DC7DEFD4884C727A /* ZXDataMatrixDecodedBitStreamParser.m */, + AA2E6F4B5C1F9A653817CBC14DE0A616 /* ZXDataMatrixDecoder.h */, + F72EF6E51567C715E1D018D51FE90A31 /* ZXDataMatrixDecoder.m */, + 781061E8CBBE400CA3C48F949E3433F9 /* ZXDataMatrixDefaultPlacement.h */, + 5B5CAB74EE4D77FFD3EEBCC4A7A0C751 /* ZXDataMatrixDefaultPlacement.m */, + 192EEBD3CCFBED410B71949E0998E05D /* ZXDataMatrixDetector.h */, + 4FF25E1BDE0C8AFFEF5B9A142633A7A5 /* ZXDataMatrixDetector.m */, + D4898026D6A7954E09802DDC74D97432 /* ZXDataMatrixEdifactEncoder.h */, + AD01537600F1A880767C84B81F08E093 /* ZXDataMatrixEdifactEncoder.m */, + DA5A718164633D231A198797B4A9CE39 /* ZXDataMatrixEncoder.h */, + E88AAA11826810C07C533AB0790B65D3 /* ZXDataMatrixEncoderContext.h */, + 5257B6F43FDF0FAD25094B50F2745284 /* ZXDataMatrixEncoderContext.m */, + A9B1920938E17DFD570D8A1D948CC7AA /* ZXDataMatrixErrorCorrection.h */, + 54E0937E501B884E9655E3C8D08BFC91 /* ZXDataMatrixErrorCorrection.m */, + 3AF09E25EE30B9D50C4EB47F6F4C6AEE /* ZXDataMatrixHighLevelEncoder.h */, + 00F8C95E50F8763425E1BD4D28EB0464 /* ZXDataMatrixHighLevelEncoder.m */, + D8ACFFB0709CAFC05D87FD648213E14C /* ZXDataMatrixReader.h */, + 08454D1CB8980B210F9094853CDF4FDC /* ZXDataMatrixReader.m */, + 04187936C4D64135EB529CC632A514C4 /* ZXDataMatrixSymbolInfo.h */, + 07C6B44F09A86EF5C27ACF2778099DEB /* ZXDataMatrixSymbolInfo.m */, + 3BFE51EE927D826B37828D85A76B0F5C /* ZXDataMatrixSymbolInfo144.h */, + 3FEE8F9FD0CBC6063EBE78FDF717F5B0 /* ZXDataMatrixSymbolInfo144.m */, + 6BFF53C2A202E0CC81A9C3D9089AA4ED /* ZXDataMatrixTextEncoder.h */, + 43C89E9657E31B58DFE00B9084357756 /* ZXDataMatrixTextEncoder.m */, + E69C2C5A7BFD32C73AB504536434A22E /* ZXDataMatrixVersion.h */, + BF20AF460CB09D0812ABB529BF3D9C51 /* ZXDataMatrixVersion.m */, + 338FB914BBF542E8B6EDE3D1B25B85AE /* ZXDataMatrixWriter.h */, + 585C0E2F4983DDFC75F1316148676D89 /* ZXDataMatrixWriter.m */, + 511FE11D56822DD2C7EEC44121FC64F7 /* ZXDataMatrixX12Encoder.h */, + 732255A23528067DAC958D1EF9B12C93 /* ZXDataMatrixX12Encoder.m */, + 5D1314B2D906C2F472D05A95CB7DA4ED /* ZXDecodeHints.h */, + 83F8703CAB596C7FBFEF9A982B05A00D /* ZXDecodeHints.m */, + DC84C765D3E246259B53EE3825C09632 /* ZXDecoderResult.h */, + DD8DFFF2272590CA81642BA75E8AC1D6 /* ZXDecoderResult.m */, + A3625D636A02C0F2E65B79BC3ABA5783 /* ZXDefaultGridSampler.h */, + 59539C955D1B0C4B6DBA95D4EE649287 /* ZXDefaultGridSampler.m */, + 19513CB18A035454268A40D605F1B344 /* ZXDetectorResult.h */, + 7B34300FE923A79BD2BCE7C5D6584292 /* ZXDetectorResult.m */, + E7613E864B947A351D382C0FC0FE150B /* ZXDimension.h */, + 0FE42BE7BCA3CE402490A8B69B7CE40C /* ZXDimension.m */, + DADCEC05EB68EACF4CA2B4C02F0B83A7 /* ZXEAN13Reader.h */, + 2D52E7B2BF8525DC5516D495D7282480 /* ZXEAN13Reader.m */, + 195EDA9DAC14879762DC64F44F971E28 /* ZXEAN13Writer.h */, + 34CCD0789E77B7F06C5559E5AEF6DD64 /* ZXEAN13Writer.m */, + 22AF2499E0B20FD9E6F109DAE83D3498 /* ZXEAN8Reader.h */, + FB88C933AF10C1078AB540B9322F75D4 /* ZXEAN8Reader.m */, + 31BD563B6469FA9EF68AE77CC8C9C056 /* ZXEAN8Writer.h */, + BDCA3A45E76A903D16393ABF6E696FAD /* ZXEAN8Writer.m */, + 8A0EB3A18258D5F28E5882D5B74216EF /* ZXEANManufacturerOrgSupport.h */, + 16B438DFFD1EE04C86A551BEE91E8A2F /* ZXEANManufacturerOrgSupport.m */, + 5005F6E8AE6F60BBF0B77AE5C2B3B80E /* ZXEmailAddressParsedResult.h */, + 287DAF48EE194A861DBDD9EE370DE641 /* ZXEmailAddressParsedResult.m */, + 102E0EC620D38D22A57CAA9F8ED30D9B /* ZXEmailAddressResultParser.h */, + 083BD5D464E77A7479E80C24C27062C3 /* ZXEmailAddressResultParser.m */, + 9D599C849A81087BE4C9522B4A37FC9F /* ZXEmailDoCoMoResultParser.h */, + 7425BF33143F64193CE5FF99404C2E59 /* ZXEmailDoCoMoResultParser.m */, + FE2AD125508AE6E894FE3EC3451B7FC2 /* ZXEncodeHints.h */, + 7249B565C8E3D69892D5BEEC5267321D /* ZXEncodeHints.m */, + 324C4E1A9498CE6F5AB03D236EB33020 /* ZXErrors.h */, + 3E261442EB32143E893D1F4DA8DC0276 /* ZXErrors.m */, + 5118A816AD33DA493A9F058C0584C931 /* ZXExpandedProductParsedResult.h */, + 39160D87A6DA3F92790ACE6B0179BE44 /* ZXExpandedProductParsedResult.m */, + D9CCE994A58013AD9DF38EC59A03E850 /* ZXExpandedProductResultParser.h */, + 8197FD370DE00707F2F2BC17FC0043E5 /* ZXExpandedProductResultParser.m */, + 089311B62F1C5BB0F120AC6B4ED43CFF /* ZXGenericGF.h */, + E206F8C05E0115971BAF625C4DCD1497 /* ZXGenericGF.m */, + DF7A59D4F2E0D7DB79A85E122F8BE6A8 /* ZXGenericGFPoly.h */, + 7AD9DFB82B3FCD2021AC782115A50DC7 /* ZXGenericGFPoly.m */, + BAE566293D579A7A32CAD1CC1A1A44F0 /* ZXGenericMultipleBarcodeReader.h */, + FDC286719F3D12D3031C6AF4E4CA9F42 /* ZXGenericMultipleBarcodeReader.m */, + CF4BC743574EA3CBE522BC1296F858D4 /* ZXGeoParsedResult.h */, + F125C9C089DA4D43567201F1485C57BC /* ZXGeoParsedResult.m */, + 6B9D75D4563F947C4DE7C065F52E210E /* ZXGeoResultParser.h */, + A7BE92D9A88AAB98280F5BE26B6CC9BB /* ZXGeoResultParser.m */, + 4F4D7086ACD27BEF0067A5E009184684 /* ZXGlobalHistogramBinarizer.h */, + EFD3B7522DAC4D87AE8F61931C893EF9 /* ZXGlobalHistogramBinarizer.m */, + 4400DF2CA88D881355B824B1B31C708A /* ZXGridSampler.h */, + BE75A2C9850C8E95D6A3688961790E22 /* ZXGridSampler.m */, + 92DF69FA8D4D90C6AC636313847C0EC1 /* ZXHybridBinarizer.h */, + 6A780D1F42790EDF0A5CCB44B32A6A9F /* ZXHybridBinarizer.m */, + D0E27E66642E304BD21EA1420F9B99E6 /* ZXImage.h */, + 3E2520DD73675F766A9D772066624121 /* ZXImage.m */, + A29E3B478023A4FB4277FE9E1BE899F2 /* ZXingObjC.h */, + 35F9DFBDCFDC3C0A47A964624B4F9704 /* ZXingObjCAztec.h */, + 2C4E54B4A0D030BF478D24E7F1C954B4 /* ZXingObjCCore.h */, + AF8181766A212352456EDDBA433246A2 /* ZXingObjCDataMatrix.h */, + 12B43532712994B7C42D9AF9ED032299 /* ZXingObjCMaxiCode.h */, + 11E38139864B924372132AEAA87B24DB /* ZXingObjCOneD.h */, + 88407759C5E8E0C1FEF9EAB41CE83B1E /* ZXingObjCPDF417.h */, + 91DC0E3772AFD8079EF04FD95782DDD4 /* ZXingObjCQRCode.h */, + 2B7F16140A1CB090B3E85EAA664A35A6 /* ZXingWrapper.h */, + 2CEFBEF7D6A654F303086039A2A3427C /* ZXingWrapper.m */, + EDA5B7474BF04615A19FDD06655BD282 /* ZXIntArray.h */, + 03C3828079E1442E9180739A8AF872BA /* ZXIntArray.m */, + 55DAD4EC88271F955D0E855D4B6D98C9 /* ZXInvertedLuminanceSource.h */, + A6441842DFDFD74CCBE21A6F514D87A6 /* ZXInvertedLuminanceSource.m */, + 2CEC8B4351A5087EFF4C82AEA645A4B3 /* ZXISBNParsedResult.h */, + 810DE4FE0E235525CA493EA5F5C19046 /* ZXISBNParsedResult.m */, + 6449BEDC3695C449D8F4F737BDC151C3 /* ZXISBNResultParser.h */, + 478C4D8B62BEF9C31111A3C01BC95AC9 /* ZXISBNResultParser.m */, + E8EBC4760CA99C02E53DCFEEC7E1C4BB /* ZXITFReader.h */, + 0B470F703305B8F7168FCA96E9DD96B3 /* ZXITFReader.m */, + 4FFA0BB96E3EBED3470673318EE8A438 /* ZXITFWriter.h */, + 97F1AC93F2135443DB33797B991F6A99 /* ZXITFWriter.m */, + 5057D117FDFC92545A80B8426FD78378 /* ZXLuminanceSource.h */, + 44705920CB16B6C84B9EF4086CC761D5 /* ZXLuminanceSource.m */, + DB26B48C02D2509CCF212DE438EF382C /* ZXMathUtils.h */, + 3682C86398A3D8CD81BAAEA99EC6CB67 /* ZXMathUtils.m */, + E0188FFF10CCB60C3F41FA0DB33273D6 /* ZXMaxiCodeBitMatrixParser.h */, + 10551AC9C89F0B2C28B79272A54229A7 /* ZXMaxiCodeBitMatrixParser.m */, + A5B4BD93D1FBC6F4581EAB2435A5F131 /* ZXMaxiCodeDecodedBitStreamParser.h */, + FD778702C35A82F55E5B0065635FE730 /* ZXMaxiCodeDecodedBitStreamParser.m */, + 8A32A95086BFEE989BA9110A456A08E6 /* ZXMaxiCodeDecoder.h */, + 1BAD6ACDBC53A067FEF7F34A04942ECE /* ZXMaxiCodeDecoder.m */, + 535DA116BAAB37F8CF70E83072E83A05 /* ZXMaxiCodeReader.h */, + 53F3CC51DCD3186BB7788B5DECE48B36 /* ZXMaxiCodeReader.m */, + 1DC2DE80246B2BF0B60498166F73679A /* ZXModulusGF.h */, + 2D920C9AA0C8FDD9CD6D08BC4A83F981 /* ZXModulusGF.m */, + DBF88A9781D801A31F8EF26E52BA46E1 /* ZXModulusPoly.h */, + BE9B6E4BBEB1499F48F9D323F3AD9118 /* ZXModulusPoly.m */, + D20F8B84034184CBBAB843F936A787F9 /* ZXMonochromeRectangleDetector.h */, + 2B410EB9C4D5A74AECA61DACE97CA734 /* ZXMonochromeRectangleDetector.m */, + 8F89033611F194CBF26D09D22D99E82B /* ZXMultiDetector.h */, + 0E32C1C5A27F32CC54003033BD4B494F /* ZXMultiDetector.m */, + DB7CC752C2DB1864FF638CB915DA6773 /* ZXMultiFinderPatternFinder.h */, + E1E67332192E4A91BBF32552E970E4DC /* ZXMultiFinderPatternFinder.m */, + 5F1D96AA24EC4D9E29125F9B66BE2999 /* ZXMultiFormatOneDReader.h */, + 7FCC3F198D635D8A65345C2D4A225B42 /* ZXMultiFormatOneDReader.m */, + F499A1EF2875CEBBC4AA0304788A4A41 /* ZXMultiFormatReader.h */, + B5C161B3A17F0053D10888059B0E0390 /* ZXMultiFormatReader.m */, + 21468CDD938A989703138053AE77030C /* ZXMultiFormatUPCEANReader.h */, + 501D468C90F4FD85AA177E0B94166125 /* ZXMultiFormatUPCEANReader.m */, + 67A7AFF07ADA3724E72965FB2447564F /* ZXMultiFormatWriter.h */, + 87E787E2C141BAA67804F927DE99336B /* ZXMultiFormatWriter.m */, + 179AE6112321A9E63ADF069B0BEEC72B /* ZXMultipleBarcodeReader.h */, + F4AEF13FBA15A0D252506C11F70DE27F /* ZXOneDimensionalCodeWriter.h */, + 130B45A77410E0950AC225E68E32281C /* ZXOneDimensionalCodeWriter.m */, + 38C39AEDD97BDBD485D6C7154BACECC9 /* ZXOneDReader.h */, + 9C401B49150060182D6B98AC9E686452 /* ZXOneDReader.m */, + 8372E75D74E013924560D5687E5C410C /* ZXParsedResult.h */, + C0889FA5DAABAA6261929DA71F89869A /* ZXParsedResult.m */, + 92C9AAE9DC1DDF0477A47CF84DA2077F /* ZXParsedResultType.h */, + CF50F39459202862E20B8C58DA748AD4 /* ZXPDF417.h */, + 6DEC5D524DEA95921A68530389F09B4D /* ZXPDF417.m */, + 3CBE64FD5E0CAEB8CE719061DA45DD9C /* ZXPDF417BarcodeMatrix.h */, + 09637B16C908D125DF0B7864F1CC9AF6 /* ZXPDF417BarcodeMatrix.m */, + 9F487C09C91BF1BB7E08546251F89F67 /* ZXPDF417BarcodeMetadata.h */, + B6C6EB5F6BB25316EA356942907E1F49 /* ZXPDF417BarcodeMetadata.m */, + F5025D454C6517C33738D9EDE5EDFF3F /* ZXPDF417BarcodeRow.h */, + 36ADCB783FC73ED76E1B608C1EE147ED /* ZXPDF417BarcodeRow.m */, + 6BBDA3E8B10E3FADF7F89B3702EEF0CB /* ZXPDF417BarcodeValue.h */, + 62DD8E2B52965C368A06486D477FFF6E /* ZXPDF417BarcodeValue.m */, + 0851E17699603C47D519E246AA85E844 /* ZXPDF417BoundingBox.h */, + 6B9FA5A8045BFC6686E0BE570A614CD3 /* ZXPDF417BoundingBox.m */, + F61C96A1EB50890AABE26F8306BD90C0 /* ZXPDF417Codeword.h */, + F69FCCE59B874F4C732C7D249770F46C /* ZXPDF417Codeword.m */, + 5FD57D80A4B82AD97932876B827EA76A /* ZXPDF417CodewordDecoder.h */, + 4C9F03B59AE965E962B20B8FED9EA332 /* ZXPDF417CodewordDecoder.m */, + C5FA36E99E1568CD05B591F7E08AF238 /* ZXPDF417Common.h */, + 8398B6B20E9939251D23CF6750A00D88 /* ZXPDF417Common.m */, + 76BD40DACA9171E75DAA6331D1651450 /* ZXPDF417DecodedBitStreamParser.h */, + D61044B83DA2AB51D961F44DCA34B249 /* ZXPDF417DecodedBitStreamParser.m */, + 6FBA935B14DF01661DA2725E870860A3 /* ZXPDF417DetectionResult.h */, + 61EB05BFA6141DA4009094265FD1CD48 /* ZXPDF417DetectionResult.m */, + CFE8A54320F9B1DFE54A82556EA7E5D3 /* ZXPDF417DetectionResultColumn.h */, + 3183E798A6219D4066F1794704E91DCD /* ZXPDF417DetectionResultColumn.m */, + 3F162C35790ED70293D1A3C5025F5394 /* ZXPDF417DetectionResultRowIndicatorColumn.h */, + 9260C97F834AFDC5E9287A483A3EEB0C /* ZXPDF417DetectionResultRowIndicatorColumn.m */, + D29AD0080BCE0785070F2CCE5E2A98A1 /* ZXPDF417Detector.h */, + EF7D6FC6B1E1FC691E78D4A92852456B /* ZXPDF417Detector.m */, + 90F4A80F4369642483FA571081BD0792 /* ZXPDF417DetectorResult.h */, + 85805DF5729E72CA51973DB8C158A2C2 /* ZXPDF417DetectorResult.m */, + 84E95B2303E0B9EF0EE27359A6AE3610 /* ZXPDF417Dimensions.h */, + 239C0E4F7521D8E95EF613AF8E41F557 /* ZXPDF417Dimensions.m */, + B386ADD68A2168AC6CD90FE149EBB1A4 /* ZXPDF417ECErrorCorrection.h */, + FF6C9CD3ED0862161499F3FA82C73109 /* ZXPDF417ECErrorCorrection.m */, + 65DD34D63236EF6FCFD051AF525BC0D2 /* ZXPDF417ErrorCorrection.h */, + 830C99480857F63A2C97638E815DFDEC /* ZXPDF417ErrorCorrection.m */, + F775623B11BC2D3021B45C56AD9ACF40 /* ZXPDF417HighLevelEncoder.h */, + EDE72E31C2E3970C191EC54DD35DBD8D /* ZXPDF417HighLevelEncoder.m */, + 0DFD2AAF89151AC91154C3F2CBA601F3 /* ZXPDF417Reader.h */, + C01873263C8FD2C8E73608FA5497003F /* ZXPDF417Reader.m */, + 94E7CD71392F64ED3AC825DD5A940E9B /* ZXPDF417ResultMetadata.h */, + 98CC65FA85FE2ADBCBCE814D21E7A861 /* ZXPDF417ResultMetadata.m */, + 585D2475973CFB76EF9709D76E4C4FCA /* ZXPDF417ScanningDecoder.h */, + B58466B6D94629BA167A6C7B6756F90E /* ZXPDF417ScanningDecoder.m */, + F2BFC26A47983CB8EC119AED9695ADD7 /* ZXPDF417Writer.h */, + 5DE79E0DD75E10B9843CD8B26E2BE9F2 /* ZXPDF417Writer.m */, + 08A4F01BFD5CE4F8C310A8F702E11D51 /* ZXPerspectiveTransform.h */, + 65E17E7519CE6AE45BDA3805E3DD573F /* ZXPerspectiveTransform.m */, + 80050EF2B399B55821262973D6ADA43F /* ZXPlanarYUVLuminanceSource.h */, + D9060E0F719533207B55A62D6B86204B /* ZXPlanarYUVLuminanceSource.m */, + 40E760628C8F0B2747D7B87E5073C897 /* ZXProductParsedResult.h */, + 51BD5168C9C8B6B7A48A622760B8E087 /* ZXProductParsedResult.m */, + 0DFA91E6480FEE73F386377B85AD82CA /* ZXProductResultParser.h */, + 973C6EBA1615D36BDFC14E663610CCC4 /* ZXProductResultParser.m */, + 83ED92E0DD10D7FAE4AC6D99B8021828 /* ZXQRCode.h */, + D6DC99BF9244ACBFDEC39A53AA4F2B8D /* ZXQRCode.m */, + 4B9F3CB00EC0BDAF08E93B058A767BB2 /* ZXQRCodeAlignmentPattern.h */, + A7D63F4A9BC3FDE37EC6321B924A9C9B /* ZXQRCodeAlignmentPattern.m */, + 3F87D49283144A1392718A7C4EB86D26 /* ZXQRCodeAlignmentPatternFinder.h */, + 099FF98B477834609DA28D17D54F8492 /* ZXQRCodeAlignmentPatternFinder.m */, + 1868B791856C3086A98BF956A3841958 /* ZXQRCodeBitMatrixParser.h */, + EE04FA23838883F895783232C88E0D5E /* ZXQRCodeBitMatrixParser.m */, + 0555A175C6506EDB9FA66314527444E0 /* ZXQRCodeBlockPair.h */, + 85D9B469170FDCAEC5788D34380A15E0 /* ZXQRCodeBlockPair.m */, + CB49B9A7AF95B95F054394597AB570C6 /* ZXQRCodeDataBlock.h */, + 37BB44FDCBA2A3F3BA11224E9BD40C69 /* ZXQRCodeDataBlock.m */, + 9DA31DB4D2D916ED462A824500A5F3A2 /* ZXQRCodeDataMask.h */, + E7C09C033A731A26153669150888DAF2 /* ZXQRCodeDataMask.m */, + FC7318D906AE4E6819195F07A7515BEF /* ZXQRCodeDecodedBitStreamParser.h */, + 13E1618865273A37407ECCBB6FE73D7E /* ZXQRCodeDecodedBitStreamParser.m */, + 8F35A69CB060517CBAC06B3C7FBB0EFB /* ZXQRCodeDecoder.h */, + 5B75928703CCB0D67E3B79FF5B6BEC70 /* ZXQRCodeDecoder.m */, + D1C76C04BC19CFDA9A046F657930A7F6 /* ZXQRCodeDecoderMetaData.h */, + CF4F745BEBFF98E4F773D0BEC2707EC5 /* ZXQRCodeDecoderMetaData.m */, + EC049E598F3DD86706970EE3B483DEFA /* ZXQRCodeDetector.h */, + E712068BED300231FA489F36BB41B8DC /* ZXQRCodeDetector.m */, + 901E0F1F7B4E32D33B1445F00BAB3D6A /* ZXQRCodeEncoder.h */, + B079BB2612D1053F894188EE8F04B2DA /* ZXQRCodeEncoder.m */, + CADA9EFA3FCABD0FAC6FE8DC1B421D8F /* ZXQRCodeErrorCorrectionLevel.h */, + B589D3C0F29F385CBA34259277066496 /* ZXQRCodeErrorCorrectionLevel.m */, + 94CFF893F9D6E23A88F2A5A0A8C5ED5E /* ZXQRCodeFinderPattern.h */, + FBAD218FF47B03FF3AE043A3436E3A0D /* ZXQRCodeFinderPattern.m */, + F66CF8827F0B34CFCACD31A5FEE1FFBB /* ZXQRCodeFinderPatternFinder.h */, + E55E3943C46C6F5D16EE87894205D0AA /* ZXQRCodeFinderPatternFinder.m */, + 3828DF5CA0C47E8EC97CBF0165796BC3 /* ZXQRCodeFinderPatternInfo.h */, + AFAB10ACA72A07CB48983B9EE04817C6 /* ZXQRCodeFinderPatternInfo.m */, + C16ED5D5D117CB740EE9ABEC0EBA1649 /* ZXQRCodeFormatInformation.h */, + A8FFDBA30ABE67DF60944AEBFEA340CF /* ZXQRCodeFormatInformation.m */, + 8BB6CE9214EA8AB66876C167AF588993 /* ZXQRCodeMaskUtil.h */, + D6E504E440ABA1292AEDDB1EC3186A8A /* ZXQRCodeMaskUtil.m */, + 9E1B789C3043FB090F33F1470E090C56 /* ZXQRCodeMatrixUtil.h */, + 36D9764AC9909FEFB91D9CF3F0248FE0 /* ZXQRCodeMatrixUtil.m */, + 056143C341215C6A0AF28738796461AE /* ZXQRCodeMode.h */, + BE625E3EA6CFC1EE77E64BC2B5D30C2A /* ZXQRCodeMode.m */, + 2B9AE07D5281C5759D652086455FBEF9 /* ZXQRCodeMultiReader.h */, + BF331D85D091C886873AACBA8521FB42 /* ZXQRCodeMultiReader.m */, + 3278EA5FAB464253D26E64899721E7F7 /* ZXQRCodeReader.h */, + 278487CDBD6D5B22DB2B92E19CAB4926 /* ZXQRCodeReader.m */, + 3CB22BCE14EACECFD8F535CE5D81392C /* ZXQRCodeVersion.h */, + DCE5D1F46B9AD5E5683541967105617C /* ZXQRCodeVersion.m */, + 622F976236021DED0BC71A18F37A3BD5 /* ZXQRCodeWriter.h */, + 22363DC3CC92A8B0401ECA9A3EF8646D /* ZXQRCodeWriter.m */, + FDCD5113FECC761B95401D1081DAAE46 /* ZXReader.h */, + 71939E1412F60A19155773F66E519250 /* ZXReedSolomonDecoder.h */, + 19490D720868336935EB60BB2F381887 /* ZXReedSolomonDecoder.m */, + CE49A78ED8CD3469317BF1740F57FEC8 /* ZXReedSolomonEncoder.h */, + EE2049030398CDE661B0B7C3C283BDDD /* ZXReedSolomonEncoder.m */, + 9643D2880EE03EF0A3081B00FE7DA113 /* ZXResult.h */, + A1B680E7E47A448E6A788774476A57A2 /* ZXResult.m */, + 403E37AA88824C6E1807A9A22B544FDC /* ZXResultMetadataType.h */, + 6543EC2D5A66343A23BE1FF5129493BC /* ZXResultParser.h */, + 5B02D371A5D3120103B193250201C8A1 /* ZXResultParser.m */, + 52E8AE4E2BB8AB7B1CBA9EC8A9A42C04 /* ZXResultPoint.h */, + 1013005211D3D77D44C1591B8966AB36 /* ZXResultPoint.m */, + 32C56C2853EE092E9116A433447747F4 /* ZXResultPointCallback.h */, + 5C268F71FA70172C992666B3096D20AB /* ZXRGBLuminanceSource.h */, + 7D621010883DE1BE39C63430A1D6B499 /* ZXRGBLuminanceSource.m */, + D6C40D284E1D73C5025FD3E0E1CCBB43 /* ZXRSS14Reader.h */, + A849FD8B462BFB2E09656D3DCD53DF72 /* ZXRSS14Reader.m */, + 0821005DFFA124EFE1E769C35CFDE5AC /* ZXRSSDataCharacter.h */, + D0DF26BF8D55C7A59F970C7D2E8ED96E /* ZXRSSDataCharacter.m */, + 1C40B6AE6D7208B199A009448D839C80 /* ZXRSSExpandedBlockParsedResult.h */, + 0945410B8D753F082469457C094359D4 /* ZXRSSExpandedBlockParsedResult.m */, + 8EE863584B2CE5FF79FA84D75D284787 /* ZXRSSExpandedCurrentParsingState.h */, + 2AD416757F0438E49C4FB9BCB525AC93 /* ZXRSSExpandedCurrentParsingState.m */, + 313E7213920F3488A506D2A1E937EC68 /* ZXRSSExpandedDecodedChar.h */, + C52183BB38FB383082491630976C0142 /* ZXRSSExpandedDecodedChar.m */, + 3D157DAAB6FAF21BC3BF5539ED1EC0E0 /* ZXRSSExpandedDecodedInformation.h */, + BAE0DCB43B9483758316E31E8F367BE8 /* ZXRSSExpandedDecodedInformation.m */, + BC14B8BC598E29944651EDC8E5BF3E98 /* ZXRSSExpandedDecodedNumeric.h */, + 0529DF2E890AB3AF1B781651D27A1982 /* ZXRSSExpandedDecodedNumeric.m */, + 586B352F25C82EE45AD9D530A76E8947 /* ZXRSSExpandedDecodedObject.h */, + 87BA85B60EAF1C3F2302976138B1A74B /* ZXRSSExpandedDecodedObject.m */, + 0837B9947C721571ED0E10CD0BEFC76B /* ZXRSSExpandedFieldParser.h */, + B300485FD71E56862235676F3ED9C010 /* ZXRSSExpandedFieldParser.m */, + 7E6510BF5D0D6830D5650409EFC7CDC6 /* ZXRSSExpandedGeneralAppIdDecoder.h */, + 012787B59372AB66F03C42636485A397 /* ZXRSSExpandedGeneralAppIdDecoder.m */, + DBCE45BBF526C98C7E4DF52B780738A8 /* ZXRSSExpandedPair.h */, + 3090E9B904AB1B164DFEF431FDD79698 /* ZXRSSExpandedPair.m */, + 6F5BE99075376BD247D7A8FD92EF66BB /* ZXRSSExpandedReader.h */, + 2753D5256EB2B5776BD07162E550277B /* ZXRSSExpandedReader.m */, + 267EB7B4D76CE8237DC8442293FFDBAF /* ZXRSSExpandedRow.h */, + E1F4391819DDD4225BDF036151223EE4 /* ZXRSSExpandedRow.m */, + 59CCB593B1DE9C198FF201163EFEDBF2 /* ZXRSSFinderPattern.h */, + F95D3775B12B0FBC4F76366A8A7FA228 /* ZXRSSFinderPattern.m */, + 8E7F4A62E4A63E56908ECD88933E8837 /* ZXRSSPair.h */, + 9CF6BA279450E3190B0CDC82B9F6A6A5 /* ZXRSSPair.m */, + 2B63F483F4A41FA5865B2584379B9F50 /* ZXRSSUtils.h */, + C28B49C4B80D513EAF88F98C85881734 /* ZXRSSUtils.m */, + 98AE7D5EF6D7FEDB91625641851AF22C /* ZXSMSMMSResultParser.h */, + 0192CAFAE90CB2862C47450C6E61048B /* ZXSMSMMSResultParser.m */, + 38913E8627AAA151B4E455E5C5CF74CD /* ZXSMSParsedResult.h */, + 5E15CFA79AAB43D809BEEA665C6B029E /* ZXSMSParsedResult.m */, + 235913F3F20DDBFFB7263D921AEF19AF /* ZXSMSTOMMSTOResultParser.h */, + CB225636F78714CDD7C23A1CDED2950F /* ZXSMSTOMMSTOResultParser.m */, + F1345578B0AB6291FD34FAE9C96C447F /* ZXSMTPResultParser.h */, + 0CBA6DCA9300BCF2EF0155B4180E1B4D /* ZXSMTPResultParser.m */, + 3DD648202AAD9716D02F0B9DA76983E0 /* ZXStringUtils.h */, + 1F34F2EF45A13B35D16AF0C93736418D /* ZXStringUtils.m */, + E2497333F54860347D41674CA272ED18 /* ZXTelParsedResult.h */, + 97120A07517F383800EC11FA12D775F0 /* ZXTelParsedResult.m */, + 9E63C2B99195537A79F146DCB9287F32 /* ZXTelResultParser.h */, + A91BF9681A7A223AEA3D079A4CF53340 /* ZXTelResultParser.m */, + 267419113BC2F016BFC104D8575C4462 /* ZXTextParsedResult.h */, + 8F7BE25B41BDBD831AC67465B027F6E0 /* ZXTextParsedResult.m */, + 73C5DF901F143420CE57E21DF5A2FE19 /* ZXUPCAReader.h */, + 99AF4EF91F2DE9DF43B1D24BE3F0F259 /* ZXUPCAReader.m */, + C97CDBEA6D3D2A8EA447F8A10ED2725E /* ZXUPCAWriter.h */, + 863EC4B777DF2C869B1BB4CB59BA1E16 /* ZXUPCAWriter.m */, + 791E3AEA6283D73CA6B2D43C93F9FADB /* ZXUPCEANExtension2Support.h */, + C3F1FD21A8EC878A093097A79EAE9794 /* ZXUPCEANExtension2Support.m */, + AF94683AAB043BAFD7C98D56A6B9F299 /* ZXUPCEANExtension5Support.h */, + F91668C823B0AE5F67E3B7ABD277E354 /* ZXUPCEANExtension5Support.m */, + EB0366894E0499283BE4B449BC7A6B2D /* ZXUPCEANExtensionSupport.h */, + 063322A1ADA284D45655C332FDE0E76E /* ZXUPCEANExtensionSupport.m */, + 052791EEF6C86CD2DB1E787879E0955A /* ZXUPCEANReader.h */, + 9E285F41A9F8C786ECBCB839D2E7523E /* ZXUPCEANReader.m */, + 2E98E60A3E0AADAB41B454C43D92F82C /* ZXUPCEANWriter.h */, + 7BB7A98AA89EE65433C671154AA9EF67 /* ZXUPCEANWriter.m */, + 4AE90821AB70960B2356D5F01B2BFE2F /* ZXUPCEReader.h */, + 3513213A0E1A06239AEB5818D047B215 /* ZXUPCEReader.m */, + B3EEB9294005C5750EF2911ED07DDAED /* ZXURIParsedResult.h */, + 9972D7F08FB570BEE096D26DB04BA42C /* ZXURIParsedResult.m */, + 470E63248005DCBC06296E7CAE7E4645 /* ZXURIResultParser.h */, + 69CE75FCAC08FBFF4A19F327BF947AEF /* ZXURIResultParser.m */, + 6E092EF878C0C56EBF720EA18E888865 /* ZXURLTOResultParser.h */, + D7FA664D8E8520065963394C33EEA6AC /* ZXURLTOResultParser.m */, + 7B4F2FF1878986DA667A7CA300ED57DD /* ZXVCardResultParser.h */, + 65A4AD04459334D9EF262092853CC94D /* ZXVCardResultParser.m */, + D33DED6D983D07751C1F44DA86010508 /* ZXVEventResultParser.h */, + 4436BB6A4592B2FC90C4D183E9D01B4B /* ZXVEventResultParser.m */, + 5C10DEB7C68E9902DAD88652E1EEFCC9 /* ZXVINParsedResult.h */, + 229FCA40E8539EFBE4226678A7EA53ED /* ZXVINParsedResult.m */, + 874DCB011D3306DD0E650FE0D7C29685 /* ZXVINResultParser.h */, + 7585E4B9773F7B664FB64AFCA7EA1879 /* ZXVINResultParser.m */, + 4BC5543F20B7E7EA04C3A1A4E43EBA04 /* ZXWhiteRectangleDetector.h */, + 6AC677CDB208825642EDD5F4BCD96A2E /* ZXWhiteRectangleDetector.m */, + 0F50C576B0963F7051702D5A33347F18 /* ZXWifiParsedResult.h */, + 63EF71061BF1793B6FABE15B3B0E53E3 /* ZXWifiParsedResult.m */, + 0E7A59810B5A5380436134148AC1E645 /* ZXWifiResultParser.h */, + 938F35BAAAE72B357005D1264806218D /* ZXWifiResultParser.m */, + 914722339DCB3642FEB6E757F40ABA8D /* ZXWriter.h */, + ); + name = LBXZXing; + sourceTree = ""; + }; + 710B7CA15F1A162078EDAD859A6631C4 /* Reachability */ = { + isa = PBXGroup; + children = ( + 84ADF7C681046CF307D8934AAB00BA0C /* AFNetworkReachabilityManager.h */, + 952FF743AF577C64405F324852A0C255 /* AFNetworkReachabilityManager.m */, ); name = Reachability; sourceTree = ""; }; - 4A2373D34CC5044D9944C2330307DC57 /* MBProgressHUD */ = { + 71586D0D244F73DBC1091872BF3102F8 /* Support Files */ = { isa = PBXGroup; children = ( - AFEF7822284D0740E9439FDA575D9C21 /* MBProgressHUD.h */, - 24B2D873DD726E1CB92080AB5A4C458F /* MBProgressHUD.m */, - 2205098B27469BCD7B87D25D45F35101 /* Support Files */, - ); - name = MBProgressHUD; - path = MBProgressHUD; - sourceTree = ""; - }; - 4BC5DD01B88C70485C05DCF48B936BD1 /* Frameworks */ = { - isa = PBXGroup; - children = ( - D9976EC54E15F0720C2031B0C2BE45A7 /* Bugly.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4BD68F65A4F8243DB4D58D528B382734 /* YTKKeyValueStore */ = { - isa = PBXGroup; - children = ( - 419688D30BFAF6943FBE6304B83E2FC3 /* YTKKeyValueStore.h */, - 266860A64CA3E38126FD443422246252 /* YTKKeyValueStore.m */, - D2250417B8C5D2E16EEF527DAF5DD1A2 /* Support Files */, - ); - name = YTKKeyValueStore; - path = YTKKeyValueStore; - sourceTree = ""; - }; - 4E14C5E5AA1EAFC384548D710ACC3AC0 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - 8ECAC204F8287FAD67B6CC17235AA448 /* Core */, - FF13C69FA758102BC163770F349C96CA /* Support Files */, - ); - name = SDWebImage; - path = SDWebImage; - sourceTree = ""; - }; - 56D87990CE17BF3E4B7E67FAA38846C4 /* Support Files */ = { - isa = PBXGroup; - children = ( - 42D7E898DE58FC64D5A1CAC1E601DEF1 /* Info.plist */, - C1ADBB706FDB59836CD7FB8B56580BFE /* Toast.modulemap */, - A71A2EDB7D80E8B54C1540FA4E2B8A8D /* Toast.xcconfig */, - DB5CDE6B616CD12A18C278C6799A0094 /* Toast-dummy.m */, - 2FB887DABDFF1B6A7789155364DD4D45 /* Toast-prefix.pch */, - 72F5A09FBDED1F72A04C3E335DE0A1BA /* Toast-umbrella.h */, + C0AF03AF045FEDB54969A733A7676799 /* Info.plist */, + 56C04120E618AB8195CE06F53AFDDA25 /* YTKKeyValueStore.modulemap */, + D52F046D041BF9D9D3D2F6A1709A4D95 /* YTKKeyValueStore.xcconfig */, + C06C0FC8EE1C494A50D7E91C80275410 /* YTKKeyValueStore-dummy.m */, + 67682C7B8DD8B0F36F701655BF4262EE /* YTKKeyValueStore-prefix.pch */, + D42458E77F66B16EDEAD4F28893B7E7E /* YTKKeyValueStore-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Toast"; + path = "../Target Support Files/YTKKeyValueStore"; sourceTree = ""; }; - 5D18979E16AA15B8FC94B1945A0FB2AB /* standard */ = { + 719001D7729D536BCD7B51136DF94723 /* Support Files */ = { isa = PBXGroup; children = ( - C53B6F23513590B1B35519E049C3AD72 /* FMDatabase.h */, - D4BFC19B6137B925C0EDE4EBABA27FC7 /* FMDatabase.m */, - F75D6F9A7E4B4F68F38B9CF845506873 /* FMDatabaseAdditions.h */, - 531AF42C28A0891D1E91B6BEA86844D7 /* FMDatabaseAdditions.m */, - FC329F809B6649CDA966EB263EF68FB2 /* FMDatabasePool.h */, - 00CC387D226EFBC6389FAA62F3DD873A /* FMDatabasePool.m */, - DA25A84A833228F9B77716016FCF329F /* FMDatabaseQueue.h */, - 6C79216DF49554E23B9DFC5FAABDB967 /* FMDatabaseQueue.m */, - 9E5007EEC9570DEC0914742C5AA50210 /* FMDB.h */, - 9A594A8236E67EB8170C115C30847FF7 /* FMResultSet.h */, - 2FD77768BDABBF2BB48928067588B12C /* FMResultSet.m */, - ); - name = standard; - sourceTree = ""; - }; - 6135153B546AEC4D283A511C77C42214 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 82167F073127B543CC843A71E2E2F134 /* libjcore-ios-1.2.2.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 61689A30C6F58A44CA0916A9797C0BC4 /* Support Files */ = { - isa = PBXGroup; - children = ( - 720A2501ACCEF31CAEFCF72E5A1755D8 /* Info.plist */, - 0B2F88F5CE468EE56C4A34CF3433FFE0 /* SocketRocket.modulemap */, - 3761E6FC8FB2C049CFB42B5DF219C572 /* SocketRocket.xcconfig */, - 5A1F61FFDF1CF20E149F6B0F6B0FF24A /* SocketRocket-dummy.m */, - 2E3AF8E64808C4D50ED1EE668DCDFBBA /* SocketRocket-prefix.pch */, - 7476095E7330D9DBD36D76CCE3773573 /* SocketRocket-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/SocketRocket"; - sourceTree = ""; - }; - 61C0046882C98AAEC1ECEB7607191880 /* Support Files */ = { - isa = PBXGroup; - children = ( - DE39B5880E93ED7DB42C862E7B216691 /* Info.plist */, - F270EF20130EC0714D627B3FC934F8B8 /* JSONModel.modulemap */, - 9000E691EFB3E3B3FF8C0EB04CFB70DB /* JSONModel.xcconfig */, - 60A50FB199FB6B0C5EA49A62A4C863D8 /* JSONModel-dummy.m */, - A2D6F39FC472C9C3E27C6635ECE723DE /* JSONModel-prefix.pch */, - A3F1A8219D19797685AF2D8E9EAFE675 /* JSONModel-umbrella.h */, + 40C567CB0D40A4C93AA26ED05D62717E /* Info.plist */, + 20B0A7CB9E750DAA0BAC23565173A38C /* JSONModel.modulemap */, + 0733D9959D7D57A038684144B9787970 /* JSONModel.xcconfig */, + FC00BBEEEC4C89225F7D537F8B753250 /* JSONModel-dummy.m */, + C4C04B219504C42089316DBDB847F874 /* JSONModel-prefix.pch */, + A6D3821B872268A19EE44F9D2588F7A0 /* JSONModel-umbrella.h */, ); name = "Support Files"; path = "../Target Support Files/JSONModel"; sourceTree = ""; }; - 638FE4730E65D92ADBB4F31EC2BCD78C /* Security */ = { + 7991A4835650A25B3365A8D4472EBA6C /* Frameworks */ = { isa = PBXGroup; children = ( - D6CDF2935BA2A5F043D6242F45854A06 /* AFSecurityPolicy.h */, - B01D2A082D8362F5E95027DBAE3D1DFD /* AFSecurityPolicy.m */, + 5B905722B94AA07A2E7FC79FCB31FA93 /* FMDB.framework */, + 22B5F61E238342B7F2651B4DE5857B44 /* Starscream.framework */, + E587095CA63535B2893EEF82B1077B64 /* iOS */, ); - name = Security; + name = Frameworks; sourceTree = ""; }; - 6B27D673B93E9DDC83DD64013DDF4CFB /* UIKit */ = { + 7A1C41D46CA2DA892C3E8FADE4CC460F /* Products */ = { isa = PBXGroup; children = ( - BB129160697EBA00C13DD98D69D252F7 /* AFAutoPurgingImageCache.h */, - E7A5DB8DF2295A90EB25F7E495E5F62B /* AFAutoPurgingImageCache.m */, - 8574AA1B5AD318AF02BC4D3B68F81E58 /* AFImageDownloader.h */, - C73F80367886F94832EE106D9F164391 /* AFImageDownloader.m */, - F8A4A704B12B0E5FCD4942063E450299 /* AFNetworkActivityIndicatorManager.h */, - 8E6E813A4FEA7EAA36447924B0005A89 /* AFNetworkActivityIndicatorManager.m */, - 9BB3C77E5D6641E78ECDFF85F30BD25A /* UIActivityIndicatorView+AFNetworking.h */, - 6C55D9F05AB29EF41FFA46E6095CFF72 /* UIActivityIndicatorView+AFNetworking.m */, - 5B8A96A9F8907E36AEE053151EF55E0B /* UIButton+AFNetworking.h */, - 9524B522E6F3A1198F46B4ED841E5662 /* UIButton+AFNetworking.m */, - DBF35F229F62DAFB1E3D7FA0942B6D8A /* UIImage+AFNetworking.h */, - 37359E3E690C6350F9602BFFDBB04147 /* UIImageView+AFNetworking.h */, - 71B92D24C35F51B3A3A9626DD861EF1E /* UIImageView+AFNetworking.m */, - A9341A0F668333A93B6FBD08098250C4 /* UIKit+AFNetworking.h */, - 8BF67949298271264E085700428A4FCF /* UIProgressView+AFNetworking.h */, - 3FC3B9F0418FF6AD9307259ADB289A07 /* UIProgressView+AFNetworking.m */, - 059F55EFCCF65A29688CF615E5AD5415 /* UIRefreshControl+AFNetworking.h */, - A1476EF51AAC4F331DC16EE15A7C9A52 /* UIRefreshControl+AFNetworking.m */, - B755A7EEE0FDDBCCB793F3ED139513EF /* UIWebView+AFNetworking.h */, - F45B85ABF6C73FC46039EF4A3D28A28D /* UIWebView+AFNetworking.m */, + 56EB7F49FC0F0364431B785203A747F0 /* AFNetworking.framework */, + A6A01C46E262767595CA64143AAF6C86 /* FMDB.framework */, + 38EAC8B7CB1278F54E9415250546A952 /* IQKeyboardManager.framework */, + 149ED688511312E137DA74ABF4A7D5DF /* JSONModel.framework */, + 6A70E94641E26AE47CF88A806AF6612C /* LBXScan.framework */, + C28769783EFCE774343708B28B72E7F9 /* LKDBHelper.framework */, + 6B836748A7FBCCB6413D869804B397EB /* Masonry.framework */, + 794EB6EDFAB588BA552A834A08BADBF4 /* MBProgressHUD.framework */, + 77C6FE3C71048FC13BDFE75FDD624DB0 /* MJRefresh.framework */, + A359CB7F1A4A59988CE455850F4BE8BB /* NJKWebViewProgress.framework */, + 02F88EB2E69381607336D7A30F9B4F54 /* Pods_GIGA.framework */, + 3D12153DC4D2C4B99BE3D68592D1F73A /* SDWebImage.framework */, + 9C712E59659A99F86AFAA0B58C0DFDB4 /* SocketIO.framework */, + A79EFE14BBDF9C55ED15A3764AC1BF0F /* SocketRocket.framework */, + 57E2550013B3B536C16FCA75E5155FF8 /* Starscream.framework */, + 52D37B7629842C40600F0591B04D55BF /* Toast.framework */, + A3C43BAFFC6BDA58CF469DA602D71A44 /* TTTAttributedLabel.framework */, + 251B13B990BC2201FC5B2E947865EEB6 /* UITableView_FDTemplateLayoutCell.framework */, + CBE4DD051D156374F9F74E20A99E5C56 /* YTKKeyValueStore.framework */, ); - name = UIKit; - sourceTree = ""; - }; - 794AD9C3DAC5F29468B7EB72907FDA6E /* IQKeyboardManager */ = { - isa = PBXGroup; - children = ( - 0EE88FA017BECDD56594C950358507E0 /* IQBarButtonItem.h */, - 82C2BD5350645441DD92F95DC5E589DD /* IQBarButtonItem.m */, - 7B077190F4428101E2C3FCA4A0F17CA1 /* IQKeyboardManager.h */, - 3484FF439E2DBB5367ED00A1BCD06905 /* IQKeyboardManager.m */, - BBDC6D1622DB585841784A5DED1346FA /* IQKeyboardManagerConstants.h */, - BEDD0B27A048E132CE68F433D20A9480 /* IQKeyboardManagerConstantsInternal.h */, - 8779B2CA7289D6A7185C91312B6BD88D /* IQKeyboardReturnKeyHandler.h */, - CF40AB4FCB400AB1D8CC624FF95B74E4 /* IQKeyboardReturnKeyHandler.m */, - D917488C1503A8C83A348CD03817262E /* IQNSArray+Sort.h */, - E03910B7599DBB9DE52BA6B580D5420C /* IQNSArray+Sort.m */, - 7916596619DEA640BF07E493F03AE462 /* IQPreviousNextView.h */, - 17CD040301E2941CF1307C11668F0335 /* IQPreviousNextView.m */, - D15A13B4D2D795A0C6BFDD4C3D657FCF /* IQTextView.h */, - 296D773846653A12BF592FA3AEE99EE7 /* IQTextView.m */, - 2CDD19D40A0561AC2EEC7572402D3D1F /* IQTitleBarButtonItem.h */, - C52D5FBF7AC49549CACAB8E226E06A55 /* IQTitleBarButtonItem.m */, - BFC2CEE4A1CC40C763FF7873BA8B56D1 /* IQToolbar.h */, - B4AA799A01CF6F84D07EBC2151183FE8 /* IQToolbar.m */, - 3707B0F6D5D2EB50CB0191D8FC9A3E26 /* IQUIScrollView+Additions.h */, - CCBD06AABD5DDD4CA2D79364A77DF3BF /* IQUIScrollView+Additions.m */, - 243FE71724C73A1404F864718F47B574 /* IQUITextFieldView+Additions.h */, - B37CE92BCFA7B9F94F1EC5EEE702D1C8 /* IQUITextFieldView+Additions.m */, - 07BAC4DCA1D385E6719FCD0A2C3518E8 /* IQUIView+Hierarchy.h */, - CDA517AA74DD3581625EABAFCF57A1F3 /* IQUIView+Hierarchy.m */, - 7491AD0045ED41AE8F08FD751720691E /* IQUIView+IQKeyboardToolbar.h */, - 6388F569E994C890615BAAE8A1012286 /* IQUIView+IQKeyboardToolbar.m */, - EAB909A57EFF13EAD51EF05B4F73395B /* IQUIViewController+Additions.h */, - CBE54AA9DF51DD23D24F6D99DBE4D170 /* IQUIViewController+Additions.m */, - 0A1A7675F7A7DD5E2EA307B7ECB550F9 /* Resources */, - 0B18D1637A92C37E605C2538A55FC3F5 /* Support Files */, - ); - name = IQKeyboardManager; - path = IQKeyboardManager; - sourceTree = ""; - }; - 7BEC3C845B8C6751D4BEC247118F7419 /* Support Files */ = { - isa = PBXGroup; - children = ( - 2B6CE4C2E0F43E8B914EC3D2DA1985F3 /* Info.plist */, - 69E99651489B054F900280430368B177 /* Masonry.modulemap */, - 61C2C19E65EA773F183A0CC25BA57237 /* Masonry.xcconfig */, - C0FD05EAF05C6EE6CD501AA135B3FC66 /* Masonry-dummy.m */, - 8999757F73DE228D5570C79E04DDE6E3 /* Masonry-prefix.pch */, - 55D47BD7E8E69B61DB9C10FE582F0F77 /* Masonry-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Masonry"; + name = Products; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - C9AC7881E3A93086F2058658C83B43BE /* Frameworks */, - 33D4CBA68C2A74D2CBF4FC67C67DB070 /* Pods */, - 3CD692616588D8B0B76B05D8F9BBFE7E /* Products */, + 7991A4835650A25B3365A8D4472EBA6C /* Frameworks */, + D34D682ABFAFB3135F3FB2C32F1C323F /* Pods */, + 7A1C41D46CA2DA892C3E8FADE4CC460F /* Products */, 204D78156C2EC3DBC444EB544EC0A6C9 /* Targets Support Files */, ); sourceTree = ""; }; - 7E69D627DEF05060BADCBCC9B07E96BB /* iOS */ = { + 87B658C8E19BEFDCBC5FE0B1631570CD /* Socket.IO-Client-Swift */ = { isa = PBXGroup; children = ( - FF2567DE02E414DB1FBB3C77E2FD44B1 /* CFNetwork.framework */, - F043DBEAB75100EC409BEDF3E58A8BC0 /* CoreGraphics.framework */, - 78F07669D4FDF923215E34924891CA68 /* CoreText.framework */, - 9F1EE390CF6C51DBF46349E43BDC2804 /* Foundation.framework */, - 3E2FB8AE972E929400C566BC03FB6468 /* ImageIO.framework */, - D8B941495F77E08AA9AD977942455F90 /* MobileCoreServices.framework */, - 70BC8DC64FAC8894D27E1964CC8CD209 /* QuartzCore.framework */, - FED1ACDE4726A20CC2932BCDC66F5787 /* Security.framework */, - 5925EC6C2B2151154E2F24CC70D04AEC /* SystemConfiguration.framework */, - 3693DA67EFBAB281959594641A587872 /* UIKit.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 81A5C6070FCB3F6939686860D1F6C46B /* Masonry */ = { - isa = PBXGroup; - children = ( - 32C89BF4798AB4ED10E9969C07146751 /* MASCompositeConstraint.h */, - 4253E7F7448B089D6F4CDECD149486CB /* MASCompositeConstraint.m */, - ADD95A322AD6CC6DFF9662EE73FD3866 /* MASConstraint.h */, - 6E421B865FF1305197CC9C5DB303BB22 /* MASConstraint.m */, - CA9FD8A6D417DF1249A66C83FFBE8E4C /* MASConstraint+Private.h */, - 237BE841F4D7796F3834F60938E612E9 /* MASConstraintMaker.h */, - 9C199822C99C320281338D998C03B995 /* MASConstraintMaker.m */, - AAF305E6DECD78168E49221E61B947D7 /* MASLayoutConstraint.h */, - B84232FF804EAAE9753EE17FCA85A8AE /* MASLayoutConstraint.m */, - B88609AD20FB25EC23E9CB38EFA4261C /* Masonry.h */, - 363026D36FA7E4000010BC1B5CD2B8E3 /* MASUtilities.h */, - EFC686D628AA3C2CFA30D354721530B4 /* MASViewAttribute.h */, - 1D11F0C588A7F5B9D6536F3DFDEFD786 /* MASViewAttribute.m */, - 07A743B083B30311B1DDC3865184A2E6 /* MASViewConstraint.h */, - 367D41745AB1AEBE8A1FFB6DB552ECEB /* MASViewConstraint.m */, - 5CFFA0AAC1274F48CF9BBAF77F583DE9 /* NSArray+MASAdditions.h */, - 463DAC3C5F6EF0A1CB5D363A99DD84AC /* NSArray+MASAdditions.m */, - 21D29A4125F838745482898EE34D680D /* NSArray+MASShorthandAdditions.h */, - 384EDBAD900277643587B535751AFC42 /* NSLayoutConstraint+MASDebugAdditions.h */, - 577E3F36FE44476EE775746E6BC7F3F2 /* NSLayoutConstraint+MASDebugAdditions.m */, - CA55885292577F09084E8F2BB1E84632 /* View+MASAdditions.h */, - FF6734BB50A15C4D259D3C14C0F70697 /* View+MASAdditions.m */, - 1942BB9A9B0208E8A598BB2F1563A2D0 /* View+MASShorthandAdditions.h */, - 40995236A773C9D30F835E44168085B1 /* ViewController+MASAdditions.h */, - 36EBA45514DE97C348F33C685F5897DD /* ViewController+MASAdditions.m */, - 7BEC3C845B8C6751D4BEC247118F7419 /* Support Files */, - ); - name = Masonry; - path = Masonry; - sourceTree = ""; - }; - 85A26EC9BC9FA781385D9AC8F9C05D82 /* NJKWebViewProgress */ = { - isa = PBXGroup; - children = ( - D932A45A0149DAE2EFA50BB134CAAEC4 /* Core */, - A9519EB88243D934E8393F78AA2ADDCE /* ProgressView */, - 3C6ECA84E263337ACC001FB248021E44 /* Support Files */, - ); - name = NJKWebViewProgress; - path = NJKWebViewProgress; - sourceTree = ""; - }; - 85A7F2BEA5CCD1B360818E0ABC07C4FC /* Support Files */ = { - isa = PBXGroup; - children = ( - C933FC7192774929912447057B8E4562 /* Info.plist */, - ABEE1B30110BC813D624D9257CEA50D1 /* LKDBHelper.modulemap */, - 8B5E70F380A1881B0AE8CC9EF93F5CC3 /* LKDBHelper.xcconfig */, - 48886EB74B58FC75012D8AB06D74F958 /* LKDBHelper-dummy.m */, - 435EA74A816C71AE5579FF600A20AF60 /* LKDBHelper-prefix.pch */, - 61FE2DC3E37626E602B4123EBB968B51 /* LKDBHelper-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/LKDBHelper"; - sourceTree = ""; - }; - 8ECAC204F8287FAD67B6CC17235AA448 /* Core */ = { - isa = PBXGroup; - children = ( - B900B84AB25BE438B82CB50415C5ADE5 /* NSButton+WebCache.h */, - D1192940DD792A9A986CB6606BFB24E8 /* NSButton+WebCache.m */, - 4CFCC52EC62F150CB4DFCDB379045F8F /* NSData+ImageContentType.h */, - 4105F4E767CE55C31AE0E2A6D969A996 /* NSData+ImageContentType.m */, - 85FA16278B2D2A724F98F1B98A871074 /* NSImage+WebCache.h */, - CD9FF2C9E2179EFB4B65EAA1F59EB227 /* NSImage+WebCache.m */, - B391B9DE52D6245F6A0358F52F1E44B0 /* SDAnimatedImageRep.h */, - A683976152674929538EEEC6EFF05A4B /* SDAnimatedImageRep.m */, - 75491F997888B75AAB2C0AB027F83D5C /* SDImageCache.h */, - BEA9D04E7D8139122C3891161371C04F /* SDImageCache.m */, - B2EF076F89FAD3ACFE9DCCC73E3553A3 /* SDImageCacheConfig.h */, - 25972EA3E10BED458FF978D175A9C263 /* SDImageCacheConfig.m */, - AE85EEFEF754EE2C913DA2E906A10FD0 /* SDWebImageCoder.h */, - 1B118355C6E3369C778E749125C4F8AA /* SDWebImageCoder.m */, - 72575B068A276F2F8A0CF243743B3E74 /* SDWebImageCoderHelper.h */, - 91A39121A9FBC45737A0102A4364012D /* SDWebImageCoderHelper.m */, - AF292596176CE1B357AB1A3CC5FC2AA6 /* SDWebImageCodersManager.h */, - 07CCB23292D6E83E10E681E65611A521 /* SDWebImageCodersManager.m */, - 88446EB28B584D07BED817C62D06D29D /* SDWebImageCompat.h */, - B416F9C983C43629DD021B63239CC1E0 /* SDWebImageCompat.m */, - CB4643E8EBAD5EE3D3BEF6DE78EBAA46 /* SDWebImageDownloader.h */, - 12BE137618AD905F6C08A0688A5AEC0F /* SDWebImageDownloader.m */, - B946CD9D828545C56B16DD0BAE1A4357 /* SDWebImageDownloaderOperation.h */, - 84A34E767AC05FDBD3D849436D0BCCEA /* SDWebImageDownloaderOperation.m */, - 6F53130DDA9FEA279EEACE1E1D479D77 /* SDWebImageFrame.h */, - C7D7CD906FAB43D44FF0E620B8F6644C /* SDWebImageFrame.m */, - CCD140D091E406CA53B6F3992BBDB579 /* SDWebImageGIFCoder.h */, - D526289C8F52F38595B594AF6ED917FA /* SDWebImageGIFCoder.m */, - 1B2009C43A73788FC750D0B1C40ECA60 /* SDWebImageImageIOCoder.h */, - EC02366395598C42E28F51101028C3D3 /* SDWebImageImageIOCoder.m */, - 2E18D0C002A9B8B1BFB6F6FD63278467 /* SDWebImageManager.h */, - F6D2D8438420EB7A9186D08660AD7BD6 /* SDWebImageManager.m */, - 10EDF99232E824A4129018791B729BC7 /* SDWebImageOperation.h */, - C5DC2D40CE636899E96F07F2E86609A7 /* SDWebImagePrefetcher.h */, - CDF02B7C8432A7AF339B1C46A875FAA1 /* SDWebImagePrefetcher.m */, - 4895A24A9EA8533671D64541ECA375BD /* SDWebImageTransition.h */, - 8C47585F4328CD92273C4B86865F9F95 /* SDWebImageTransition.m */, - FEE4923BAFE446FDB51B8375C4DA4869 /* UIButton+WebCache.h */, - 73A0A8125787204B223B07F7C9F0A42E /* UIButton+WebCache.m */, - C74B6FEF3E092E16E6AA34C13A34D0B9 /* UIImage+ForceDecode.h */, - BB8ED24222958BA93B420822394B77BC /* UIImage+ForceDecode.m */, - 9265EF5245C8B9E17305393357C5D93F /* UIImage+GIF.h */, - 7D5D3928FE1E7CA0D8E3A946574DC2F0 /* UIImage+GIF.m */, - 897350FBCDF747BE59B857BB5740214A /* UIImage+MultiFormat.h */, - C4E76FAF8061A10B224E54FE0D78F122 /* UIImage+MultiFormat.m */, - 26168530D466303D1859051CADEAF5EB /* UIImageView+HighlightedWebCache.h */, - 59E8BF8E1889AB501DDF9C32A0B690F8 /* UIImageView+HighlightedWebCache.m */, - D1C4ECF2FBF4E01A9207EE8FD4F3FF66 /* UIImageView+WebCache.h */, - B66D98C970953F228BE3D0F043AA6859 /* UIImageView+WebCache.m */, - C5AB81B04A2D01A1380ED02CA7F95DE4 /* UIView+WebCache.h */, - CADC5017C63268D068AD5B7FB33E0BFC /* UIView+WebCache.m */, - AC5B168B958ECE131EC368A4E10C6DEB /* UIView+WebCacheOperation.h */, - 250AC017E1404E43770F53CAC6280DC7 /* UIView+WebCacheOperation.m */, - ); - name = Core; - sourceTree = ""; - }; - 912D0FA9DD1FA891FC42F760869ABA1F /* Serialization */ = { - isa = PBXGroup; - children = ( - 88FA75A73C1252600B984CF5DE17B8CE /* AFURLRequestSerialization.h */, - 805D42FFE0EC9DD228E5EB6C75F8E9AA /* AFURLRequestSerialization.m */, - A21BBBF163BCA4C3910C8490302E3372 /* AFURLResponseSerialization.h */, - 967F8C400CE4F9921B132F3F960E9FF0 /* AFURLResponseSerialization.m */, - ); - name = Serialization; - sourceTree = ""; - }; - 95FEF0CE2F0A92C7121D81C2CB15AC44 /* Support Files */ = { - isa = PBXGroup; - children = ( - EEB3011FEE0FAEAB95CDBD6F94B6266A /* Info.plist */, - C49E0B9B92E3FB3DF23C94F2D7F2B819 /* MJRefresh.modulemap */, - 7F2A106A290EC7B512FC0E8A9C14E807 /* MJRefresh.xcconfig */, - 74C8E35BDB3CC1024935C804E53F0DD2 /* MJRefresh-dummy.m */, - E34D12543D1E0D6B0197D19F99328425 /* MJRefresh-prefix.pch */, - 0D16FD952562C34388EC43F2A7733B27 /* MJRefresh-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/MJRefresh"; - sourceTree = ""; - }; - A633D579D4B888F7971A6C11883C1718 /* AFNetworking */ = { - isa = PBXGroup; - children = ( - 404662E4EA47719280C225A3F07A8A6A /* AFNetworking.h */, - E94D47C3F28D29C969506120624B288D /* NSURLSession */, - 44CAD7891D251809201C7D44DC9CDB01 /* Reachability */, - 638FE4730E65D92ADBB4F31EC2BCD78C /* Security */, - 912D0FA9DD1FA891FC42F760869ABA1F /* Serialization */, - F3C3E5A59E64EBF70E1674F01580AE36 /* Support Files */, - 6B27D673B93E9DDC83DD64013DDF4CFB /* UIKit */, - ); - name = AFNetworking; - path = AFNetworking; - sourceTree = ""; - }; - A8FCFF06C4D1130E14692E5D37CE3D59 /* Socket.IO-Client-Swift */ = { - isa = PBXGroup; - children = ( - D82A606DAFFFB4961C3B9C2FA8505535 /* SocketAckEmitter.swift */, - 3D3288F586F676906211064535ACEA59 /* SocketAckManager.swift */, - 027B44E48FB40AD9D0DC25B70D6AE8CE /* SocketAnyEvent.swift */, - 22A12862A28052673208D864DF5F8671 /* SocketEngine.swift */, - 002CC32FEB8FB1D1B4D4BA9D7AE0CB41 /* SocketEngineClient.swift */, - 7BD28F6214D96C6BCC2EAF3C08B2EBA4 /* SocketEnginePacketType.swift */, - B4AF1BBB3946B6E0D89CDC1AE59011B0 /* SocketEnginePollable.swift */, - 936CB1BC52F552DA2661695DAD338FA0 /* SocketEngineSpec.swift */, - EAB6CB6F47D077D87B2488C5A7D01EE4 /* SocketEngineWebsocket.swift */, - 6191ABE66A1BB9B2F88FFD6AF6186D63 /* SocketEventHandler.swift */, - 93BF77A950CD15978D9DA654DDF789CD /* SocketExtensions.swift */, - 986BB8C05577A2D5C64F498406015E85 /* SocketIOClient.swift */, - 768A5DE5D08824954B4B101A2FB6B2BD /* SocketIOClientConfiguration.swift */, - 90609B4B8F17E6BD520EC73A397904D4 /* SocketIOClientOption.swift */, - 79898C8FB8D364D3B8B09502372E9F0B /* SocketIOClientSpec.swift */, - 3859DA0DF93E825130ADB78D0E66166E /* SocketIOStatus.swift */, - 55CDFB91944CA5A1481875292A58F12A /* SocketLogger.swift */, - A6DAF6AA9DC71209F96E9D4506478663 /* SocketManager.swift */, - 6F43E521A7D9B6E90D0A9E791D4C725D /* SocketManagerSpec.swift */, - D2C3B4A8303BF777A59CF2BAC331C8B6 /* SocketPacket.swift */, - C722C8355643E88536A2074EFDB9B2DA /* SocketParsable.swift */, - F30327CFECF1D69BC51289B5CCC97712 /* SocketRawView.swift */, - 7704E7E2B7BD84344BB610CC27D5A70E /* SocketStringReader.swift */, - 852AB63551AC52D340F98C97A94D9FD6 /* SocketTypes.swift */, - E3949679577E6689BFFF358B9518FE13 /* SSLSecurity.swift */, - C052FF26712528C42D280946BC5DD978 /* Support Files */, + 91B5524326030982E08D19C6DD79A605 /* SocketAckEmitter.swift */, + FE09343CF77ADDE6B4A2E8E4B156B1CC /* SocketAckManager.swift */, + A364B76E07EDED5CE6622600D9A01FA6 /* SocketAnyEvent.swift */, + 461834DA994FE18EBE2D48989FEBFC0C /* SocketEngine.swift */, + 0920463F74491C55DB9068AF51DB39D6 /* SocketEngineClient.swift */, + 6CF5E2FD354E3AD4AAD8B25E696EDDB2 /* SocketEnginePacketType.swift */, + 5F92E90DB24B107777D3809F3BF15DEE /* SocketEnginePollable.swift */, + 5CB026A66B6F2535F9EAA5691F683517 /* SocketEngineSpec.swift */, + DCF6F053DFBF0307477DF134AE5D856D /* SocketEngineWebsocket.swift */, + 697078F7E74492370116817C140930DA /* SocketEventHandler.swift */, + 9E9F570F0C8FF7E01A8D9117552856F8 /* SocketExtensions.swift */, + BFCDF5213447A628E04D699697D1B7D1 /* SocketIOClient.swift */, + 2A448F51B392A1B9BD7106633EF062E2 /* SocketIOClientConfiguration.swift */, + E269CAA8DF5F1A3FDB98EDE519EB63FE /* SocketIOClientOption.swift */, + F31CBEF84376251F0806EADAD2A08076 /* SocketIOClientSpec.swift */, + 633ED391CA5537F706E648B064B3C5A7 /* SocketIOStatus.swift */, + 015B8D14A645C8CFF87D3707F0EDA333 /* SocketLogger.swift */, + DF18793C84D22F32ECAD06799CFF3D17 /* SocketManager.swift */, + 3563CE30C7FC383DB5E57A9EFAED2A5D /* SocketManagerSpec.swift */, + 050F5D4A18A243F44CD990ED0FD713A8 /* SocketPacket.swift */, + 5DE834176952B6A04A8FBAEC4BDB5370 /* SocketParsable.swift */, + F0E4A8D325E6EBFDBECD2C650970CBDF /* SocketRawView.swift */, + 58D0B50681B79F8D39E41675732BE4D6 /* SocketStringReader.swift */, + 645111D5F231357418BF0742750B400D /* SocketTypes.swift */, + 50FD9B1F2C384AB4FA9C84A84A04CC9A /* SSLSecurity.swift */, + D20DB5F04DDE0AFEF2DDC38D3219FCD7 /* Support Files */, ); name = "Socket.IO-Client-Swift"; path = "Socket.IO-Client-Swift"; sourceTree = ""; }; - A9519EB88243D934E8393F78AA2ADDCE /* ProgressView */ = { + 8E466B9018EE707E50EDB0DCE0505900 /* Support Files */ = { isa = PBXGroup; children = ( - B8C80B2C162E2DADAE6E64B7C59BD395 /* NJKWebViewProgressView.h */, - 7D0587B9F9A54258E4EC092F7FCE94EC /* NJKWebViewProgressView.m */, - ); - name = ProgressView; - sourceTree = ""; - }; - AD0DF298644AA6EFB83ADF5D1723BD32 /* LKDBHelper */ = { - isa = PBXGroup; - children = ( - 0664FE391669606C208EA556EBDD28A5 /* standard */, - 85A7F2BEA5CCD1B360818E0ABC07C4FC /* Support Files */, - ); - name = LKDBHelper; - path = LKDBHelper; - sourceTree = ""; - }; - C052FF26712528C42D280946BC5DD978 /* Support Files */ = { - isa = PBXGroup; - children = ( - 5EA0FD074C76AC8611D95613CDEB4311 /* Info.plist */, - E2ED3BE7480909B51B50DE2998A28003 /* Socket.IO-Client-Swift.modulemap */, - 86A54BF6E391B76DFBE0F0695DB27785 /* Socket.IO-Client-Swift.xcconfig */, - 1501D5687E1AF56AAF3E46B413F8A46B /* Socket.IO-Client-Swift-dummy.m */, - 7E9D6482F9A7BDDA51F2CA23CC989F00 /* Socket.IO-Client-Swift-prefix.pch */, - 1CA5AAF13D2E09670AF9CBA0B18BF39F /* Socket.IO-Client-Swift-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Socket.IO-Client-Swift"; - sourceTree = ""; - }; - C64A38BCDA1A3F78AC00751F0655D817 /* TTTAttributedLabel */ = { - isa = PBXGroup; - children = ( - D18BF93986D1392783B2FEBA0B4EEBE5 /* TTTAttributedLabel.h */, - 98D89B37F7C92F976B671CF4941E8120 /* TTTAttributedLabel.m */, - CFAE78A59712B086D2CC3BDF37EEC08B /* Support Files */, - ); - name = TTTAttributedLabel; - path = TTTAttributedLabel; - sourceTree = ""; - }; - C7192BD386630DD39E6C218B6259B956 /* Support Files */ = { - isa = PBXGroup; - children = ( - E64BCF4BA39828C61CC26523596F36BC /* Info.plist */, - 59B9D327C5265DEE8087CB64AB64426F /* Starscream.modulemap */, - 53F4D20C7F0D216C630BE1353AC09D55 /* Starscream.xcconfig */, - 5BC61B5225D9CEE976A35A242843BF85 /* Starscream-dummy.m */, - 4C5390F4E86B7D09F66AD00A442AB988 /* Starscream-prefix.pch */, - 270472B1F4EA9863212F85E4EAB5B497 /* Starscream-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Starscream"; - sourceTree = ""; - }; - C9AC7881E3A93086F2058658C83B43BE /* Frameworks */ = { - isa = PBXGroup; - children = ( - 23AAFF4BE17FB72260148442F598E055 /* FMDB.framework */, - D8509BE0EBE02FAB118A15EBE60C8E47 /* Starscream.framework */, - 7E69D627DEF05060BADCBCC9B07E96BB /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - CCA25ECCC450E021E069120D409442A4 /* FMDB */ = { - isa = PBXGroup; - children = ( - 5D18979E16AA15B8FC94B1945A0FB2AB /* standard */, - 0C0EA7F3A802D825B66C8E23BA35A161 /* Support Files */, - ); - name = FMDB; - path = FMDB; - sourceTree = ""; - }; - CFAE78A59712B086D2CC3BDF37EEC08B /* Support Files */ = { - isa = PBXGroup; - children = ( - 4F5A634FE6A212612B8063E798439185 /* Info.plist */, - 8B7517F6F47C3E3DBDDC7897D5532B4E /* TTTAttributedLabel.modulemap */, - 558D6E7CB99E8F711140222C4C7FD6C0 /* TTTAttributedLabel.xcconfig */, - CECF499859A92AC25079255ECACA8E36 /* TTTAttributedLabel-dummy.m */, - 4A22823A58050582ED95D1A767F76671 /* TTTAttributedLabel-prefix.pch */, - 044E5621EF88BE1E4C8B35094500FCA8 /* TTTAttributedLabel-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/TTTAttributedLabel"; - sourceTree = ""; - }; - D2250417B8C5D2E16EEF527DAF5DD1A2 /* Support Files */ = { - isa = PBXGroup; - children = ( - ADA2CB35E59C1515D5BED389D956661B /* Info.plist */, - 2347C099D7F33A036587B18EE3CEFEB6 /* YTKKeyValueStore.modulemap */, - 18230792D7301ED554D8EBE3D27C83C6 /* YTKKeyValueStore.xcconfig */, - 9E018CB10D71F6E7076E334BE4031987 /* YTKKeyValueStore-dummy.m */, - 727870954CC82AAEDD7172910D081D2F /* YTKKeyValueStore-prefix.pch */, - FAA85730E7ECFBD1CCEB7260FF00F4C2 /* YTKKeyValueStore-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/YTKKeyValueStore"; - sourceTree = ""; - }; - D2A62A7B2591E116CD2CB1E591BABAED /* Frameworks */ = { - isa = PBXGroup; - children = ( - 6C9A66715097B49E44CC06CFE998E3B8 /* UMCommon.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - D4D12C5B91A26ECDA4A6A7DBDF734592 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 46F020E16865FD56CE53816167224099 /* UMAnalytics.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - D932A45A0149DAE2EFA50BB134CAAEC4 /* Core */ = { - isa = PBXGroup; - children = ( - BB6C3ABE582E083225418DE0C8C70C57 /* NJKWebViewProgress.h */, - B3FC77617DC552A6560A5396024E9F3E /* NJKWebViewProgress.m */, - ); - name = Core; - sourceTree = ""; - }; - E0AB66D2C96E63CD3CA32758697A0143 /* Toast */ = { - isa = PBXGroup; - children = ( - D03FDD61963B602D63D86983F58A4B56 /* Toast.h */, - EC74917D726BBCA053741855222BD20F /* UIView+Toast.h */, - 6594B566BAF22CF7F3BF954283907D88 /* UIView+Toast.m */, - 56D87990CE17BF3E4B7E67FAA38846C4 /* Support Files */, - ); - name = Toast; - path = Toast; - sourceTree = ""; - }; - E1DEBC0332688293576CF0781BF2B546 /* UITableView+FDTemplateLayoutCell */ = { - isa = PBXGroup; - children = ( - F51B36454E6DCF580D43CCFCB03FC536 /* UITableView+FDIndexPathHeightCache.h */, - 3DF7CF70E97B77C95449324D577D2DE5 /* UITableView+FDIndexPathHeightCache.m */, - 18DDE12559A163C7C94F4FE3A82C3212 /* UITableView+FDKeyedHeightCache.h */, - ECFAC79A556CD170296E2CF2FDE40919 /* UITableView+FDKeyedHeightCache.m */, - F76496371A94D04C6DEB3EBEEB62540B /* UITableView+FDTemplateLayoutCell.h */, - 5F1558AF059B62809206FC3CD1039CBA /* UITableView+FDTemplateLayoutCell.m */, - EF79A7916BB6B36C2A83C99F45DDA1C3 /* UITableView+FDTemplateLayoutCellDebug.h */, - E3206BC9B15475420835FF224D6604E1 /* UITableView+FDTemplateLayoutCellDebug.m */, - 337E1E73A7CE2DEDA6F9FB1837F71269 /* Support Files */, - ); - name = "UITableView+FDTemplateLayoutCell"; - path = "UITableView+FDTemplateLayoutCell"; - sourceTree = ""; - }; - E63D2863D5FB7DC212A24B273C014E03 /* JSONModel */ = { - isa = PBXGroup; - children = ( - C8B763BF7B2D2A4C39D2DC28299CEF57 /* JSONAPI.h */, - B2DEBA7CEFB5421B185C9365A7AA8A75 /* JSONAPI.m */, - DCF6F5650FAA9B82ED6F665EAB1DE040 /* JSONHTTPClient.h */, - 1B4BDE950FE4B829BD4E2D8E0B86A002 /* JSONHTTPClient.m */, - D143D5CBDD8A310F6BE8B5FE049E63B7 /* JSONKeyMapper.h */, - BDB59FA6744E05662DDE8F5FB6697313 /* JSONKeyMapper.m */, - A2092DB43436F5251A059C3C4A62A935 /* JSONModel.h */, - F6F9763802AC8D472A1FFBF6A867B33D /* JSONModel.m */, - 66D6A876FB337C3A5AEC09F74362A022 /* JSONModel+networking.h */, - E88C81586D204E9EC5AB0CBFE3620057 /* JSONModel+networking.m */, - 774A10F51C61AA781BFD1C4397931231 /* JSONModelClassProperty.h */, - 6779C8F389FC4B45319BDA12E59B2BFD /* JSONModelClassProperty.m */, - 65FA72B7E48A3FABA22AE5D855BB186C /* JSONModelError.h */, - A1D013A487C85EC1042B4A1ED71E7C6D /* JSONModelError.m */, - 7E7D955074A0ED0B9FF131595E872064 /* JSONModelLib.h */, - 6FF4D47DF573B44C28B3DF814C3E50CB /* JSONValueTransformer.h */, - 118814FC7D9B5A7CF1BF99F325AF8488 /* JSONValueTransformer.m */, - 61C0046882C98AAEC1ECEB7607191880 /* Support Files */, - ); - name = JSONModel; - path = JSONModel; - sourceTree = ""; - }; - E94D47C3F28D29C969506120624B288D /* NSURLSession */ = { - isa = PBXGroup; - children = ( - B6841A5F308297E91E99E7B83292909E /* AFCompatibilityMacros.h */, - FEAAD1709AA2F9B0C1E7F611FA261B98 /* AFHTTPSessionManager.h */, - 531C313E293B098E8DD0AE16F9F05E50 /* AFHTTPSessionManager.m */, - 7F8965BFE9CC1CE8B5CFC2B14D7E2DA8 /* AFURLSessionManager.h */, - C5E794D2376437EFF78B2C7EB9D7060B /* AFURLSessionManager.m */, - ); - name = NSURLSession; - sourceTree = ""; - }; - F3C3E5A59E64EBF70E1674F01580AE36 /* Support Files */ = { - isa = PBXGroup; - children = ( - 7544FB7D9022E74937D8BE12C05191AA /* AFNetworking.modulemap */, - CC29AB6DCE0390D33472279DBF9F826F /* AFNetworking.xcconfig */, - D083351E8A8E8A86A59BA3A3863723C4 /* AFNetworking-dummy.m */, - F0A568A70445E76EE1B2DC6996139B64 /* AFNetworking-prefix.pch */, - 79CF50141FCA7A6797717FC93955DAF1 /* AFNetworking-umbrella.h */, - D04F3E0E968470EBB1EC4F70818FABF3 /* Info.plist */, + D2FB3BEA2B955286DFF270B0F74B1368 /* AFNetworking.modulemap */, + 7A9339DF6CB574A5346814889C803896 /* AFNetworking.xcconfig */, + C5BCCBDFB1C9D318B399428068B1A6A1 /* AFNetworking-dummy.m */, + 013777DCCD1ECAC13DCF051BEFB038CA /* AFNetworking-prefix.pch */, + 4D57DAB6BFCB824F15CBA51D5F9992AA /* AFNetworking-umbrella.h */, + 7E3D66FD38AD1D0531E69B0CE20E9322 /* Info.plist */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; sourceTree = ""; }; - F3CDD0BE903CBFB244CDB880490A04EC /* Frameworks */ = { + 8FA2233E1DAFBB7E74B9DA75AB6427A4 /* LBXScan */ = { isa = PBXGroup; children = ( - 5842466C4060B5C8F8FB2C92F2D73D97 /* libjpush-ios-3.1.0.a */, + 6F72BDA77DDE3C8CCA20BA6548A25928 /* LBXZXing */, + 38ED195F8198A4B63D4FD69E3835FF15 /* Support Files */, + 52B04B6E2E2E4269F8F730AFDDB3D23B /* Types */, + ); + name = LBXScan; + path = LBXScan; + sourceTree = ""; + }; + 92ED64BE4BAC585E3C9C2CE040DF0516 /* Security */ = { + isa = PBXGroup; + children = ( + E7EE73C29C12A420E29202973AB3A065 /* AFSecurityPolicy.h */, + 79FE412CCF5EB10F2499FED97EF034ED /* AFSecurityPolicy.m */, + ); + name = Security; + sourceTree = ""; + }; + 97183FEE94E98D480AEFD02413128333 /* Resources */ = { + isa = PBXGroup; + children = ( + 93574EE2DA0422951D812872E110654B /* MJRefresh.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + A35E093739DD832A986D73C2D8749C28 /* NJKWebViewProgress */ = { + isa = PBXGroup; + children = ( + 3E3625EE8290A2E0171187A12427C4A6 /* Core */, + 35F6FB5B9F1B6D3EF2E8F4F23EDDDD97 /* ProgressView */, + FF75B8F982F5A9CD1AFF5DE09D307B16 /* Support Files */, + ); + name = NJKWebViewProgress; + path = NJKWebViewProgress; + sourceTree = ""; + }; + A46B744A8486F54B7741D1AF6EF3519D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8ADDD36454D390960AFDDF9340ACC212 /* UMAnalytics.framework */, ); name = Frameworks; sourceTree = ""; }; + A486D8E5E4C520D9D3238D8552766797 /* AFNetworking */ = { + isa = PBXGroup; + children = ( + 35585E01D8EFEEBEC799FE84FDF8A47C /* AFNetworking.h */, + B76813AAF7C314933E968D16510C053C /* NSURLSession */, + 710B7CA15F1A162078EDAD859A6631C4 /* Reachability */, + 92ED64BE4BAC585E3C9C2CE040DF0516 /* Security */, + 65BD502401EFFA2F5336628B0E61158E /* Serialization */, + 8E466B9018EE707E50EDB0DCE0505900 /* Support Files */, + D685CFA6AAD617B78A6BC333025B23AB /* UIKit */, + ); + name = AFNetworking; + path = AFNetworking; + sourceTree = ""; + }; + A7B0DB21178E5111685EBCA258735A60 /* Support Files */ = { + isa = PBXGroup; + children = ( + 0D14B74F7C07C073476B4274CF8C5A19 /* Info.plist */, + E0327F685ACB807EADF939F1B4628C2D /* SDWebImage.modulemap */, + 96D38E5E642795832255E9825CD80F42 /* SDWebImage.xcconfig */, + A0F634DD850EAE7CA353C2E86F349468 /* SDWebImage-dummy.m */, + A2F2DAC00021411F4AF5F6FAC3BE4A94 /* SDWebImage-prefix.pch */, + 27F20E0FDA54EF826C95714A52CE9C09 /* SDWebImage-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + A87189F63605E7B6DA2B8FEF2F9FD0BE /* Masonry */ = { + isa = PBXGroup; + children = ( + ADD15CC73D37D63D79884B9AF2970A5D /* MASCompositeConstraint.h */, + F12009D1C01556CEA7A2D3988A794F73 /* MASCompositeConstraint.m */, + 248CA5F52D608A5643F90F8DE6F4CFCC /* MASConstraint.h */, + 004F6E5045671D830987CF2BA82B1B56 /* MASConstraint.m */, + 915CC73C8057CA2817230A48BC6A391F /* MASConstraint+Private.h */, + 919EF3437C8069062405289CF4D9F092 /* MASConstraintMaker.h */, + E5D3CC79E85F7918D70BD3A4522AACE6 /* MASConstraintMaker.m */, + 2491CC38C2B789FC40186BCCDF2D82D8 /* MASLayoutConstraint.h */, + 5826DD4C8A1EA288E322FAC3C9EA4691 /* MASLayoutConstraint.m */, + A40463DAC6A4E916654CEF343C61ECED /* Masonry.h */, + 5FB61DDB2E7A09B5F41E3BB2AA655388 /* MASUtilities.h */, + 92FEEDFA83D3A00920E16B9CABEFA1E5 /* MASViewAttribute.h */, + 448563F35B5EBE456D58CC5DB9B6E732 /* MASViewAttribute.m */, + BBD7A1690C374C0D6EB52EA1E5CD8023 /* MASViewConstraint.h */, + 411CC2AB65DDA90561C1A996DCB39D38 /* MASViewConstraint.m */, + 9165CCA443172EAFEA5F67FEC667E494 /* NSArray+MASAdditions.h */, + 487563F965DF353FF2A0C6737EBC43AC /* NSArray+MASAdditions.m */, + D3975F2419B8D6B20104A7D872211E48 /* NSArray+MASShorthandAdditions.h */, + F90A2EDD8280C3F6E157F06F89AD2C88 /* NSLayoutConstraint+MASDebugAdditions.h */, + BEE5EA3A3EA8FD272D48AE637E5243D3 /* NSLayoutConstraint+MASDebugAdditions.m */, + 01AE0C0079CA9AD58E9E0F21D47EBEF7 /* View+MASAdditions.h */, + C515A55A679E5749725EDE2DD579D895 /* View+MASAdditions.m */, + F2C5FF007199CEA3518E6FC9F9700871 /* View+MASShorthandAdditions.h */, + F298804CFB13E8D56C1490A3060E80C8 /* ViewController+MASAdditions.h */, + B651E4833F9DA640EDAD393921C93D38 /* ViewController+MASAdditions.m */, + 2A79D46B034D02006F22AB0DA866270B /* Support Files */, + ); + name = Masonry; + path = Masonry; + sourceTree = ""; + }; + AF67C8E6F6B65E5B1CF8D56D2D8360ED /* standard */ = { + isa = PBXGroup; + children = ( + A23106CA0DB895B05E409ACADA49BB3D /* LKDB+Mapping.h */, + 1616C6AFF0D30BA7956FE92E35E55C9D /* LKDB+Mapping.m */, + 59EF2EB3362C0B2ED9F2F3A9977DA345 /* LKDBHelper.h */, + 5D19C16AD520047D87A62E87D78B88DC /* LKDBHelper.m */, + 859D68675FCAFB6FEF5CAB1173B80AB7 /* LKDBUtils.h */, + E3AB84771CDBC97157AFEEF0D298CBC4 /* LKDBUtils.m */, + 56B36467AE75A63FFC84B594640762F2 /* NSObject+LKDBHelper.h */, + 73FE89B7E2ED57F34CFD8AE3C02ED889 /* NSObject+LKDBHelper.m */, + 0261143F731CF8A7A25FC2017DEA766E /* NSObject+LKModel.h */, + E371536297EE73EDA25573988ADB0FF8 /* NSObject+LKModel.m */, + ); + name = standard; + sourceTree = ""; + }; + B227EDD7C75708BE658363B1722D2848 /* Support Files */ = { + isa = PBXGroup; + children = ( + 4536A2ED882A400458EBD3A0C3F37E7A /* Info.plist */, + 0B3F57FF8C5CE705D7BA3F15CEBC9E87 /* IQKeyboardManager.modulemap */, + F5E94E4212716C7AB9D7D0E2B64A071A /* IQKeyboardManager.xcconfig */, + B43958B9922FD34350604E634E5FC721 /* IQKeyboardManager-dummy.m */, + 3EE522AA06CD2B0D9B45221D43D2DAA2 /* IQKeyboardManager-prefix.pch */, + DB3698AA6971F6CC730B057DE45FF66D /* IQKeyboardManager-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardManager"; + sourceTree = ""; + }; + B76813AAF7C314933E968D16510C053C /* NSURLSession */ = { + isa = PBXGroup; + children = ( + 45E3CD46940FDD395CACBA1A4A21FD19 /* AFCompatibilityMacros.h */, + 336F0381CB9A0395C4BBF4C768C65F74 /* AFHTTPSessionManager.h */, + 4B6CFBDEEF15C5CAC528272DFA72E70D /* AFHTTPSessionManager.m */, + CAF15FF37FEE65A4BD8CB5EB924D9792 /* AFURLSessionManager.h */, + DF91059153F21AF14EB312A6DB0B5502 /* AFURLSessionManager.m */, + ); + name = NSURLSession; + sourceTree = ""; + }; + B95103A38187DC5B1D9ECDB97106424C /* Support Files */ = { + isa = PBXGroup; + children = ( + DA01C144A28B7CAC321EC6840A0D9275 /* Info.plist */, + D2B901F35DBA98ACD6B3ADFF00C15E6D /* TTTAttributedLabel.modulemap */, + 8D36A1C2ADDA3E56029534C48A04FF1D /* TTTAttributedLabel.xcconfig */, + 3FE6280647D511E8A1CF5138E9C19EEF /* TTTAttributedLabel-dummy.m */, + FB3EFE16F11E70763CE1F088F3AEC58D /* TTTAttributedLabel-prefix.pch */, + 4B56E10174EEAF6135A318FC9ED5DC73 /* TTTAttributedLabel-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/TTTAttributedLabel"; + sourceTree = ""; + }; + BA46DB89496E01552C67961E461E6A39 /* Bugly */ = { + isa = PBXGroup; + children = ( + 07D2ADB1B13705CC6166A4AD779D683B /* Frameworks */, + ); + name = Bugly; + path = Bugly; + sourceTree = ""; + }; + BC4DD4E2151C8B275EAA4DD6429A3115 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AE72CDF71FC6F3212622FADC1252AF59 /* libjcore-ios-1.2.2.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + C7DB6C4C1346840ABE1A42A25D8A96F1 /* Resources */ = { + isa = PBXGroup; + children = ( + 21B81153AF23CF76DCC9E5AB0BBE5804 /* IQKeyboardManager.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + D20DB5F04DDE0AFEF2DDC38D3219FCD7 /* Support Files */ = { + isa = PBXGroup; + children = ( + E29E80A59D84FC676861AFDA9265796A /* Info.plist */, + 6E97EAE0A8D0A8FE97D3C042BEF63960 /* Socket.IO-Client-Swift.modulemap */, + B01401140320D07C8A62D408F3E0DA71 /* Socket.IO-Client-Swift.xcconfig */, + 3F3856B0D263FC58D95A8AD0D1B21E7A /* Socket.IO-Client-Swift-dummy.m */, + 6A088F28BFD7B6C6CCEB1861DB0090F6 /* Socket.IO-Client-Swift-prefix.pch */, + 888F40F9F81D0D0A3492771A2A16A8EF /* Socket.IO-Client-Swift-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Socket.IO-Client-Swift"; + sourceTree = ""; + }; + D34D682ABFAFB3135F3FB2C32F1C323F /* Pods */ = { + isa = PBXGroup; + children = ( + A486D8E5E4C520D9D3238D8552766797 /* AFNetworking */, + BA46DB89496E01552C67961E461E6A39 /* Bugly */, + 12AE0D69F66BE61895061C26269F0316 /* FMDB */, + D7EAF6BEE1D5476FB7072A2543FA2933 /* IQKeyboardManager */, + F3D602A764DCE53574E30CF723A68406 /* JCore */, + 2669FE09D19074727E52B81A6972B867 /* JPush */, + EB6B5829831A31849770BEDE6F068A94 /* JSONModel */, + 8FA2233E1DAFBB7E74B9DA75AB6427A4 /* LBXScan */, + 29C94DAB3DF0034FBE256F7CB816B0F9 /* LKDBHelper */, + A87189F63605E7B6DA2B8FEF2F9FD0BE /* Masonry */, + F13AFEA66BFC6463F672B790EAB8687A /* MBProgressHUD */, + 2269F3292F201D8192CC08F9A2AD4016 /* MJRefresh */, + A35E093739DD832A986D73C2D8749C28 /* NJKWebViewProgress */, + FAC611D3CC8C82271A18828A6D992A3F /* SDWebImage */, + 87B658C8E19BEFDCBC5FE0B1631570CD /* Socket.IO-Client-Swift */, + 160DD7E11644E822656E36ADDEBFC4D0 /* SocketRocket */, + 32F6B7E3A85840132B6D0AF6494FCB65 /* Starscream */, + FA08407EF0A6C8AA6F453FE650E86FD6 /* Toast */, + 3B2B419113BEC5CB996D2F14B2F6827D /* TTTAttributedLabel */, + F45EC5986ED5CE78ACFC6C0E326C519B /* UITableView+FDTemplateLayoutCell */, + 541A032234A4C435AEAFBB3AF2116D25 /* UMCAnalytics */, + FA3A8693095DA251CF2001C89183CAF2 /* UMCCommon */, + E4926D633848A321DB2A1C46357C93D2 /* UMCSecurityPlugins */, + D794315497A2FAB7C782EF7B1C6F5727 /* WechatOpenSDK */, + 0F551DD932EF8AA7DB75FE4A60AE3735 /* YTKKeyValueStore */, + ); + name = Pods; + sourceTree = ""; + }; + D5063F5D551F8AAC0A5E1FF2C1B68FEF /* Support Files */ = { + isa = PBXGroup; + children = ( + 6282CC5CEF7E3B986992AA06E148ACA7 /* Info.plist */, + 350C60BDB8C307BD30635D48AB2EB920 /* Toast.modulemap */, + E2E383C17ED8079D78E6A75D6794D7CC /* Toast.xcconfig */, + FF9A9450B76B010E6A27E2BE82AC6C98 /* Toast-dummy.m */, + BAB0F73AE2B4C8776A06C452DBCF0FA3 /* Toast-prefix.pch */, + 7E1CA2E6972145743991FD3D343DF043 /* Toast-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Toast"; + sourceTree = ""; + }; + D685CFA6AAD617B78A6BC333025B23AB /* UIKit */ = { + isa = PBXGroup; + children = ( + B95D0E98143F761DAF81176974CE05D8 /* AFAutoPurgingImageCache.h */, + 40601347DD17AEE48EB4A05C95CEDE4D /* AFAutoPurgingImageCache.m */, + AF67FFD3DB88A86F97B87AA371019906 /* AFImageDownloader.h */, + 60A8566008F2AD60A21C20D15502D353 /* AFImageDownloader.m */, + 13F4310737FA0422C581F7E03BEF1C03 /* AFNetworkActivityIndicatorManager.h */, + B8939096BA2BF2487B8738E6BD3072F2 /* AFNetworkActivityIndicatorManager.m */, + F5E3E7A450E3F2F506A4750E78B0CC3F /* UIActivityIndicatorView+AFNetworking.h */, + 7047319FE14D03FEB9C8CFEB7BC9FDB9 /* UIActivityIndicatorView+AFNetworking.m */, + F951FBB93592715C79CB49A74F212457 /* UIButton+AFNetworking.h */, + 5171E517994BE790AD2CC0E312612361 /* UIButton+AFNetworking.m */, + 143FB6B44654C24BB8B89753BFC2F90E /* UIImage+AFNetworking.h */, + 9100592460B4D50C5A7AFF91703629A2 /* UIImageView+AFNetworking.h */, + E4C0009AC3BB69124F18FD9D2961200A /* UIImageView+AFNetworking.m */, + 73394E3C99C0F7034198B9D0338C2B49 /* UIKit+AFNetworking.h */, + 62DB1127BBB610074D9DD441518B890A /* UIProgressView+AFNetworking.h */, + 6E8CA25D03257A99F234AA0E7E688B7B /* UIProgressView+AFNetworking.m */, + A8E4C804748510DA87291035398A53AE /* UIRefreshControl+AFNetworking.h */, + 2E08BFB38983459E0EE437ACEA12B99F /* UIRefreshControl+AFNetworking.m */, + C318977FCF328523387B6D4A7C4C463B /* UIWebView+AFNetworking.h */, + 76BFAE3C824CE992C06944187EBE0981 /* UIWebView+AFNetworking.m */, + ); + name = UIKit; + sourceTree = ""; + }; + D794315497A2FAB7C782EF7B1C6F5727 /* WechatOpenSDK */ = { + isa = PBXGroup; + children = ( + C90718282B911DA283EED1944D1918DD /* WechatAuthSDK.h */, + 7B495DB1DDBCF9A902C16E605E698C67 /* WXApi.h */, + D93FF457E74024D9B4CA312E8A0487A2 /* WXApiObject.h */, + 16B09E7EB7890600D4E4281569B583A1 /* Frameworks */, + ); + name = WechatOpenSDK; + path = WechatOpenSDK; + sourceTree = ""; + }; + D7EAF6BEE1D5476FB7072A2543FA2933 /* IQKeyboardManager */ = { + isa = PBXGroup; + children = ( + 6CCBEC0E54094922227B670E6DB080E9 /* IQBarButtonItem.h */, + AA90CAD09890A93DE22DF96193FDE32F /* IQBarButtonItem.m */, + ED92E6B7D288035979BF42CB418A9CE2 /* IQKeyboardManager.h */, + E3D34627710B673293F9006447215215 /* IQKeyboardManager.m */, + 29470A1C268C0A1F1C7B973C23A1F7A8 /* IQKeyboardManagerConstants.h */, + 95B5D6488D2A9F8A957047341D1B1418 /* IQKeyboardManagerConstantsInternal.h */, + F8511D0B3E2963CA1CD4AE1B9FA833E3 /* IQKeyboardReturnKeyHandler.h */, + 3E41F011C85810C2F24051ADF688EAC6 /* IQKeyboardReturnKeyHandler.m */, + D80D98735957E03896AE3A84B4BF36F4 /* IQNSArray+Sort.h */, + 6F56ED7BB1C9B9CEBCDE058DB3D75771 /* IQNSArray+Sort.m */, + A52DB4C293AA3C677B923D21761331BA /* IQPreviousNextView.h */, + 2569425A0FA93A78E8B74BA057402124 /* IQPreviousNextView.m */, + 232646EC5F31EAA7AF0455FE8C72225D /* IQTextView.h */, + 7D70C968EE0D52159E632EAD33541F1D /* IQTextView.m */, + 1FD296265ABE09EAE1B9B8D7B3B6F3F4 /* IQTitleBarButtonItem.h */, + 17D561C32CB8DBDDB9692DB49D6C7B73 /* IQTitleBarButtonItem.m */, + 73114DBF445B889F132749E0B264FDD9 /* IQToolbar.h */, + 81D496F5BF77C54A94097921D27092F2 /* IQToolbar.m */, + 1289BA734A4A2D403F72FC21D6E271E6 /* IQUIScrollView+Additions.h */, + 07CAAFBE787F94EBAB0F50E7F7F1CD83 /* IQUIScrollView+Additions.m */, + 5EF62BFCE82564E335A65CB3784EA01F /* IQUITextFieldView+Additions.h */, + 8FF962C3B5E9F87BAD0687F98E01A68F /* IQUITextFieldView+Additions.m */, + 7C3FE4CD8A5E9DAC8CA4CA059E57139E /* IQUIView+Hierarchy.h */, + CB0C6FA3F55EFFAB1555D06598C28905 /* IQUIView+Hierarchy.m */, + A1996AA7C2137DB7AA8880037F9572EF /* IQUIView+IQKeyboardToolbar.h */, + 5EE816134A2D9EEC209C05AECBE42499 /* IQUIView+IQKeyboardToolbar.m */, + B511D89A58E69A73AA9266E378998CB3 /* IQUIViewController+Additions.h */, + 77FC00CA12D81353B9F8489133C2DEF3 /* IQUIViewController+Additions.m */, + C7DB6C4C1346840ABE1A42A25D8A96F1 /* Resources */, + B227EDD7C75708BE658363B1722D2848 /* Support Files */, + ); + name = IQKeyboardManager; + path = IQKeyboardManager; + sourceTree = ""; + }; + E4926D633848A321DB2A1C46357C93D2 /* UMCSecurityPlugins */ = { + isa = PBXGroup; + children = ( + EF606691DCDB02BFEE9D322320F460D9 /* Frameworks */, + ); + name = UMCSecurityPlugins; + path = UMCSecurityPlugins; + sourceTree = ""; + }; + E587095CA63535B2893EEF82B1077B64 /* iOS */ = { + isa = PBXGroup; + children = ( + 44CBD3EB20B3CF018557CB282DE81D97 /* AVFoundation.framework */, + FBB9755676843B30743EA7966C0286B5 /* CFNetwork.framework */, + F15582E57A6912BCCB5DE234CA48348A /* CoreGraphics.framework */, + 449F2506A175228D3745E422F9FA4505 /* CoreMedia.framework */, + EE1794291AC6356B32D4FBB406D1E87D /* CoreText.framework */, + 0369659D7DD2AF8AC3111E85E262AF41 /* CoreVideo.framework */, + AA165F4FD210951F0C08AE2648D3201C /* Foundation.framework */, + 1558559131A84E06FE4C17C8B92D445F /* ImageIO.framework */, + 8D348C141AC0E517123D21C02ACD9329 /* MobileCoreServices.framework */, + EBD335DA3FAF9F79ECA258065EB163EB /* QuartzCore.framework */, + 8EB1EC42888716D62C56F080EBFEC574 /* Security.framework */, + 240BAD531BB4B9EEBE08492B619A8762 /* SystemConfiguration.framework */, + 635A274D0FAAA69FECA7412329502686 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + E6595B098F2A715892C61B0D382537FE /* Support Files */ = { + isa = PBXGroup; + children = ( + 26DCFD25FCBCA4E28F0BC003760D39C3 /* Info.plist */, + AA29DD0E0EAA7C717EB5BF59D7AD96DB /* UITableView+FDTemplateLayoutCell.modulemap */, + EA03E8D5F65C226379EBBD40A4694353 /* UITableView+FDTemplateLayoutCell.xcconfig */, + DF5D7B201521512A5C700D172DAF2F90 /* UITableView+FDTemplateLayoutCell-dummy.m */, + 75F52EEA397EEE02870D0EDD6D0B364D /* UITableView+FDTemplateLayoutCell-prefix.pch */, + 2954D1C7455042E32D975BE36184E2F7 /* UITableView+FDTemplateLayoutCell-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/UITableView+FDTemplateLayoutCell"; + sourceTree = ""; + }; + EB6B5829831A31849770BEDE6F068A94 /* JSONModel */ = { + isa = PBXGroup; + children = ( + F5DE348ABEF4AEEB28F6FBD506103C1A /* JSONAPI.h */, + 0B4D7786EE2660AC3DC4E70BDF860D37 /* JSONAPI.m */, + 36925CAD9B84F8F3F48AE20228BEF509 /* JSONHTTPClient.h */, + 9C08014B0933A01D397B8D075C867A21 /* JSONHTTPClient.m */, + A657F0E7F01EED7AB15C3FE8BD0AAF6B /* JSONKeyMapper.h */, + 6CA27166E73856714CABF732CF0143F4 /* JSONKeyMapper.m */, + AED784CAA8D2959F0450D522DFFCED8F /* JSONModel.h */, + 8FD5528C0D2E108DE76282C4D370CF27 /* JSONModel.m */, + FD3C532397C903A0F5DADD4C208B2087 /* JSONModel+networking.h */, + 693E8329C711960AE3D2219970BAA72C /* JSONModel+networking.m */, + 6712D72897762340266F2A87E45D60AE /* JSONModelClassProperty.h */, + 799440664117950193264CD9FAE22257 /* JSONModelClassProperty.m */, + 510966428F5451128EE1BC1086B01BE4 /* JSONModelError.h */, + 69A02C9C6C41A6BD55909C0958CE6ED2 /* JSONModelError.m */, + E3DF9AC48121A71DF66F2AF611AAF2F7 /* JSONModelLib.h */, + 887E4A760843250FA8EF25C97F1326EE /* JSONValueTransformer.h */, + 8D7697DD5DF625D58F6CE57BB14C297D /* JSONValueTransformer.m */, + 719001D7729D536BCD7B51136DF94723 /* Support Files */, + ); + name = JSONModel; + path = JSONModel; + sourceTree = ""; + }; + EBFBE77ECE4B10793B3468FAF56DBBA4 /* standard */ = { + isa = PBXGroup; + children = ( + BC871066179BE447E2CA99B04F8E4628 /* FMDatabase.h */, + 5BAAD8495FF0A8451A4093707288E6E7 /* FMDatabase.m */, + 91706C8AD7E45476FC3B6520045F128A /* FMDatabaseAdditions.h */, + 8E524E96BB42E41C1895212420B58739 /* FMDatabaseAdditions.m */, + 699B9450180960A7E88622DB7FFE74A1 /* FMDatabasePool.h */, + 0747D4EA06CA97B015B24FCB55985F62 /* FMDatabasePool.m */, + E70EB5BE65F087C48AD9E30596FA715F /* FMDatabaseQueue.h */, + BB64B79D1CF75BABB098326BD4EFFB24 /* FMDatabaseQueue.m */, + 769202E13791277C39A1C873BFE3BE54 /* FMDB.h */, + 2E9C7AC858653DE1292892B6992DB152 /* FMResultSet.h */, + 754FC21784F2DBFBEFD47802461F5013 /* FMResultSet.m */, + ); + name = standard; + sourceTree = ""; + }; + EF606691DCDB02BFEE9D322320F460D9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C26CFBB175279564D8DE5AA2CA29BF96 /* SecurityEnvSDK.framework */, + 6EE5AC70172636793C97057451F9977B /* UTDID.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + F13AFEA66BFC6463F672B790EAB8687A /* MBProgressHUD */ = { + isa = PBXGroup; + children = ( + 2B961506C39517250A71DF02B7976774 /* MBProgressHUD.h */, + 5352DC6B9113D89A1085F56106CFAC48 /* MBProgressHUD.m */, + 68F2009C9581183540BED36611704FF5 /* Support Files */, + ); + name = MBProgressHUD; + path = MBProgressHUD; + sourceTree = ""; + }; + F3D602A764DCE53574E30CF723A68406 /* JCore */ = { + isa = PBXGroup; + children = ( + BC4DD4E2151C8B275EAA4DD6429A3115 /* Frameworks */, + ); + name = JCore; + path = JCore; + sourceTree = ""; + }; + F45EC5986ED5CE78ACFC6C0E326C519B /* UITableView+FDTemplateLayoutCell */ = { + isa = PBXGroup; + children = ( + F8C59CE9B10ED445F854EA1D3CBB058C /* UITableView+FDIndexPathHeightCache.h */, + E62451403F39E86819BF52DB1585E9AB /* UITableView+FDIndexPathHeightCache.m */, + 646B209E896918796E000D73F622D0D7 /* UITableView+FDKeyedHeightCache.h */, + 8782A7575A373179F4E5803ADB820210 /* UITableView+FDKeyedHeightCache.m */, + 65FB9A85E34D940326FAD7F5F992BA59 /* UITableView+FDTemplateLayoutCell.h */, + 75E16078F463F9E5994EE6ACBDA099CA /* UITableView+FDTemplateLayoutCell.m */, + 9D6A9FBDA969B9C0A17DD37367C7D458 /* UITableView+FDTemplateLayoutCellDebug.h */, + E68B3DC05BD9D790DEAAA27A5658A735 /* UITableView+FDTemplateLayoutCellDebug.m */, + E6595B098F2A715892C61B0D382537FE /* Support Files */, + ); + name = "UITableView+FDTemplateLayoutCell"; + path = "UITableView+FDTemplateLayoutCell"; + sourceTree = ""; + }; + FA08407EF0A6C8AA6F453FE650E86FD6 /* Toast */ = { + isa = PBXGroup; + children = ( + 5F082F6A417E526857C5FA44E9DBA532 /* Toast.h */, + DB5725EAA2D37D63C8B3216CCA38202F /* UIView+Toast.h */, + 620646C69C1CD1C0CE91F1E26462E3E8 /* UIView+Toast.m */, + D5063F5D551F8AAC0A5E1FF2C1B68FEF /* Support Files */, + ); + name = Toast; + path = Toast; + sourceTree = ""; + }; + FA3A8693095DA251CF2001C89183CAF2 /* UMCCommon */ = { + isa = PBXGroup; + children = ( + 03CF47B3D75C108E16CDBD53851FD32B /* Frameworks */, + ); + name = UMCCommon; + path = UMCCommon; + sourceTree = ""; + }; + FAC611D3CC8C82271A18828A6D992A3F /* SDWebImage */ = { + isa = PBXGroup; + children = ( + 19C95B1B0C9B462099454E2E50E0D4DD /* Core */, + A7B0DB21178E5111685EBCA258735A60 /* Support Files */, + ); + name = SDWebImage; + path = SDWebImage; + sourceTree = ""; + }; FBB949B909D1BC7355CE4C96A365A607 /* Pods-GIGA */ = { isa = PBXGroup; children = ( @@ -2065,357 +3558,556 @@ path = "Target Support Files/Pods-GIGA"; sourceTree = ""; }; - FBDA7C8860678A5E3250E18D9655919E /* Bugly */ = { + FF75B8F982F5A9CD1AFF5DE09D307B16 /* Support Files */ = { isa = PBXGroup; children = ( - 4BC5DD01B88C70485C05DCF48B936BD1 /* Frameworks */, - ); - name = Bugly; - path = Bugly; - sourceTree = ""; - }; - FCCB57F67790368B6E845405EBA032D6 /* Resources */ = { - isa = PBXGroup; - children = ( - 3AB36856959C85924D590AFD2695D2B6 /* MJRefresh.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - FF13C69FA758102BC163770F349C96CA /* Support Files */ = { - isa = PBXGroup; - children = ( - B9995F667229F5D1A39B33E48EA6FCD5 /* Info.plist */, - C35DDEF1EDC8880803553CEF5DDDCA6A /* SDWebImage.modulemap */, - D9BDB47A250C4BB9FE058D907EC81077 /* SDWebImage.xcconfig */, - 1512D35F866701255C740BB8D89CB037 /* SDWebImage-dummy.m */, - 7C57BCFDE1C485BAE504B6F82A3BCAC0 /* SDWebImage-prefix.pch */, - 5660075EFC0AA10C221C3D12FB6522F3 /* SDWebImage-umbrella.h */, + 1698054241CF0AFCAA137F12BB563CFD /* Info.plist */, + FE9567EAD0ABEFD610EF93BDEAB89EF2 /* NJKWebViewProgress.modulemap */, + 0513E585A677A67FB93767E315B26865 /* NJKWebViewProgress.xcconfig */, + 56A248AD2B14391AA65B56084DA88713 /* NJKWebViewProgress-dummy.m */, + A00BFC9C88717D14B3A38DDBA026EC02 /* NJKWebViewProgress-prefix.pch */, + B792D8AB36054EBD45C94653B554F26F /* NJKWebViewProgress-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/SDWebImage"; + path = "../Target Support Files/NJKWebViewProgress"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 03AB14DB0235B494910320324F3BF2C2 /* Headers */ = { + 08EF78522D0C15FAC07E3DF1CA39E77C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0648973667FB537BDC3ABFA9F3AD2ED8 /* IQBarButtonItem.h in Headers */, - 85F02B2E2F922F439A12C7CBB077E8DE /* IQKeyboardManager-umbrella.h in Headers */, - 14479278EA90F38247811468ADD8EBB7 /* IQKeyboardManager.h in Headers */, - C49ED0BA3BE26C50F202C5ED5FB85573 /* IQKeyboardManagerConstants.h in Headers */, - B21C3C93DAA23B1C331B9326991CDCFC /* IQKeyboardManagerConstantsInternal.h in Headers */, - 3619E77A8EC11571EE9F32921DAC0C89 /* IQKeyboardReturnKeyHandler.h in Headers */, - 688E0882DFC8CABA02390F43178CB33F /* IQNSArray+Sort.h in Headers */, - CF4EB3350726A86BCCDF5F363C5FCE72 /* IQPreviousNextView.h in Headers */, - AAC6DB8270C474C50F5D71DE9BC73382 /* IQTextView.h in Headers */, - 99249B44D65716B5CCA0BFFD5F83062C /* IQTitleBarButtonItem.h in Headers */, - 7CF3668C8E30DA3CAB92C9C6A8B88B8F /* IQToolbar.h in Headers */, - 06FF2586AE76FBBCBF8171F98255D8CB /* IQUIScrollView+Additions.h in Headers */, - B05BDA89A18DA866355AD804B694F851 /* IQUITextFieldView+Additions.h in Headers */, - 63F5BA839B931DB6605554B6D4369A0C /* IQUIView+Hierarchy.h in Headers */, - 639A86F8EDAF569092C61103FFAEA21D /* IQUIView+IQKeyboardToolbar.h in Headers */, - 13D87E1D99CFD98771E8066E6FF832CD /* IQUIViewController+Additions.h in Headers */, + 205C539389D123F0D635AEEE94E23A57 /* MJRefresh-umbrella.h in Headers */, + 6C7D22626A2F5AD4BB1ACC02D8F10731 /* MJRefresh.h in Headers */, + 19A2D61A783C422B8828408F98E56290 /* MJRefreshAutoFooter.h in Headers */, + 2AE9F2C800AA6D4A6EDD9DB4B93DCDCF /* MJRefreshAutoGifFooter.h in Headers */, + 79E7436378404C9DD06E9F65180D62A4 /* MJRefreshAutoNormalFooter.h in Headers */, + B967DE3AFEE4C96AAB002B8095B6C7C2 /* MJRefreshAutoStateFooter.h in Headers */, + 72BA18069C0DFC671464EB497250D358 /* MJRefreshBackFooter.h in Headers */, + 1364E587347DB7B32700946C39D69836 /* MJRefreshBackGifFooter.h in Headers */, + 16145634E76498599E08EE59BF2BA9D9 /* MJRefreshBackNormalFooter.h in Headers */, + 02B6166834FDE582A7475C4D021C532A /* MJRefreshBackStateFooter.h in Headers */, + DEF65EB64591CE2D6F99463627951710 /* MJRefreshComponent.h in Headers */, + 57F9EB19DF46EC2590C8B10DB89D146E /* MJRefreshConst.h in Headers */, + 62E84F67014328D5ED1B0F65775CDDFA /* MJRefreshFooter.h in Headers */, + 7FC1CEA91F90834F660AA84E603B37AD /* MJRefreshGifHeader.h in Headers */, + 370474488F17310C2E917826EE8B93FB /* MJRefreshHeader.h in Headers */, + 366A0A2B7CC87D039FD802C7FF82BEE7 /* MJRefreshNormalHeader.h in Headers */, + 7F9B9007891D36363BE6BE0CB08C1006 /* MJRefreshStateHeader.h in Headers */, + 04E5A6920974A68B2D15090CBE56D58B /* NSBundle+MJRefresh.h in Headers */, + 35CCA902DF0D8C0AB9C3A7C8AF4FD40D /* UIScrollView+MJExtension.h in Headers */, + 7203872DAF858D609912A7D0F768FEAF /* UIScrollView+MJRefresh.h in Headers */, + B356C813D009D8F48B49B93F970B1F1B /* UIView+MJExtension.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1D0B0A5525CB3F57F2D64B587D880D88 /* Headers */ = { + 14A114006D608BC38C8DC73EB1C0D6A9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D820DE54D6E9E5C85E0F9BF8A399E5EF /* MJRefresh-umbrella.h in Headers */, - 35D685CF7C6F73A65AD3DD99674CA78F /* MJRefresh.h in Headers */, - D9F2BA4D713DAC2A85CB4A453240EA3E /* MJRefreshAutoFooter.h in Headers */, - D0E7D5B865722A25EC7D91B0FAD8A6CD /* MJRefreshAutoGifFooter.h in Headers */, - A5382D3EA98D2EB1AD9EDA5F2138F00D /* MJRefreshAutoNormalFooter.h in Headers */, - BA0711638621C2A47AABFF9E03546893 /* MJRefreshAutoStateFooter.h in Headers */, - B02D91E02099D3C6A2F988C766032176 /* MJRefreshBackFooter.h in Headers */, - 2CEA12D52F3F7AC0669C99A157E19F62 /* MJRefreshBackGifFooter.h in Headers */, - 17F033046E658F3BFD0011DCB768CF54 /* MJRefreshBackNormalFooter.h in Headers */, - 1ED505CC385A149F4DF8F4B94BA4FC0B /* MJRefreshBackStateFooter.h in Headers */, - A72D242BEF61E27D6C29092DF4666A4A /* MJRefreshComponent.h in Headers */, - EBEB72F80DCD10DEB82BF5F856D467FD /* MJRefreshConst.h in Headers */, - AA4959949A290D4B8BE1E31A890D0C80 /* MJRefreshFooter.h in Headers */, - 6A0B1A0FA7A75C861B9D401D0E8CC95E /* MJRefreshGifHeader.h in Headers */, - 71F6D96E3AEAA07389F37E2C4B63C4F6 /* MJRefreshHeader.h in Headers */, - 7942D242D079A5710A72B659A54D7E26 /* MJRefreshNormalHeader.h in Headers */, - BDB33C3708110C6D755175D1F0A2A70B /* MJRefreshStateHeader.h in Headers */, - 58E6E68D10EF3D64522BD267CC1761A6 /* NSBundle+MJRefresh.h in Headers */, - D02DEBC241C24DEEFDA13C355197A2FB /* UIScrollView+MJExtension.h in Headers */, - 0EFB524EFDF2F8712A2F5067817A672E /* UIScrollView+MJRefresh.h in Headers */, - DE17E4C2C6EADE5D2D531268B1695405 /* UIView+MJExtension.h in Headers */, + 5DCE79860316F17CCE26AF562BCA3525 /* TTTAttributedLabel-umbrella.h in Headers */, + 3E0D1BB53D02E6ADB21C370D47D9B168 /* TTTAttributedLabel.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3D1D3FD07EADAAA80F00A5970E4DE970 /* Headers */ = { + 24EBD299F8226CCCC3C89491618DC96B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3463AED0AFF441E7AE64C5818A235DEE /* YTKKeyValueStore-umbrella.h in Headers */, - 0BD29DA68F0ECBAED7316565DCA70D64 /* YTKKeyValueStore.h in Headers */, + AF51B418D6CA69E02289049555F67643 /* SocketRocket-umbrella.h in Headers */, + 285F87D7309720285EE5B833E7CBE178 /* SocketRocket.h in Headers */, + A8BED069847BB22DD090490591F7866D /* SRWebSocket.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3D2A080C5CD4ED4520C6AEFA1D6BA26F /* Headers */ = { + 2DAC78716B7A0D53FBF1A775848691BB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F11FAB91014130EE233A3429439D38D7 /* FMDatabase.h in Headers */, - A548833BE5FAD40830428F36E77D0F52 /* FMDatabaseAdditions.h in Headers */, - 9B8D84996694C541CD3434386E0A081A /* FMDatabasePool.h in Headers */, - 22554065FA07F1BFE5308A685394CB12 /* FMDatabaseQueue.h in Headers */, - 96E70B43FC04BC99AED1BBD4FB1D7581 /* FMDB-umbrella.h in Headers */, - CCB74062CE0F4B8E5B7483599BC398DA /* FMDB.h in Headers */, - 3E43906B70EB01C06F3AE17008B853B9 /* FMResultSet.h in Headers */, + DEDB1DD346377084D9B12D417486A181 /* JSONAPI.h in Headers */, + DCF4C6F43EB2CCAEDB4A876433C05ABB /* JSONHTTPClient.h in Headers */, + 34F0205A2E04BEAAA6F8B7CBE41795EB /* JSONKeyMapper.h in Headers */, + B0BC6259F0382D9773B8E654F3E97F42 /* JSONModel+networking.h in Headers */, + 8A7F22AF5C3F93AC58731C00D8E07BE9 /* JSONModel-umbrella.h in Headers */, + E448D5FB85442D010DC68FFDA2DE571E /* JSONModel.h in Headers */, + A8292B18F5B9B0B87ADAA9B6823220EC /* JSONModelClassProperty.h in Headers */, + 1A780116BE09EB8EB8DB5392E7F60ED8 /* JSONModelError.h in Headers */, + DB396C0846C4080C0DEBDBA030980E4F /* JSONModelLib.h in Headers */, + 214C23C38D39C303E219473D10E44D5B /* JSONValueTransformer.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 407CE9FF1A14D66AD1FE967456A950E9 /* Headers */ = { + 43EA16CA5146E94EE36F7C8DAD6F1FAB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9701C0D167F477E53632D1A8FBDF6556 /* Socket.IO-Client-Swift-umbrella.h in Headers */, + 9FD7C5B0DE582DABA9DF2E876F742F12 /* UITableView+FDIndexPathHeightCache.h in Headers */, + 64E810DA08A8065ECF004562FBC5E29C /* UITableView+FDKeyedHeightCache.h in Headers */, + E320DEC88139DC89A673C8150F6A1169 /* UITableView+FDTemplateLayoutCell-umbrella.h in Headers */, + AB3A971D4A2FEEAE70D027F3C4715B14 /* UITableView+FDTemplateLayoutCell.h in Headers */, + 2773072CB44B9803154BCC53D116606E /* UITableView+FDTemplateLayoutCellDebug.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 437E0B8BDA100834FD20877E5FCDC59D /* Headers */ = { + 45F8EDB81B405B9AF3E3CCB4B59ABD97 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4AA21F40697CB42D7D219ACEDE4FBFCF /* AFAutoPurgingImageCache.h in Headers */, - 9898B13B5771AC304E096319E72F8098 /* AFCompatibilityMacros.h in Headers */, - B086C8017A694E281B3F30DCCE8FA588 /* AFHTTPSessionManager.h in Headers */, - F54879EEAE223E90AC9674197E6B1ADE /* AFImageDownloader.h in Headers */, - 9AC1064802A4D107353A87F2B4A963B0 /* AFNetworkActivityIndicatorManager.h in Headers */, - 5BFE1CC79F693B6218B419AE50B2070E /* AFNetworking-umbrella.h in Headers */, - 3DDB894364CEC991E61B04E9036D6D54 /* AFNetworking.h in Headers */, - 8D9636C74777C684BDF312EE66F8A585 /* AFNetworkReachabilityManager.h in Headers */, - 04F3BBE71B24770E40CC66A993AD85D1 /* AFSecurityPolicy.h in Headers */, - F26CD9A1DF452688BF3C98BBA9090F92 /* AFURLRequestSerialization.h in Headers */, - CA0D37AE5433954573D3E37771CDDBFA /* AFURLResponseSerialization.h in Headers */, - C12BAA822391D670C53FF0C2299654AD /* AFURLSessionManager.h in Headers */, - AD868043328B2125E27A5DC14D11958F /* UIActivityIndicatorView+AFNetworking.h in Headers */, - 0ACBBA158F4635FAE16AB5456ABADCA4 /* UIButton+AFNetworking.h in Headers */, - F1199E40BF416FC1ACA2DDCD7B2E23A1 /* UIImage+AFNetworking.h in Headers */, - A5B069CA1170E03891AC5648DE5CF87D /* UIImageView+AFNetworking.h in Headers */, - ADD011E9ABBD96D70AAA32A4B9ACBD02 /* UIKit+AFNetworking.h in Headers */, - 63BA6FBA10304F4828DE97C0FA63ED9D /* UIProgressView+AFNetworking.h in Headers */, - 86EA527BA1862E06A8E19E0960C66E7E /* UIRefreshControl+AFNetworking.h in Headers */, - 15F6265FCE0955CDB4967F7306407D67 /* UIWebView+AFNetworking.h in Headers */, + 59F1F34EC8668D299B1A1BEA3AD51A98 /* MASCompositeConstraint.h in Headers */, + EC276D99797A5947F84D1AB0BDD5B215 /* MASConstraint+Private.h in Headers */, + 03E6C18745D7D3CFAD4F513DE97B954B /* MASConstraint.h in Headers */, + D9561A7C99AD978BA82BEC10C9DFCE04 /* MASConstraintMaker.h in Headers */, + 50FADD0D1A73B1AD065B54A6355CAA06 /* MASLayoutConstraint.h in Headers */, + F53E3A2A1B6B94BF66E65E3A048C6769 /* Masonry-umbrella.h in Headers */, + 61D6D891F5267AB65CD97EC2C0D4BA9C /* Masonry.h in Headers */, + F1F7EA0A021AF4A11E1C1D221186B378 /* MASUtilities.h in Headers */, + CAD12EC4165B2CC0B80A5E7168037F4B /* MASViewAttribute.h in Headers */, + 24AA095821D4A1EE5818A0374DFCD08B /* MASViewConstraint.h in Headers */, + 892469602EA886064AC260E8CC7E6657 /* NSArray+MASAdditions.h in Headers */, + 9DF1CD6D437EF1F3334EF52497102528 /* NSArray+MASShorthandAdditions.h in Headers */, + C0E60F0CEF08F6B87CA7E77161017610 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */, + 4A3DD37ABD9A5758C3BE31E8B1CF7B29 /* View+MASAdditions.h in Headers */, + 0CB26840B2CD2CDB40F8A29A935233E3 /* View+MASShorthandAdditions.h in Headers */, + C7F8E19DF007724D472F873813DC9EF8 /* ViewController+MASAdditions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4564ABBA1717987BB224F78BEAEA3C8C /* Headers */ = { + 6A3730888CECDE03B9F31330042A968D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1F150FE6E6E8D78C6DBBA7870EA8E4C4 /* UITableView+FDIndexPathHeightCache.h in Headers */, - 7072311B8847A2004F9C31069CC00E19 /* UITableView+FDKeyedHeightCache.h in Headers */, - 5C33A1FFCCF56C70F3BEF5C8A478712B /* UITableView+FDTemplateLayoutCell-umbrella.h in Headers */, - 511F4CF798D6A4A3688B6BB842C48D87 /* UITableView+FDTemplateLayoutCell.h in Headers */, - 53DB4048614C4483D678AF52930E9ECD /* UITableView+FDTemplateLayoutCellDebug.h in Headers */, + D9C4FC1FC90DA4C70E5E5FB5968750EC /* YTKKeyValueStore-umbrella.h in Headers */, + F0899E97EF9D85A2C56087BE042E45BD /* YTKKeyValueStore.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 512E6EE9FA761557E8CCF9BF26270143 /* Headers */ = { + 6C0F6E8F8879BF42CE9EA904AF1DFFDA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3DF9076C816AE6338CE95412E588DF54 /* Pods-GIGA-umbrella.h in Headers */, + 7CFCFA61CBF6F981CC10E6E0BC721EB6 /* LBXScan-umbrella.h in Headers */, + D36031FEBCF5916ECA0D681A02744797 /* LBXScanTypes.h in Headers */, + D18E5833140D36B4ACB8D2E2294D572B /* LBXZXCapture.h in Headers */, + 353382B8A15BC55300955FA0C1A10F9E /* LBXZXCaptureDelegate.h in Headers */, + D4E228FF3530F2D0D93071C496E1C8EB /* ZXAbstractDoCoMoResultParser.h in Headers */, + E47B8081CBDDA46D2F0A570DB0572A39 /* ZXAbstractExpandedDecoder.h in Headers */, + C9D84AB1705FF017CF7E53F4487E0B54 /* ZXAbstractRSSReader.h in Headers */, + EC0F5152CA743490D954C6FD10064F23 /* ZXAddressBookAUResultParser.h in Headers */, + EF75902B18FB401741AF57D2C8DE97EF /* ZXAddressBookDoCoMoResultParser.h in Headers */, + C6360B9860ED4C41DB4A827A54727BF4 /* ZXAddressBookParsedResult.h in Headers */, + CE87FC34E6E0A23CE7CBCE0A7DF5AD27 /* ZXAI013103decoder.h in Headers */, + 652DD457D846BA54808C1055274952E3 /* ZXAI01320xDecoder.h in Headers */, + 8015903E7E555F98A830619D2AC1DF61 /* ZXAI01392xDecoder.h in Headers */, + 1EB34504AD478844B411493E8FA20D35 /* ZXAI01393xDecoder.h in Headers */, + 65DADB71E21ADB8D8773FFCA6C5F894C /* ZXAI013x0x1xDecoder.h in Headers */, + 36071DB4475017296E5FBFF079DF15F0 /* ZXAI013x0xDecoder.h in Headers */, + 198F0E09657C9C552FE73EB1F1CFA59C /* ZXAI01AndOtherAIs.h in Headers */, + CF432BE06535C2F8B8B33208FF3EE8D0 /* ZXAI01decoder.h in Headers */, + 72C40E38C6C9FB70748E321E6FA762AA /* ZXAI01weightDecoder.h in Headers */, + CE6DD415935ABD034C2AD2C7A500AA49 /* ZXAnyAIDecoder.h in Headers */, + BC9A9AF774231ABA862240CBA53C30BE /* ZXAztecBinaryShiftToken.h in Headers */, + F5485D59518D671416CA6384506B9357 /* ZXAztecCode.h in Headers */, + 9207565E4E52520A01455E5942995436 /* ZXAztecDecoder.h in Headers */, + A8F21793321B84AF27401100BEA8C7F3 /* ZXAztecDetector.h in Headers */, + B875BBAA4920C609184A00E0C79EA587 /* ZXAztecDetectorResult.h in Headers */, + 810F48991446EA207F68868C4ACCD792 /* ZXAztecEncoder.h in Headers */, + 6125E8F17E06CCA90FF36B813FF2C391 /* ZXAztecHighLevelEncoder.h in Headers */, + ECB10E82B16BC43A414F07DD978D2E33 /* ZXAztecReader.h in Headers */, + 995AF3D2E1623BB1C830ACD3ADF94B53 /* ZXAztecSimpleToken.h in Headers */, + 87A12972098BD298D80E4C38D94ADBBC /* ZXAztecState.h in Headers */, + 8110B70A3F793DA048829BF8DA69CF8D /* ZXAztecToken.h in Headers */, + F9907950B02A484F2A05246D7645DFC6 /* ZXAztecWriter.h in Headers */, + 85B4CF741E31A20063B1C55E38636946 /* ZXBarcodeFormat.h in Headers */, + 4D13DF22DDA3666F96593A596958AA04 /* ZXBinarizer.h in Headers */, + C77BD460EB1F294707DE9365F2BDA7C2 /* ZXBinaryBitmap.h in Headers */, + 665525DD9D8732957752E545B70A9FC3 /* ZXBitArray.h in Headers */, + BFE2AEFE879A355E8856CE2B661834B7 /* ZXBitArrayBuilder.h in Headers */, + A63D580A2AE9F878C81EC893391C03D9 /* ZXBitMatrix.h in Headers */, + 7501331A8CC6BA0792A027098D7C7D84 /* ZXBitSource.h in Headers */, + E780ECCA359E00B11FE6D4F5F94AE3AA /* ZXBizcardResultParser.h in Headers */, + 230924929DCBF1E60EABEF40EF42D76A /* ZXBookmarkDoCoMoResultParser.h in Headers */, + 3E0ED290E658DACA30B3A07C3962D076 /* ZXBoolArray.h in Headers */, + B6D4958A10D36D6DE6C3064FAD9C1E62 /* ZXByQuadrantReader.h in Headers */, + A53C63209FFAC17790D496BDF3DEE8C5 /* ZXByteArray.h in Headers */, + 978176645791C5EE19D0CF1EBDCE7EBC /* ZXByteMatrix.h in Headers */, + ED0E54165F2CD68DF828A45E198649E6 /* ZXCalendarParsedResult.h in Headers */, + 39980DE3500CE06CDAFAC40535CFAE34 /* ZXCapture.h in Headers */, + 0E1E4648395AA2EE20A6BD675FFF730F /* ZXCaptureDelegate.h in Headers */, + 8DFF09A9785F9698D17C6D4C6186D8F2 /* ZXCGImageLuminanceSource.h in Headers */, + E5DA44E33C8FDB20824D27592C41FE08 /* ZXCharacterSetECI.h in Headers */, + E9C6A13686CEA7217767CE7ACCFEE249 /* ZXCodaBarReader.h in Headers */, + 06449B8E96058AB3611908712D4B0B67 /* ZXCodaBarWriter.h in Headers */, + 28D2310906C377A77FED98D3AE53E5F8 /* ZXCode128Reader.h in Headers */, + 458CD0F434FE0520CE60FED6A898E456 /* ZXCode128Writer.h in Headers */, + EF75D2BC8ABF049BD048E7C9F32DBAE6 /* ZXCode39Reader.h in Headers */, + B1086F6175428C794D7885D05B5DC67B /* ZXCode39Writer.h in Headers */, + CF86E1636C529E6A1B07099ED5BC622A /* ZXCode93Reader.h in Headers */, + 4E9827F96977E8027A84D7FADDE1A691 /* ZXDataMatrixASCIIEncoder.h in Headers */, + 9914AB5DEFBF7E15AF7C839BB33624BE /* ZXDataMatrixBase256Encoder.h in Headers */, + CE457BC7DB6F028124F7598E6D12616C /* ZXDataMatrixBitMatrixParser.h in Headers */, + 7B24431E7D430962537DE32F9254AFDE /* ZXDataMatrixC40Encoder.h in Headers */, + 9D03F88A2FCB4756458FA96EF4597A5B /* ZXDataMatrixDataBlock.h in Headers */, + B567C8B61C580DE6ECE316D7B8D4FC18 /* ZXDataMatrixDecodedBitStreamParser.h in Headers */, + 34A98C5A04E3CCD0550105051C104293 /* ZXDataMatrixDecoder.h in Headers */, + F3411A3199EF156A6FA8410E2AFBD498 /* ZXDataMatrixDefaultPlacement.h in Headers */, + C7DC9250FDAFF2AC8BE2012278130782 /* ZXDataMatrixDetector.h in Headers */, + C580FB79966082342B33F478A38FAB90 /* ZXDataMatrixEdifactEncoder.h in Headers */, + DD27850C6E34681F6704C854510A7866 /* ZXDataMatrixEncoder.h in Headers */, + 3B46B3F978B488C190FAE610705F3FF7 /* ZXDataMatrixEncoderContext.h in Headers */, + 27174122CB2EBE83E32C989DEB4ADA83 /* ZXDataMatrixErrorCorrection.h in Headers */, + 31D80FC5690380187E4AFF7648EE5425 /* ZXDataMatrixHighLevelEncoder.h in Headers */, + 171711D1CDAE0951DCFDC5F367F840E1 /* ZXDataMatrixReader.h in Headers */, + 83E8C5AAACBA4CF4C6FB8F1CD058572B /* ZXDataMatrixSymbolInfo.h in Headers */, + CFFF3CB7FAE91A7DCF44A1C79C7B7AFA /* ZXDataMatrixSymbolInfo144.h in Headers */, + 998920581E9575A82CF6ACBDA4D3F456 /* ZXDataMatrixTextEncoder.h in Headers */, + 5F8322FD7820C499B005750A0A718268 /* ZXDataMatrixVersion.h in Headers */, + 854CFE1942538CB9CB69B7F1E02DDCCD /* ZXDataMatrixWriter.h in Headers */, + C6F66FEEE41420FE8BF1FE589B3C2B9D /* ZXDataMatrixX12Encoder.h in Headers */, + D0E386A9C252107265EC2702F4E40637 /* ZXDecodeHints.h in Headers */, + A8B01631D7088E712E9DCB62A6D874AD /* ZXDecoderResult.h in Headers */, + 4DC714615E227A05423BCA5BE6E20724 /* ZXDefaultGridSampler.h in Headers */, + 0B447317E02FA0A300B5FA7D81F8AC7F /* ZXDetectorResult.h in Headers */, + 983CBB3E64EDB753A4E1847BE402E047 /* ZXDimension.h in Headers */, + 090E3CAF933E0D6BEE6AD4675C1EDE0D /* ZXEAN13Reader.h in Headers */, + F8304A21D9A946D5427654E384E43549 /* ZXEAN13Writer.h in Headers */, + 19BDAF08A2C2ECB1CEF7CE715AAE4B1A /* ZXEAN8Reader.h in Headers */, + 6B8EB985AF975FC44766B9B8F1547A7E /* ZXEAN8Writer.h in Headers */, + E771FD3B4BE7F1EFEAE39B65A534D330 /* ZXEANManufacturerOrgSupport.h in Headers */, + 8118B720743D3A2337D2DA590C4F3EAC /* ZXEmailAddressParsedResult.h in Headers */, + 49F39244472E3F1C35DD8F20F6F8DA93 /* ZXEmailAddressResultParser.h in Headers */, + FD43E2938AA74FFAEF5D8586F123633E /* ZXEmailDoCoMoResultParser.h in Headers */, + 7039F1721793FD779E8F0FCD9FFAEC9B /* ZXEncodeHints.h in Headers */, + 41EDB9B21D399EF4D91634C25BB355F5 /* ZXErrors.h in Headers */, + 53CA2F6F5F2EB2EB3087A54CC995C197 /* ZXExpandedProductParsedResult.h in Headers */, + 969B62532328DD39915FACFAAB9C6D1E /* ZXExpandedProductResultParser.h in Headers */, + 85FE0DAA3E520C16E1226D70E669B4BB /* ZXGenericGF.h in Headers */, + C2E5BD6F57260D7EAFBA4B813B3229D5 /* ZXGenericGFPoly.h in Headers */, + 99598FB51E665B6DDB29E8179D3A1810 /* ZXGenericMultipleBarcodeReader.h in Headers */, + 7D8F048F485B282CB394D7859777E936 /* ZXGeoParsedResult.h in Headers */, + FDE10165B2A62756247FD9DA4503D9BD /* ZXGeoResultParser.h in Headers */, + 78237EC071053B70E167AA5F6F7E4B5C /* ZXGlobalHistogramBinarizer.h in Headers */, + 5B017C612744851F41FA4261F0B26E0D /* ZXGridSampler.h in Headers */, + 6945F694ED4434FCC48B8103E638FF82 /* ZXHybridBinarizer.h in Headers */, + 0F99D58A41F6E2CFB2BC108CEC770370 /* ZXImage.h in Headers */, + B048FC5DC10A524F4B3B161FFB89BC80 /* ZXingObjC.h in Headers */, + 51A1474D2305AFE9957BB88DADBF9542 /* ZXingObjCAztec.h in Headers */, + 4C9238620CC162EFBDC1C10415DD3251 /* ZXingObjCCore.h in Headers */, + A594BCF59DC413D1B30E4DA2397E16C6 /* ZXingObjCDataMatrix.h in Headers */, + 9A7E04EB36EE6CC1C1F5FA01C7F58A38 /* ZXingObjCMaxiCode.h in Headers */, + E2CA09BB1F7A39C81FB4D8132B92A359 /* ZXingObjCOneD.h in Headers */, + D1D0715E329BA90B3506296254E0D5EE /* ZXingObjCPDF417.h in Headers */, + 2AE5FBA24F046F9157DBC6C3B665AC48 /* ZXingObjCQRCode.h in Headers */, + 2360B94E2E9E3595867AC8A477B15720 /* ZXingWrapper.h in Headers */, + F87FADD74353A77EE8D4138D8D048776 /* ZXIntArray.h in Headers */, + 02521F17C82FFDB7F52E26C8AFB6C37E /* ZXInvertedLuminanceSource.h in Headers */, + 8A9EDE9E5548FB6CB498F4EF0798BDC9 /* ZXISBNParsedResult.h in Headers */, + D4ACEE90357C31D4BF1CB0AD8B5B6A69 /* ZXISBNResultParser.h in Headers */, + 2208BCA0C2F2F769772F02F22CDD7F20 /* ZXITFReader.h in Headers */, + A13A40DF733172D83C500531D3D5F240 /* ZXITFWriter.h in Headers */, + F396A2DD2B4E525CE65223F308CBE755 /* ZXLuminanceSource.h in Headers */, + 4B8C563476E17D29285485F08593303C /* ZXMathUtils.h in Headers */, + 30EE20E459F1CC664E8F9DDBF372A862 /* ZXMaxiCodeBitMatrixParser.h in Headers */, + 8712536831207386FCEB0E9D2828AE1A /* ZXMaxiCodeDecodedBitStreamParser.h in Headers */, + DEDD37470134675ED4F8EC518554E5D2 /* ZXMaxiCodeDecoder.h in Headers */, + F3828E4AE119C25F440502A955636D95 /* ZXMaxiCodeReader.h in Headers */, + 46AAD136547C5FE0EBD8D2AF03DBD85D /* ZXModulusGF.h in Headers */, + F1060140AE84EB6DC294469065230715 /* ZXModulusPoly.h in Headers */, + A7B140E5D1B2CDFD09CAE5543BAFE58F /* ZXMonochromeRectangleDetector.h in Headers */, + 070C04B3F141B19F8475CE84919DC2B2 /* ZXMultiDetector.h in Headers */, + FAB04BE86174037AD5E9B3A8F55F537F /* ZXMultiFinderPatternFinder.h in Headers */, + BF577D8B4EBAB796C0B5142B9FA156BB /* ZXMultiFormatOneDReader.h in Headers */, + 8AC178C448C151C5ED62AC26BF3B8A16 /* ZXMultiFormatReader.h in Headers */, + EE58BB78F1C469E67F8A0366B591A129 /* ZXMultiFormatUPCEANReader.h in Headers */, + 108E59FD1C171794D94F1323B27AFFB8 /* ZXMultiFormatWriter.h in Headers */, + 6CB5C888731E5142C50219D52CB274B8 /* ZXMultipleBarcodeReader.h in Headers */, + D70B98DD3417421F2D3181551B71657C /* ZXOneDimensionalCodeWriter.h in Headers */, + D8FCF9663CA5C3BFD4744B218B33CAD6 /* ZXOneDReader.h in Headers */, + DDE3AC7CA17A63B15423F7A4A31AEAE6 /* ZXParsedResult.h in Headers */, + CA4565F8CB9E78C5CB1B6E33D9B99E6C /* ZXParsedResultType.h in Headers */, + F3B0CDDB431A0EC25F89BBFCED02400A /* ZXPDF417.h in Headers */, + 61C25E571726F566B4F41925B1639B1B /* ZXPDF417BarcodeMatrix.h in Headers */, + 85CEA85437A5D1E053C8E87E8D20A7D6 /* ZXPDF417BarcodeMetadata.h in Headers */, + 573DC1A247FBBCAF3FC01660F8106F63 /* ZXPDF417BarcodeRow.h in Headers */, + 8D430944975FEA87A7EC8EAF6D7B6CA5 /* ZXPDF417BarcodeValue.h in Headers */, + 59141E4AF3C48506B14EF66658CF8010 /* ZXPDF417BoundingBox.h in Headers */, + 4F3E95C9C9604AECDDB0CFFC01266FD8 /* ZXPDF417Codeword.h in Headers */, + D815E654A01B0ACE0EE7E13D35EC3C16 /* ZXPDF417CodewordDecoder.h in Headers */, + 2461DF35C69570CD2CEEB7CA9FB4537C /* ZXPDF417Common.h in Headers */, + 12BAC1DCF612652DDA3E854EEA852CF4 /* ZXPDF417DecodedBitStreamParser.h in Headers */, + 8E196440D023F4F7A14CD043E6E39B2F /* ZXPDF417DetectionResult.h in Headers */, + AD476A94E27AE0827B306750F8463484 /* ZXPDF417DetectionResultColumn.h in Headers */, + 51CF6F14BAF9060B3A36B1D49E35A87D /* ZXPDF417DetectionResultRowIndicatorColumn.h in Headers */, + EAE661E14451AB678CF9F209A8871C01 /* ZXPDF417Detector.h in Headers */, + 6577428E5885283B560FB24723385635 /* ZXPDF417DetectorResult.h in Headers */, + 05FC34C7266B4990FFD4B78DF5002EE6 /* ZXPDF417Dimensions.h in Headers */, + 6C92211130872AC5306B6528F3977BB1 /* ZXPDF417ECErrorCorrection.h in Headers */, + F5577C693F3C4420996A1D213A58E160 /* ZXPDF417ErrorCorrection.h in Headers */, + 0C887DEB9FB6D358004DD0386F4336FC /* ZXPDF417HighLevelEncoder.h in Headers */, + EEF9EAFD9C41D216358A69A9832976B5 /* ZXPDF417Reader.h in Headers */, + 20B46FA558DBDA3CBA354DEB490493E2 /* ZXPDF417ResultMetadata.h in Headers */, + 00F544FA7FC8E886BC6711FE0B7BC9C7 /* ZXPDF417ScanningDecoder.h in Headers */, + 9F586A14A643289A77792623EB34351D /* ZXPDF417Writer.h in Headers */, + 7B22DC790484F8FCA78B89722AA093D5 /* ZXPerspectiveTransform.h in Headers */, + 081D8B04B190246D6A588535911C158D /* ZXPlanarYUVLuminanceSource.h in Headers */, + 3BABAE2AD290C7FB4F10D60982216375 /* ZXProductParsedResult.h in Headers */, + B057BBC46DD61B10260D033754D68DB8 /* ZXProductResultParser.h in Headers */, + 787250A500D39DCA8F1B83D32D41A791 /* ZXQRCode.h in Headers */, + 24C0F6BA7065CEDE1F0DA91475F7B3F4 /* ZXQRCodeAlignmentPattern.h in Headers */, + 47669D92FD5B317A4C014D9EF8C4492A /* ZXQRCodeAlignmentPatternFinder.h in Headers */, + E7F72BF560B8B1A12ECC9B24A87FC0F7 /* ZXQRCodeBitMatrixParser.h in Headers */, + B47DB316417A0297987B57A85575A6D9 /* ZXQRCodeBlockPair.h in Headers */, + 71199890B26E8235C760FC10090D3067 /* ZXQRCodeDataBlock.h in Headers */, + 82353FE47D60524E4668829EEAC7F5C6 /* ZXQRCodeDataMask.h in Headers */, + 8BF472B706C0A855193BF4E9681CA708 /* ZXQRCodeDecodedBitStreamParser.h in Headers */, + CC250020A4F9D0DBC7EE2C4E73FABC32 /* ZXQRCodeDecoder.h in Headers */, + B7D315D00FB42B8A164AD9771C685413 /* ZXQRCodeDecoderMetaData.h in Headers */, + DA696CF9F3F7A6DFAE627122B09549DA /* ZXQRCodeDetector.h in Headers */, + 8DBEC830A9D524D060E2E8E3ED35A951 /* ZXQRCodeEncoder.h in Headers */, + FF6F1B87F7E92DA128CF3AB4F5EC7F6E /* ZXQRCodeErrorCorrectionLevel.h in Headers */, + 21207B9714BF03DE4145C14D777D13DE /* ZXQRCodeFinderPattern.h in Headers */, + 6946F28650C4B7F1F2422D3EA38D5F7A /* ZXQRCodeFinderPatternFinder.h in Headers */, + 12545191DFB2851D52C1ED1D93ECAF61 /* ZXQRCodeFinderPatternInfo.h in Headers */, + 04016CA14595571EAD0F42A11EF05500 /* ZXQRCodeFormatInformation.h in Headers */, + 145C8B45494D95CD3006FE30992FA4AC /* ZXQRCodeMaskUtil.h in Headers */, + 1381C87BCE649C17E9B889E0399CA179 /* ZXQRCodeMatrixUtil.h in Headers */, + DA88B3E2E47F15D2C34933AC4A737332 /* ZXQRCodeMode.h in Headers */, + 7618689D9E1E437777F947961B1DA1A8 /* ZXQRCodeMultiReader.h in Headers */, + 46BD1ED7571B2F79E80D2D1D06A48DAE /* ZXQRCodeReader.h in Headers */, + E4FC555758E18F42C78FC7911E5669BB /* ZXQRCodeVersion.h in Headers */, + 2E48D7D5AEA6A07171CB8772665D015F /* ZXQRCodeWriter.h in Headers */, + F8A7F36435DBE9032B5C003C531491EE /* ZXReader.h in Headers */, + 3725F0800362C949BC6E1152C369699B /* ZXReedSolomonDecoder.h in Headers */, + C0F3732315AAEA5E5B25E5C59D7EFBEB /* ZXReedSolomonEncoder.h in Headers */, + 4FD943A725AEFCF61694FF6082CCB49F /* ZXResult.h in Headers */, + B5394F3850868397AEB071E3FDB0B25A /* ZXResultMetadataType.h in Headers */, + 98C310C1B9961619B95A58B61CDAFBE0 /* ZXResultParser.h in Headers */, + CFC2D9694194E479075CEAE825FA71E5 /* ZXResultPoint.h in Headers */, + 693D8D1FC11728188581439826FDB667 /* ZXResultPointCallback.h in Headers */, + 96C8719A776127A45A00C28865C03DC3 /* ZXRGBLuminanceSource.h in Headers */, + DBDBBC9D0DFFAC0906128A16AA9A78B7 /* ZXRSS14Reader.h in Headers */, + 1EAD85048E5A419DD0073DFBD45484F5 /* ZXRSSDataCharacter.h in Headers */, + D1344503C30625AB5505103408AAD827 /* ZXRSSExpandedBlockParsedResult.h in Headers */, + DFB76FFA95AFB336F666B20F63C39444 /* ZXRSSExpandedCurrentParsingState.h in Headers */, + 7657FFFA92E7989B21868F397ED39D15 /* ZXRSSExpandedDecodedChar.h in Headers */, + B40BB2C83C01DB238F5617BF46D05448 /* ZXRSSExpandedDecodedInformation.h in Headers */, + FEDF18C5BE342834EEC1EAB9DE4C30DF /* ZXRSSExpandedDecodedNumeric.h in Headers */, + BABEE847D58868A5EA5DE63D535B93F8 /* ZXRSSExpandedDecodedObject.h in Headers */, + 805AF4FC4B72F7E340475144B402F0BE /* ZXRSSExpandedFieldParser.h in Headers */, + 1490DD191D19F936E6B1739559C99E1A /* ZXRSSExpandedGeneralAppIdDecoder.h in Headers */, + 0243A0672C963B169A395D176606158C /* ZXRSSExpandedPair.h in Headers */, + 20B258AEB78903EA92C8201723496832 /* ZXRSSExpandedReader.h in Headers */, + 0341E444CB2B77435FB7A0EFAEE5B63A /* ZXRSSExpandedRow.h in Headers */, + F6CC713842A0E6058D732A18EA198BBE /* ZXRSSFinderPattern.h in Headers */, + ACD04EF21E456C574AC64081F77C2B56 /* ZXRSSPair.h in Headers */, + C317DEF82E1FCC4A79E48AFB5A311CD0 /* ZXRSSUtils.h in Headers */, + AD0A818DAC472137AB3C7E273C50D83C /* ZXSMSMMSResultParser.h in Headers */, + 2C143370823B3FE6C25AC4FCD42224E0 /* ZXSMSParsedResult.h in Headers */, + 3DC0CA957A8DC38AC7DA4427355BA481 /* ZXSMSTOMMSTOResultParser.h in Headers */, + 07145249B05A14FC7A69318690965DC1 /* ZXSMTPResultParser.h in Headers */, + 076FC5CA280368A340F893AD9BF3DD05 /* ZXStringUtils.h in Headers */, + 67C8CA39AD2250B78156EA6805F1FD69 /* ZXTelParsedResult.h in Headers */, + D0742599C8727ACFB6C0AE055E5A77FB /* ZXTelResultParser.h in Headers */, + 2F90D736AF28DA96AB8544A6E8E3D986 /* ZXTextParsedResult.h in Headers */, + 2B26DD5283DB358D724503BD0760F6D6 /* ZXUPCAReader.h in Headers */, + AF4632CC7BFCF195AFEB39791DB43951 /* ZXUPCAWriter.h in Headers */, + B71FAB1EEC6F67C9CF1F2A4C4990BF4F /* ZXUPCEANExtension2Support.h in Headers */, + DF222AE51D155545CFBD73AF87A3DD2E /* ZXUPCEANExtension5Support.h in Headers */, + 32E75C107C18B1E7F82D66142E346350 /* ZXUPCEANExtensionSupport.h in Headers */, + 9824B3A87FA346E9BEF2F19983D84B3C /* ZXUPCEANReader.h in Headers */, + 39B87CDA7F6D7D4D08E0D5FF6DD59EE8 /* ZXUPCEANWriter.h in Headers */, + D3E588649DF8C08FF628D83A68781EF1 /* ZXUPCEReader.h in Headers */, + 33DCCEB071AB90BB0D6C2CBC7C888F7F /* ZXURIParsedResult.h in Headers */, + 28B04892F47BFDE49A39853C7FCCB941 /* ZXURIResultParser.h in Headers */, + 981C5A17E0DBEB54DDBFA226E911D3F3 /* ZXURLTOResultParser.h in Headers */, + 4CFFE2226B0FA9D5490DBC04C8D11B5D /* ZXVCardResultParser.h in Headers */, + CEE8A510AA8A32C8946AEB5A435DEC51 /* ZXVEventResultParser.h in Headers */, + 79FDC95E0D84CD38EB60409B8D475C1F /* ZXVINParsedResult.h in Headers */, + A712A87FAE237083DB644C0A2D6408D2 /* ZXVINResultParser.h in Headers */, + 88148FB4BEC07E6A698231644D115136 /* ZXWhiteRectangleDetector.h in Headers */, + 3043589469BB211AB39D54A0922B9D34 /* ZXWifiParsedResult.h in Headers */, + 918E3ECC0A1EAB3D10048A38522A008E /* ZXWifiResultParser.h in Headers */, + 3D767D37F0212CBCC1BF1975BEFBEBBE /* ZXWriter.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5BCF5028D69FA0C4AF14DA4074F13C7D /* Headers */ = { + 7CA1E50BD0A67FCC3C4FB663E6A7A40C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5239E6CA49837A90A08639E1E4CBB3B1 /* Toast-umbrella.h in Headers */, - 13F320C89A0757B4DBD7A1B0C47B7B46 /* Toast.h in Headers */, - 57C1171188E1A77E65C670ED986D46DD /* UIView+Toast.h in Headers */, + 37863F91F35BA4E1BC07D158BDFDBCE7 /* Starscream-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A8626284EBDE24E4BF46F02D9E3FF648 /* Headers */ = { + 8B9E0BD2CFDB58C6FF46C11A2E50A123 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 42B30C255DE8D19534405DAD5EA14C91 /* Starscream-umbrella.h in Headers */, + 15B7F5229A6BAD5ABAD72C952933FC96 /* Toast-umbrella.h in Headers */, + 9E625A2F24BD26E96CCFD7C111B00059 /* Toast.h in Headers */, + BFBAAA5BAC61F93FD61ED0470380F34E /* UIView+Toast.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - BBF7227F5BD0440E9DF598DF26EC3891 /* Headers */ = { + 93B245A713E341FB841920F7D988A4F0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4EB17293737C717D12298CFFE6A67514 /* JSONAPI.h in Headers */, - 7F66E5779B29E0BC17D565DAD7CDEC1B /* JSONHTTPClient.h in Headers */, - 58388F773008AF671CE67FE1C902E6CB /* JSONKeyMapper.h in Headers */, - E3C47E114E924D2F331F9A3F122AEE5C /* JSONModel+networking.h in Headers */, - 36E344E5B627E04368ECC96338E17F26 /* JSONModel-umbrella.h in Headers */, - 37FD169854FF4B397051998D611F152A /* JSONModel.h in Headers */, - 009C79BE88C2F4C986644CD3E0B088C2 /* JSONModelClassProperty.h in Headers */, - 2AFB0AFA2138181E162CD00669D87FE3 /* JSONModelError.h in Headers */, - 6F5906B58272E07A0850248867562581 /* JSONModelLib.h in Headers */, - DFA0B0C7EC02135911CACDAFD38BE715 /* JSONValueTransformer.h in Headers */, + E4AB135BE83CC3B34FA5AA61B1677D90 /* Socket.IO-Client-Swift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - CDCC81C5A7B82E18A00A9F9EC5474BDC /* Headers */ = { + 9A73183AFC171C4665A594820C7FCDCC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0DCFD83A6149FC0514890A5ED67047B5 /* NJKWebViewProgress-umbrella.h in Headers */, - F2EFDC17C03449A9A15E26464453103F /* NJKWebViewProgress.h in Headers */, - 7AE9484F09D29428653109D73D4FC488 /* NJKWebViewProgressView.h in Headers */, + 602342DE53F524C6C771F5201C385566 /* MBProgressHUD-umbrella.h in Headers */, + C9E5E77581A3F050A79297E916FD46F4 /* MBProgressHUD.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D015B3F3E2F85391AA3B395B5B1ADCE5 /* Headers */ = { + 9D94501107FB33B239F1452EA78770F2 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B646C96E2D7DF54445B3719F800D79E9 /* MBProgressHUD-umbrella.h in Headers */, - D206EDC84CE44D5DC711ADD087BC4B17 /* MBProgressHUD.h in Headers */, + 61F50D390689E5C9DE2E8F8DFE8C6E64 /* FMDatabase.h in Headers */, + B1A2B716293BA4783BAE4D6675390617 /* FMDatabaseAdditions.h in Headers */, + 4C9681A6187CCB4AAE3E3F5E24A375B2 /* FMDatabasePool.h in Headers */, + 9881828CC3B1296ABC3304512700E13C /* FMDatabaseQueue.h in Headers */, + DA7B73959B1A448517DECD329073FF2A /* FMDB-umbrella.h in Headers */, + 517BA94B26A0572AF4B3EE6F8429286C /* FMDB.h in Headers */, + 32DCC516E0C351A177097ADDCFD4E4B9 /* FMResultSet.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - ED8FF911FDD33A3EF0E4C647B44A922E /* Headers */ = { + A1C444B27EA52DEEEDB1EADF746DB79F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D1641F0A353E02D971A2E6C004D4D996 /* LKDB+Mapping.h in Headers */, - AC5F946DEC898FE1FE7BA74426FE6A8D /* LKDBHelper-umbrella.h in Headers */, - 0FDFFDFAF40F6A37B8911FA7C57428CB /* LKDBHelper.h in Headers */, - 6FF8739ADFFE8465389AF3F0603E6F83 /* LKDBUtils.h in Headers */, - 0AF48B0ADAD7D4F5A2CB22075A3F5FEC /* NSObject+LKDBHelper.h in Headers */, - 4985E014269593640635A8DBD75DA450 /* NSObject+LKModel.h in Headers */, + 80C5C42A0672F22AFA1FE0A00E567E07 /* NJKWebViewProgress-umbrella.h in Headers */, + 086F8F6A904E4D27500CC752AEC9E6BB /* NJKWebViewProgress.h in Headers */, + 4E0A460145219AA7F67E936CC5D0F6A5 /* NJKWebViewProgressView.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - EE5D40E224195E31FA50038B96EEA6A5 /* Headers */ = { + A8232A9E8066D44B4C2617CD1415BB23 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 271DED3D581E835D146A9B5800F50339 /* SocketRocket-umbrella.h in Headers */, - BAF4176A24E04B8CBE0FA434C1BF810B /* SocketRocket.h in Headers */, - D5153467E7A41556D6ECF2FF3627EF13 /* SRWebSocket.h in Headers */, + E6E4046CE87F092BF609E5BCA3152F68 /* NSButton+WebCache.h in Headers */, + F9F580E9A55FB9E211E73BEDC0DFE3D9 /* NSData+ImageContentType.h in Headers */, + 1357320DB65F37DAABB9F0AD9333B597 /* NSImage+WebCache.h in Headers */, + 4EC6069A0FA841B755FB769B09796E8E /* SDAnimatedImageRep.h in Headers */, + 8E5FA4446BEF13675307A5F22659BD3E /* SDImageCache.h in Headers */, + CC678FAF7BBDDBCD6ADFA76B54FA4F8A /* SDImageCacheConfig.h in Headers */, + 2382DCF8FC01E93F6B27E85CEACA58F3 /* SDWebImage-umbrella.h in Headers */, + 5413A0D9E34F9CE7CAA73261ACE2FE82 /* SDWebImageCoder.h in Headers */, + E4D49C5F309D5EBA722732930B803786 /* SDWebImageCoderHelper.h in Headers */, + DDFE46D16329A1CAFDE8E07D9F6F8084 /* SDWebImageCodersManager.h in Headers */, + 40B5A1DF320C92B95B9A544AF8A23B24 /* SDWebImageCompat.h in Headers */, + 4B90445D4D4407D3ECE08E677CA0A1A2 /* SDWebImageDownloader.h in Headers */, + 7129E11D6A0CEC203AFB749F4F1C4989 /* SDWebImageDownloaderOperation.h in Headers */, + 21A0B879F2B7F7DC79E744DD94BE2EBB /* SDWebImageFrame.h in Headers */, + DA3F72FA37B1C76AD4F113469FAD49F3 /* SDWebImageGIFCoder.h in Headers */, + ACAF9E413787547D405DACA2A235071B /* SDWebImageImageIOCoder.h in Headers */, + EAD3823EB5260D6488EB46459FCFCAFA /* SDWebImageManager.h in Headers */, + 127030075369F500A10B6A8332BBEBA8 /* SDWebImageOperation.h in Headers */, + EB2F7B1E7FAD2BA860CD74037B3E2F6A /* SDWebImagePrefetcher.h in Headers */, + 27317A36ACEA8029C3FECFEF468E28CF /* SDWebImageTransition.h in Headers */, + F58D221824568EA7E38192C619CBE122 /* UIButton+WebCache.h in Headers */, + 337BE31D38C56EA27E2A8FBD404F327C /* UIImage+ForceDecode.h in Headers */, + 3C6BC7709AECD8E1B1A179CE2A2AFB5C /* UIImage+GIF.h in Headers */, + 8047B94832CAC04D252870CD1E5AA050 /* UIImage+MultiFormat.h in Headers */, + 2AB911C03449EF10F97731AFC5C7516D /* UIImageView+HighlightedWebCache.h in Headers */, + D7C7C251D548C0A5985BA9DED9191E3B /* UIImageView+WebCache.h in Headers */, + 59E82FAD1DE511F807B85214312CB475 /* UIView+WebCache.h in Headers */, + BE5697087D711839329087D6676E4612 /* UIView+WebCacheOperation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F3E9930C736C01D12F5733EFD1F0A948 /* Headers */ = { + B5E140C985F3196798D57F2A7DB76ECD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8CD45B754192DE834B642975E85257AB /* MASCompositeConstraint.h in Headers */, - 4D4F2050654580FE1F1D5F4F82CEDDB8 /* MASConstraint+Private.h in Headers */, - C8DF22EAFFC2F81B0426E2165AC93E44 /* MASConstraint.h in Headers */, - 88DE7BAB1F4999A5F4B617F44E5FD1D3 /* MASConstraintMaker.h in Headers */, - 7C17BEA6034027310D1D205DB2008CA5 /* MASLayoutConstraint.h in Headers */, - 457ACF9150DCF9AF445B129CC9678FB6 /* Masonry-umbrella.h in Headers */, - CC8F9B4A1AC4E276EA8AA4C6F2BF3CD4 /* Masonry.h in Headers */, - 04A7D6AADAB213CE7D26F8EAD2F87536 /* MASUtilities.h in Headers */, - 636BBA734C1A17A734761D674FAE8800 /* MASViewAttribute.h in Headers */, - 091D17D5D8F832D28546A72B788CF0AE /* MASViewConstraint.h in Headers */, - C0A16E00B4BC2D88A7833D5DAED62942 /* NSArray+MASAdditions.h in Headers */, - D8B1525CB3DFCBD8E5032680530413D9 /* NSArray+MASShorthandAdditions.h in Headers */, - 0FDB2B4F75591851F0F119EAE70B3F63 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */, - 068EF598E554EC57038ACFB89CC2C47A /* View+MASAdditions.h in Headers */, - B44383A3FA435C1E986942C817339302 /* View+MASShorthandAdditions.h in Headers */, - 2854C9B1086758BD2B6681206B6759B4 /* ViewController+MASAdditions.h in Headers */, + 8AD9F8FE36978CB4348E402207950883 /* AFAutoPurgingImageCache.h in Headers */, + 3CC1558D8899A2E13A968D4C403CD793 /* AFCompatibilityMacros.h in Headers */, + 6C7C6C542448137FC3B6CEA04386780C /* AFHTTPSessionManager.h in Headers */, + 616166BD57B8707EC940068BF5E1AA0A /* AFImageDownloader.h in Headers */, + FF12B4BE37652AC565ED618C106CFE10 /* AFNetworkActivityIndicatorManager.h in Headers */, + 88A52F2DE87FAAEF79B420CC9B6BDE80 /* AFNetworking-umbrella.h in Headers */, + 9D380619079479C622272E2C77FCD289 /* AFNetworking.h in Headers */, + 66340E06FB146280E83112B966E563C3 /* AFNetworkReachabilityManager.h in Headers */, + 901790CB7729E8871AE5DE99E486792B /* AFSecurityPolicy.h in Headers */, + D491FD44351A11016A957CA81ABE0EC5 /* AFURLRequestSerialization.h in Headers */, + 2E68973739E2AE713059A22F94238C60 /* AFURLResponseSerialization.h in Headers */, + FE66EF8D47514D23E7551E2C95C765D8 /* AFURLSessionManager.h in Headers */, + D014A5430789C5F0FFCF490D53B22897 /* UIActivityIndicatorView+AFNetworking.h in Headers */, + BEE7FD5C1C06AF3670E0FB75F996DDF7 /* UIButton+AFNetworking.h in Headers */, + 78F5D40D5B8E9FC40FB257953EA945BA /* UIImage+AFNetworking.h in Headers */, + F2D2FE3B9DB1610D8EFAB393A3412DB7 /* UIImageView+AFNetworking.h in Headers */, + A39E1924915C53C49E7220F72AD96BBB /* UIKit+AFNetworking.h in Headers */, + FCB209DFAFF4721A4AA51197AB2D7016 /* UIProgressView+AFNetworking.h in Headers */, + 15304B6383EF69EC4E3DE45F8613BE2E /* UIRefreshControl+AFNetworking.h in Headers */, + CB633AF10D27AD0971F3E34470B0BB01 /* UIWebView+AFNetworking.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F94C73A9196403C827ADA2B7D78833DE /* Headers */ = { + C002A6889B142EED06FCC84E3652D9DD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1C22674A488487F3510ED9E6C484C937 /* TTTAttributedLabel-umbrella.h in Headers */, - A6CED0722D83F40F3462956E04841AC8 /* TTTAttributedLabel.h in Headers */, + 5CD86742903D65F3E643EC7E18DE9F3B /* Pods-GIGA-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - FEC5DE9A4AF76643C746A6BC541B1999 /* Headers */ = { + CDD89AE2B5E03B80EF60EB95DE649BE9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8DEFF8A97422F8839254684CE8C88F4E /* NSButton+WebCache.h in Headers */, - 5F6ABD27328146E613415A59A1521EB6 /* NSData+ImageContentType.h in Headers */, - C25A6DEF8B9F5859BF6E8FACD53F88BB /* NSImage+WebCache.h in Headers */, - EF09BB047F4238F812F93E5FA7F31E0E /* SDAnimatedImageRep.h in Headers */, - 80C7997C4D60D2103A63AAE65EA63C8B /* SDImageCache.h in Headers */, - 17E52896A3ABBD4CCAB35046E48BE055 /* SDImageCacheConfig.h in Headers */, - 790B528109D306DAF9105F80D932F218 /* SDWebImage-umbrella.h in Headers */, - CB52B7EF0160C5FC511C13D7E6D2A8B7 /* SDWebImageCoder.h in Headers */, - DDEA8BEE980D9DD7E9E746DFEAB726E4 /* SDWebImageCoderHelper.h in Headers */, - FA1282B06560C854E5FD9022B8429FFC /* SDWebImageCodersManager.h in Headers */, - 4B2CCAA899BA00D1D49EC70C0BCF57BF /* SDWebImageCompat.h in Headers */, - 7B7402278FE9063BB449B30F22B09DF7 /* SDWebImageDownloader.h in Headers */, - E82DEF0A70F9ABCC6EAA900B9BA3AB16 /* SDWebImageDownloaderOperation.h in Headers */, - 206E174869FE4C5679DC9EFADE9FDC0E /* SDWebImageFrame.h in Headers */, - E023B49FEB84BA9DC22FBB8CC7B348FD /* SDWebImageGIFCoder.h in Headers */, - 4A712D32646F119F208BBA3D2A7C0672 /* SDWebImageImageIOCoder.h in Headers */, - EEDE8B3B8AF5A20C039DB6F1DD25BCC6 /* SDWebImageManager.h in Headers */, - 16AB19AD78FA194D0ED3A8EBE7A347FB /* SDWebImageOperation.h in Headers */, - 7BD298BE626433E40A97797DFBF271A8 /* SDWebImagePrefetcher.h in Headers */, - 87C7C6E2F687289E7EFB48EA630B3EB9 /* SDWebImageTransition.h in Headers */, - 307ADC5FBF528D9C850F5CEB47EFCC99 /* UIButton+WebCache.h in Headers */, - 781BC730696BEA5F8680861CE876AA2C /* UIImage+ForceDecode.h in Headers */, - E26423151F8032E63A36100AABB61D43 /* UIImage+GIF.h in Headers */, - F1560689B79F19D606B9EA5205BA7C80 /* UIImage+MultiFormat.h in Headers */, - BACE840E379E35D62AE29B87B8337CDB /* UIImageView+HighlightedWebCache.h in Headers */, - 83EB76688541963CC6A7837966631AFD /* UIImageView+WebCache.h in Headers */, - 9939FB017D464F93944D8624AD4EB0D1 /* UIView+WebCache.h in Headers */, - 00D9918CA212DF704D4248EF869DB868 /* UIView+WebCacheOperation.h in Headers */, + B89E3F69B65F9F1033495F254C6FE7FD /* IQBarButtonItem.h in Headers */, + F7A5376102E8A5DDE3B67B1F01497D03 /* IQKeyboardManager-umbrella.h in Headers */, + 266CC0324D1A0024FDE39A2DC8FDE73A /* IQKeyboardManager.h in Headers */, + E887EB54D7A5D4132B0AE0CC28B6C984 /* IQKeyboardManagerConstants.h in Headers */, + 4EDAA3CBC9D424B3E8A8FDB78AB2C563 /* IQKeyboardManagerConstantsInternal.h in Headers */, + 43B515EFF247E214FE33401EC8121D8E /* IQKeyboardReturnKeyHandler.h in Headers */, + 7A2685E30335AB08F230A5EF4C703DA6 /* IQNSArray+Sort.h in Headers */, + E5EBDD83953D2E17DA2025AC0243F3E5 /* IQPreviousNextView.h in Headers */, + C91D1216111E6B2DC6F0717E1A86E5CD /* IQTextView.h in Headers */, + 695B15B926033750A60778938829CACE /* IQTitleBarButtonItem.h in Headers */, + 8D3D649AC816938B8B78CAEC5CE8962F /* IQToolbar.h in Headers */, + FD7A36750DCF463CEA1958FE5CA5A1B1 /* IQUIScrollView+Additions.h in Headers */, + FA4D5BB0A7CC863C9B52E990ED4002CB /* IQUITextFieldView+Additions.h in Headers */, + 0E2EF782F412B9E4B62EC9D58313964E /* IQUIView+Hierarchy.h in Headers */, + CB1BA39A04D63DE4DBACCD1F14ECBB4A /* IQUIView+IQKeyboardToolbar.h in Headers */, + A9A1B4884406BA13CF99C74C85056DDF /* IQUIViewController+Additions.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E74F1015846E5E2F6AA55B3503E0C0DB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CE00BB2E78F7B40FC22D1501B2DDD0FB /* LKDB+Mapping.h in Headers */, + 57979623E4937F62C4EF8595EB31B7EC /* LKDBHelper-umbrella.h in Headers */, + 367FABA600C3419A12E1C31829E11703 /* LKDBHelper.h in Headers */, + 01E8819E375EB689FB54D32BF7F4216E /* LKDBUtils.h in Headers */, + B26F8142AAD12FEAFF5CC17129EB3087 /* NSObject+LKDBHelper.h in Headers */, + F0F866DEA9A3649D79D45313A434B44F /* NSObject+LKModel.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1EB527CCE1B0F3D64088AFF319F1FBA4 /* TTTAttributedLabel */ = { + 01B52F53C563BB35B7989239BE79A18B /* FMDB */ = { isa = PBXNativeTarget; - buildConfigurationList = FE1D69742C36F3E572A7171E67E92F3C /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */; + buildConfigurationList = A072544970FCC8FB7FD7EF00EC6FDC43 /* Build configuration list for PBXNativeTarget "FMDB" */; buildPhases = ( - 9C25B5FA35DC9EC5F136CC6548A928D0 /* Sources */, - E7CEC03E6403E87DB68C93D8409CC6A1 /* Frameworks */, - F94C73A9196403C827ADA2B7D78833DE /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = TTTAttributedLabel; - productName = TTTAttributedLabel; - productReference = 22776590D888620F659DDF182BE8BEFC /* TTTAttributedLabel.framework */; - productType = "com.apple.product-type.framework"; - }; - 203E2ACFC533A5A3C189DF6DCDF9A3CA /* Toast */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9C1388254385C167C3486774DFA19E4B /* Build configuration list for PBXNativeTarget "Toast" */; - buildPhases = ( - 5AB88D7903550EABB072B69F1E682D00 /* Sources */, - 924592AD76A1CAF35F2E54F909E21BCC /* Frameworks */, - 5BCF5028D69FA0C4AF14DA4074F13C7D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Toast; - productName = Toast; - productReference = 547FB455959DBDAB1B311703DC4655D1 /* Toast.framework */; - productType = "com.apple.product-type.framework"; - }; - 251BAD17812F7EBF6532EACF66F941C3 /* FMDB */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5B0566FF0CE681AC326D316CEC45A8CF /* Build configuration list for PBXNativeTarget "FMDB" */; - buildPhases = ( - 8FE0D4B503A94502F3431DC0DCB58040 /* Sources */, - EEFB61A65EB8DA6653B544822EB9CE44 /* Frameworks */, - 3D2A080C5CD4ED4520C6AEFA1D6BA26F /* Headers */, + 9D94501107FB33B239F1452EA78770F2 /* Headers */, + 160EB3EB93705FE5D486FBCBF3E6639B /* Sources */, + F5984E20EC27C71E4066B3F1D4D03D30 /* Frameworks */, + F8B5E1B67AFBCAB7652B582632894765 /* Resources */, ); buildRules = ( ); @@ -2423,86 +4115,17 @@ ); name = FMDB; productName = FMDB; - productReference = 3F9C38A75057CBD015D16FAA76005ECB /* FMDB.framework */; + productReference = A6A01C46E262767595CA64143AAF6C86 /* FMDB.framework */; productType = "com.apple.product-type.framework"; }; - 3578E512F8C94E9B49F88CAA98690402 /* Socket.IO-Client-Swift */ = { + 0656CD2BE0FB0A99456605A137B14A8A /* UITableView+FDTemplateLayoutCell */ = { isa = PBXNativeTarget; - buildConfigurationList = AD43B7EE0B1CE05F5620E0CB4E98AA04 /* Build configuration list for PBXNativeTarget "Socket.IO-Client-Swift" */; + buildConfigurationList = 04947B774390B3A05B50509ED7F45DA5 /* Build configuration list for PBXNativeTarget "UITableView+FDTemplateLayoutCell" */; buildPhases = ( - C0BD0068ECDB12149AD4414CBA31B505 /* Sources */, - 975519A8DD8D28FC91AEE205A5ED5A3F /* Frameworks */, - 407CE9FF1A14D66AD1FE967456A950E9 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 9CAF310FFB6FDCB7682F7D72D8E2A542 /* PBXTargetDependency */, - ); - name = "Socket.IO-Client-Swift"; - productName = "Socket.IO-Client-Swift"; - productReference = 0F329A9EA016DA0D20BA2C5C7D0DAC79 /* SocketIO.framework */; - productType = "com.apple.product-type.framework"; - }; - 41BE4379487F65BC8832BC9F797E1290 /* Pods-GIGA */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1E5906AA4CEA8D63C4872E060D702ED0 /* Build configuration list for PBXNativeTarget "Pods-GIGA" */; - buildPhases = ( - 4EE946193A9F32FB7CAFC4A21B5EA358 /* Sources */, - 718E88DD1843C285DD139D86BA77F7FB /* Frameworks */, - 512E6EE9FA761557E8CCF9BF26270143 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 3474D6C3280BAA5B3AE4B633886CFAFD /* PBXTargetDependency */, - 8C3790FF34469A5A4973C79FADDC3A8C /* PBXTargetDependency */, - BC40A9A910B2C3270FB0877043CE564C /* PBXTargetDependency */, - 34FD209D36BCC2071BC143882F6FFD7F /* PBXTargetDependency */, - E99E9B707573763E42EBDE5EFD4BB215 /* PBXTargetDependency */, - F5433A64C8D149225D11B9976EEA15C2 /* PBXTargetDependency */, - 7B269A4DC3EE69401D85709E40F00741 /* PBXTargetDependency */, - ADC0001F8C3FA28B1BD19C658A16229E /* PBXTargetDependency */, - 0BE77DA234F6DEC499E903B8E7EB5483 /* PBXTargetDependency */, - 079925957D86D489BC666F7FA843B6FA /* PBXTargetDependency */, - 8090D0FCF9F29403D4F000D942D9F481 /* PBXTargetDependency */, - D39B75EEFD12FE7DB170D1185F47889C /* PBXTargetDependency */, - 2465E7DF59E294D30DF9A4A33577D4E3 /* PBXTargetDependency */, - 2628552A12C2EACA98125D6931C82E07 /* PBXTargetDependency */, - D709F92486254BF5CB45836CBA34C204 /* PBXTargetDependency */, - EE4738C2A350C865467010A20947D4AD /* PBXTargetDependency */, - BD746092D8282A48023C6DD462B91812 /* PBXTargetDependency */, - ); - name = "Pods-GIGA"; - productName = "Pods-GIGA"; - productReference = BEA40D79454E792C12261F3AF180920F /* Pods_GIGA.framework */; - productType = "com.apple.product-type.framework"; - }; - 43F697FCA8E9557F575EBF7DC785AFD4 /* YTKKeyValueStore */ = { - isa = PBXNativeTarget; - buildConfigurationList = 4342C6E210ABD2AA884A6763AD5DFC1B /* Build configuration list for PBXNativeTarget "YTKKeyValueStore" */; - buildPhases = ( - 1C4846445598AC676D2EBB4484C533B3 /* Sources */, - 081BAF7030A01DB5133B8E011BB888BF /* Frameworks */, - 3D1D3FD07EADAAA80F00A5970E4DE970 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - BFEE35A4C49AB945CAEC4362F733E394 /* PBXTargetDependency */, - ); - name = YTKKeyValueStore; - productName = YTKKeyValueStore; - productReference = 99792AD152EC0F67CE203E29D0DACFC0 /* YTKKeyValueStore.framework */; - productType = "com.apple.product-type.framework"; - }; - 57DFE3ED684FE796F4717C7ABAE517F8 /* UITableView+FDTemplateLayoutCell */ = { - isa = PBXNativeTarget; - buildConfigurationList = D773EDDAA9E875352723DC73E02DDFE5 /* Build configuration list for PBXNativeTarget "UITableView+FDTemplateLayoutCell" */; - buildPhases = ( - 332FDFAE5F0A731100B7DA84FF1C4493 /* Sources */, - 81F903C6F2439B4DE4CACDA906440A2D /* Frameworks */, - 4564ABBA1717987BB224F78BEAEA3C8C /* Headers */, + 43EA16CA5146E94EE36F7C8DAD6F1FAB /* Headers */, + E5234A45649DADD21E14048EFDA99A91 /* Sources */, + 0D781F8CDFB4E5B287E1F80B7519E0E8 /* Frameworks */, + C65C0A9FACFC1DBA1DB2F7908C1425FA /* Resources */, ); buildRules = ( ); @@ -2510,120 +4133,54 @@ ); name = "UITableView+FDTemplateLayoutCell"; productName = "UITableView+FDTemplateLayoutCell"; - productReference = 4819F4658B859A7A2B63B28F360E7FFD /* UITableView_FDTemplateLayoutCell.framework */; + productReference = 251B13B990BC2201FC5B2E947865EEB6 /* UITableView_FDTemplateLayoutCell.framework */; productType = "com.apple.product-type.framework"; }; - 6B1714E816AE794962516E2ECBB40A5A /* MBProgressHUD */ = { + 0F3C96ED140272710A6DBB0D5160C4BE /* YTKKeyValueStore */ = { isa = PBXNativeTarget; - buildConfigurationList = 28A1BDB3CE3F2F1CB0931DFEEDBA7936 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildConfigurationList = 9D1C3AED740F97C52313DE35F0C6014C /* Build configuration list for PBXNativeTarget "YTKKeyValueStore" */; buildPhases = ( - 5D9F4A386169F298C8544D099324BB28 /* Sources */, - 9FE6CEF1763E05FB90653801CE3E2B5B /* Frameworks */, - D015B3F3E2F85391AA3B395B5B1ADCE5 /* Headers */, + 6A3730888CECDE03B9F31330042A968D /* Headers */, + 7D3C02976879E96AC7CD71E39CA4F1DA /* Sources */, + AF90F114733E66CF03CAF8093803FAB0 /* Frameworks */, + 20C8B7636FC8DEF388DCF8C4396F7AC9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4325F679C897B690AC3EF15CC9D62CFD /* PBXTargetDependency */, + ); + name = YTKKeyValueStore; + productName = YTKKeyValueStore; + productReference = CBE4DD051D156374F9F74E20A99E5C56 /* YTKKeyValueStore.framework */; + productType = "com.apple.product-type.framework"; + }; + 16F68B5CBE5CC3F4678A1D70F1C55D39 /* TTTAttributedLabel */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4EE543C7CCDD9178FC90D95A34DF1E9D /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */; + buildPhases = ( + 14A114006D608BC38C8DC73EB1C0D6A9 /* Headers */, + D9A83526FEFD3DDF6E25C88C64E87DF4 /* Sources */, + 402A767BFFBEC1C17F7C77A70A3F5158 /* Frameworks */, + 845A5BB96CA0B8A097C61CDFE7BFF021 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = MBProgressHUD; - productName = MBProgressHUD; - productReference = A0E77CB702D048DE8D95D7B71073CB5A /* MBProgressHUD.framework */; + name = TTTAttributedLabel; + productName = TTTAttributedLabel; + productReference = A3C43BAFFC6BDA58CF469DA602D71A44 /* TTTAttributedLabel.framework */; productType = "com.apple.product-type.framework"; }; - 6B8D192C8CBB4BF55A7F9B79C12280DB /* SocketRocket */ = { + 1833D3C7CD0433421BD88C8B00B8D75C /* SDWebImage */ = { isa = PBXNativeTarget; - buildConfigurationList = FD3E3AC28A10371D2EC0FED80CFD7E84 /* Build configuration list for PBXNativeTarget "SocketRocket" */; + buildConfigurationList = C937A074FD9D529D85566C6D84B457F1 /* Build configuration list for PBXNativeTarget "SDWebImage" */; buildPhases = ( - BADE9C1D2BCD00ED4F4CA4A4E9457DFA /* Sources */, - 092CD07E711BB27E0075AC3ADF20915B /* Frameworks */, - EE5D40E224195E31FA50038B96EEA6A5 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SocketRocket; - productName = SocketRocket; - productReference = 67C8BFEE51B5F26E6EB7520C972CD09A /* SocketRocket.framework */; - productType = "com.apple.product-type.framework"; - }; - 826EFF975442065A54A0B2D3103EE6A4 /* NJKWebViewProgress */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5C5BD8C49D5108DF93608FA1EDC5B5EF /* Build configuration list for PBXNativeTarget "NJKWebViewProgress" */; - buildPhases = ( - 333271689444C03071D8092853B02EDD /* Sources */, - 59DA24E1BFBF4DF2381ED2E0EE6964A0 /* Frameworks */, - CDCC81C5A7B82E18A00A9F9EC5474BDC /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = NJKWebViewProgress; - productName = NJKWebViewProgress; - productReference = 23E3DFBE5E063BE6E4D93A3E77F032ED /* NJKWebViewProgress.framework */; - productType = "com.apple.product-type.framework"; - }; - CCA9C33B127D6C859A3F8AFBEFCBABF0 /* LKDBHelper */ = { - isa = PBXNativeTarget; - buildConfigurationList = 730557350F2D643032C64C252A33646B /* Build configuration list for PBXNativeTarget "LKDBHelper" */; - buildPhases = ( - 28931639A1BF9251AAB8A696279FC52C /* Sources */, - 77A4F3ABB18A1CBD901A6D7F4564A99A /* Frameworks */, - ED8FF911FDD33A3EF0E4C647B44A922E /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - C5949C3702F8D473B24B99AF83A168EA /* PBXTargetDependency */, - ); - name = LKDBHelper; - productName = LKDBHelper; - productReference = 5290E81387FC7DE33A6834ABB78CD62C /* LKDBHelper.framework */; - productType = "com.apple.product-type.framework"; - }; - D52144DE9D7255DE912490FF5A806573 /* Masonry */ = { - isa = PBXNativeTarget; - buildConfigurationList = 02D024184BD368B565F3B6257DF3C605 /* Build configuration list for PBXNativeTarget "Masonry" */; - buildPhases = ( - 00A62ED60FF8A98AB74C8F2CECD850BA /* Sources */, - F6EC657AC5A7BEE9A3D288B582F4C5E9 /* Frameworks */, - F3E9930C736C01D12F5733EFD1F0A948 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Masonry; - productName = Masonry; - productReference = 2493EEFA5275F1BFBB2AF35F11BED82C /* Masonry.framework */; - productType = "com.apple.product-type.framework"; - }; - D55833EC3DE9EBD9B329CAEB983D5A9D /* IQKeyboardManager */ = { - isa = PBXNativeTarget; - buildConfigurationList = 22A2379BF2B87BFC7BA495F9BD85DD28 /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */; - buildPhases = ( - EF7C3A296212CFB87AC9B8A7939E3733 /* Sources */, - 8944C0B131AF550CF6CC8073435E22F2 /* Frameworks */, - 03AB14DB0235B494910320324F3BF2C2 /* Headers */, - 2E730D5A406D8720DD8830A43109145D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = IQKeyboardManager; - productName = IQKeyboardManager; - productReference = A087BAC4F72D6A1D75482DB745BF663D /* IQKeyboardManager.framework */; - productType = "com.apple.product-type.framework"; - }; - D90CADD9FA47277BDDDE85CFC0082CA0 /* SDWebImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = FD8A0CB03AC21C5BCB521E0FC6235E48 /* Build configuration list for PBXNativeTarget "SDWebImage" */; - buildPhases = ( - 965333B574D4C1404A50E045E0E55524 /* Sources */, - 77DFA32B5A12FCE9A60389FE17A7F94B /* Frameworks */, - FEC5DE9A4AF76643C746A6BC541B1999 /* Headers */, + A8232A9E8066D44B4C2617CD1415BB23 /* Headers */, + F5E4E28FDBBBA3AA91306A48D567B739 /* Sources */, + DD5C9024F378E063738F6EFE4D234528 /* Frameworks */, + 4EE0AAC3DE1E5A100ECCFD7F267C50C2 /* Resources */, ); buildRules = ( ); @@ -2631,51 +4188,53 @@ ); name = SDWebImage; productName = SDWebImage; - productReference = E84CE3A7FDCD3AE81A473F6C746504A2 /* SDWebImage.framework */; + productReference = 3D12153DC4D2C4B99BE3D68592D1F73A /* SDWebImage.framework */; productType = "com.apple.product-type.framework"; }; - DC3688684BF42A20A8998F31DDA51A49 /* JSONModel */ = { + 1BEA4448CAF18B76846444E6AE7C7546 /* Toast */ = { isa = PBXNativeTarget; - buildConfigurationList = F4D16BF2938703D3A0079C402F5E75D8 /* Build configuration list for PBXNativeTarget "JSONModel" */; + buildConfigurationList = B70836F81278D2A31C66970B1FCF5525 /* Build configuration list for PBXNativeTarget "Toast" */; buildPhases = ( - CF525CD81327D7C4B38AF818D91B35A1 /* Sources */, - 0F13FDE48FAA625D37D626F69DA46819 /* Frameworks */, - BBF7227F5BD0440E9DF598DF26EC3891 /* Headers */, + 8B9E0BD2CFDB58C6FF46C11A2E50A123 /* Headers */, + F234D804A6DF4B28B29AD4543C9E7091 /* Sources */, + DC7C609367479420D4D1BADE316B9AC5 /* Frameworks */, + 1CBA8F48E50801EADEACC40A4CE6763A /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = JSONModel; - productName = JSONModel; - productReference = 935FBB07F207A53D79856BDDE153E292 /* JSONModel.framework */; + name = Toast; + productName = Toast; + productReference = 52D37B7629842C40600F0591B04D55BF /* Toast.framework */; productType = "com.apple.product-type.framework"; }; - E0D1006C742EBDDD3F2BF40A564ACBCB /* Starscream */ = { + 3FDA1ED51BACF2A55760CB610A5952FE /* SocketRocket */ = { isa = PBXNativeTarget; - buildConfigurationList = E72A11DB5C3E9606198B359389FDF949 /* Build configuration list for PBXNativeTarget "Starscream" */; + buildConfigurationList = D212F986F9035E51217E1FDE5DD6A3FB /* Build configuration list for PBXNativeTarget "SocketRocket" */; buildPhases = ( - FA2E591FE6FE4CD342ACA3F8A3757326 /* Sources */, - 8CECDEE34E27741BF2EF71AF71CDA5FC /* Frameworks */, - A8626284EBDE24E4BF46F02D9E3FF648 /* Headers */, + 24EBD299F8226CCCC3C89491618DC96B /* Headers */, + 2B44311FB98D00DA89E7C0D8D08B409D /* Sources */, + FBDA3FA5D995945512D0D2AF828AC0A1 /* Frameworks */, + DF5E5F2D968E738C513A1BC13CE40F3D /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = Starscream; - productName = Starscream; - productReference = DDE1008593C16D5180F63ED51EC27802 /* Starscream.framework */; + name = SocketRocket; + productName = SocketRocket; + productReference = A79EFE14BBDF9C55ED15A3764AC1BF0F /* SocketRocket.framework */; productType = "com.apple.product-type.framework"; }; - E14A62900910444707A5504D25EC98DC /* MJRefresh */ = { + 546B747B9DB0515E059EEBA0B9E98B42 /* MJRefresh */ = { isa = PBXNativeTarget; - buildConfigurationList = 1EFADDC2BB6831ED43B76E0241CCDB75 /* Build configuration list for PBXNativeTarget "MJRefresh" */; + buildConfigurationList = E6F83A3523D8341EDA917BED02337C9A /* Build configuration list for PBXNativeTarget "MJRefresh" */; buildPhases = ( - 6D4ECE0A60E69F261AA10FE2CB90A0AC /* Sources */, - 1AAD91176E5F5F9AD062AD678F6746E4 /* Frameworks */, - 1D0B0A5525CB3F57F2D64B587D880D88 /* Headers */, - 8E06EE42A2928B5842D11E8A0A68E87D /* Resources */, + 08EF78522D0C15FAC07E3DF1CA39E77C /* Headers */, + 43D5CCDE6E144B6F6AEE48CEDD25AC1C /* Sources */, + 4330790BF93619542494717EF5872A17 /* Frameworks */, + 862C3C5F3DC00E80837F3E923C463301 /* Resources */, ); buildRules = ( ); @@ -2683,16 +4242,144 @@ ); name = MJRefresh; productName = MJRefresh; - productReference = 029A3331019368C8C30B8DA9778E0794 /* MJRefresh.framework */; + productReference = 77C6FE3C71048FC13BDFE75FDD624DB0 /* MJRefresh.framework */; productType = "com.apple.product-type.framework"; }; - F4160500DCEA3DA3E93FBA579E88CA0A /* AFNetworking */ = { + 54B4749AF88450A71D699C9EBA4EA9C0 /* LBXScan */ = { isa = PBXNativeTarget; - buildConfigurationList = 25909703FE8BF472066161C98342A956 /* Build configuration list for PBXNativeTarget "AFNetworking" */; + buildConfigurationList = 5D84F5F811261DD11885E583CFB1B295 /* Build configuration list for PBXNativeTarget "LBXScan" */; buildPhases = ( - 4CC771DB3008E2E9E454A6212D41A5E9 /* Sources */, - 6DE9B3A8689C804A43D970F1265675A4 /* Frameworks */, - 437E0B8BDA100834FD20877E5FCDC59D /* Headers */, + 6C0F6E8F8879BF42CE9EA904AF1DFFDA /* Headers */, + 53D4DF99BA6CF42DB05EE67E0B072062 /* Sources */, + B8B095A708D89B92B57C68E6CD9B6F61 /* Frameworks */, + 9765A490EE04F4D20409772996A667F9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LBXScan; + productName = LBXScan; + productReference = 6A70E94641E26AE47CF88A806AF6612C /* LBXScan.framework */; + productType = "com.apple.product-type.framework"; + }; + 701274A44ABD738F6AFAB306D4FC0A44 /* Starscream */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9A25E6853E113548CF6F6EE3F44072A1 /* Build configuration list for PBXNativeTarget "Starscream" */; + buildPhases = ( + 7CA1E50BD0A67FCC3C4FB663E6A7A40C /* Headers */, + 56AAE5F77503768AB7E1B1C1CBAC6C2E /* Sources */, + 6512FEC7FBC6EDECD9B82EF4A1C957F1 /* Frameworks */, + 40400BB777914D8ABB50D91654B41695 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Starscream; + productName = Starscream; + productReference = 57E2550013B3B536C16FCA75E5155FF8 /* Starscream.framework */; + productType = "com.apple.product-type.framework"; + }; + 9FF23E172EC401782F56F65C2FF4688A /* Socket.IO-Client-Swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = E96A385FF56519172E33BAFA56A572C1 /* Build configuration list for PBXNativeTarget "Socket.IO-Client-Swift" */; + buildPhases = ( + 93B245A713E341FB841920F7D988A4F0 /* Headers */, + E2E0D0E5DD75E32F6B871B89C841379B /* Sources */, + AEAC7297197C204CA26767EDBD8C65D3 /* Frameworks */, + ED591AA0A0707890B38EF822BF6EAC86 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B28AF7085CFD16F23D5415BB1974952B /* PBXTargetDependency */, + ); + name = "Socket.IO-Client-Swift"; + productName = "Socket.IO-Client-Swift"; + productReference = 9C712E59659A99F86AFAA0B58C0DFDB4 /* SocketIO.framework */; + productType = "com.apple.product-type.framework"; + }; + A938F7AB77B92F5273D43659F12031AD /* IQKeyboardManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1F1E080D0C17D9EECB7A0F73562A384B /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */; + buildPhases = ( + CDD89AE2B5E03B80EF60EB95DE649BE9 /* Headers */, + 487B8E18B11D5D96332ADD13BA3CE7C3 /* Sources */, + 666394A079C4D1571C47CC2BDC42F11F /* Frameworks */, + D2491073816F91F3BC79E28EA02C451B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IQKeyboardManager; + productName = IQKeyboardManager; + productReference = 38EAC8B7CB1278F54E9415250546A952 /* IQKeyboardManager.framework */; + productType = "com.apple.product-type.framework"; + }; + B18ACDBC4A945B03194AEC88D59D9CA9 /* MBProgressHUD */ = { + isa = PBXNativeTarget; + buildConfigurationList = C85F409FF2887195D0FBEF664694B351 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildPhases = ( + 9A73183AFC171C4665A594820C7FCDCC /* Headers */, + F4713168E0E52FBFA2C477699A9D16C9 /* Sources */, + C1AE280510D0059781AB44BF58B67C7D /* Frameworks */, + 0FB33502B4D9A33A7D03EDA3A63553BD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MBProgressHUD; + productName = MBProgressHUD; + productReference = 794EB6EDFAB588BA552A834A08BADBF4 /* MBProgressHUD.framework */; + productType = "com.apple.product-type.framework"; + }; + CD73E94F82FB067451D805BD98C55FE4 /* Pods-GIGA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FC06AAEA119877FC6B52B189F5BCA5A /* Build configuration list for PBXNativeTarget "Pods-GIGA" */; + buildPhases = ( + C002A6889B142EED06FCC84E3652D9DD /* Headers */, + 34C3DED89EC5E68511A7A2328AC574D1 /* Sources */, + 2D116F4789C634DBBF4D9815E617E62A /* Frameworks */, + DBD14751322D58B6D3839E27E0A52825 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C427C9A7B7072675D37200A002D1627A /* PBXTargetDependency */, + 0DBF47829E10BF29D53ED9D706420C96 /* PBXTargetDependency */, + C2C44E2D2372987664BE48F5B60FBF51 /* PBXTargetDependency */, + D53B443A6496FB1402221066B3327A0D /* PBXTargetDependency */, + A2DBE9D8FBA2256B93D3E4A6D16F77A3 /* PBXTargetDependency */, + 3EA23C128B3DFF0589419700A1FD3DA4 /* PBXTargetDependency */, + 2CE8038F90A90FE3BC39BCEF4AE7CD19 /* PBXTargetDependency */, + 5FE2A5499BBC40EB5083035DDA4E58C1 /* PBXTargetDependency */, + 80A010A25ED0BFCC1FAD27909E9ADED8 /* PBXTargetDependency */, + B1CD41339EC40059D5C25C1CFA3F16E0 /* PBXTargetDependency */, + 481681AF6DC205CB9FF3652EBDF371E3 /* PBXTargetDependency */, + 23AA8DD6BF898E467E6268A4C7C94CF1 /* PBXTargetDependency */, + 60ACA4E90740E528002126968A6F7DD4 /* PBXTargetDependency */, + 846DE17CFF9320B45B13F0385AC7CA15 /* PBXTargetDependency */, + 094391649B987EAEDBBC5E411E36A8B4 /* PBXTargetDependency */, + 12F06E7249623AEF1C0169B97CDB0077 /* PBXTargetDependency */, + DF73E9BD43EFCB0828C164ABCD801C5E /* PBXTargetDependency */, + 0BD00084C3D42E503DCFCBCE33BDD138 /* PBXTargetDependency */, + ); + name = "Pods-GIGA"; + productName = "Pods-GIGA"; + productReference = 02F88EB2E69381607336D7A30F9B4F54 /* Pods_GIGA.framework */; + productType = "com.apple.product-type.framework"; + }; + EAE60BD2ADA8DCB217E116ADB628185C /* AFNetworking */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8289B039CF0D8B5A385C13089893A356 /* Build configuration list for PBXNativeTarget "AFNetworking" */; + buildPhases = ( + B5E140C985F3196798D57F2A7DB76ECD /* Headers */, + 07C7A3674C96B85AD8EA6C6D71BC549B /* Sources */, + 201C4131525D709A2C0FE414167327DC /* Frameworks */, + 8F134AE083847A523C4AE149B84307BF /* Resources */, ); buildRules = ( ); @@ -2700,7 +4387,80 @@ ); name = AFNetworking; productName = AFNetworking; - productReference = 06F7DF71211917C6613F190B1D9CEA2B /* AFNetworking.framework */; + productReference = 56EB7F49FC0F0364431B785203A747F0 /* AFNetworking.framework */; + productType = "com.apple.product-type.framework"; + }; + F021BBC57C82DEFE283FCD90518F5AC4 /* LKDBHelper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 85844E90586203B26A5DF401D0D1CB40 /* Build configuration list for PBXNativeTarget "LKDBHelper" */; + buildPhases = ( + E74F1015846E5E2F6AA55B3503E0C0DB /* Headers */, + 09464D15895B3C0CE26FBB2AAD36254B /* Sources */, + C1767DBAD5191FDAA8D776AB397B33AD /* Frameworks */, + BE680C84C2E009336EE52737A20B37A0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 52927093CF36E9907ED84566EB4A4247 /* PBXTargetDependency */, + ); + name = LKDBHelper; + productName = LKDBHelper; + productReference = C28769783EFCE774343708B28B72E7F9 /* LKDBHelper.framework */; + productType = "com.apple.product-type.framework"; + }; + F6E4F5C61825ACB370E59562B9CDB407 /* JSONModel */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0B3AED7BA0EB0D83A648507C8FCDEA7C /* Build configuration list for PBXNativeTarget "JSONModel" */; + buildPhases = ( + 2DAC78716B7A0D53FBF1A775848691BB /* Headers */, + E312B520DA96818DD869E0F741A90F07 /* Sources */, + 53B548AE094C80BC15CFBFA6BFEBA6B6 /* Frameworks */, + 7ABAD5F09FF119D45EF9662F24A5B5C9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JSONModel; + productName = JSONModel; + productReference = 149ED688511312E137DA74ABF4A7D5DF /* JSONModel.framework */; + productType = "com.apple.product-type.framework"; + }; + FA1290BD9C46E61BF154FE7DDA8D128C /* NJKWebViewProgress */ = { + isa = PBXNativeTarget; + buildConfigurationList = AAD8611BAA4F46825D297E01759AEAED /* Build configuration list for PBXNativeTarget "NJKWebViewProgress" */; + buildPhases = ( + A1C444B27EA52DEEEDB1EADF746DB79F /* Headers */, + C5E84FE0D6BE979BFCF2CD8915D3CB6D /* Sources */, + 17181CF799976D86AA613B06C8DC525F /* Frameworks */, + 47AEF522DB46D94938B3ECA1EFF8201F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NJKWebViewProgress; + productName = NJKWebViewProgress; + productReference = A359CB7F1A4A59988CE455850F4BE8BB /* NJKWebViewProgress.framework */; + productType = "com.apple.product-type.framework"; + }; + FF7468B4F5259B98018DD1ABAD2D2593 /* Masonry */ = { + isa = PBXNativeTarget; + buildConfigurationList = 84710AC86F03C1B2256418269E74EE40 /* Build configuration list for PBXNativeTarget "Masonry" */; + buildPhases = ( + 45F8EDB81B405B9AF3E3CCB4B59ABD97 /* Headers */, + 79D0EB5C92240FE3B1FF78CA02696BF1 /* Sources */, + 3A7D6E70DA2F5E0F418BCB15090269FF /* Frameworks */, + BAA9753AEC5C54F599FCE4798F7CD520 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Masonry; + productName = Masonry; + productReference = 6B836748A7FBCCB6413D869804B397EB /* Masonry.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -2720,465 +4480,925 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 3CD692616588D8B0B76B05D8F9BBFE7E /* Products */; + productRefGroup = 7A1C41D46CA2DA892C3E8FADE4CC460F /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - F4160500DCEA3DA3E93FBA579E88CA0A /* AFNetworking */, - 251BAD17812F7EBF6532EACF66F941C3 /* FMDB */, - D55833EC3DE9EBD9B329CAEB983D5A9D /* IQKeyboardManager */, - DC3688684BF42A20A8998F31DDA51A49 /* JSONModel */, - CCA9C33B127D6C859A3F8AFBEFCBABF0 /* LKDBHelper */, - D52144DE9D7255DE912490FF5A806573 /* Masonry */, - 6B1714E816AE794962516E2ECBB40A5A /* MBProgressHUD */, - E14A62900910444707A5504D25EC98DC /* MJRefresh */, - 826EFF975442065A54A0B2D3103EE6A4 /* NJKWebViewProgress */, - 41BE4379487F65BC8832BC9F797E1290 /* Pods-GIGA */, - D90CADD9FA47277BDDDE85CFC0082CA0 /* SDWebImage */, - 3578E512F8C94E9B49F88CAA98690402 /* Socket.IO-Client-Swift */, - 6B8D192C8CBB4BF55A7F9B79C12280DB /* SocketRocket */, - E0D1006C742EBDDD3F2BF40A564ACBCB /* Starscream */, - 203E2ACFC533A5A3C189DF6DCDF9A3CA /* Toast */, - 1EB527CCE1B0F3D64088AFF319F1FBA4 /* TTTAttributedLabel */, - 57DFE3ED684FE796F4717C7ABAE517F8 /* UITableView+FDTemplateLayoutCell */, - 43F697FCA8E9557F575EBF7DC785AFD4 /* YTKKeyValueStore */, + EAE60BD2ADA8DCB217E116ADB628185C /* AFNetworking */, + 01B52F53C563BB35B7989239BE79A18B /* FMDB */, + A938F7AB77B92F5273D43659F12031AD /* IQKeyboardManager */, + F6E4F5C61825ACB370E59562B9CDB407 /* JSONModel */, + 54B4749AF88450A71D699C9EBA4EA9C0 /* LBXScan */, + F021BBC57C82DEFE283FCD90518F5AC4 /* LKDBHelper */, + FF7468B4F5259B98018DD1ABAD2D2593 /* Masonry */, + B18ACDBC4A945B03194AEC88D59D9CA9 /* MBProgressHUD */, + 546B747B9DB0515E059EEBA0B9E98B42 /* MJRefresh */, + FA1290BD9C46E61BF154FE7DDA8D128C /* NJKWebViewProgress */, + CD73E94F82FB067451D805BD98C55FE4 /* Pods-GIGA */, + 1833D3C7CD0433421BD88C8B00B8D75C /* SDWebImage */, + 9FF23E172EC401782F56F65C2FF4688A /* Socket.IO-Client-Swift */, + 3FDA1ED51BACF2A55760CB610A5952FE /* SocketRocket */, + 701274A44ABD738F6AFAB306D4FC0A44 /* Starscream */, + 1BEA4448CAF18B76846444E6AE7C7546 /* Toast */, + 16F68B5CBE5CC3F4678A1D70F1C55D39 /* TTTAttributedLabel */, + 0656CD2BE0FB0A99456605A137B14A8A /* UITableView+FDTemplateLayoutCell */, + 0F3C96ED140272710A6DBB0D5160C4BE /* YTKKeyValueStore */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2E730D5A406D8720DD8830A43109145D /* Resources */ = { + 0FB33502B4D9A33A7D03EDA3A63553BD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 788BA72F67004504FFDFC670048786B5 /* IQKeyboardManager.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8E06EE42A2928B5842D11E8A0A68E87D /* Resources */ = { + 1CBA8F48E50801EADEACC40A4CE6763A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 20C8B7636FC8DEF388DCF8C4396F7AC9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40400BB777914D8ABB50D91654B41695 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 47AEF522DB46D94938B3ECA1EFF8201F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4EE0AAC3DE1E5A100ECCFD7F267C50C2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7ABAD5F09FF119D45EF9662F24A5B5C9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 845A5BB96CA0B8A097C61CDFE7BFF021 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 862C3C5F3DC00E80837F3E923C463301 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 10884584B45C6564993981E004AE6B5B /* MJRefresh.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F134AE083847A523C4AE149B84307BF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9765A490EE04F4D20409772996A667F9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BAA9753AEC5C54F599FCE4798F7CD520 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BE680C84C2E009336EE52737A20B37A0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C65C0A9FACFC1DBA1DB2F7908C1425FA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2491073816F91F3BC79E28EA02C451B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CFC09D4DDE3E33FB00200C0E03A3B354 /* IQKeyboardManager.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DBD14751322D58B6D3839E27E0A52825 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DF5E5F2D968E738C513A1BC13CE40F3D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + ED591AA0A0707890B38EF822BF6EAC86 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8B5E1B67AFBCAB7652B582632894765 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6298B1C2234864DA5ED3B5E6398B95AC /* MJRefresh.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 00A62ED60FF8A98AB74C8F2CECD850BA /* Sources */ = { + 07C7A3674C96B85AD8EA6C6D71BC549B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 53BDF81D0A52EA526D597A5C5B139D7F /* MASCompositeConstraint.m in Sources */, - 59F81DE0305CC2AC448D2A3C6B3280A2 /* MASConstraint.m in Sources */, - 73BBDACC22CCA36A6DAAA167AD780BAF /* MASConstraintMaker.m in Sources */, - 6C23BBF56ED4DCC10CA1765A6736D1F8 /* MASLayoutConstraint.m in Sources */, - A08A8AB356264E248D01F1BC0EF08166 /* Masonry-dummy.m in Sources */, - A7370CE9231F9A4927142D79021879EC /* MASViewAttribute.m in Sources */, - 756DF24546C7D91459DCADC8F1C98660 /* MASViewConstraint.m in Sources */, - E72EDE323AC9F92EC8A00A93AC186093 /* NSArray+MASAdditions.m in Sources */, - 0F3DF5C3BEFCC9838B53C37735B414BE /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, - F4B3E44D5D2F6508BC1BB35A9FBDEC70 /* View+MASAdditions.m in Sources */, - 8A6EEF68E7625AB66A3A8DED1594F88F /* ViewController+MASAdditions.m in Sources */, + 9486D80CC092F8ACB2355D5C94A155E3 /* AFAutoPurgingImageCache.m in Sources */, + 5A4C39ACCE4CE7B6C69C736F48087759 /* AFHTTPSessionManager.m in Sources */, + 6A5E05D187005E863177B45D58905C71 /* AFImageDownloader.m in Sources */, + 15F1AB626337FECD0B9CFAAD90FAC342 /* AFNetworkActivityIndicatorManager.m in Sources */, + 8826A0887EEE1A618FA3BA34989E05B5 /* AFNetworking-dummy.m in Sources */, + 137A6E8841A2429C00CBFA701695197E /* AFNetworkReachabilityManager.m in Sources */, + 63A7B518E880C7AACABCD20AFA247C8C /* AFSecurityPolicy.m in Sources */, + CB3CA20E3732A095F5515E0621D8719C /* AFURLRequestSerialization.m in Sources */, + 11EAB2A17E2712DB04831AD0FFD6A5DB /* AFURLResponseSerialization.m in Sources */, + 0D58399A6DC61099900309A4449F7891 /* AFURLSessionManager.m in Sources */, + CB3028664CA23A1480C18C7A86CFDAF4 /* UIActivityIndicatorView+AFNetworking.m in Sources */, + 402EB64C59857FE252DC98844643C420 /* UIButton+AFNetworking.m in Sources */, + 41FD4D0D6101210E26DDDCDD17FBB7C3 /* UIImageView+AFNetworking.m in Sources */, + DF74915F8F367134FA4277BE9A2F52DB /* UIProgressView+AFNetworking.m in Sources */, + 00ED59EE2784CE922358E57E241A6C75 /* UIRefreshControl+AFNetworking.m in Sources */, + 00E2C1092D2255BB25E45DF004D3E7E5 /* UIWebView+AFNetworking.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1C4846445598AC676D2EBB4484C533B3 /* Sources */ = { + 09464D15895B3C0CE26FBB2AAD36254B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BCC67B107B611B06ABD214407B69B62F /* YTKKeyValueStore-dummy.m in Sources */, - A9545DE6CA040EF32EC94145E3D1F49A /* YTKKeyValueStore.m in Sources */, + BD1E9ED7F5339CF30E74A8D6357A1977 /* LKDB+Mapping.m in Sources */, + BFB56D89B4F56E29E9F259156E5C2A48 /* LKDBHelper-dummy.m in Sources */, + 7E80DF7477E52BC83231CE99C08C955C /* LKDBHelper.m in Sources */, + CBECB9B6DC9D8CB7360B9F78D95800C2 /* LKDBUtils.m in Sources */, + E388931A491EFCDD7A4B92836929CB1C /* NSObject+LKDBHelper.m in Sources */, + 8EFDC05AD48B492FCD676D14050A7345 /* NSObject+LKModel.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 28931639A1BF9251AAB8A696279FC52C /* Sources */ = { + 160EB3EB93705FE5D486FBCBF3E6639B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D29CF1B9A1D71268C1F85EA53B32BA24 /* LKDB+Mapping.m in Sources */, - 6E6E8ADF2879B9F6832CE82F2B538366 /* LKDBHelper-dummy.m in Sources */, - 19119F01A87FAA55D45B4F11F33B7B3E /* LKDBHelper.m in Sources */, - A77943B15F7CF5151B637808B40DD722 /* LKDBUtils.m in Sources */, - DB55C38E306ED2B647AA6E49486483B7 /* NSObject+LKDBHelper.m in Sources */, - 2C5EA66B987D887948303DB77AF68D61 /* NSObject+LKModel.m in Sources */, + 946A83F9D55E7732CC74EB6C00DF6223 /* FMDatabase.m in Sources */, + BF3BE01EA64CE40E470AB4FD107F36FF /* FMDatabaseAdditions.m in Sources */, + 79355BD5499E59326F5C7BC9CC25F497 /* FMDatabasePool.m in Sources */, + C422E71E27ABBE6D606E062B525B982B /* FMDatabaseQueue.m in Sources */, + 15B428705051597975139C2DB212F373 /* FMDB-dummy.m in Sources */, + 43762D71F8E603D0955BC62987C6C536 /* FMResultSet.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 332FDFAE5F0A731100B7DA84FF1C4493 /* Sources */ = { + 2B44311FB98D00DA89E7C0D8D08B409D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 46A64AC807BC0DBFDA09A579EA0CF3E6 /* UITableView+FDIndexPathHeightCache.m in Sources */, - E05E5C1BD849F31A27B68D75DEF07E30 /* UITableView+FDKeyedHeightCache.m in Sources */, - A5B3E46D3763A25BD3BAF0CFFDEAA24D /* UITableView+FDTemplateLayoutCell-dummy.m in Sources */, - 7FBCD08C954F8BE3AF648806C1ACFF0B /* UITableView+FDTemplateLayoutCell.m in Sources */, - 01069C1B4E0135AF251E5CE7659768B3 /* UITableView+FDTemplateLayoutCellDebug.m in Sources */, + 1B8CB6ED0FE724C49D662E604382F2B3 /* SocketRocket-dummy.m in Sources */, + F7FC2DCB2D02DD52F9F733EB52177CC9 /* SRWebSocket.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 333271689444C03071D8092853B02EDD /* Sources */ = { + 34C3DED89EC5E68511A7A2328AC574D1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1563D7F05577852DD479C1BA3CFC24CC /* NJKWebViewProgress-dummy.m in Sources */, - 40E6B7A671DFD76170156328D995546B /* NJKWebViewProgress.m in Sources */, - 8C9165B82240F78C43F7E7ACFD17612B /* NJKWebViewProgressView.m in Sources */, + 64FF44C8D750948C28B8091DD8DEAEF7 /* Pods-GIGA-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4CC771DB3008E2E9E454A6212D41A5E9 /* Sources */ = { + 43D5CCDE6E144B6F6AEE48CEDD25AC1C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7099E4035C06D3116DA2586EFE563C0B /* AFAutoPurgingImageCache.m in Sources */, - 939EF882233B22D0321A70F6DADED11F /* AFHTTPSessionManager.m in Sources */, - B46FE8C00C2CDDE0B4790FFD3DC961A4 /* AFImageDownloader.m in Sources */, - EA23726556D213DB485BD1791C7164CF /* AFNetworkActivityIndicatorManager.m in Sources */, - 4C321BA8844AA4C44D4416CC6948DF2B /* AFNetworking-dummy.m in Sources */, - A12A3BC640B690479F345A49C6C48209 /* AFNetworkReachabilityManager.m in Sources */, - F30950E63F3D8D6C07FFB50C5971116E /* AFSecurityPolicy.m in Sources */, - E5CD5C797956697DDCC98A3EAC7E99E3 /* AFURLRequestSerialization.m in Sources */, - 3C9E113B7712442B4BCB59AB7EEC2085 /* AFURLResponseSerialization.m in Sources */, - 4C5DA96F7CAC26975EEEBD7450FF214D /* AFURLSessionManager.m in Sources */, - C257BE809D4C4357A8EB7118960E3143 /* UIActivityIndicatorView+AFNetworking.m in Sources */, - 8A1EB96C607F92E8AA20676F9A4BC7D9 /* UIButton+AFNetworking.m in Sources */, - 6AB8F78680B3470391219F11D51A1DE7 /* UIImageView+AFNetworking.m in Sources */, - 6595C6295B9EBBF40751A376239681FD /* UIProgressView+AFNetworking.m in Sources */, - 4AA3A9FC9AAD94C226CA975946C9395B /* UIRefreshControl+AFNetworking.m in Sources */, - 3345805C0D8E8D0726F7E5981DA61A5F /* UIWebView+AFNetworking.m in Sources */, + 482B75E0CB8031D3F673F70242FA41FB /* MJRefresh-dummy.m in Sources */, + DB70C0344D46C9DBD3DBD9CA84C639D3 /* MJRefreshAutoFooter.m in Sources */, + B50A173CC006987E8682D89650F14F63 /* MJRefreshAutoGifFooter.m in Sources */, + 6E560D2FE4A36AB742453E3CF5F4CE68 /* MJRefreshAutoNormalFooter.m in Sources */, + 6D2FD545E0B463F0210B5242E1477721 /* MJRefreshAutoStateFooter.m in Sources */, + EEDC5683FF36946364A3C8344630705B /* MJRefreshBackFooter.m in Sources */, + F41FA61294C6ABEEAEDC06A420AD696E /* MJRefreshBackGifFooter.m in Sources */, + 2EFA8D0D3C31B3A77612C955773F7D36 /* MJRefreshBackNormalFooter.m in Sources */, + C1117CCC45FA6780A4E9CC0879D5C3EA /* MJRefreshBackStateFooter.m in Sources */, + A7ED1FA2F59F020062DE3B579AF84F55 /* MJRefreshComponent.m in Sources */, + F024CC151BA9C2DCEEEDB1857C832CB8 /* MJRefreshConst.m in Sources */, + 4E75F1293990391FB686C2BBD734E715 /* MJRefreshFooter.m in Sources */, + 94237113054B0D5CE28D86E2C827BD72 /* MJRefreshGifHeader.m in Sources */, + B7170162BEBD63676519BFABE4D76287 /* MJRefreshHeader.m in Sources */, + EF873453BEEE867C2F8C43660CEB4A78 /* MJRefreshNormalHeader.m in Sources */, + 31D52A4583BB36984AEC4C6D71265746 /* MJRefreshStateHeader.m in Sources */, + 9A9931F189A4EF1FABC8C731BC11AEFE /* NSBundle+MJRefresh.m in Sources */, + 81727E0FB34C0FE08D39BDE52687701F /* UIScrollView+MJExtension.m in Sources */, + CF76306C6168AD7A6C076288CA899B02 /* UIScrollView+MJRefresh.m in Sources */, + 8234F492BBE286EA25736C05B5728C82 /* UIView+MJExtension.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4EE946193A9F32FB7CAFC4A21B5EA358 /* Sources */ = { + 487B8E18B11D5D96332ADD13BA3CE7C3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2EE716A52967138FD6916F5F0F0F63B3 /* Pods-GIGA-dummy.m in Sources */, + 0E4B8913A6194C1F91B73A74CAED0DCB /* IQBarButtonItem.m in Sources */, + 9CC2E583FE800ADE166A1C9D3580ACF5 /* IQKeyboardManager-dummy.m in Sources */, + 40CDAE3042B8831613E47CEA56966B01 /* IQKeyboardManager.m in Sources */, + 7B9FD8963C83EAD768E39632D58C4CDC /* IQKeyboardReturnKeyHandler.m in Sources */, + A4CBB299F1244630410150448F219B08 /* IQNSArray+Sort.m in Sources */, + 47ACE3AC563AF20D4B5214D3E9D54A24 /* IQPreviousNextView.m in Sources */, + 3FDA1CCC5C9CF26A05D9BC63FD39080D /* IQTextView.m in Sources */, + 50211E13372A7BB7F52D15ADF482DD83 /* IQTitleBarButtonItem.m in Sources */, + 1201B1B59F2CBAE4BFF1C769A089F04B /* IQToolbar.m in Sources */, + 3D7B9AB514124A054C4743DCCE14A7D9 /* IQUIScrollView+Additions.m in Sources */, + 7A15663A29FCFAC7A0CEDBD4054CD3F2 /* IQUITextFieldView+Additions.m in Sources */, + 10D5DDC653E3129429EAA5F479578CF7 /* IQUIView+Hierarchy.m in Sources */, + 50B7B54B5D5C314F0A7F1D4484FBE38B /* IQUIView+IQKeyboardToolbar.m in Sources */, + 3F7946B6980350182019FE263719E5CE /* IQUIViewController+Additions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5AB88D7903550EABB072B69F1E682D00 /* Sources */ = { + 53D4DF99BA6CF42DB05EE67E0B072062 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 95E0F7FDECABE72E262C058CB72C7DFB /* Toast-dummy.m in Sources */, - 97D9744D1FA62E10C2F3180A4B0128E5 /* UIView+Toast.m in Sources */, + 8B6FAC1D4E4E00C17CD80714623899ED /* LBXScan-dummy.m in Sources */, + 4E9322ED1BFA3AF6C4CCE034A9C9A407 /* LBXScanTypes.m in Sources */, + 4D49F2DE1333B9A93800D9094DC666BF /* LBXZXCapture.m in Sources */, + 2088C8D0DE11BA47793E33945F4E84E0 /* ZXAbstractDoCoMoResultParser.m in Sources */, + 8569759499496B1FCD936CB213BAE7CB /* ZXAbstractExpandedDecoder.m in Sources */, + A6CE0B0CE8A6380E5DD50E27597F2040 /* ZXAbstractRSSReader.m in Sources */, + D9617E15C53681EE7102360D27565D1E /* ZXAddressBookAUResultParser.m in Sources */, + CD5B234F63B253894801E87B049262FD /* ZXAddressBookDoCoMoResultParser.m in Sources */, + 92F1744A21FDACEF6F6297010D9310B2 /* ZXAddressBookParsedResult.m in Sources */, + C1B9F94970B2DB95017EB3227018A18F /* ZXAI013103decoder.m in Sources */, + 5B1239AFAE9E2E81EEB051C73A35E18D /* ZXAI01320xDecoder.m in Sources */, + D985271F97E42D83F184231DCE3E7462 /* ZXAI01392xDecoder.m in Sources */, + 1C43E4F256605E746DBD9404E22BBBE6 /* ZXAI01393xDecoder.m in Sources */, + 7FCC75D93EA3270EA7324472F20E6FD4 /* ZXAI013x0x1xDecoder.m in Sources */, + 5A920240A5DAD603C6FEFF093C6DD5F7 /* ZXAI013x0xDecoder.m in Sources */, + 46B64F21093474F5B883124D52BC409A /* ZXAI01AndOtherAIs.m in Sources */, + EB39031121BBC0DB7E53884D7518B15B /* ZXAI01decoder.m in Sources */, + 0DD9F8E78451E31753B11952BE1CA5D7 /* ZXAI01weightDecoder.m in Sources */, + D053A597BD250D3BAF1BA8AB4AB96371 /* ZXAnyAIDecoder.m in Sources */, + 6EBDFECD251CF9EB4701BBE088CFDEA6 /* ZXAztecBinaryShiftToken.m in Sources */, + 0230503CF5A3A9AC3C3873A6436927D5 /* ZXAztecCode.m in Sources */, + 706285072C6DD219003E529981939855 /* ZXAztecDecoder.m in Sources */, + 859A254DDE770691FCF898EE9AFE1066 /* ZXAztecDetector.m in Sources */, + C0948F3883EB111F12F3B093972333A2 /* ZXAztecDetectorResult.m in Sources */, + D8AA83B4ABFA7C8F5359B874D3A1FF76 /* ZXAztecEncoder.m in Sources */, + 6E815C943A6D268D625565BE85A98252 /* ZXAztecHighLevelEncoder.m in Sources */, + 4654ED39ED8349B6D7C6D8C7B9AE4ECB /* ZXAztecReader.m in Sources */, + DC2A6D85806B1FEA530B2888AC931065 /* ZXAztecSimpleToken.m in Sources */, + 69D7D7374DE4F1D6AD9C44DBDF2EE192 /* ZXAztecState.m in Sources */, + C8A0FAA64E3706CF58898FB38C610EEC /* ZXAztecToken.m in Sources */, + 289DA201A0B240DDCDCA4BB5ECB2F49A /* ZXAztecWriter.m in Sources */, + 80DEF5B5723234A78AFD3AA8F2E35B74 /* ZXBinarizer.m in Sources */, + 11FD3664C2B75E3AE30CBBF2B6500267 /* ZXBinaryBitmap.m in Sources */, + AA849A4E8DDA79D2C21020FB0A7623AC /* ZXBitArray.m in Sources */, + E847A30B5A0E54B474076185A75E3C6F /* ZXBitArrayBuilder.m in Sources */, + 23A330EC869B2344D976D0EA28C956E7 /* ZXBitMatrix.m in Sources */, + F45F46F25C98F06E54806AE8938BC1AF /* ZXBitSource.m in Sources */, + DE32A2993A413AD4A70A33FAB6691987 /* ZXBizcardResultParser.m in Sources */, + D1AF9F67B318ABDA0C4FCE09D0E16DDB /* ZXBookmarkDoCoMoResultParser.m in Sources */, + 5A62CFC81D529D35D2B708F3B38CB8E6 /* ZXBoolArray.m in Sources */, + E71A2B242F224F2354702F6DE2E3B99A /* ZXByQuadrantReader.m in Sources */, + 10E71691920126D27B9A72D474B3828B /* ZXByteArray.m in Sources */, + 41D40A80B513E5E8EB5E3AB335778AA1 /* ZXByteMatrix.m in Sources */, + 25559E4E2C354D7D2BBD2D01DCAFE38D /* ZXCalendarParsedResult.m in Sources */, + 41CF733CFE787A2740740BE8ADBDBD6C /* ZXCapture.m in Sources */, + D65D0DD30BEEE2F98ACD1ADFB51D7085 /* ZXCGImageLuminanceSource.m in Sources */, + 03748FAD55F48FCF3557A552C0A26D43 /* ZXCharacterSetECI.m in Sources */, + F203AE2DFE177121F02FED459BB84687 /* ZXCodaBarReader.m in Sources */, + 3C9E55854D24D8CF4CAFD23F1A4BB9A6 /* ZXCodaBarWriter.m in Sources */, + 73C1E279DD50A3C4C72170DD3A6B3C7B /* ZXCode128Reader.m in Sources */, + 50F4D6AA95F0E8C47D49D48A07BBA5A0 /* ZXCode128Writer.m in Sources */, + C69EFE1963CC7EB0BF1871B2CEFF292E /* ZXCode39Reader.m in Sources */, + 983123462A43B9162D52FDFE886E0AC7 /* ZXCode39Writer.m in Sources */, + 918093B1FE40206F66CB4B708918DD14 /* ZXCode93Reader.m in Sources */, + 30E230ACAA6AB5F8BBBEC11E535E6671 /* ZXDataMatrixASCIIEncoder.m in Sources */, + 9B36951533A1C00573181520834EEA86 /* ZXDataMatrixBase256Encoder.m in Sources */, + 65399940489E63D7F2757795E5FA7585 /* ZXDataMatrixBitMatrixParser.m in Sources */, + 18E044F64226DAE40D9865B638AB9DD0 /* ZXDataMatrixC40Encoder.m in Sources */, + F1D57D554CA4714B5416999B93FBAB54 /* ZXDataMatrixDataBlock.m in Sources */, + E552BCAD950098A51325AB5244034AF3 /* ZXDataMatrixDecodedBitStreamParser.m in Sources */, + 4DDD45CE71968BBCA3F298950ACEB0FF /* ZXDataMatrixDecoder.m in Sources */, + 1329A5B1B0DC10041BA6F354B73C72F7 /* ZXDataMatrixDefaultPlacement.m in Sources */, + A5FF89D1E926B822DA7B51AB553A7744 /* ZXDataMatrixDetector.m in Sources */, + FABDC970968F0D4859F0BD67A03D3BDA /* ZXDataMatrixEdifactEncoder.m in Sources */, + 017961D5BE65850BA411A7045693EC85 /* ZXDataMatrixEncoderContext.m in Sources */, + 4C4E70E3516568924C49190DC86851AB /* ZXDataMatrixErrorCorrection.m in Sources */, + 5155B80278A28ABBEFAAA3B5AB688BCA /* ZXDataMatrixHighLevelEncoder.m in Sources */, + A29EF1446A12F1B7FBC7E5B336F90255 /* ZXDataMatrixReader.m in Sources */, + AC81D218EAFEF78A56792A1FA636DF9A /* ZXDataMatrixSymbolInfo.m in Sources */, + E337E91A8370C5BB12622AC6E18A189B /* ZXDataMatrixSymbolInfo144.m in Sources */, + 0854B98C1D8854EC56DC4C964DB86B49 /* ZXDataMatrixTextEncoder.m in Sources */, + B814C8058A9BD33C02B57C994A7D9AF2 /* ZXDataMatrixVersion.m in Sources */, + 054A7E047A0FB2A2BFA3423CAD1839AF /* ZXDataMatrixWriter.m in Sources */, + 9C40862620C22A2B902911BF29EAD79D /* ZXDataMatrixX12Encoder.m in Sources */, + 3DCF7C6E3D58056FBB2EE6A75575A9D2 /* ZXDecodeHints.m in Sources */, + 91DDE6FF0D788AB359CB8E7ACC15BFB3 /* ZXDecoderResult.m in Sources */, + 04064EC74E135332467E5477AAD9ADE3 /* ZXDefaultGridSampler.m in Sources */, + FC283D1BA2F662B3502607AB7F337A25 /* ZXDetectorResult.m in Sources */, + F56C6E43364273BBC683BFB665474A22 /* ZXDimension.m in Sources */, + BEF50B5785E425A84EAC9904D7F6CF9B /* ZXEAN13Reader.m in Sources */, + 2DC227122CFB24F03615A0FBAAFC0818 /* ZXEAN13Writer.m in Sources */, + 164AC4F173828D009D726CC958BEC2D0 /* ZXEAN8Reader.m in Sources */, + 13E157842AB42B54F062359AAC2299C7 /* ZXEAN8Writer.m in Sources */, + 9787E77302F790920E5F650461E8D9CA /* ZXEANManufacturerOrgSupport.m in Sources */, + D27CEF06138C8868FA5310DCE2A12806 /* ZXEmailAddressParsedResult.m in Sources */, + E0D65A7F368158AF20919447EABA1684 /* ZXEmailAddressResultParser.m in Sources */, + CA8F3D2003D05B66D7BB8E56DF63AB0B /* ZXEmailDoCoMoResultParser.m in Sources */, + B9F59E8ABD288FA6FE288E4B5182FE8C /* ZXEncodeHints.m in Sources */, + 07C6E6A1C9069FD456A242D72FE32253 /* ZXErrors.m in Sources */, + 0616920BAE64A9CFFCBE26BC50C3C443 /* ZXExpandedProductParsedResult.m in Sources */, + 483B369D6217A42012EDEE2BC01E8BC5 /* ZXExpandedProductResultParser.m in Sources */, + 0815653B5DF4D512FB219BB2ECF95D2C /* ZXGenericGF.m in Sources */, + 04D647F472CAE96F3006BDA55B7E2886 /* ZXGenericGFPoly.m in Sources */, + F737E60C98B60846FF5C659B592F37E5 /* ZXGenericMultipleBarcodeReader.m in Sources */, + DF43E16D650023A35F9CD8EAF73785B8 /* ZXGeoParsedResult.m in Sources */, + 55714A226363D940B274121222897BCE /* ZXGeoResultParser.m in Sources */, + 5117A00713E0CEBABF79657E5B847E05 /* ZXGlobalHistogramBinarizer.m in Sources */, + 68BB2BC495F583B25EE800A2BC7A43FC /* ZXGridSampler.m in Sources */, + 85C27D27BB3D85E250BBD79B0C26F9CD /* ZXHybridBinarizer.m in Sources */, + 9A7AE8C9966DC22D4821354CDB74E333 /* ZXImage.m in Sources */, + 9994837D5818B55B069C0767791FE87B /* ZXingWrapper.m in Sources */, + 1619ED2FD1C355EA0130B3E05D61964B /* ZXIntArray.m in Sources */, + 041299113984B1FB98FE8FD63DD2657E /* ZXInvertedLuminanceSource.m in Sources */, + 590CF998ECFFA060696A7F8F8B5A6E8E /* ZXISBNParsedResult.m in Sources */, + 69655DB7EFE25A40DF19A77A94EE1EC2 /* ZXISBNResultParser.m in Sources */, + 8CDD5683DEF8E858DF5F23DACC45A4F2 /* ZXITFReader.m in Sources */, + 28147D66555F4B8B5822544E8B6B080C /* ZXITFWriter.m in Sources */, + DBF928F76E5DA1D06ECF0B0081911114 /* ZXLuminanceSource.m in Sources */, + BABD81F3D2777203AF3704D13ACCDC27 /* ZXMathUtils.m in Sources */, + 495CFEABBBBA2ADC0B52DEB5CFEB72D6 /* ZXMaxiCodeBitMatrixParser.m in Sources */, + E26E326795EDA1C381219EAF939F1B74 /* ZXMaxiCodeDecodedBitStreamParser.m in Sources */, + 31616EA5E6B8076A6858FD5F524E115A /* ZXMaxiCodeDecoder.m in Sources */, + 8C526C365681FCEE39A1696DEA7EBAFA /* ZXMaxiCodeReader.m in Sources */, + AB5044B1827EA235284AEAB03E9D4BD5 /* ZXModulusGF.m in Sources */, + 9DC350CED7B28CF0CD4C71C3806D1A6F /* ZXModulusPoly.m in Sources */, + 63E5B0A89D51F5D880D1D0C90D8A34E2 /* ZXMonochromeRectangleDetector.m in Sources */, + 1500362D354156D0722F68DECAB6E430 /* ZXMultiDetector.m in Sources */, + 7357C3D72FF425B7A6EEC2CBDF631DC2 /* ZXMultiFinderPatternFinder.m in Sources */, + 576FA432643D0D695F13446285A55594 /* ZXMultiFormatOneDReader.m in Sources */, + E8031CE350D6AD3EAC28DE6E39103CC8 /* ZXMultiFormatReader.m in Sources */, + E7A7D73ADE45384E37A646D8B17D7774 /* ZXMultiFormatUPCEANReader.m in Sources */, + FED8C903661CCC5A88D7D830D020845A /* ZXMultiFormatWriter.m in Sources */, + 24628AD291BBFFC2FE0DC01051F6299E /* ZXOneDimensionalCodeWriter.m in Sources */, + B7423B876A190A6C9851BA4F78CB58D0 /* ZXOneDReader.m in Sources */, + 3248509225F59B637EE3DE3D804DCAAC /* ZXParsedResult.m in Sources */, + 8319020F2483A8059B64A7CE1BC80558 /* ZXPDF417.m in Sources */, + D2E6B8F0B143775E0EA5DE2F74BF80B9 /* ZXPDF417BarcodeMatrix.m in Sources */, + 2B3E666D4FE7F6552C5BAA2BAD8D9B53 /* ZXPDF417BarcodeMetadata.m in Sources */, + 5742DD733E7EC5A2F097A6DC286C2F85 /* ZXPDF417BarcodeRow.m in Sources */, + 12245E86084A5B5356DF2077B1A32177 /* ZXPDF417BarcodeValue.m in Sources */, + 28744B437FCF4895E95F8DF66D380600 /* ZXPDF417BoundingBox.m in Sources */, + A8DA1233E1C289F8B13A4CEE6C1E8D75 /* ZXPDF417Codeword.m in Sources */, + 047D13E2A3E2D35B369E75467D80AB13 /* ZXPDF417CodewordDecoder.m in Sources */, + 36068B032EB99BCE0930EF12AA3B33C5 /* ZXPDF417Common.m in Sources */, + 08FD02B7B63343BF27F3A89116996919 /* ZXPDF417DecodedBitStreamParser.m in Sources */, + 75D5CD688FAAF760643D48071DA197C3 /* ZXPDF417DetectionResult.m in Sources */, + 3C471B836E94E5FE7C07E5471727CCAC /* ZXPDF417DetectionResultColumn.m in Sources */, + 59FFE52313B87B9B65A3A95212E2FED8 /* ZXPDF417DetectionResultRowIndicatorColumn.m in Sources */, + 0CC7607C2E4903CE9132B17D88F9EB46 /* ZXPDF417Detector.m in Sources */, + 2828820A42A647A2E121E7DD78473B38 /* ZXPDF417DetectorResult.m in Sources */, + 137DE5BDCF20530B665451EC6115F568 /* ZXPDF417Dimensions.m in Sources */, + 8085492743111A17C44AE052BF758F37 /* ZXPDF417ECErrorCorrection.m in Sources */, + 1180E7653EF29270DABF9A1CE1F7DBE6 /* ZXPDF417ErrorCorrection.m in Sources */, + 5824F5A12616DBC3A9CC47195AC7344F /* ZXPDF417HighLevelEncoder.m in Sources */, + 6D40381AFBEC7CAF83A9199A0A08B641 /* ZXPDF417Reader.m in Sources */, + 22E4E0F5E42F50FD9B948AB8AAEE698A /* ZXPDF417ResultMetadata.m in Sources */, + 364FFF78A00C1470CED2A6FE750A866C /* ZXPDF417ScanningDecoder.m in Sources */, + 88E2AAEC30FF97B51CC113174241AEFC /* ZXPDF417Writer.m in Sources */, + EFCD757A09DE5104AABE56A9A5F0B283 /* ZXPerspectiveTransform.m in Sources */, + 80968BCB9F1D1613D254B39D68F13E81 /* ZXPlanarYUVLuminanceSource.m in Sources */, + DE45A11F0AEAED5327152BC41FEFE4C1 /* ZXProductParsedResult.m in Sources */, + 687BC988130EF82F37904842B2990463 /* ZXProductResultParser.m in Sources */, + CB4892D447BB6EC251B44C2CE30B4DBC /* ZXQRCode.m in Sources */, + 71F1CC538AEEEB44DA131E0E1D2659D5 /* ZXQRCodeAlignmentPattern.m in Sources */, + B80AA261F7BE797DA797826E9DBA09B0 /* ZXQRCodeAlignmentPatternFinder.m in Sources */, + B826105B4E974955EA0B83DB1649ACEC /* ZXQRCodeBitMatrixParser.m in Sources */, + A7734BC342BF08F031ED1D31CFAE0C99 /* ZXQRCodeBlockPair.m in Sources */, + 5463D92BFD765B8FE84B6C61EB0580AF /* ZXQRCodeDataBlock.m in Sources */, + BFA142179E38FDE18B754753B100EA04 /* ZXQRCodeDataMask.m in Sources */, + AD4907C12B75D45C1C2EBE1652E9570C /* ZXQRCodeDecodedBitStreamParser.m in Sources */, + 8232897CAD17822C162EEA3C4E00477B /* ZXQRCodeDecoder.m in Sources */, + 38D8E6C09D1D142EECFF104C92C2FE3B /* ZXQRCodeDecoderMetaData.m in Sources */, + 2F6382C4372F2D6B83D8ED88687D3D55 /* ZXQRCodeDetector.m in Sources */, + 98CFDDBFA30FD9C6FAE3B10F4F4115F7 /* ZXQRCodeEncoder.m in Sources */, + A9397A8C0E6D8187B73BBBF9D1639EBC /* ZXQRCodeErrorCorrectionLevel.m in Sources */, + 0D17159F0F0CF816F62BF8B9913AC5C8 /* ZXQRCodeFinderPattern.m in Sources */, + C18741ABF4CA82275B9E25DF3D9245ED /* ZXQRCodeFinderPatternFinder.m in Sources */, + F9A94F5870BF1F51D62AAB43BDBEBDE2 /* ZXQRCodeFinderPatternInfo.m in Sources */, + A0D2068FB749177AAD59EEB97B2A9E14 /* ZXQRCodeFormatInformation.m in Sources */, + D904FE6DC02E6E0AE443E6556F338C0A /* ZXQRCodeMaskUtil.m in Sources */, + 185A228F0F839BF661F803C4977BBFCC /* ZXQRCodeMatrixUtil.m in Sources */, + 53E4371EAC1B99BC5A46C98963D0E99F /* ZXQRCodeMode.m in Sources */, + E77B6ABB0AC7A21F71B54989E8B72311 /* ZXQRCodeMultiReader.m in Sources */, + 5C9A5F3ED2438CB6E5C9264B78EFACAF /* ZXQRCodeReader.m in Sources */, + 766BA37972D9E3CBD39D099A1684DE8B /* ZXQRCodeVersion.m in Sources */, + 0C0A394B863D13A21C892D7AC4D91D90 /* ZXQRCodeWriter.m in Sources */, + 35631935DA5947708E3A1AF02645F182 /* ZXReedSolomonDecoder.m in Sources */, + FB1802782C09F43938EDAEAD30BEDA76 /* ZXReedSolomonEncoder.m in Sources */, + 4660733038D27363E625BC581A310405 /* ZXResult.m in Sources */, + FDFCBD17D90E97102EEEAE34EC5D7052 /* ZXResultParser.m in Sources */, + 15A8696D77C1C328CA1F9B3C1E8A8EE9 /* ZXResultPoint.m in Sources */, + 7AC960A6348FB810BAD910637E074628 /* ZXRGBLuminanceSource.m in Sources */, + 39D416C06B41801B1A99F3239832E886 /* ZXRSS14Reader.m in Sources */, + 14BC9EC2ED9FDCC51C077E22C1516E36 /* ZXRSSDataCharacter.m in Sources */, + 4433F4DAF902F9FD2DD8BFA469A5E080 /* ZXRSSExpandedBlockParsedResult.m in Sources */, + 1EE475C1374AD0801F4E702631882891 /* ZXRSSExpandedCurrentParsingState.m in Sources */, + A833B3BF425053CF3DB92B757FAD7768 /* ZXRSSExpandedDecodedChar.m in Sources */, + C7F3DE8453708A0A3FA26F146AEBB1BD /* ZXRSSExpandedDecodedInformation.m in Sources */, + B631B58110CF1C281A0C6617A6A9011F /* ZXRSSExpandedDecodedNumeric.m in Sources */, + CE273EBEF55C902DB2A36A423E4635B6 /* ZXRSSExpandedDecodedObject.m in Sources */, + 3E09002683582BCA4A1F28B6AC43ED5D /* ZXRSSExpandedFieldParser.m in Sources */, + 7341E2ECDC0C449A24F1D201E240059F /* ZXRSSExpandedGeneralAppIdDecoder.m in Sources */, + DF824E7A687730AC8C0D82E617959E9F /* ZXRSSExpandedPair.m in Sources */, + 4F63793C6840D0406F6FABB3BE56D525 /* ZXRSSExpandedReader.m in Sources */, + 311B967477C5DC8361F304109A070C93 /* ZXRSSExpandedRow.m in Sources */, + 0D757E743295B66A7F4163954C393E53 /* ZXRSSFinderPattern.m in Sources */, + 359A08BE7D3363731FF5B862178D2C03 /* ZXRSSPair.m in Sources */, + C7FEF0EF55BC138C7095D0BB3CBFE9E7 /* ZXRSSUtils.m in Sources */, + FAB3DA08A21A0B281718F6917C922815 /* ZXSMSMMSResultParser.m in Sources */, + B0B3A20301514E5A71D837F8871394EB /* ZXSMSParsedResult.m in Sources */, + EE57C4E1072D696BD8271EA8D97D8712 /* ZXSMSTOMMSTOResultParser.m in Sources */, + E91C1774AAFB30CA789730C35866A158 /* ZXSMTPResultParser.m in Sources */, + F69D5706B6378625288304ECCEE950CB /* ZXStringUtils.m in Sources */, + D74CC7C57FEC0C821FADB3C39F575FE8 /* ZXTelParsedResult.m in Sources */, + F2B27FE21DE67A8FC4FF1C83C15BF57E /* ZXTelResultParser.m in Sources */, + C1AEBA80A062707BA682306712A8730C /* ZXTextParsedResult.m in Sources */, + C74A80546CDF6BB6A89440FA69A9AEA4 /* ZXUPCAReader.m in Sources */, + 717ACA4BC5C80F17D454BA3FFA4BEFAE /* ZXUPCAWriter.m in Sources */, + EC7D17FE2711C8D82918606F046B3E97 /* ZXUPCEANExtension2Support.m in Sources */, + 75F9CE6C73465F62FABD40FEF93009CB /* ZXUPCEANExtension5Support.m in Sources */, + FDD8EA80A701E1FDE822BACDE407CE53 /* ZXUPCEANExtensionSupport.m in Sources */, + 9D78AFC0B0AF189B2A50279C25651C18 /* ZXUPCEANReader.m in Sources */, + 71B9A63D48135B0FE64609FA8F1A7C3D /* ZXUPCEANWriter.m in Sources */, + CC37D45550BD8023949D261D159AB47E /* ZXUPCEReader.m in Sources */, + 38F7C78C1407F016F58A448522B0A000 /* ZXURIParsedResult.m in Sources */, + 736B7EDF2AD8D42409920C482FBEB35A /* ZXURIResultParser.m in Sources */, + E40AC5E79BF9DE2489450684BDAD4671 /* ZXURLTOResultParser.m in Sources */, + 42CA33FB1078C0D2289E837E16E204EE /* ZXVCardResultParser.m in Sources */, + D61B5ED8425310C8F3E2CEDF0071F9BB /* ZXVEventResultParser.m in Sources */, + 78C391F2C671000F6CA29CB491D3CF9F /* ZXVINParsedResult.m in Sources */, + 241A5CB8E943BA47DF202969BF0F3746 /* ZXVINResultParser.m in Sources */, + 2B4C83D570A94C9A8A0D98B49B94C3C9 /* ZXWhiteRectangleDetector.m in Sources */, + 4AAB319F32AA53F947C290C0AD453BA6 /* ZXWifiParsedResult.m in Sources */, + 03C04D438843E9ABA57B8AAE9B6155EA /* ZXWifiResultParser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5D9F4A386169F298C8544D099324BB28 /* Sources */ = { + 56AAE5F77503768AB7E1B1C1CBAC6C2E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 57E9B041CC1D8988C38DDC97CAEFCD76 /* MBProgressHUD-dummy.m in Sources */, - AA00DCC0C8174B2D7E48EEC3C768B047 /* MBProgressHUD.m in Sources */, + AAEE1BA924187FD226827D96E7BBFD72 /* Compression.swift in Sources */, + B5CEE9B4820443E56D0E82A7CA8E06A3 /* SSLSecurity.swift in Sources */, + 497C18109669EB1CA4777CDCCC305010 /* Starscream-dummy.m in Sources */, + 73273C50AD0AD94F2D8CB5903C2651C0 /* WebSocket.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6D4ECE0A60E69F261AA10FE2CB90A0AC /* Sources */ = { + 79D0EB5C92240FE3B1FF78CA02696BF1 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 621B413DAEFE75991251ED378822527C /* MJRefresh-dummy.m in Sources */, - D46545D206874E3A223372C84F1EA73E /* MJRefreshAutoFooter.m in Sources */, - 7EFDAA1642FA83DE777CFD086182D5A4 /* MJRefreshAutoGifFooter.m in Sources */, - 344DB99F8332029C0391F08B6D0E425C /* MJRefreshAutoNormalFooter.m in Sources */, - 1843E6DF520A5EFE9C83C38E18578E42 /* MJRefreshAutoStateFooter.m in Sources */, - E80DB5D9B2D35085282DF057BB540AFE /* MJRefreshBackFooter.m in Sources */, - D66E78D63935A98894E702D922AA8B91 /* MJRefreshBackGifFooter.m in Sources */, - 101F836F887C01B45F4DCF351EBC28D1 /* MJRefreshBackNormalFooter.m in Sources */, - 2524EC4EF024A6C067A0FA082084CFB5 /* MJRefreshBackStateFooter.m in Sources */, - F68EA720B0ED1BF96CEBF07977A1C0A2 /* MJRefreshComponent.m in Sources */, - 8069223DDD6D0F2E1A87D8E66966709B /* MJRefreshConst.m in Sources */, - 3829CBCC3598DB13C2AD3B7383D1F24A /* MJRefreshFooter.m in Sources */, - FD31283E2A43955C5BA6FA9008EE8D7C /* MJRefreshGifHeader.m in Sources */, - 8DC3FC2342EC2E944B3A3E83E2683130 /* MJRefreshHeader.m in Sources */, - E57312010AFB591EE37870F65E651EA6 /* MJRefreshNormalHeader.m in Sources */, - 07159A933B3C47A02FE2B2744ABAAC89 /* MJRefreshStateHeader.m in Sources */, - F4A57F7C1F8184A6DDEABB07FA6D7083 /* NSBundle+MJRefresh.m in Sources */, - FB9C6242B11049E2F1062D04565E568D /* UIScrollView+MJExtension.m in Sources */, - 8B855A73B75155FB2C0CB05B54FDDE0D /* UIScrollView+MJRefresh.m in Sources */, - 0A1E34B4A27DCD62A914F3B028A07E6C /* UIView+MJExtension.m in Sources */, + C2B0DA35772F9F6531314F99C5E2BBDD /* MASCompositeConstraint.m in Sources */, + 98655E9ABEE655AC980F3AB422088C38 /* MASConstraint.m in Sources */, + A0FDD2A6832EE4854731CDB45C4B5B9F /* MASConstraintMaker.m in Sources */, + 65AD43F8BB7734430A4B11B134CFA4E0 /* MASLayoutConstraint.m in Sources */, + DCBA94B9BD9E5DD47BAF0C901C85ABC4 /* Masonry-dummy.m in Sources */, + FCE43D464D18874613D40BCAF034A404 /* MASViewAttribute.m in Sources */, + 69E753A064765388C9FA44918F81E5A5 /* MASViewConstraint.m in Sources */, + F70096947E7F91201BC9FACCF008FE9C /* NSArray+MASAdditions.m in Sources */, + A9C9774D6BCA3A159F4DA9D9D0CD4196 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, + 1046B7E99E763A9478CEDEB621A21C5F /* View+MASAdditions.m in Sources */, + 49CD91D6F77E8E088F0A5C59EE86B53C /* ViewController+MASAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8FE0D4B503A94502F3431DC0DCB58040 /* Sources */ = { + 7D3C02976879E96AC7CD71E39CA4F1DA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 37F097E2269EF1BD238AD7449D796445 /* FMDatabase.m in Sources */, - 9C11A290C9C5866A185A54F1EC04E2BB /* FMDatabaseAdditions.m in Sources */, - C605A44DF96E7FCACF7D6E37B62F795D /* FMDatabasePool.m in Sources */, - A1B5D80A8998311B8C9043E6942925E6 /* FMDatabaseQueue.m in Sources */, - D5991941DC41DDDDDACAE0B5D47A4639 /* FMDB-dummy.m in Sources */, - 87ECA447DB887426665260651B7F147E /* FMResultSet.m in Sources */, + BEADC76C933ECDEC7FB7898EB94DFA9E /* YTKKeyValueStore-dummy.m in Sources */, + 901B19E638D600F0F4F3FC0CF71A0892 /* YTKKeyValueStore.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 965333B574D4C1404A50E045E0E55524 /* Sources */ = { + C5E84FE0D6BE979BFCF2CD8915D3CB6D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 980E0C1816124A0343E2EA2CF7F30EE5 /* NSButton+WebCache.m in Sources */, - F2DBE008FD27BC11699DB76F11074A94 /* NSData+ImageContentType.m in Sources */, - 3A0419540405C51EA35937E39E985E9D /* NSImage+WebCache.m in Sources */, - 7FFE6B83CA9E5A9A1D23F9F7FC320E65 /* SDAnimatedImageRep.m in Sources */, - A78A1ABBC5D657764E754959BF9BD290 /* SDImageCache.m in Sources */, - 78D1AB77E0145AD1E77DC9CE0B8C4D49 /* SDImageCacheConfig.m in Sources */, - 91F8ACC960F47860C2BFD36E1AB3DC2D /* SDWebImage-dummy.m in Sources */, - E630FECF3706C1EC8EE717263D1B2FF5 /* SDWebImageCoder.m in Sources */, - D0E2C9455FAC089FF047113E8B217CC8 /* SDWebImageCoderHelper.m in Sources */, - EDE0C584CA148C197740CCB795E2120A /* SDWebImageCodersManager.m in Sources */, - 018E193AC91FD48C64A9ED15D58AC95D /* SDWebImageCompat.m in Sources */, - CAE88A60F8C6CD6AE662BAFA5ED3B373 /* SDWebImageDownloader.m in Sources */, - 6F5E56A1D7E89F2B0A2692CF780EFE7C /* SDWebImageDownloaderOperation.m in Sources */, - B1BDB5153E77DA6754E2364A3BB4D20A /* SDWebImageFrame.m in Sources */, - 2CB401BA28E91577E8318A7BD8D03192 /* SDWebImageGIFCoder.m in Sources */, - 82E73BD4532D89B27F8F209781C134AE /* SDWebImageImageIOCoder.m in Sources */, - 57D1433F37CDBBC61AEC35D00F8F5CA7 /* SDWebImageManager.m in Sources */, - 3B31BC5E11334050DEE2597D1196D8A1 /* SDWebImagePrefetcher.m in Sources */, - 2C70FC786858E6FFD02177DD4DF6DEFB /* SDWebImageTransition.m in Sources */, - 0CDCF95E1063393825F8FC7FFD04726A /* UIButton+WebCache.m in Sources */, - FBE6911E3E07AED7313FC851407687B7 /* UIImage+ForceDecode.m in Sources */, - EB0A377753BF36E5018176EF7A4AF774 /* UIImage+GIF.m in Sources */, - 45AAEFF6FFBCEE5DA0A7377AE556CE7B /* UIImage+MultiFormat.m in Sources */, - 9C54C073493FCFF4AE07427E9CC72DB2 /* UIImageView+HighlightedWebCache.m in Sources */, - 9ADBC57B36C223E3C5BE5DFCD8197971 /* UIImageView+WebCache.m in Sources */, - B1F714AD50E405F4DD3C865A7D823EAB /* UIView+WebCache.m in Sources */, - 03FF8A989242213A9B392E66E53BE8C1 /* UIView+WebCacheOperation.m in Sources */, + 7315D926EF2DD1D3CF820129392B70B5 /* NJKWebViewProgress-dummy.m in Sources */, + 1E0D2D2C8E89E32D7EB761D831C2A922 /* NJKWebViewProgress.m in Sources */, + ED159AC56D7FABFB161CF365E5D083C2 /* NJKWebViewProgressView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9C25B5FA35DC9EC5F136CC6548A928D0 /* Sources */ = { + D9A83526FEFD3DDF6E25C88C64E87DF4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 14441D47B616C056BC4F532352A3091D /* TTTAttributedLabel-dummy.m in Sources */, - F35840AED8A0E374320B77F3E86D1FA3 /* TTTAttributedLabel.m in Sources */, + B0281E4D47021BE0F52F6965D9B6AD49 /* TTTAttributedLabel-dummy.m in Sources */, + B1CA92FCCC65778E67847B884E6D1EE3 /* TTTAttributedLabel.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BADE9C1D2BCD00ED4F4CA4A4E9457DFA /* Sources */ = { + E2E0D0E5DD75E32F6B871B89C841379B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5BC8CFF572E6322BA5BDC91D816D94DB /* SocketRocket-dummy.m in Sources */, - 572BCA39E6087AD4DE4BD534943A67C9 /* SRWebSocket.m in Sources */, + 06C238A68332A7F2CCE87BF90B63B5A0 /* Socket.IO-Client-Swift-dummy.m in Sources */, + 83C45B2227372932D4B69C936DDF74F7 /* SocketAckEmitter.swift in Sources */, + 6538CFC461D1FB80288ECA206B11C410 /* SocketAckManager.swift in Sources */, + CDB4993924F7B8522FA32BCFFAA7A14F /* SocketAnyEvent.swift in Sources */, + D07F337EFACD95AFE2C1B5FD1D7FB897 /* SocketEngine.swift in Sources */, + 1245F5367CBC0C659D1FBBEEFCE0E744 /* SocketEngineClient.swift in Sources */, + D7DF407CF9892B54E300B16AEE0569B1 /* SocketEnginePacketType.swift in Sources */, + F1A67CDA78C57CE8E65AD8EB230BC24E /* SocketEnginePollable.swift in Sources */, + 87A4427A95A579CC8DF04135529D93F7 /* SocketEngineSpec.swift in Sources */, + EB951ACB50E3FE6A853DFB4DDB2E77A8 /* SocketEngineWebsocket.swift in Sources */, + 4543B450ACE79BA79F906BF95AE21B59 /* SocketEventHandler.swift in Sources */, + 8EEBDDFC5BBB167C4913C62807AC9C24 /* SocketExtensions.swift in Sources */, + 3188B757C2D0D03E8E269A7F716DAC9C /* SocketIOClient.swift in Sources */, + F49F47AFAD2D3D8854BD0B3CE4B6746C /* SocketIOClientConfiguration.swift in Sources */, + 7495F5F35EF054D5CC1F6BBBE5A18A98 /* SocketIOClientOption.swift in Sources */, + 6C1A59F113DA3CC594BAD9FECE548A28 /* SocketIOClientSpec.swift in Sources */, + E9DFA226A33F536E50D19EC5A7D17DED /* SocketIOStatus.swift in Sources */, + 23AC0D9177E0A94FC02781BAF003F2A3 /* SocketLogger.swift in Sources */, + 3527C1A5E649D245B06E5692B204F3C1 /* SocketManager.swift in Sources */, + A996D01F1A72BBDBE24ED9DB6E9887F4 /* SocketManagerSpec.swift in Sources */, + B3766CD47ABAD4FEF5379E0ACDF5FDC0 /* SocketPacket.swift in Sources */, + 3621B1D5A658B98CCDBBAAE39F617716 /* SocketParsable.swift in Sources */, + 84B07844B1C013044F01D7C68E3F1448 /* SocketRawView.swift in Sources */, + DE2534B24D28CAD5D2C0B14445264AE2 /* SocketStringReader.swift in Sources */, + 1951AB8CB4412CE82DD03CCFCA47CBFD /* SocketTypes.swift in Sources */, + 2BF184F06F49DE9A54CE797F4FCE1DEB /* SSLSecurity.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C0BD0068ECDB12149AD4414CBA31B505 /* Sources */ = { + E312B520DA96818DD869E0F741A90F07 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A0303675DA1D1590CCCBDAA2B5A7F560 /* Socket.IO-Client-Swift-dummy.m in Sources */, - 5F0B1C5637118C157A9B60D62896F846 /* SocketAckEmitter.swift in Sources */, - 08F144BF3E6E8F423644771FDC299B88 /* SocketAckManager.swift in Sources */, - 97A034AF6314B2F2799F157CB5701E9E /* SocketAnyEvent.swift in Sources */, - 8DFCB3EDAF8FA11CB49B473AE187B5F3 /* SocketEngine.swift in Sources */, - 0D820188A3982F77A8C2FD47F4249F25 /* SocketEngineClient.swift in Sources */, - 104BE926FFFB5C942A7A0FAC05920132 /* SocketEnginePacketType.swift in Sources */, - 71E99398CEF7E77AFD550582A21DF6A9 /* SocketEnginePollable.swift in Sources */, - 162595288B55C740806E9BF91E39A9FA /* SocketEngineSpec.swift in Sources */, - D55F4366DC3D822A511513DF4E5D6AF5 /* SocketEngineWebsocket.swift in Sources */, - 2C4EF1B590BD389FF42157519B73A70C /* SocketEventHandler.swift in Sources */, - 72E566862803FE9B1DE0D4A246E34DA9 /* SocketExtensions.swift in Sources */, - 40A9F401B6A8B531B3CF176B6EA4C0AB /* SocketIOClient.swift in Sources */, - A1DF5B0FADB9E502553372C3347042A2 /* SocketIOClientConfiguration.swift in Sources */, - C5BDD2876FB1BBF95F1EC56250280365 /* SocketIOClientOption.swift in Sources */, - 82C00DBA894D53CDD0AD35BE2BBFEC0B /* SocketIOClientSpec.swift in Sources */, - F82FA69799081C549A687B2B72DB7ECA /* SocketIOStatus.swift in Sources */, - 322539ED22E284D2B69C53BB5298C282 /* SocketLogger.swift in Sources */, - CF957309306A61F1A68EC08E1152AB3E /* SocketManager.swift in Sources */, - A0FB2FBEADC2C2FA597C80290DF6B809 /* SocketManagerSpec.swift in Sources */, - 580C49850ED7094BC4D197E27DDB07CE /* SocketPacket.swift in Sources */, - 3C52DF3086A7BA2E047AFFFCBFEC1E0B /* SocketParsable.swift in Sources */, - C4A53AB41B17060209A7059F727FCB9F /* SocketRawView.swift in Sources */, - 7854DF5B9510FA3584D187A9D20B2F18 /* SocketStringReader.swift in Sources */, - EA0E9DCCA7F7A4B3B582E34AC137C2A3 /* SocketTypes.swift in Sources */, - 2BF9244FC886AC7E571F140F13713AFC /* SSLSecurity.swift in Sources */, + 5FA55EF84822B2052AA3135EC5BA3CF9 /* JSONAPI.m in Sources */, + A752FFFD5E8C40A7C19452658D664AA8 /* JSONHTTPClient.m in Sources */, + 47B6240312148D9BC9E8304C28B4F6D0 /* JSONKeyMapper.m in Sources */, + 4A2E07F69738291B00F0EDE3F298DBD6 /* JSONModel+networking.m in Sources */, + 2C7B1F9981AAF7E6DB36F33CB2D6E976 /* JSONModel-dummy.m in Sources */, + 97EBD85280DD7B1F9D8EF8688F166FC2 /* JSONModel.m in Sources */, + 94104A13FB72ABF23BCFA2050B032810 /* JSONModelClassProperty.m in Sources */, + 92EAD4A2D3217EF1712DEBAA146F4925 /* JSONModelError.m in Sources */, + AB0E805A026ADE3A14D715AB1C2A15E2 /* JSONValueTransformer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - CF525CD81327D7C4B38AF818D91B35A1 /* Sources */ = { + E5234A45649DADD21E14048EFDA99A91 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 06697BBB6E6D73B5F021E6DACAC5DE45 /* JSONAPI.m in Sources */, - 57FE38F17C0EDD5CF73B2A084A17586E /* JSONHTTPClient.m in Sources */, - 772785574BC1059C2913576CBFF3AD17 /* JSONKeyMapper.m in Sources */, - 98F19C682AC68E9D2E2052F709F42AF9 /* JSONModel+networking.m in Sources */, - 8060025235D93F30A5F10B412DD0822E /* JSONModel-dummy.m in Sources */, - E39D9A942BCE728467A42C478816966F /* JSONModel.m in Sources */, - 40A6216FC50B4540584DA1C45F98F9FD /* JSONModelClassProperty.m in Sources */, - 0B1C5725C7BE03D622114275D6FD6EFA /* JSONModelError.m in Sources */, - 37F6913EE3CD6EB8715086F0C9F6A823 /* JSONValueTransformer.m in Sources */, + 194BFF38420B84FEC90E78230049F8E3 /* UITableView+FDIndexPathHeightCache.m in Sources */, + C733A3160B98A390F70AC3995352E5A1 /* UITableView+FDKeyedHeightCache.m in Sources */, + 123BFB4D6A5A03B0BEA5FB60E35BCE57 /* UITableView+FDTemplateLayoutCell-dummy.m in Sources */, + CA476856E4164EDEDF8D4221CF2FB977 /* UITableView+FDTemplateLayoutCell.m in Sources */, + CDC48DDA8FFF645BB2FEEE7B76277D35 /* UITableView+FDTemplateLayoutCellDebug.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EF7C3A296212CFB87AC9B8A7939E3733 /* Sources */ = { + F234D804A6DF4B28B29AD4543C9E7091 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0DB2E34289D18AA9810609ADCCBFA181 /* IQBarButtonItem.m in Sources */, - A3CE2D718CEB5AC059823178404AF0EF /* IQKeyboardManager-dummy.m in Sources */, - 2D407C6492BC569F5361B9210C89A19C /* IQKeyboardManager.m in Sources */, - E802560B425A04296159872675948D29 /* IQKeyboardReturnKeyHandler.m in Sources */, - 7C49A18841060D12A58F92CE62C21F9D /* IQNSArray+Sort.m in Sources */, - C2B7F4EB405C401EA53023341C05E15E /* IQPreviousNextView.m in Sources */, - 72EE4A5DC3076CD8C13717D4DAA37DFD /* IQTextView.m in Sources */, - 958FEEE31215AB970371D4CBAEB8A4DC /* IQTitleBarButtonItem.m in Sources */, - CA1E205A4D3A8515ED42F76C2671F1BA /* IQToolbar.m in Sources */, - 431C76067CB09B1FC0E4DD5AEA6B540A /* IQUIScrollView+Additions.m in Sources */, - 665B3B037B98D3E3ADB449A43FF14F42 /* IQUITextFieldView+Additions.m in Sources */, - DEB92E2DB086E554AEA1DBFA8A9F00D0 /* IQUIView+Hierarchy.m in Sources */, - C4AA57B938513DE614A7B90AEF5CD858 /* IQUIView+IQKeyboardToolbar.m in Sources */, - C480AC5D32406D4901116FCAC5FB0EB5 /* IQUIViewController+Additions.m in Sources */, + 0A6918600CF1ED55AD77072040F53728 /* Toast-dummy.m in Sources */, + 9800F31C362EB5F09E059F128AFA4BB8 /* UIView+Toast.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FA2E591FE6FE4CD342ACA3F8A3757326 /* Sources */ = { + F4713168E0E52FBFA2C477699A9D16C9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 37BC04B72C67B4A408D409660D3B790C /* Compression.swift in Sources */, - 1AB30B2D8CA8C6F55177330FA38BA5B3 /* SSLSecurity.swift in Sources */, - 877908A157CA3CC4687710B1F8C43117 /* Starscream-dummy.m in Sources */, - B4137607C73DB4C84CA0EF8163BDD6F0 /* WebSocket.swift in Sources */, + C2092485FA10B21CE9CB9B066900E661 /* MBProgressHUD-dummy.m in Sources */, + 487EFA26B8348DD253C758F3F7A5BC3C /* MBProgressHUD.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F5E4E28FDBBBA3AA91306A48D567B739 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CDC6FB0F5FCB58B8F964F088730BB34E /* NSButton+WebCache.m in Sources */, + 1E4944B1B0A936AB1A312372241DA81D /* NSData+ImageContentType.m in Sources */, + 4E72AED0E8BCB951E0552BCB50CB334D /* NSImage+WebCache.m in Sources */, + B0E962DF1ABF8E3BCCE2417F3288B893 /* SDAnimatedImageRep.m in Sources */, + E6D254619488CB7CE6F27274F47D9AB9 /* SDImageCache.m in Sources */, + 332D90D4E1E29F975EFC1A2C57D43F85 /* SDImageCacheConfig.m in Sources */, + 2420AC422D4BA7D37D2DF2658EB29660 /* SDWebImage-dummy.m in Sources */, + 47C66017AFF8B9C3F94C99C9448C02E6 /* SDWebImageCoder.m in Sources */, + 0E153F9B4DAEC9C1BD0998D2EA22DCD7 /* SDWebImageCoderHelper.m in Sources */, + 93C4308343B23D55C32470E2F9FB5917 /* SDWebImageCodersManager.m in Sources */, + F867ED173D4B0920CAB4F91AE032F6E5 /* SDWebImageCompat.m in Sources */, + 951D22F9648387ACCCD5795969AEAD02 /* SDWebImageDownloader.m in Sources */, + E8103E369A49C3FAB1E048815628E26E /* SDWebImageDownloaderOperation.m in Sources */, + 3019CD18CCB214F7E5B5DE03EAE3A53C /* SDWebImageFrame.m in Sources */, + 4E8626BB5B57700FCCDCB61B2AF7F7B1 /* SDWebImageGIFCoder.m in Sources */, + 538FADA93B9ED8FF6EBE726DFDEC6722 /* SDWebImageImageIOCoder.m in Sources */, + 81790BFE14093CED901966998BBDA7A7 /* SDWebImageManager.m in Sources */, + CB804B5FEE4743D906CA384A7066CAAB /* SDWebImagePrefetcher.m in Sources */, + 8FA9EE637CCA93919158C7D1F2B2C123 /* SDWebImageTransition.m in Sources */, + F1FEFCC47B84063C09BB15EFC61C6347 /* UIButton+WebCache.m in Sources */, + 0CEB64C65D99E37CF202E65A9961CE20 /* UIImage+ForceDecode.m in Sources */, + FECC3B1D6A518337B348474CDB24756F /* UIImage+GIF.m in Sources */, + 955623738E352D34791B6DF3B208638D /* UIImage+MultiFormat.m in Sources */, + 126E1C4B8C5A1CCBB0F162D88BA52607 /* UIImageView+HighlightedWebCache.m in Sources */, + 9C9207803EFF14A47B2EFA9410263B00 /* UIImageView+WebCache.m in Sources */, + 790E36B06B42D441FE6D50E5A8DA8FC4 /* UIView+WebCache.m in Sources */, + 30DAA59D2374E9665FE97EDACFCA0BAF /* UIView+WebCacheOperation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 079925957D86D489BC666F7FA843B6FA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = D90CADD9FA47277BDDDE85CFC0082CA0 /* SDWebImage */; - targetProxy = DED752E9FC0AA5300D528DB0E9124181 /* PBXContainerItemProxy */; - }; - 0BE77DA234F6DEC499E903B8E7EB5483 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = NJKWebViewProgress; - target = 826EFF975442065A54A0B2D3103EE6A4 /* NJKWebViewProgress */; - targetProxy = 9C3EF21F4556D671BA3BE7400A55E897 /* PBXContainerItemProxy */; - }; - 2465E7DF59E294D30DF9A4A33577D4E3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Starscream; - target = E0D1006C742EBDDD3F2BF40A564ACBCB /* Starscream */; - targetProxy = C76985D2A0135055E2ABBA833FC64D06 /* PBXContainerItemProxy */; - }; - 2628552A12C2EACA98125D6931C82E07 /* PBXTargetDependency */ = { + 094391649B987EAEDBBC5E411E36A8B4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = TTTAttributedLabel; - target = 1EB527CCE1B0F3D64088AFF319F1FBA4 /* TTTAttributedLabel */; - targetProxy = BC9806EDCB11E0B99C6381C9C331547D /* PBXContainerItemProxy */; + target = 16F68B5CBE5CC3F4678A1D70F1C55D39 /* TTTAttributedLabel */; + targetProxy = D5C6E922B97256B5D5C69552F034D503 /* PBXContainerItemProxy */; }; - 3474D6C3280BAA5B3AE4B633886CFAFD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = AFNetworking; - target = F4160500DCEA3DA3E93FBA579E88CA0A /* AFNetworking */; - targetProxy = 7CEAB308D3E048B456470272A1F49E79 /* PBXContainerItemProxy */; - }; - 34FD209D36BCC2071BC143882F6FFD7F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = JSONModel; - target = DC3688684BF42A20A8998F31DDA51A49 /* JSONModel */; - targetProxy = AC37C85FA38ECD5BF75ADA47577069D8 /* PBXContainerItemProxy */; - }; - 7B269A4DC3EE69401D85709E40F00741 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = MJRefresh; - target = E14A62900910444707A5504D25EC98DC /* MJRefresh */; - targetProxy = 01E07FDE67675FAB1B4CDDB0CFB15A5A /* PBXContainerItemProxy */; - }; - 8090D0FCF9F29403D4F000D942D9F481 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Socket.IO-Client-Swift"; - target = 3578E512F8C94E9B49F88CAA98690402 /* Socket.IO-Client-Swift */; - targetProxy = DA15677B5BEEF2B52CC8D1DB79DA0071 /* PBXContainerItemProxy */; - }; - 8C3790FF34469A5A4973C79FADDC3A8C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FMDB; - target = 251BAD17812F7EBF6532EACF66F941C3 /* FMDB */; - targetProxy = 1E4EF142FFB1473CAEC44BD562F17C8F /* PBXContainerItemProxy */; - }; - 9CAF310FFB6FDCB7682F7D72D8E2A542 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Starscream; - target = E0D1006C742EBDDD3F2BF40A564ACBCB /* Starscream */; - targetProxy = 88165B3DC6F1DD9D85F485FF523A7B7F /* PBXContainerItemProxy */; - }; - ADC0001F8C3FA28B1BD19C658A16229E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Masonry; - target = D52144DE9D7255DE912490FF5A806573 /* Masonry */; - targetProxy = 02AD085923257926101043ECBDA0B642 /* PBXContainerItemProxy */; - }; - BC40A9A910B2C3270FB0877043CE564C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = IQKeyboardManager; - target = D55833EC3DE9EBD9B329CAEB983D5A9D /* IQKeyboardManager */; - targetProxy = 565145C78EF9F332BB48DEDC973C1DA9 /* PBXContainerItemProxy */; - }; - BD746092D8282A48023C6DD462B91812 /* PBXTargetDependency */ = { + 0BD00084C3D42E503DCFCBCE33BDD138 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YTKKeyValueStore; - target = 43F697FCA8E9557F575EBF7DC785AFD4 /* YTKKeyValueStore */; - targetProxy = 174E6C2171B05DD68BDA9FF3114D98FD /* PBXContainerItemProxy */; + target = 0F3C96ED140272710A6DBB0D5160C4BE /* YTKKeyValueStore */; + targetProxy = 78A5F4FB9778A8500F6313408930292B /* PBXContainerItemProxy */; }; - BFEE35A4C49AB945CAEC4362F733E394 /* PBXTargetDependency */ = { + 0DBF47829E10BF29D53ED9D706420C96 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FMDB; - target = 251BAD17812F7EBF6532EACF66F941C3 /* FMDB */; - targetProxy = 0CB6BCAA410A24DDCAB7891977A91996 /* PBXContainerItemProxy */; + target = 01B52F53C563BB35B7989239BE79A18B /* FMDB */; + targetProxy = C71BD7E816CFE5489EBA3E0BB9FC7D35 /* PBXContainerItemProxy */; }; - C5949C3702F8D473B24B99AF83A168EA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FMDB; - target = 251BAD17812F7EBF6532EACF66F941C3 /* FMDB */; - targetProxy = 8A906A446E3695C9C80C35AF0D8D128A /* PBXContainerItemProxy */; - }; - D39B75EEFD12FE7DB170D1185F47889C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SocketRocket; - target = 6B8D192C8CBB4BF55A7F9B79C12280DB /* SocketRocket */; - targetProxy = 96033F3DE39CB124CE5C342CDB6D3638 /* PBXContainerItemProxy */; - }; - D709F92486254BF5CB45836CBA34C204 /* PBXTargetDependency */ = { + 12F06E7249623AEF1C0169B97CDB0077 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Toast; - target = 203E2ACFC533A5A3C189DF6DCDF9A3CA /* Toast */; - targetProxy = 476568165F539EF85B0F5D26800B1E50 /* PBXContainerItemProxy */; + target = 1BEA4448CAF18B76846444E6AE7C7546 /* Toast */; + targetProxy = 28AB62E59D5B56A11A9D6BEC31639603 /* PBXContainerItemProxy */; }; - E99E9B707573763E42EBDE5EFD4BB215 /* PBXTargetDependency */ = { + 23AA8DD6BF898E467E6268A4C7C94CF1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = LKDBHelper; - target = CCA9C33B127D6C859A3F8AFBEFCBABF0 /* LKDBHelper */; - targetProxy = D4BE66B430547E25A22F38975F6DA9C5 /* PBXContainerItemProxy */; + name = "Socket.IO-Client-Swift"; + target = 9FF23E172EC401782F56F65C2FF4688A /* Socket.IO-Client-Swift */; + targetProxy = F6E9B6DA89ED17A96F9D64422AE14881 /* PBXContainerItemProxy */; }; - EE4738C2A350C865467010A20947D4AD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "UITableView+FDTemplateLayoutCell"; - target = 57DFE3ED684FE796F4717C7ABAE517F8 /* UITableView+FDTemplateLayoutCell */; - targetProxy = F3C75840DD6E63711A0AEAEDF330E105 /* PBXContainerItemProxy */; - }; - F5433A64C8D149225D11B9976EEA15C2 /* PBXTargetDependency */ = { + 2CE8038F90A90FE3BC39BCEF4AE7CD19 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = MBProgressHUD; - target = 6B1714E816AE794962516E2ECBB40A5A /* MBProgressHUD */; - targetProxy = 42C98B0B09DABB12204DFF9FDEFE2BEB /* PBXContainerItemProxy */; + target = B18ACDBC4A945B03194AEC88D59D9CA9 /* MBProgressHUD */; + targetProxy = D0DE694AD89D8DB3722F059818E43A67 /* PBXContainerItemProxy */; + }; + 3EA23C128B3DFF0589419700A1FD3DA4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = LKDBHelper; + target = F021BBC57C82DEFE283FCD90518F5AC4 /* LKDBHelper */; + targetProxy = ED0D36E2BF7DE830DA2E9FCF4F733E75 /* PBXContainerItemProxy */; + }; + 4325F679C897B690AC3EF15CC9D62CFD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FMDB; + target = 01B52F53C563BB35B7989239BE79A18B /* FMDB */; + targetProxy = 80EAEA3E8FC7515D044B9838BA9A31D4 /* PBXContainerItemProxy */; + }; + 481681AF6DC205CB9FF3652EBDF371E3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 1833D3C7CD0433421BD88C8B00B8D75C /* SDWebImage */; + targetProxy = EE991CE7F6A19903FFA81C36F6325083 /* PBXContainerItemProxy */; + }; + 52927093CF36E9907ED84566EB4A4247 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FMDB; + target = 01B52F53C563BB35B7989239BE79A18B /* FMDB */; + targetProxy = F123EE9B5973A4871BCCBF0BAD58A6F6 /* PBXContainerItemProxy */; + }; + 5FE2A5499BBC40EB5083035DDA4E58C1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJRefresh; + target = 546B747B9DB0515E059EEBA0B9E98B42 /* MJRefresh */; + targetProxy = F5FD1299D9F05F7D5DDAFA6FC4DA3F29 /* PBXContainerItemProxy */; + }; + 60ACA4E90740E528002126968A6F7DD4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SocketRocket; + target = 3FDA1ED51BACF2A55760CB610A5952FE /* SocketRocket */; + targetProxy = 1D2F327649D188F8E7A87E0E78333C51 /* PBXContainerItemProxy */; + }; + 80A010A25ED0BFCC1FAD27909E9ADED8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Masonry; + target = FF7468B4F5259B98018DD1ABAD2D2593 /* Masonry */; + targetProxy = 9F9E08DB86D1C18DBB762180583184D4 /* PBXContainerItemProxy */; + }; + 846DE17CFF9320B45B13F0385AC7CA15 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Starscream; + target = 701274A44ABD738F6AFAB306D4FC0A44 /* Starscream */; + targetProxy = FC87DE2B7484657C155DF737C56F5803 /* PBXContainerItemProxy */; + }; + A2DBE9D8FBA2256B93D3E4A6D16F77A3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = LBXScan; + target = 54B4749AF88450A71D699C9EBA4EA9C0 /* LBXScan */; + targetProxy = DC7F748D13F710EF89792A351A4CCF33 /* PBXContainerItemProxy */; + }; + B1CD41339EC40059D5C25C1CFA3F16E0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = NJKWebViewProgress; + target = FA1290BD9C46E61BF154FE7DDA8D128C /* NJKWebViewProgress */; + targetProxy = 2A81C06EF24F92E12936E5618B2D9D14 /* PBXContainerItemProxy */; + }; + B28AF7085CFD16F23D5415BB1974952B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Starscream; + target = 701274A44ABD738F6AFAB306D4FC0A44 /* Starscream */; + targetProxy = FABC6CACB674D4021F3BDC76346F539F /* PBXContainerItemProxy */; + }; + C2C44E2D2372987664BE48F5B60FBF51 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardManager; + target = A938F7AB77B92F5273D43659F12031AD /* IQKeyboardManager */; + targetProxy = 56AC3DA124BDAD9919E16A985BA30E57 /* PBXContainerItemProxy */; + }; + C427C9A7B7072675D37200A002D1627A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AFNetworking; + target = EAE60BD2ADA8DCB217E116ADB628185C /* AFNetworking */; + targetProxy = 768EE0E3734BED2F0B36E60B6B9C3FBA /* PBXContainerItemProxy */; + }; + D53B443A6496FB1402221066B3327A0D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = JSONModel; + target = F6E4F5C61825ACB370E59562B9CDB407 /* JSONModel */; + targetProxy = 2476A57611200FCAEFC4EFD6299AEEF1 /* PBXContainerItemProxy */; + }; + DF73E9BD43EFCB0828C164ABCD801C5E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "UITableView+FDTemplateLayoutCell"; + target = 0656CD2BE0FB0A99456605A137B14A8A /* UITableView+FDTemplateLayoutCell */; + targetProxy = 65F705FA74A8D963D2A4A5D17D9ECB2D /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 030147F75322C49391CC6A180694DA1A /* Release */ = { + 027E5D5A8CA75B54D36EFF03B224CD82 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9000E691EFB3E3B3FF8C0EB04CFB70DB /* JSONModel.xcconfig */; + baseConfigurationReference = E2E383C17ED8079D78E6A75D6794D7CC /* Toast.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; + PRODUCT_MODULE_NAME = Toast; + PRODUCT_NAME = Toast; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 02CAB7BE1697F214B017691492C16BF0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7F98EE491F1B375848361DC7AEB1B92F /* LKDBHelper.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/LKDBHelper/LKDBHelper-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LKDBHelper/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LKDBHelper/LKDBHelper.modulemap"; + PRODUCT_MODULE_NAME = LKDBHelper; + PRODUCT_NAME = LKDBHelper; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 089F0DE89075697C96DD4FD66A019635 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F5E94E4212716C7AB9D7D0E2B64A071A /* IQKeyboardManager.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardManager; + PRODUCT_NAME = IQKeyboardManager; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0A2E360F0D6E81E198E0C01CBDD380EC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0733D9959D7D57A038684144B9787970 /* JSONModel.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3193,7 +5413,45 @@ INFOPLIST_FILE = "Target Support Files/JSONModel/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/JSONModel/JSONModel.modulemap"; + PRODUCT_MODULE_NAME = JSONModel; + PRODUCT_NAME = JSONModel; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0AB2459C63B785C09A11EAE2EB9E0355 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0733D9959D7D57A038684144B9787970 /* JSONModel.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/JSONModel/JSONModel-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/JSONModel/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/JSONModel/JSONModel.modulemap"; PRODUCT_MODULE_NAME = JSONModel; PRODUCT_NAME = JSONModel; @@ -3207,9 +5465,182 @@ }; name = Release; }; - 15BBFED7520799B81C419B9659B126FA /* Release */ = { + 0F0F299AB70A0C03E87D8DC78AB7C38F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 86A54BF6E391B76DFBE0F0695DB27785 /* Socket.IO-Client-Swift.xcconfig */; + baseConfigurationReference = B791735EB4C9484A7C8D303FBFB1FCD6 /* SocketRocket.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SocketRocket/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap"; + PRODUCT_MODULE_NAME = SocketRocket; + PRODUCT_NAME = SocketRocket; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0F34D738076D7F8BF70D847CE7B3432A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC3F543F9DD927FDD2F604B031EEC06B /* FMDB.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FMDB/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FMDB/FMDB.modulemap"; + PRODUCT_MODULE_NAME = FMDB; + PRODUCT_NAME = FMDB; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 1408B2FD3DF0F2C3499CE5D66CA2DE20 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 96D38E5E642795832255E9825CD80F42 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 1A74BEFD82D80AB573E388BECE10D724 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC3F543F9DD927FDD2F604B031EEC06B /* FMDB.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FMDB/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/FMDB/FMDB.modulemap"; + PRODUCT_MODULE_NAME = FMDB; + PRODUCT_NAME = FMDB; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1BF939CC19DE98829BF1C02B78224BCB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1B2F7A05CD667B7F4431FA132E462FC9 /* MJRefresh.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MJRefresh/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; + PRODUCT_MODULE_NAME = MJRefresh; + PRODUCT_NAME = MJRefresh; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2E0118D156813716F27EAA0AAB3D56FF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B01401140320D07C8A62D408F3E0DA71 /* Socket.IO-Client-Swift.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3224,14 +5655,19 @@ INFOPLIST_FILE = "Target Support Files/Socket.IO-Client-Swift/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.modulemap"; PRODUCT_MODULE_NAME = SocketIO; PRODUCT_NAME = SocketIO; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -3239,9 +5675,112 @@ }; name = Release; }; - 1DA9018703D5845007DEFB59F340E13F /* Release */ = { + 2E7A2D92BE086A6C62BFAE145AF717C4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 18230792D7301ED554D8EBE3D27C83C6 /* YTKKeyValueStore.xcconfig */; + baseConfigurationReference = 1B2F7A05CD667B7F4431FA132E462FC9 /* MJRefresh.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MJRefresh/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; + PRODUCT_MODULE_NAME = MJRefresh; + PRODUCT_NAME = MJRefresh; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 30E89D5BBD3DA97AF376D85B9C972D9C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EA03E8D5F65C226379EBBD40A4694353 /* UITableView+FDTemplateLayoutCell.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.modulemap"; + PRODUCT_MODULE_NAME = UITableView_FDTemplateLayoutCell; + PRODUCT_NAME = UITableView_FDTemplateLayoutCell; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 45C6EE744B88790E9180DB215978FB82 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B791735EB4C9484A7C8D303FBFB1FCD6 /* SocketRocket.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SocketRocket/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap"; + PRODUCT_MODULE_NAME = SocketRocket; + PRODUCT_NAME = SocketRocket; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4667C66AA7FCB8E459C2959D38831DAB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D52F046D041BF9D9D3D2F6A1709A4D95 /* YTKKeyValueStore.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3256,7 +5795,11 @@ INFOPLIST_FILE = "Target Support Files/YTKKeyValueStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/YTKKeyValueStore/YTKKeyValueStore.modulemap"; PRODUCT_MODULE_NAME = YTKKeyValueStore; PRODUCT_NAME = YTKKeyValueStore; @@ -3264,13 +5807,633 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 52CD5B602C0538AF75F14F3FFB2F2587 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8D36A1C2ADDA3E56029534C48A04FF1D /* TTTAttributedLabel.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TTTAttributedLabel/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel.modulemap"; + PRODUCT_MODULE_NAME = TTTAttributedLabel; + PRODUCT_NAME = TTTAttributedLabel; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 1EE19F5DD95931924296F637BF18BD8F /* Debug */ = { + 58DA1C6C94008EACB2CCE2CCDCA51A6C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 18653B1A7B81EC7FA4D888702040D042 /* Masonry.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Masonry/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; + PRODUCT_MODULE_NAME = Masonry; + PRODUCT_NAME = Masonry; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 61AC0CD0AA095C32AFD72ECCD4559624 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 218B6E61733A5B9138CB4D0815133580 /* Pods-GIGA.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GIGA/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GIGA/Pods-GIGA.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 69604D559633DA7E77B761E075E95D35 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0513E585A677A67FB93767E315B26865 /* NJKWebViewProgress.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/NJKWebViewProgress/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress.modulemap"; + PRODUCT_MODULE_NAME = NJKWebViewProgress; + PRODUCT_NAME = NJKWebViewProgress; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 79688657BF17962FD05D04E9F2B8098C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7F98EE491F1B375848361DC7AEB1B92F /* LKDBHelper.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/LKDBHelper/LKDBHelper-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LKDBHelper/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LKDBHelper/LKDBHelper.modulemap"; + PRODUCT_MODULE_NAME = LKDBHelper; + PRODUCT_NAME = LKDBHelper; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7C04FC7FD460726B036AD9AB0D1B7917 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99C40C91334B69C1D3D909F15E8B8784 /* LBXScan.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/LBXScan/LBXScan-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LBXScan/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LBXScan/LBXScan.modulemap"; + PRODUCT_MODULE_NAME = LBXScan; + PRODUCT_NAME = LBXScan; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 83505847DC3BFEA363B7F7DC68D08333 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E2E383C17ED8079D78E6A75D6794D7CC /* Toast.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; + PRODUCT_MODULE_NAME = Toast; + PRODUCT_NAME = Toast; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 8626821EA2C51FF34F96AB982C6FDD7D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9574A12E8279712E0544674068BEC2E1 /* Pods-GIGA.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-GIGA/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-GIGA/Pods-GIGA.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 865817DB214C594E7CA099481A565F97 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B01401140320D07C8A62D408F3E0DA71 /* Socket.IO-Client-Swift.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Socket.IO-Client-Swift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.modulemap"; + PRODUCT_MODULE_NAME = SocketIO; + PRODUCT_NAME = SocketIO; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 8D2DCA929D6EAACBC099C6391F176FAB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7A9339DF6CB574A5346814889C803896 /* AFNetworking.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; + PRODUCT_MODULE_NAME = AFNetworking; + PRODUCT_NAME = AFNetworking; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 96434B6C8FF320C976A10DAD7174A4BB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 9AEDA75949AABA1F283745568EA1FD4D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 03EBC956C1D11E846DAB8041CAB8952F /* MBProgressHUD.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MBProgressHUD/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; + PRODUCT_MODULE_NAME = MBProgressHUD; + PRODUCT_NAME = MBProgressHUD; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 9F05FB7480ECA0237560017761177F3A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7A9339DF6CB574A5346814889C803896 /* AFNetworking.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; + PRODUCT_MODULE_NAME = AFNetworking; + PRODUCT_NAME = AFNetworking; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BAE0E3FDD04E6AC5D3E54F918EF73C56 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 96D38E5E642795832255E9825CD80F42 /* SDWebImage.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BB7EF004ADE2898F56297A0AC09379A5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0513E585A677A67FB93767E315B26865 /* NJKWebViewProgress.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/NJKWebViewProgress/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress.modulemap"; + PRODUCT_MODULE_NAME = NJKWebViewProgress; + PRODUCT_NAME = NJKWebViewProgress; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C68FD196BFED3D3563B3E7DE41E7C62C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 99C40C91334B69C1D3D909F15E8B8784 /* LBXScan.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/LBXScan/LBXScan-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LBXScan/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LBXScan/LBXScan.modulemap"; + PRODUCT_MODULE_NAME = LBXScan; + PRODUCT_NAME = LBXScan; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + C9DC5FB228883585EF90730F0C1FD825 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8D36A1C2ADDA3E56029534C48A04FF1D /* TTTAttributedLabel.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TTTAttributedLabel/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel.modulemap"; + PRODUCT_MODULE_NAME = TTTAttributedLabel; + PRODUCT_NAME = TTTAttributedLabel; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D11C82AF2204B41B80412B8DC9C1D652 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -3324,7 +6487,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; @@ -3333,39 +6497,9 @@ }; name = Debug; }; - 3845069A573E47CF21533487C497A730 /* Debug */ = { + D95F7EBA995EB1BD0699A252E757CE0F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 61C2C19E65EA773F183A0CC25BA57237 /* Masonry.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Masonry/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; - PRODUCT_MODULE_NAME = Masonry; - PRODUCT_NAME = Masonry; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 3B3B79288247B2E1243D4ADBF87333CE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53F4D20C7F0D216C630BE1353AC09D55 /* Starscream.xcconfig */; + baseConfigurationReference = 57F5BF2DC8AB7CC32D954D4F87FC431A /* Starscream.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3380,24 +6514,27 @@ INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; PRODUCT_MODULE_NAME = Starscream; PRODUCT_NAME = Starscream; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 3FDE1A3479CDFFEC9781B7D059673D86 /* Debug */ = { + DD1ED8FD6E80FC23C0340468023AB499 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9000E691EFB3E3B3FF8C0EB04CFB70DB /* JSONModel.xcconfig */; + baseConfigurationReference = F5E94E4212716C7AB9D7D0E2B64A071A /* IQKeyboardManager.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3408,26 +6545,101 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/JSONModel/JSONModel-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/JSONModel/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/JSONModel/JSONModel.modulemap"; - PRODUCT_MODULE_NAME = JSONModel; - PRODUCT_NAME = JSONModel; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; + PRODUCT_MODULE_NAME = IQKeyboardManager; + PRODUCT_NAME = IQKeyboardManager; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 43F7BB0B35A73F6686758F4D9F7A3322 /* Debug */ = { + DD53FB1BF6B9A967B4724365DC60F293 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 18230792D7301ED554D8EBE3D27C83C6 /* YTKKeyValueStore.xcconfig */; + baseConfigurationReference = 18653B1A7B81EC7FA4D888702040D042 /* Masonry.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Masonry/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; + PRODUCT_MODULE_NAME = Masonry; + PRODUCT_NAME = Masonry; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + EAF01FF83143B96B8739EBE989FEE56D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EA03E8D5F65C226379EBBD40A4694353 /* UITableView+FDTemplateLayoutCell.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.modulemap"; + PRODUCT_MODULE_NAME = UITableView_FDTemplateLayoutCell; + PRODUCT_NAME = UITableView_FDTemplateLayoutCell; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F010C1626C888438FAD96F4C59EBB655 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D52F046D041BF9D9D3D2F6A1709A4D95 /* YTKKeyValueStore.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3442,7 +6654,11 @@ INFOPLIST_FILE = "Target Support Files/YTKKeyValueStore/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/YTKKeyValueStore/YTKKeyValueStore.modulemap"; PRODUCT_MODULE_NAME = YTKKeyValueStore; PRODUCT_NAME = YTKKeyValueStore; @@ -3450,476 +6666,15 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4F8845C8AA7628D814E62D3DA5BBE94C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8B5E70F380A1881B0AE8CC9EF93F5CC3 /* LKDBHelper.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/LKDBHelper/LKDBHelper-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/LKDBHelper/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/LKDBHelper/LKDBHelper.modulemap"; - PRODUCT_MODULE_NAME = LKDBHelper; - PRODUCT_NAME = LKDBHelper; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 5158EC3BBBE24D0DC0B7FD8485499D50 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A1E47E6E0B0C4589F0066EB47D2EFB1E /* NJKWebViewProgress.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/NJKWebViewProgress/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress.modulemap"; - PRODUCT_MODULE_NAME = NJKWebViewProgress; - PRODUCT_NAME = NJKWebViewProgress; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 51F80CF25424DE3FA510FB9288900CC5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D7AFFE638A1D3629C5C2E838084B7CB7 /* UITableView+FDTemplateLayoutCell.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.modulemap"; - PRODUCT_MODULE_NAME = UITableView_FDTemplateLayoutCell; - PRODUCT_NAME = UITableView_FDTemplateLayoutCell; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 5A63432C9ABA464AE372CE9DC734EFC2 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 558D6E7CB99E8F711140222C4C7FD6C0 /* TTTAttributedLabel.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/TTTAttributedLabel/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel.modulemap"; - PRODUCT_MODULE_NAME = TTTAttributedLabel; - PRODUCT_NAME = TTTAttributedLabel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 5EA25C1E9FDF8DEF6A53F68A6237E686 /* Debug */ = { + F1A46A572F9B27A59447A2DC0E6C3123 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 053338AFC5DFA5DC334E688DA16499C6 /* FMDB.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FMDB/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FMDB/FMDB.modulemap"; - PRODUCT_MODULE_NAME = FMDB; - PRODUCT_NAME = FMDB; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 64F425AD1ABDBE7B571C3EE6AB4454E7 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A71A2EDB7D80E8B54C1540FA4E2B8A8D /* Toast.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; - PRODUCT_MODULE_NAME = Toast; - PRODUCT_NAME = Toast; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 6B20280CE6A95E2D8D451B55CDA5C940 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7F2A106A290EC7B512FC0E8A9C14E807 /* MJRefresh.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MJRefresh/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; - PRODUCT_MODULE_NAME = MJRefresh; - PRODUCT_NAME = MJRefresh; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 6D17A2E9C19EFB3CEFB664ED5349ED7F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D7AFFE638A1D3629C5C2E838084B7CB7 /* UITableView+FDTemplateLayoutCell.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/UITableView+FDTemplateLayoutCell/UITableView+FDTemplateLayoutCell.modulemap"; - PRODUCT_MODULE_NAME = UITableView_FDTemplateLayoutCell; - PRODUCT_NAME = UITableView_FDTemplateLayoutCell; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 6FDB77145A49DA9893642D8226EBEFB5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A1E47E6E0B0C4589F0066EB47D2EFB1E /* NJKWebViewProgress.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/NJKWebViewProgress/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/NJKWebViewProgress/NJKWebViewProgress.modulemap"; - PRODUCT_MODULE_NAME = NJKWebViewProgress; - PRODUCT_NAME = NJKWebViewProgress; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 74F14DAD92525F5165930D906F7BDCC5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D9BDB47A250C4BB9FE058D907EC81077 /* SDWebImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 77B29220E68FD63B7DF07B8DADE69E58 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 86A54BF6E391B76DFBE0F0695DB27785 /* Socket.IO-Client-Swift.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Socket.IO-Client-Swift/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.modulemap"; - PRODUCT_MODULE_NAME = SocketIO; - PRODUCT_NAME = SocketIO; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 7D95619E7EDE9F3FC6AD74F265102D66 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 053338AFC5DFA5DC334E688DA16499C6 /* FMDB.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/FMDB/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/FMDB/FMDB.modulemap"; - PRODUCT_MODULE_NAME = FMDB; - PRODUCT_NAME = FMDB; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 94A04F2FDCA78F1527BDF81A7D819E00 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9574A12E8279712E0544674068BEC2E1 /* Pods-GIGA.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GIGA/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GIGA/Pods-GIGA.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 9DB789882BAFB3FAAAC0CE3010D697E4 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CC29AB6DCE0390D33472279DBF9F826F /* AFNetworking.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; - PRODUCT_MODULE_NAME = AFNetworking; - PRODUCT_NAME = AFNetworking; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - A1F2087375C7B0E0FC17B7C69C343A24 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8B5E70F380A1881B0AE8CC9EF93F5CC3 /* LKDBHelper.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/LKDBHelper/LKDBHelper-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/LKDBHelper/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/LKDBHelper/LKDBHelper.modulemap"; - PRODUCT_MODULE_NAME = LKDBHelper; - PRODUCT_NAME = LKDBHelper; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - A779DC8723C1EB601F70FC8F2170010B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53F4D20C7F0D216C630BE1353AC09D55 /* Starscream.xcconfig */; + baseConfigurationReference = 57F5BF2DC8AB7CC32D954D4F87FC431A /* Starscream.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3934,44 +6689,19 @@ INFOPLIST_FILE = "Target Support Files/Starscream/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; PRODUCT_MODULE_NAME = Starscream; PRODUCT_NAME = Starscream; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - B15B60D56D4801C4BB2840A791584455 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D9BDB47A250C4BB9FE058D907EC81077 /* SDWebImage.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -3979,100 +6709,9 @@ }; name = Release; }; - B7DFA3A9CFCC2DE983F00C6B24B38672 /* Debug */ = { + F24DFBD9EE8FF7357DF0C5D75884B1F2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 558D6E7CB99E8F711140222C4C7FD6C0 /* TTTAttributedLabel.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/TTTAttributedLabel/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/TTTAttributedLabel/TTTAttributedLabel.modulemap"; - PRODUCT_MODULE_NAME = TTTAttributedLabel; - PRODUCT_NAME = TTTAttributedLabel; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - C1EAD11CCF0B74622AA2C8426F33EEC6 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3761E6FC8FB2C049CFB42B5DF219C572 /* SocketRocket.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SocketRocket/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap"; - PRODUCT_MODULE_NAME = SocketRocket; - PRODUCT_NAME = SocketRocket; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - C31D4A60B85340BE5612ED03122BB05A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 206777951591DDC2438D5F454A71CB8A /* IQKeyboardManager.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; - PRODUCT_MODULE_NAME = IQKeyboardManager; - PRODUCT_NAME = IQKeyboardManager; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - CF7020C6E9C00CE59577DC6F9E4255AF /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 36C94757ECFB0CDBFD720B0C11F08BC1 /* MBProgressHUD.xcconfig */; + baseConfigurationReference = 03EBC956C1D11E846DAB8041CAB8952F /* MBProgressHUD.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -4087,380 +6726,49 @@ INFOPLIST_FILE = "Target Support Files/MBProgressHUD/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; - PRODUCT_MODULE_NAME = MBProgressHUD; - PRODUCT_NAME = MBProgressHUD; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - D0283D74AA9E4B0F055622C3C9C03217 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7F2A106A290EC7B512FC0E8A9C14E807 /* MJRefresh.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MJRefresh/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; - PRODUCT_MODULE_NAME = MJRefresh; - PRODUCT_NAME = MJRefresh; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - D958D0B06505E793082732152F56DAB8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 206777951591DDC2438D5F454A71CB8A /* IQKeyboardManager.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; - PRODUCT_MODULE_NAME = IQKeyboardManager; - PRODUCT_NAME = IQKeyboardManager; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - DB6B8C92D8C6DDD73048B46FE91C4FB9 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3761E6FC8FB2C049CFB42B5DF219C572 /* SocketRocket.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SocketRocket/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap"; - PRODUCT_MODULE_NAME = SocketRocket; - PRODUCT_NAME = SocketRocket; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - DF7FA40181E08DC392346D86E3A8405C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CC29AB6DCE0390D33472279DBF9F826F /* AFNetworking.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/AFNetworking/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/AFNetworking/AFNetworking.modulemap"; - PRODUCT_MODULE_NAME = AFNetworking; - PRODUCT_NAME = AFNetworking; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - EAD68733C951B7827F1B8D1C845E080F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A71A2EDB7D80E8B54C1540FA4E2B8A8D /* Toast.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Toast/Toast-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Toast/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Toast/Toast.modulemap"; - PRODUCT_MODULE_NAME = Toast; - PRODUCT_NAME = Toast; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - EF3B39AB7B1FB9966CE26F11E192097A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 218B6E61733A5B9138CB4D0815133580 /* Pods-GIGA.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GIGA/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GIGA/Pods-GIGA.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - F147DE2EB0DE030E54C6E63C35F621A1 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 36C94757ECFB0CDBFD720B0C11F08BC1 /* MBProgressHUD.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MBProgressHUD/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; - PRODUCT_MODULE_NAME = MBProgressHUD; - PRODUCT_NAME = MBProgressHUD; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - F4568DEE257655D290C2B9CEAB37C934 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", + LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - FE3EC76958EB417BB5A9577967FD1019 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 61C2C19E65EA773F183A0CC25BA57237 /* Masonry.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Masonry/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; - PRODUCT_MODULE_NAME = Masonry; - PRODUCT_NAME = Masonry; + MODULEMAP_FILE = "Target Support Files/MBProgressHUD/MBProgressHUD.modulemap"; + PRODUCT_MODULE_NAME = MBProgressHUD; + PRODUCT_NAME = MBProgressHUD; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 02D024184BD368B565F3B6257DF3C605 /* Build configuration list for PBXNativeTarget "Masonry" */ = { + 04947B774390B3A05B50509ED7F45DA5 /* Build configuration list for PBXNativeTarget "UITableView+FDTemplateLayoutCell" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3845069A573E47CF21533487C497A730 /* Debug */, - FE3EC76958EB417BB5A9577967FD1019 /* Release */, + 30E89D5BBD3DA97AF376D85B9C972D9C /* Debug */, + EAF01FF83143B96B8739EBE989FEE56D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1E5906AA4CEA8D63C4872E060D702ED0 /* Build configuration list for PBXNativeTarget "Pods-GIGA" */ = { + 0B3AED7BA0EB0D83A648507C8FCDEA7C /* Build configuration list for PBXNativeTarget "JSONModel" */ = { isa = XCConfigurationList; buildConfigurations = ( - EF3B39AB7B1FB9966CE26F11E192097A /* Debug */, - 94A04F2FDCA78F1527BDF81A7D819E00 /* Release */, + 0A2E360F0D6E81E198E0C01CBDD380EC /* Debug */, + 0AB2459C63B785C09A11EAE2EB9E0355 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1EFADDC2BB6831ED43B76E0241CCDB75 /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { + 1F1E080D0C17D9EECB7A0F73562A384B /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */ = { isa = XCConfigurationList; buildConfigurations = ( - D0283D74AA9E4B0F055622C3C9C03217 /* Debug */, - 6B20280CE6A95E2D8D451B55CDA5C940 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 22A2379BF2B87BFC7BA495F9BD85DD28 /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C31D4A60B85340BE5612ED03122BB05A /* Debug */, - D958D0B06505E793082732152F56DAB8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 25909703FE8BF472066161C98342A956 /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9DB789882BAFB3FAAAC0CE3010D697E4 /* Debug */, - DF7FA40181E08DC392346D86E3A8405C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 28A1BDB3CE3F2F1CB0931DFEEDBA7936 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CF7020C6E9C00CE59577DC6F9E4255AF /* Debug */, - F147DE2EB0DE030E54C6E63C35F621A1 /* Release */, + 089F0DE89075697C96DD4FD66A019635 /* Debug */, + DD1ED8FD6E80FC23C0340468023AB499 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4468,116 +6776,152 @@ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1EE19F5DD95931924296F637BF18BD8F /* Debug */, - F4568DEE257655D290C2B9CEAB37C934 /* Release */, + D11C82AF2204B41B80412B8DC9C1D652 /* Debug */, + 96434B6C8FF320C976A10DAD7174A4BB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4342C6E210ABD2AA884A6763AD5DFC1B /* Build configuration list for PBXNativeTarget "YTKKeyValueStore" */ = { + 4EE543C7CCDD9178FC90D95A34DF1E9D /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */ = { isa = XCConfigurationList; buildConfigurations = ( - 43F7BB0B35A73F6686758F4D9F7A3322 /* Debug */, - 1DA9018703D5845007DEFB59F340E13F /* Release */, + C9DC5FB228883585EF90730F0C1FD825 /* Debug */, + 52CD5B602C0538AF75F14F3FFB2F2587 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5B0566FF0CE681AC326D316CEC45A8CF /* Build configuration list for PBXNativeTarget "FMDB" */ = { + 5D84F5F811261DD11885E583CFB1B295 /* Build configuration list for PBXNativeTarget "LBXScan" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5EA25C1E9FDF8DEF6A53F68A6237E686 /* Debug */, - 7D95619E7EDE9F3FC6AD74F265102D66 /* Release */, + 7C04FC7FD460726B036AD9AB0D1B7917 /* Debug */, + C68FD196BFED3D3563B3E7DE41E7C62C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5C5BD8C49D5108DF93608FA1EDC5B5EF /* Build configuration list for PBXNativeTarget "NJKWebViewProgress" */ = { + 8289B039CF0D8B5A385C13089893A356 /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5158EC3BBBE24D0DC0B7FD8485499D50 /* Debug */, - 6FDB77145A49DA9893642D8226EBEFB5 /* Release */, + 9F05FB7480ECA0237560017761177F3A /* Debug */, + 8D2DCA929D6EAACBC099C6391F176FAB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 730557350F2D643032C64C252A33646B /* Build configuration list for PBXNativeTarget "LKDBHelper" */ = { + 84710AC86F03C1B2256418269E74EE40 /* Build configuration list for PBXNativeTarget "Masonry" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4F8845C8AA7628D814E62D3DA5BBE94C /* Debug */, - A1F2087375C7B0E0FC17B7C69C343A24 /* Release */, + 58DA1C6C94008EACB2CCE2CCDCA51A6C /* Debug */, + DD53FB1BF6B9A967B4724365DC60F293 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9C1388254385C167C3486774DFA19E4B /* Build configuration list for PBXNativeTarget "Toast" */ = { + 85844E90586203B26A5DF401D0D1CB40 /* Build configuration list for PBXNativeTarget "LKDBHelper" */ = { isa = XCConfigurationList; buildConfigurations = ( - 64F425AD1ABDBE7B571C3EE6AB4454E7 /* Debug */, - EAD68733C951B7827F1B8D1C845E080F /* Release */, + 02CAB7BE1697F214B017691492C16BF0 /* Debug */, + 79688657BF17962FD05D04E9F2B8098C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AD43B7EE0B1CE05F5620E0CB4E98AA04 /* Build configuration list for PBXNativeTarget "Socket.IO-Client-Swift" */ = { + 9A25E6853E113548CF6F6EE3F44072A1 /* Build configuration list for PBXNativeTarget "Starscream" */ = { isa = XCConfigurationList; buildConfigurations = ( - 77B29220E68FD63B7DF07B8DADE69E58 /* Debug */, - 15BBFED7520799B81C419B9659B126FA /* Release */, + D95F7EBA995EB1BD0699A252E757CE0F /* Debug */, + F1A46A572F9B27A59447A2DC0E6C3123 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D773EDDAA9E875352723DC73E02DDFE5 /* Build configuration list for PBXNativeTarget "UITableView+FDTemplateLayoutCell" */ = { + 9D1C3AED740F97C52313DE35F0C6014C /* Build configuration list for PBXNativeTarget "YTKKeyValueStore" */ = { isa = XCConfigurationList; buildConfigurations = ( - 51F80CF25424DE3FA510FB9288900CC5 /* Debug */, - 6D17A2E9C19EFB3CEFB664ED5349ED7F /* Release */, + 4667C66AA7FCB8E459C2959D38831DAB /* Debug */, + F010C1626C888438FAD96F4C59EBB655 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E72A11DB5C3E9606198B359389FDF949 /* Build configuration list for PBXNativeTarget "Starscream" */ = { + 9FC06AAEA119877FC6B52B189F5BCA5A /* Build configuration list for PBXNativeTarget "Pods-GIGA" */ = { isa = XCConfigurationList; buildConfigurations = ( - A779DC8723C1EB601F70FC8F2170010B /* Debug */, - 3B3B79288247B2E1243D4ADBF87333CE /* Release */, + 61AC0CD0AA095C32AFD72ECCD4559624 /* Debug */, + 8626821EA2C51FF34F96AB982C6FDD7D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F4D16BF2938703D3A0079C402F5E75D8 /* Build configuration list for PBXNativeTarget "JSONModel" */ = { + A072544970FCC8FB7FD7EF00EC6FDC43 /* Build configuration list for PBXNativeTarget "FMDB" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3FDE1A3479CDFFEC9781B7D059673D86 /* Debug */, - 030147F75322C49391CC6A180694DA1A /* Release */, + 1A74BEFD82D80AB573E388BECE10D724 /* Debug */, + 0F34D738076D7F8BF70D847CE7B3432A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FD3E3AC28A10371D2EC0FED80CFD7E84 /* Build configuration list for PBXNativeTarget "SocketRocket" */ = { + AAD8611BAA4F46825D297E01759AEAED /* Build configuration list for PBXNativeTarget "NJKWebViewProgress" */ = { isa = XCConfigurationList; buildConfigurations = ( - DB6B8C92D8C6DDD73048B46FE91C4FB9 /* Debug */, - C1EAD11CCF0B74622AA2C8426F33EEC6 /* Release */, + BB7EF004ADE2898F56297A0AC09379A5 /* Debug */, + 69604D559633DA7E77B761E075E95D35 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FD8A0CB03AC21C5BCB521E0FC6235E48 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + B70836F81278D2A31C66970B1FCF5525 /* Build configuration list for PBXNativeTarget "Toast" */ = { isa = XCConfigurationList; buildConfigurations = ( - 74F14DAD92525F5165930D906F7BDCC5 /* Debug */, - B15B60D56D4801C4BB2840A791584455 /* Release */, + 83505847DC3BFEA363B7F7DC68D08333 /* Debug */, + 027E5D5A8CA75B54D36EFF03B224CD82 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FE1D69742C36F3E572A7171E67E92F3C /* Build configuration list for PBXNativeTarget "TTTAttributedLabel" */ = { + C85F409FF2887195D0FBEF664694B351 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { isa = XCConfigurationList; buildConfigurations = ( - B7DFA3A9CFCC2DE983F00C6B24B38672 /* Debug */, - 5A63432C9ABA464AE372CE9DC734EFC2 /* Release */, + F24DFBD9EE8FF7357DF0C5D75884B1F2 /* Debug */, + 9AEDA75949AABA1F283745568EA1FD4D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C937A074FD9D529D85566C6D84B457F1 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BAE0E3FDD04E6AC5D3E54F918EF73C56 /* Debug */, + 1408B2FD3DF0F2C3499CE5D66CA2DE20 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D212F986F9035E51217E1FDE5DD6A3FB /* Build configuration list for PBXNativeTarget "SocketRocket" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 45C6EE744B88790E9180DB215978FB82 /* Debug */, + 0F0F299AB70A0C03E87D8DC78AB7C38F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E6F83A3523D8341EDA917BED02337C9A /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1BF939CC19DE98829BF1C02B78224BCB /* Debug */, + 2E7A2D92BE086A6C62BFAE145AF717C4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E96A385FF56519172E33BAFA56A572C1 /* Build configuration list for PBXNativeTarget "Socket.IO-Client-Swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 865817DB214C594E7CA099481A565F97 /* Debug */, + 2E0118D156813716F27EAA0AAB3D56FF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/AFNetworking.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/AFNetworking.xcscheme index d49ba02..9d1cdc0 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/AFNetworking.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/AFNetworking.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/FMDB.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/FMDB.xcscheme index 9e99512..cf11aec 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/FMDB.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/FMDB.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme index 6b24ae8..3be738f 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/JSONModel.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/JSONModel.xcscheme index 7071267..bb50b71 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/JSONModel.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/JSONModel.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LBXScan.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LBXScan.xcscheme new file mode 100644 index 0000000..9c675d6 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LBXScan.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LKDBHelper.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LKDBHelper.xcscheme index 04ec8e4..e492c70 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LKDBHelper.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/LKDBHelper.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MBProgressHUD.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MBProgressHUD.xcscheme index ae00253..b6bc1ca 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MBProgressHUD.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MBProgressHUD.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MJRefresh.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MJRefresh.xcscheme index 3923004..2eab593 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MJRefresh.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/MJRefresh.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Masonry.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Masonry.xcscheme index eea9141..87e5356 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Masonry.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Masonry.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/NJKWebViewProgress.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/NJKWebViewProgress.xcscheme index c207413..c360060 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/NJKWebViewProgress.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/NJKWebViewProgress.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Pods-GIGA.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Pods-GIGA.xcscheme index 322012a..530db37 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Pods-GIGA.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Pods-GIGA.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -45,7 +45,7 @@ diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SDWebImage.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SDWebImage.xcscheme index 8af0096..9302406 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SDWebImage.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Socket.IO-Client-Swift.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Socket.IO-Client-Swift.xcscheme index 6bb6a26..744d95c 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Socket.IO-Client-Swift.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Socket.IO-Client-Swift.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -45,7 +45,7 @@ diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SocketRocket.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SocketRocket.xcscheme index 8787c69..7a45590 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SocketRocket.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/SocketRocket.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Starscream.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Starscream.xcscheme index 92d95a0..cd4002c 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Starscream.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Starscream.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/TTTAttributedLabel.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/TTTAttributedLabel.xcscheme index 33ce620..c69c01f 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/TTTAttributedLabel.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/TTTAttributedLabel.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Toast.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Toast.xcscheme index 3be888a..fc146a4 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Toast.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/Toast.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/UITableView+FDTemplateLayoutCell.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/UITableView+FDTemplateLayoutCell.xcscheme index 3f10f55..55a0d55 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/UITableView+FDTemplateLayoutCell.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/UITableView+FDTemplateLayoutCell.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> @@ -45,7 +45,7 @@ diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/YTKKeyValueStore.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/YTKKeyValueStore.xcscheme index 07fb3a0..dfedca9 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/YTKKeyValueStore.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/YTKKeyValueStore.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist index 7771d00..f1f57dd 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/lianxiang.xcuserdatad/xcschemes/xcschememanagement.plist @@ -32,104 +32,111 @@ orderHint 3
- LKDBHelper.xcscheme + LBXScan.xcscheme isShown orderHint 4 - MBProgressHUD.xcscheme - - isShown - - orderHint - 6 - - MJRefresh.xcscheme - - isShown - - orderHint - 7 - - Masonry.xcscheme + LKDBHelper.xcscheme isShown orderHint 5 - NJKWebViewProgress.xcscheme + MBProgressHUD.xcscheme + + isShown + + orderHint + 7 + + MJRefresh.xcscheme isShown orderHint 8 - Pods-GIGA.xcscheme + Masonry.xcscheme + + isShown + + orderHint + 6 + + NJKWebViewProgress.xcscheme isShown orderHint 9 - SDWebImage.xcscheme + Pods-GIGA.xcscheme isShown orderHint 10 - Socket.IO-Client-Swift.xcscheme + SDWebImage.xcscheme isShown orderHint 11 - SocketRocket.xcscheme + Socket.IO-Client-Swift.xcscheme isShown orderHint 12 - Starscream.xcscheme + SocketRocket.xcscheme isShown orderHint 13 - TTTAttributedLabel.xcscheme - - isShown - - orderHint - 15 - - Toast.xcscheme + Starscream.xcscheme isShown orderHint 14 - UITableView+FDTemplateLayoutCell.xcscheme + TTTAttributedLabel.xcscheme isShown orderHint 16 - YTKKeyValueStore.xcscheme + Toast.xcscheme + + isShown + + orderHint + 15 + + UITableView+FDTemplateLayoutCell.xcscheme isShown orderHint 17 + YTKKeyValueStore.xcscheme + + isShown + + orderHint + 18 + SuppressBuildableAutocreation diff --git a/Pods/Target Support Files/LBXScan/Info.plist b/Pods/Target Support Files/LBXScan/Info.plist new file mode 100644 index 0000000..d135faf --- /dev/null +++ b/Pods/Target Support Files/LBXScan/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.3.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/LBXScan/LBXScan-dummy.m b/Pods/Target Support Files/LBXScan/LBXScan-dummy.m new file mode 100644 index 0000000..ca03b6a --- /dev/null +++ b/Pods/Target Support Files/LBXScan/LBXScan-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_LBXScan : NSObject +@end +@implementation PodsDummy_LBXScan +@end diff --git a/Pods/Target Support Files/LBXScan/LBXScan-prefix.pch b/Pods/Target Support Files/LBXScan/LBXScan-prefix.pch new file mode 100644 index 0000000..914f77e --- /dev/null +++ b/Pods/Target Support Files/LBXScan/LBXScan-prefix.pch @@ -0,0 +1,14 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "ZXingWrapper.h" +#import diff --git a/Pods/Target Support Files/LBXScan/LBXScan-umbrella.h b/Pods/Target Support Files/LBXScan/LBXScan-umbrella.h new file mode 100644 index 0000000..02136ac --- /dev/null +++ b/Pods/Target Support Files/LBXScan/LBXScan-umbrella.h @@ -0,0 +1,257 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "LBXZXCapture.h" +#import "LBXZXCaptureDelegate.h" +#import "ZXAztecDecoder.h" +#import "ZXAztecDetector.h" +#import "ZXAztecBinaryShiftToken.h" +#import "ZXAztecCode.h" +#import "ZXAztecEncoder.h" +#import "ZXAztecHighLevelEncoder.h" +#import "ZXAztecSimpleToken.h" +#import "ZXAztecState.h" +#import "ZXAztecToken.h" +#import "ZXAztecDetectorResult.h" +#import "ZXAztecReader.h" +#import "ZXAztecWriter.h" +#import "ZXingObjCAztec.h" +#import "ZXAbstractDoCoMoResultParser.h" +#import "ZXAddressBookAUResultParser.h" +#import "ZXAddressBookDoCoMoResultParser.h" +#import "ZXAddressBookParsedResult.h" +#import "ZXBizcardResultParser.h" +#import "ZXBookmarkDoCoMoResultParser.h" +#import "ZXCalendarParsedResult.h" +#import "ZXEmailAddressParsedResult.h" +#import "ZXEmailAddressResultParser.h" +#import "ZXEmailDoCoMoResultParser.h" +#import "ZXExpandedProductParsedResult.h" +#import "ZXExpandedProductResultParser.h" +#import "ZXGeoParsedResult.h" +#import "ZXGeoResultParser.h" +#import "ZXISBNParsedResult.h" +#import "ZXISBNResultParser.h" +#import "ZXParsedResult.h" +#import "ZXParsedResultType.h" +#import "ZXProductParsedResult.h" +#import "ZXProductResultParser.h" +#import "ZXResultParser.h" +#import "ZXSMSMMSResultParser.h" +#import "ZXSMSParsedResult.h" +#import "ZXSMSTOMMSTOResultParser.h" +#import "ZXSMTPResultParser.h" +#import "ZXTelParsedResult.h" +#import "ZXTelResultParser.h" +#import "ZXTextParsedResult.h" +#import "ZXURIParsedResult.h" +#import "ZXURIResultParser.h" +#import "ZXURLTOResultParser.h" +#import "ZXVCardResultParser.h" +#import "ZXVEventResultParser.h" +#import "ZXVINParsedResult.h" +#import "ZXVINResultParser.h" +#import "ZXWifiParsedResult.h" +#import "ZXWifiResultParser.h" +#import "ZXCapture.h" +#import "ZXCaptureDelegate.h" +#import "ZXCGImageLuminanceSource.h" +#import "ZXImage.h" +#import "ZXMathUtils.h" +#import "ZXMonochromeRectangleDetector.h" +#import "ZXWhiteRectangleDetector.h" +#import "ZXGenericGF.h" +#import "ZXGenericGFPoly.h" +#import "ZXReedSolomonDecoder.h" +#import "ZXReedSolomonEncoder.h" +#import "ZXBitArray.h" +#import "ZXBitMatrix.h" +#import "ZXBitSource.h" +#import "ZXBoolArray.h" +#import "ZXByteArray.h" +#import "ZXCharacterSetECI.h" +#import "ZXDecoderResult.h" +#import "ZXDefaultGridSampler.h" +#import "ZXDetectorResult.h" +#import "ZXGlobalHistogramBinarizer.h" +#import "ZXGridSampler.h" +#import "ZXHybridBinarizer.h" +#import "ZXIntArray.h" +#import "ZXPerspectiveTransform.h" +#import "ZXStringUtils.h" +#import "ZXBarcodeFormat.h" +#import "ZXBinarizer.h" +#import "ZXBinaryBitmap.h" +#import "ZXByteMatrix.h" +#import "ZXDecodeHints.h" +#import "ZXDimension.h" +#import "ZXEncodeHints.h" +#import "ZXErrors.h" +#import "ZXingObjCCore.h" +#import "ZXInvertedLuminanceSource.h" +#import "ZXLuminanceSource.h" +#import "ZXPlanarYUVLuminanceSource.h" +#import "ZXReader.h" +#import "ZXResult.h" +#import "ZXResultMetadataType.h" +#import "ZXResultPoint.h" +#import "ZXResultPointCallback.h" +#import "ZXRGBLuminanceSource.h" +#import "ZXWriter.h" +#import "ZXDataMatrixBitMatrixParser.h" +#import "ZXDataMatrixDataBlock.h" +#import "ZXDataMatrixDecodedBitStreamParser.h" +#import "ZXDataMatrixDecoder.h" +#import "ZXDataMatrixVersion.h" +#import "ZXDataMatrixDetector.h" +#import "ZXDataMatrixASCIIEncoder.h" +#import "ZXDataMatrixBase256Encoder.h" +#import "ZXDataMatrixC40Encoder.h" +#import "ZXDataMatrixDefaultPlacement.h" +#import "ZXDataMatrixEdifactEncoder.h" +#import "ZXDataMatrixEncoder.h" +#import "ZXDataMatrixEncoderContext.h" +#import "ZXDataMatrixErrorCorrection.h" +#import "ZXDataMatrixHighLevelEncoder.h" +#import "ZXDataMatrixSymbolInfo.h" +#import "ZXDataMatrixSymbolInfo144.h" +#import "ZXDataMatrixTextEncoder.h" +#import "ZXDataMatrixX12Encoder.h" +#import "ZXDataMatrixReader.h" +#import "ZXDataMatrixWriter.h" +#import "ZXingObjCDataMatrix.h" +#import "ZXMaxiCodeBitMatrixParser.h" +#import "ZXMaxiCodeDecodedBitStreamParser.h" +#import "ZXMaxiCodeDecoder.h" +#import "ZXingObjCMaxiCode.h" +#import "ZXMaxiCodeReader.h" +#import "ZXByQuadrantReader.h" +#import "ZXGenericMultipleBarcodeReader.h" +#import "ZXMultipleBarcodeReader.h" +#import "ZXAbstractExpandedDecoder.h" +#import "ZXAI013103decoder.h" +#import "ZXAI01320xDecoder.h" +#import "ZXAI01392xDecoder.h" +#import "ZXAI01393xDecoder.h" +#import "ZXAI013x0x1xDecoder.h" +#import "ZXAI013x0xDecoder.h" +#import "ZXAI01AndOtherAIs.h" +#import "ZXAI01decoder.h" +#import "ZXAI01weightDecoder.h" +#import "ZXAnyAIDecoder.h" +#import "ZXRSSExpandedBlockParsedResult.h" +#import "ZXRSSExpandedCurrentParsingState.h" +#import "ZXRSSExpandedDecodedChar.h" +#import "ZXRSSExpandedDecodedInformation.h" +#import "ZXRSSExpandedDecodedNumeric.h" +#import "ZXRSSExpandedDecodedObject.h" +#import "ZXRSSExpandedFieldParser.h" +#import "ZXRSSExpandedGeneralAppIdDecoder.h" +#import "ZXBitArrayBuilder.h" +#import "ZXRSSExpandedPair.h" +#import "ZXRSSExpandedReader.h" +#import "ZXRSSExpandedRow.h" +#import "ZXAbstractRSSReader.h" +#import "ZXRSS14Reader.h" +#import "ZXRSSDataCharacter.h" +#import "ZXRSSFinderPattern.h" +#import "ZXRSSPair.h" +#import "ZXRSSUtils.h" +#import "ZXCodaBarReader.h" +#import "ZXCodaBarWriter.h" +#import "ZXCode128Reader.h" +#import "ZXCode128Writer.h" +#import "ZXCode39Reader.h" +#import "ZXCode39Writer.h" +#import "ZXCode93Reader.h" +#import "ZXEAN13Reader.h" +#import "ZXEAN13Writer.h" +#import "ZXEAN8Reader.h" +#import "ZXEAN8Writer.h" +#import "ZXEANManufacturerOrgSupport.h" +#import "ZXingObjCOneD.h" +#import "ZXITFReader.h" +#import "ZXITFWriter.h" +#import "ZXMultiFormatOneDReader.h" +#import "ZXMultiFormatUPCEANReader.h" +#import "ZXOneDimensionalCodeWriter.h" +#import "ZXOneDReader.h" +#import "ZXUPCAReader.h" +#import "ZXUPCAWriter.h" +#import "ZXUPCEANExtension2Support.h" +#import "ZXUPCEANExtension5Support.h" +#import "ZXUPCEANExtensionSupport.h" +#import "ZXUPCEANReader.h" +#import "ZXUPCEANWriter.h" +#import "ZXUPCEReader.h" +#import "ZXModulusGF.h" +#import "ZXModulusPoly.h" +#import "ZXPDF417ECErrorCorrection.h" +#import "ZXPDF417BarcodeMetadata.h" +#import "ZXPDF417BarcodeValue.h" +#import "ZXPDF417BoundingBox.h" +#import "ZXPDF417Codeword.h" +#import "ZXPDF417CodewordDecoder.h" +#import "ZXPDF417DecodedBitStreamParser.h" +#import "ZXPDF417DetectionResult.h" +#import "ZXPDF417DetectionResultColumn.h" +#import "ZXPDF417DetectionResultRowIndicatorColumn.h" +#import "ZXPDF417ScanningDecoder.h" +#import "ZXPDF417Detector.h" +#import "ZXPDF417DetectorResult.h" +#import "ZXPDF417.h" +#import "ZXPDF417BarcodeMatrix.h" +#import "ZXPDF417BarcodeRow.h" +#import "ZXPDF417Dimensions.h" +#import "ZXPDF417ErrorCorrection.h" +#import "ZXPDF417HighLevelEncoder.h" +#import "ZXingObjCPDF417.h" +#import "ZXPDF417Common.h" +#import "ZXPDF417Reader.h" +#import "ZXPDF417ResultMetadata.h" +#import "ZXPDF417Writer.h" +#import "ZXQRCodeBitMatrixParser.h" +#import "ZXQRCodeDataBlock.h" +#import "ZXQRCodeDataMask.h" +#import "ZXQRCodeDecodedBitStreamParser.h" +#import "ZXQRCodeDecoder.h" +#import "ZXQRCodeDecoderMetaData.h" +#import "ZXQRCodeErrorCorrectionLevel.h" +#import "ZXQRCodeFormatInformation.h" +#import "ZXQRCodeMode.h" +#import "ZXQRCodeVersion.h" +#import "ZXQRCodeAlignmentPattern.h" +#import "ZXQRCodeAlignmentPatternFinder.h" +#import "ZXQRCodeDetector.h" +#import "ZXQRCodeFinderPattern.h" +#import "ZXQRCodeFinderPatternFinder.h" +#import "ZXQRCodeFinderPatternInfo.h" +#import "ZXQRCode.h" +#import "ZXQRCodeBlockPair.h" +#import "ZXQRCodeEncoder.h" +#import "ZXQRCodeMaskUtil.h" +#import "ZXQRCodeMatrixUtil.h" +#import "ZXMultiDetector.h" +#import "ZXMultiFinderPatternFinder.h" +#import "ZXQRCodeMultiReader.h" +#import "ZXingObjCQRCode.h" +#import "ZXQRCodeReader.h" +#import "ZXQRCodeWriter.h" +#import "ZXingObjC.h" +#import "ZXMultiFormatReader.h" +#import "ZXMultiFormatWriter.h" +#import "ZXingWrapper.h" +#import "LBXScanTypes.h" + +FOUNDATION_EXPORT double LBXScanVersionNumber; +FOUNDATION_EXPORT const unsigned char LBXScanVersionString[]; + diff --git a/Pods/Target Support Files/LBXScan/LBXScan.modulemap b/Pods/Target Support Files/LBXScan/LBXScan.modulemap new file mode 100644 index 0000000..838c5d5 --- /dev/null +++ b/Pods/Target Support Files/LBXScan/LBXScan.modulemap @@ -0,0 +1,6 @@ +framework module LBXScan { + umbrella header "LBXScan-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/LBXScan/LBXScan.xcconfig b/Pods/Target Support Files/LBXScan/LBXScan.xcconfig new file mode 100644 index 0000000..8b99d5d --- /dev/null +++ b/Pods/Target Support Files/LBXScan/LBXScan.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LBXScan +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = -framework "AVFoundation" -framework "CoreGraphics" -framework "CoreMedia" -framework "CoreVideo" -framework "ImageIO" -framework "QuartzCore" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/LBXScan +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.markdown b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.markdown index 93ff96b..e7f80bc 100644 --- a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.markdown @@ -115,6 +115,32 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## LBXScan + +The MIT License (MIT) + +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + ## LKDBHelper Copyright (c) 2012 Jianghuai Li (https://github.com/li6185377) diff --git a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.plist b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.plist index 66fc486..627bc80 100644 --- a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-acknowledgements.plist @@ -168,6 +168,38 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Type PSGroupSpecifier + + FooterText + The MIT License (MIT) + +Copyright (c) 2015 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + License + MIT + Title + LBXScan + Type + PSGroupSpecifier + FooterText Copyright (c) 2012 Jianghuai Li (https://github.com/li6185377) diff --git a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-frameworks.sh b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-frameworks.sh index 1405e7b..42dac12 100755 --- a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-frameworks.sh +++ b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA-frameworks.sh @@ -147,6 +147,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework" install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework" + install_framework "${BUILT_PRODUCTS_DIR}/LBXScan/LBXScan.framework" install_framework "${BUILT_PRODUCTS_DIR}/LKDBHelper/LKDBHelper.framework" install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" @@ -166,6 +167,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework" install_framework "${BUILT_PRODUCTS_DIR}/JSONModel/JSONModel.framework" + install_framework "${BUILT_PRODUCTS_DIR}/LBXScan/LBXScan.framework" install_framework "${BUILT_PRODUCTS_DIR}/LKDBHelper/LKDBHelper.framework" install_framework "${BUILT_PRODUCTS_DIR}/MBProgressHUD/MBProgressHUD.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" diff --git a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.debug.xcconfig b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.debug.xcconfig index 3845a42..028ce4f 100644 --- a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.debug.xcconfig +++ b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.debug.xcconfig @@ -1,11 +1,11 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/FMDB" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel" "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell" "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/FMDB" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel" "${PODS_CONFIGURATION_BUILD_DIR}/LBXScan" "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell" "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/WechatOpenSDK" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${PODS_ROOT}/WechatOpenSDK/WechatSDK1.8.2" -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FMDB/FMDB.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel/JSONModel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper/LKDBHelper.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress/NJKWebViewProgress.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift/SocketIO.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell/UITableView_FDTemplateLayoutCell.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore/YTKKeyValueStore.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/JPush" -isystem "${PODS_ROOT}/Headers/Public/WechatOpenSDK" -OTHER_LDFLAGS = $(inherited) -ObjC -l"WeChatSDK" -l"c++" -l"jcore-ios-1.2.2" -l"jpush-ios-3.1.0" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "FMDB" -framework "Foundation" -framework "IQKeyboardManager" -framework "JSONModel" -framework "LKDBHelper" -framework "MBProgressHUD" -framework "MJRefresh" -framework "Masonry" -framework "NJKWebViewProgress" -framework "SDWebImage" -framework "Security" -framework "SecurityEnvSDK" -framework "SocketIO" -framework "SocketRocket" -framework "Starscream" -framework "SystemConfiguration" -framework "TTTAttributedLabel" -framework "Toast" -framework "UIKit" -framework "UITableView_FDTemplateLayoutCell" -framework "UMAnalytics" -framework "UMCommon" -framework "UTDID" -framework "YTKKeyValueStore" -weak_framework "UserNotifications" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FMDB/FMDB.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel/JSONModel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LBXScan/LBXScan.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper/LKDBHelper.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress/NJKWebViewProgress.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift/SocketIO.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell/UITableView_FDTemplateLayoutCell.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore/YTKKeyValueStore.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/JPush" -isystem "${PODS_ROOT}/Headers/Public/WechatOpenSDK" +OTHER_LDFLAGS = $(inherited) -ObjC -l"WeChatSDK" -l"c++" -l"jcore-ios-1.2.2" -l"jpush-ios-3.1.0" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "FMDB" -framework "Foundation" -framework "IQKeyboardManager" -framework "JSONModel" -framework "LBXScan" -framework "LKDBHelper" -framework "MBProgressHUD" -framework "MJRefresh" -framework "Masonry" -framework "NJKWebViewProgress" -framework "SDWebImage" -framework "Security" -framework "SecurityEnvSDK" -framework "SocketIO" -framework "SocketRocket" -framework "Starscream" -framework "SystemConfiguration" -framework "TTTAttributedLabel" -framework "Toast" -framework "UIKit" -framework "UITableView_FDTemplateLayoutCell" -framework "UMAnalytics" -framework "UMCommon" -framework "UTDID" -framework "YTKKeyValueStore" -weak_framework "UserNotifications" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.release.xcconfig b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.release.xcconfig index 3845a42..028ce4f 100644 --- a/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.release.xcconfig +++ b/Pods/Target Support Files/Pods-GIGA/Pods-GIGA.release.xcconfig @@ -1,11 +1,11 @@ EMBEDDED_CONTENT_CONTAINS_SWIFT = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/FMDB" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel" "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell" "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/FMDB" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel" "${PODS_CONFIGURATION_BUILD_DIR}/LBXScan" "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper" "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel" "${PODS_CONFIGURATION_BUILD_DIR}/Toast" "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell" "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore" "${PODS_ROOT}/Bugly" "${PODS_ROOT}/UMCAnalytics" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/UMCSecurityPlugins/thirdparties" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/JPush" "${PODS_ROOT}/Headers/Public/WechatOpenSDK" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${PODS_ROOT}/WechatOpenSDK/WechatSDK1.8.2" -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FMDB/FMDB.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel/JSONModel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper/LKDBHelper.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress/NJKWebViewProgress.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift/SocketIO.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell/UITableView_FDTemplateLayoutCell.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore/YTKKeyValueStore.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/JPush" -isystem "${PODS_ROOT}/Headers/Public/WechatOpenSDK" -OTHER_LDFLAGS = $(inherited) -ObjC -l"WeChatSDK" -l"c++" -l"jcore-ios-1.2.2" -l"jpush-ios-3.1.0" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "FMDB" -framework "Foundation" -framework "IQKeyboardManager" -framework "JSONModel" -framework "LKDBHelper" -framework "MBProgressHUD" -framework "MJRefresh" -framework "Masonry" -framework "NJKWebViewProgress" -framework "SDWebImage" -framework "Security" -framework "SecurityEnvSDK" -framework "SocketIO" -framework "SocketRocket" -framework "Starscream" -framework "SystemConfiguration" -framework "TTTAttributedLabel" -framework "Toast" -framework "UIKit" -framework "UITableView_FDTemplateLayoutCell" -framework "UMAnalytics" -framework "UMCommon" -framework "UTDID" -framework "YTKKeyValueStore" -weak_framework "UserNotifications" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/FMDB/FMDB.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/JSONModel/JSONModel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LBXScan/LBXScan.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/LKDBHelper/LKDBHelper.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MBProgressHUD/MBProgressHUD.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/NJKWebViewProgress/NJKWebViewProgress.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Socket.IO-Client-Swift/SocketIO.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TTTAttributedLabel/TTTAttributedLabel.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Toast/Toast.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/UITableView+FDTemplateLayoutCell/UITableView_FDTemplateLayoutCell.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/YTKKeyValueStore/YTKKeyValueStore.framework/Headers" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/JPush" -isystem "${PODS_ROOT}/Headers/Public/WechatOpenSDK" +OTHER_LDFLAGS = $(inherited) -ObjC -l"WeChatSDK" -l"c++" -l"jcore-ios-1.2.2" -l"jpush-ios-3.1.0" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "FMDB" -framework "Foundation" -framework "IQKeyboardManager" -framework "JSONModel" -framework "LBXScan" -framework "LKDBHelper" -framework "MBProgressHUD" -framework "MJRefresh" -framework "Masonry" -framework "NJKWebViewProgress" -framework "SDWebImage" -framework "Security" -framework "SecurityEnvSDK" -framework "SocketIO" -framework "SocketRocket" -framework "Starscream" -framework "SystemConfiguration" -framework "TTTAttributedLabel" -framework "Toast" -framework "UIKit" -framework "UITableView_FDTemplateLayoutCell" -framework "UMAnalytics" -framework "UMCommon" -framework "UTDID" -framework "YTKKeyValueStore" -weak_framework "UserNotifications" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)