From 1809ee77d29efcf5526d4f502d6defc204d3ea07 Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 7 Nov 2023 01:31:23 +0800 Subject: [PATCH 01/37] Add basic support for CaiyunService Add basic implementation for Caiyun Service Fix CR suggestion Add caiyun service transtype support perf: split caiyun test token to more parts perf: improve caiyun supported langauges dict Update Easydict/Feature/Service/Caiyun/CaiyunService.swift Co-authored-by: Kyle --- Easydict/App/Localizable.xcstrings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index f330a85c9..f50b8341b 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -2322,4 +2322,4 @@ } }, "version" : "1.0" -} \ No newline at end of file +} From 3d17eab8733bb650742ae3f2ec2f66ee644b6a11 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 25 Nov 2023 16:23:59 -0800 Subject: [PATCH 02/37] feat: initiate Tencent Translate support --- Easydict.xcodeproj/project.pbxproj | 20 +++ .../Tencent.imageset/Tencent Translate.png | Bin 134131 -> 28636 bytes .../EZSettingViewController.m | 1 + Easydict/Feature/Service/Model/EZEnumTypes.h | 1 + Easydict/Feature/Service/Model/EZEnumTypes.m | 1 + .../Feature/Service/Model/EZServiceTypes.m | 1 + .../Service/Tencent/TencentResponse.swift | 16 +++ .../Service/Tencent/TencentService.swift | 14 ++ .../Tencent/TencentTranslateType.swift | 125 ++++++++++++++++++ 9 files changed, 179 insertions(+) create mode 100644 Easydict/Feature/Service/Tencent/TencentResponse.swift create mode 100644 Easydict/Feature/Service/Tencent/TencentService.swift create mode 100644 Easydict/Feature/Service/Tencent/TencentTranslateType.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index e5b8b4302..9d2797d01 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -225,6 +225,9 @@ 62ED29A22B15F1F500901F51 /* EZWrapView.m in Sources */ = {isa = PBXBuildFile; fileRef = 62ED29A12B15F1F500901F51 /* EZWrapView.m */; }; A0B65CA0F31AC8ECFB8347CC /* Pods_EasydictTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 378E73A7EA8FC8FB9C975A63 /* Pods_EasydictTests.framework */; }; B87AC7E36367075BA5D13234 /* Pods_Easydict.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6372B33DFF803C7096A82250 /* Pods_Easydict.framework */; }; + C4DD01E92B12B3C80025EE8E /* TencentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DD01E82B12B3C80025EE8E /* TencentService.swift */; }; + C4DD01EB2B12BA250025EE8E /* TencentResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DD01EA2B12BA250025EE8E /* TencentResponse.swift */; }; + C4DD01ED2B12BE9B0025EE8E /* TencentTranslateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4DD01EC2B12BE9B0025EE8E /* TencentTranslateType.swift */; }; C4DE3D6D2AC00EB500C2B85D /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C4DE3D6C2AC00EB500C2B85D /* Localizable.xcstrings */; }; C98CAE75239F4619005F7DCA /* EasydictHelper.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = C90BE309239F38EB00ADE88B /* EasydictHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ @@ -666,6 +669,9 @@ 6372B33DFF803C7096A82250 /* Pods_Easydict.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Easydict.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 91E3E579C6DB88658B4BB102 /* Pods-Easydict.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Easydict.release.xcconfig"; path = "Target Support Files/Pods-Easydict/Pods-Easydict.release.xcconfig"; sourceTree = ""; }; A230E9A2358C7FBC7FB26189 /* Pods-EasydictTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-EasydictTests.debug.xcconfig"; path = "Target Support Files/Pods-EasydictTests/Pods-EasydictTests.debug.xcconfig"; sourceTree = ""; }; + C4DD01E82B12B3C80025EE8E /* TencentService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TencentService.swift; sourceTree = ""; }; + C4DD01EA2B12BA250025EE8E /* TencentResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TencentResponse.swift; sourceTree = ""; }; + C4DD01EC2B12BE9B0025EE8E /* TencentTranslateType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TencentTranslateType.swift; sourceTree = ""; }; C4DE3D6C2AC00EB500C2B85D /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = Easydict/App/Localizable.xcstrings; sourceTree = SOURCE_ROOT; }; C4DE3D6E2AC00EB500C2B85D /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/Main.xcstrings; sourceTree = ""; }; C90BE309239F38EB00ADE88B /* EasydictHelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EasydictHelper.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1170,6 +1176,7 @@ children = ( 17BCAEF22B0DFF9000A7D372 /* Niutrans */, 2746AEBF2AF95040005FE0A1 /* Caiyun */, + C4DD01E72B12B3B00025EE8E /* Tencent */, 6220AD582A8280E800BBFB52 /* Bing */, 0399C6A929A8608000B4AFCC /* OpenAI */, 03F14A382956011400CB7379 /* Volcano */, @@ -1939,6 +1946,16 @@ name = "Recovered References"; sourceTree = ""; }; + C4DD01E72B12B3B00025EE8E /* Tencent */ = { + isa = PBXGroup; + children = ( + C4DD01E82B12B3C80025EE8E /* TencentService.swift */, + C4DD01EA2B12BA250025EE8E /* TencentResponse.swift */, + C4DD01EC2B12BE9B0025EE8E /* TencentTranslateType.swift */, + ); + path = Tencent; + sourceTree = ""; + }; C99EEB0F2385796700FEE666 = { isa = PBXGroup; children = ( @@ -2248,6 +2265,7 @@ 03B0232E29231FA6001C7E63 /* MMCrashSignalExceptionHandler.m in Sources */, 03BDA7C42A26DA280079D04F /* NSDictionary+RubyDescription.m in Sources */, 62ED29A22B15F1F500901F51 /* EZWrapView.m in Sources */, + C4DD01EB2B12BA250025EE8E /* TencentResponse.swift in Sources */, 036A0DB82AD8403A006E6D4F /* NSString+EZHandleInputText.m in Sources */, 03BDA7C12A26DA280079D04F /* XPMArgumentParser.m in Sources */, 03B0231329231FA6001C7E63 /* NSView+HiddenDebug.m in Sources */, @@ -2374,6 +2392,7 @@ 03B0233129231FA6001C7E63 /* MMCrash.m in Sources */, 03B0232629231FA6001C7E63 /* NSAttributedString+MM.m in Sources */, 03542A402937B3C900C34C33 /* EZOCRResult.m in Sources */, + C4DD01E92B12B3C80025EE8E /* TencentService.swift in Sources */, 036A0DBB2AD941F9006E6D4F /* EZReplaceTextButton.m in Sources */, 03DC7C662A3CA465000BF7C9 /* HWSegmentedControl.m in Sources */, 03B022E929231FA6001C7E63 /* AppDelegate.m in Sources */, @@ -2381,6 +2400,7 @@ 03B0233529231FA6001C7E63 /* MMFileLogFormatter.m in Sources */, 03DC38C1292CC97900922CB2 /* EZServiceInfo.m in Sources */, 03B0232A29231FA6001C7E63 /* NSColor+MyColors.m in Sources */, + C4DD01ED2B12BE9B0025EE8E /* TencentTranslateType.swift in Sources */, 03D043562928940500E7559E /* EZBaseQueryWindow.m in Sources */, 03BDA7B92A26DA280079D04F /* NSProcessInfo+XPMArgumentParser.m in Sources */, 03542A4F2937B64B00C34C33 /* EZYoudaoOCRResponse.m in Sources */, diff --git a/Easydict/App/Assets.xcassets/service-icon/Tencent.imageset/Tencent Translate.png b/Easydict/App/Assets.xcassets/service-icon/Tencent.imageset/Tencent Translate.png index d91e835f44e02ca6705deac011dc178300de8f4a..7b5394764d2f0dea6077b2f27e4a5bb3b94f61d2 100644 GIT binary patch literal 28636 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 n!+g9vPrsb TencentTranslateType { + if from == .simplifiedChinese { + guard [Language.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay].contains(to) else { + return .unsupported + } + } else if from == .traditionalChinese { + guard [Language.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay].contains(to) else { + return .unsupported + } + } else if from == .english { + guard [Language.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi].contains(to) else { + return .unsupported + } + } else if from == .japanese { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .korean].contains(to) else { + return .unsupported + } + } else if from == .korean { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .japanese].contains(to) else { + return .unsupported + } + } else if from == .french{ + guard [Language.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .spanish { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .italian { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .german { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .turkish { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .russian { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese].contains(to) else { + return .unsupported + } + } else if from == .portuguese { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian].contains(to) else { + return .unsupported + } + } else if from == .vietnamese { + guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { + return .unsupported + } + } else if from == .indonesian { + guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { + return .unsupported + } + } else if from == .thai { + guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { + return .unsupported + } + } else if from == .malay { + guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { + return .unsupported + } + } else if from == .arabic { + guard [Language.english].contains(to) else { + return .unsupported + } + } else if from == .hindi { + guard [Language.english].contains(to) else { + return .unsupported + } + } else if from == .auto { + guard [Language.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi].contains(to) else { + return .unsupported + } + } + return TencentTranslateType(rawValue: "\(from.tencentValue)2\(to.tencentValue)") + } +} + +extension Language { + + var tencentValue: String { + switch self { + case .auto: return "auto" + case .simplifiedChinese: return "zh" + case .traditionalChinese: return "zh-TW" + case .english: return "en" + case .japanese: return "ja" + case .korean: return "ko" + case .french: return "fr" + case .spanish: return "es" + case .italian: return "it" + case .german: return "de" + case .turkish: return "tr" + case .russian: return "ru" + case .portuguese: return "pt" + case .vietnamese: return "vi" + case .indonesian: return "id" + case .thai: return "th" + case .malay: return "ms" + case .arabic: return "ar" + case .hindi: return "hi" + default: return "" + } + } +} From e65aabf8429240b312588380c8aa1552bf6d0a94 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 25 Nov 2023 19:40:25 -0800 Subject: [PATCH 03/37] feat: continue building Tencent Translate --- Easydict/App/Localizable.xcstrings | 11 ++ .../Service/Tencent/TencentService.swift | 135 +++++++++++++++++- .../Tencent/TencentTranslateType.swift | 9 +- .../Utility/EZLinkParser/EZSchemeParser.m | 2 + 4 files changed, 152 insertions(+), 5 deletions(-) diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index f50b8341b..2ac6728d7 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -2175,6 +2175,17 @@ } } }, + "tencent_translate" : { + "comment" : "The name of Tencent Translate", + "localizations" : { + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "腾讯翻译" + } + } + } + }, "toggle_languages" : { "localizations" : { "en" : { diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 0beeca949..88f81ca6e 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -6,9 +6,142 @@ // Copyright © 2023 izual. All rights reserved. // +import Alamofire import Foundation @objc(EZTencentService) public final class TencentService: QueryService { - + override public func serviceType() -> ServiceType { + .tencent + } + + override public func link() -> String? { + "https://fanyi.qq.com" + } + + override public func name() -> String { + NSLocalizedString("tencent_translate", comment: "The name of Tencent Translate") + } + + override public func supportLanguagesDictionary() -> MMOrderedDictionary { + // TODO: Replace MMOrderedDictionary in the API + let orderedDict = MMOrderedDictionary() + let dic: [Language: String] = [ + .auto: "auto", + .simplifiedChinese: "zh", + .traditionalChinese: "zh-TW", + .english: "en", + .japanese: "ja", + .korean: "ko", + .french: "fr", + .spanish: "es", + .italian: "it", + .german: "de", + .turkish: "tr", + .russian: "ru", + .portuguese: "pt", + .vietnamese: "vi", + .indonesian: "id", + .thai: "th", + .malay: "ms", + .arabic: "ar", + .hindi: "hi", + ] + dic.forEach { key, value in + orderedDict.setObject(value as NSString, forKey: key.rawValue as NSString) + } + return orderedDict + } + + override public func ocr(_: EZQueryModel) async throws -> EZOCRResult { + NSLog("Tencent Translate currently does not support OCR") + throw QueryServiceError.notSupported + } + +//MARK: API Request + private var apiEndPoint = "https://tmt.tencentcloudapi.com" + + private static let defaultTestToken = "" + + private var token: String { + let token = UserDefaults.standard.string(forKey: EZTencentAPIKey) + + if let token, !token.isEmpty { + return token + } else { + return TencentService.defaultTestToken + } + } + + public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { + if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { + return + } + + let transType = TencentTranslateType.type(from: from, to: to) + guard transType != .unsupported else { + result.errorType = .unsupportedLanguage + result.errorMessage = "不支持的翻译类型: \(from.rawValue) --> \(to.rawValue)" + completion(result, nil) + return + } + + let parameters: [String: Any] = [ + "SourceText": text.split(separator: "\n"), + "Source": transType.sourceLanguage, + "Target": transType.targetLanguage, + "ProjectId": "0", + ] + + let timeStamp = String(Int(Date().timeIntervalSince1970)) + + let headers: HTTPHeaders = [ + "Authorization": "", + "Content-Type": "application/json", + "Host": "tmt.tencentcloudapi.com", + "X-TC-Action": "TextTranslate", + "X-TC-Timestamp": timeStamp, + "X-TC-Version": "2018-03-21", + "X-TC-Region": "ap-guangzhou", + "X-TC-Token": "", + ] + + // Use the Alamofire module to create and send a POST request to the API endpoint with the parameters and headers + let request = AF.request(apiEndPoint, + method: .post, + parameters: parameters, + encoding: JSONEncoding.default, + headers: headers) + // Validate the response + .validate() + // Decode the response as a CaiyunResponse object + .responseDecodable(of: TencentResponse.self) { [weak self] response in + // Use a weak reference to self to avoid memory leaks + guard let self else { return } + // Get the result object from self + let result = self.result + // Switch on the response result + switch response.result { + // If success, assign the value to a constant + case let .success(value): + // Set the from, to, queryText, and translatedResults properties of the result object with the corresponding values + result.from = from + result.to = to + result.queryText = text + result.translatedResults = value.TargetText + // Call the completion closure with the result object and nil error + completion(result, nil) + // If failure, assign the error to a constant + case let .failure(error): + // Log the error message + NSLog("Tencent lookup error \(error)") + // Call the completion closure with the result object and the error + completion(result, error) + } + } + // Set the stop closure of the queryModel object with a closure that cancels the request + queryModel.setStop({ + request.cancel() + }, serviceType: serviceType().rawValue) + } } diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index cb7cde98f..780463d70 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -8,10 +8,11 @@ import Foundation -struct TencentTranslateType: RawRepresentable { - var rawValue: String +struct TencentTranslateType { + var sourceLanguage: String + var targetLanguage: String - static let unsupported = TencentTranslateType(rawValue: "unsupported") + static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") // Align with the web interface static func type(from: Language, to: Language) -> TencentTranslateType { @@ -92,7 +93,7 @@ struct TencentTranslateType: RawRepresentable { return .unsupported } } - return TencentTranslateType(rawValue: "\(from.tencentValue)2\(to.tencentValue)") + return TencentTranslateType(sourceLanguage: from.tencentValue, targetLanguage: to.tencentValue) } } diff --git a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m index 1574be544..93a67292a 100644 --- a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m +++ b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m @@ -206,6 +206,8 @@ - (NSArray *)allowedReadWriteKeys { EZNiuTransAPIKey, EZCaiyunToken, + EZTencentAPIKey, + EZIntelligentQueryModeKey, EZBingCookieKey, From 948737208604f9ad266e72e6c20e0e55762165e1 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 25 Nov 2023 20:25:14 -0800 Subject: [PATCH 04/37] fix: error when detecting unsupported languages in transType --- Easydict/Feature/Service/Tencent/TencentTranslateType.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index 780463d70..11c25eabb 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -8,7 +8,8 @@ import Foundation -struct TencentTranslateType { +struct TencentTranslateType: Equatable { + var sourceLanguage: String var targetLanguage: String From 2322fd961313a45d77eba50f2db8c1a05ab72aeb Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 25 Nov 2023 20:29:37 -0800 Subject: [PATCH 05/37] style: code formatting --- .../Service/Tencent/TencentService.swift | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 88f81ca6e..d23d403b5 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -65,7 +65,6 @@ public final class TencentService: QueryService { private var token: String { let token = UserDefaults.standard.string(forKey: EZTencentAPIKey) - if let token, !token.isEmpty { return token } else { @@ -77,7 +76,6 @@ public final class TencentService: QueryService { if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { return } - let transType = TencentTranslateType.type(from: from, to: to) guard transType != .unsupported else { result.errorType = .unsupportedLanguage @@ -93,6 +91,7 @@ public final class TencentService: QueryService { "ProjectId": "0", ] +//MARK: Header Reqest let timeStamp = String(Int(Date().timeIntervalSince1970)) let headers: HTTPHeaders = [ @@ -106,40 +105,29 @@ public final class TencentService: QueryService { "X-TC-Token": "", ] - // Use the Alamofire module to create and send a POST request to the API endpoint with the parameters and headers + let request = AF.request(apiEndPoint, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers) - // Validate the response + .validate() - // Decode the response as a CaiyunResponse object .responseDecodable(of: TencentResponse.self) { [weak self] response in - // Use a weak reference to self to avoid memory leaks guard let self else { return } - // Get the result object from self let result = self.result - // Switch on the response result switch response.result { - // If success, assign the value to a constant case let .success(value): - // Set the from, to, queryText, and translatedResults properties of the result object with the corresponding values result.from = from result.to = to result.queryText = text result.translatedResults = value.TargetText - // Call the completion closure with the result object and nil error completion(result, nil) - // If failure, assign the error to a constant case let .failure(error): - // Log the error message NSLog("Tencent lookup error \(error)") - // Call the completion closure with the result object and the error completion(result, error) } } - // Set the stop closure of the queryModel object with a closure that cancels the request queryModel.setStop({ request.cancel() }, serviceType: serviceType().rawValue) From 79f0b29d548c8d41559e4675a5017e8237219e5f Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 25 Nov 2023 22:48:02 -0800 Subject: [PATCH 06/37] feat: proceed to Authentication header --- .../Service/Tencent/TencentService.swift | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index d23d403b5..5589b63e2 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -61,16 +61,17 @@ public final class TencentService: QueryService { //MARK: API Request private var apiEndPoint = "https://tmt.tencentcloudapi.com" - private static let defaultTestToken = "" - - private var token: String { - let token = UserDefaults.standard.string(forKey: EZTencentAPIKey) - if let token, !token.isEmpty { - return token - } else { - return TencentService.defaultTestToken - } - } +//TODO: Implement user token +// private static let defaultTestToken = "" +// +// private var token: String { +// let token = UserDefaults.standard.string(forKey: EZTencentAPIKey) +// if let token, !token.isEmpty { +// return token +// } else { +// return TencentService.defaultTestToken +// } +// } public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { @@ -91,21 +92,43 @@ public final class TencentService: QueryService { "ProjectId": "0", ] -//MARK: Header Reqest - let timeStamp = String(Int(Date().timeIntervalSince1970)) +//TODO: Adopt Signiture V3 https://cloud.tencent.com/document/api/551/30636(https://www.tencentcloud.com/document/product/1161/50430) +// SecretID & SecretKey + let secretId = "" + let secretKey = "" +// UTC date in yyyy-mm-dd + let date = Date() + let formatter = DateFormatter() + formatter.timeZone = TimeZone(abbreviation: "UTC") + formatter.dateFormat = "yyyy-MM-dd" + let utcDate = formatter.string(from: date) +// UNIX UTC Timestamp + let requestTimestamp = String(Int(Date().timeIntervalSince1970)) +// Calculate Signiture + let HTTPRequestMethod = "POST" + let CanonicalURI = "/" + let CanonicalQueryString = "" // Leave empty for POST method + let CanonicalHeaders = "content-type:application/json" + let HashedRequestPayload = "" //这个常量需要对 HTTP 请求正文(parameters)做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母 + +// Components of auth + let authAlgorithm = "TC3-HMAC-SHA256" + let authCredential = "Credential=\(secretId)/\(utcDate)/tmt/tc3_request" + let authSignedHeaders = "content-type;host" + let authSigniture = "Signature=" +// Authentication header + let auth = "\(authAlgorithm) \(authCredential), \(authSignedHeaders), \(authSigniture)" let headers: HTTPHeaders = [ - "Authorization": "", + "Authorization": auth, "Content-Type": "application/json", "Host": "tmt.tencentcloudapi.com", "X-TC-Action": "TextTranslate", - "X-TC-Timestamp": timeStamp, + "X-TC-Timestamp": requestTimestamp, "X-TC-Version": "2018-03-21", "X-TC-Region": "ap-guangzhou", - "X-TC-Token": "", ] - let request = AF.request(apiEndPoint, method: .post, parameters: parameters, From 4f75dff1ba1c13c3c83786bc53e508f62be59ced Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Mon, 27 Nov 2023 22:13:46 -0800 Subject: [PATCH 07/37] fix: re-add TencentAPIKek --- Easydict/Feature/Service/Model/EZConstKey.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Easydict/Feature/Service/Model/EZConstKey.h b/Easydict/Feature/Service/Model/EZConstKey.h index d698c17d4..83bf8f46a 100644 --- a/Easydict/Feature/Service/Model/EZConstKey.h +++ b/Easydict/Feature/Service/Model/EZConstKey.h @@ -32,7 +32,7 @@ static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZBingCookieKey = @"EZBingCookieKey"; static NSString *const EZNiuTransAPIKey = @"EZNiuTransAPIKey"; static NSString *const EZCaiyunToken = @"EZCaiyunToken"; - +static NSString *const EZTencentAPIKey = @"EZTencentAPIKey"; @interface EZConstKey : NSObject From 7ba3b85cb8a4d267ff19d5ae286badc79bab110a Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 7 Nov 2023 01:02:27 +0800 Subject: [PATCH 08/37] Fix header issue --- Easydict.xcodeproj/project.pbxproj | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 9d2797d01..922f7d7ad 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -212,10 +212,7 @@ 03FD68BE2B1E151A00FD388E /* String+EncryptAES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */; }; 17BCAEF72B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */; }; 17BCAEF82B0DFF9000A7D372 /* EZNiuTransTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */; }; - 2721E4D02AFE920700A059AC /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 2721E4CF2AFE920700A059AC /* Alamofire */; }; 2746AEC12AF95138005FE0A1 /* CaiyunService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2746AEC02AF95138005FE0A1 /* CaiyunService.swift */; }; - 278322602B0FB0EA0026644C /* CaiyunResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2783225F2B0FB0EA0026644C /* CaiyunResponse.swift */; }; - 278322622B0FB8EF0026644C /* CaiyunTranslateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278322612B0FB8EF0026644C /* CaiyunTranslateType.swift */; }; 27B7919E2AEC36A1006E07C6 /* Easydict.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 27B7919C2AEC36A1006E07C6 /* Easydict.xcconfig */; }; 27B7919F2AEC36A1006E07C6 /* Easydict-debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 27B7919D2AEC36A1006E07C6 /* Easydict-debug.xcconfig */; }; 6220AD5B2A82812300BBFB52 /* EZBingService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6220AD5A2A82812300BBFB52 /* EZBingService.m */; }; @@ -649,8 +646,6 @@ 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZNiuTransTranslateResponse.m; sourceTree = ""; }; 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZNiuTransTranslate.m; sourceTree = ""; }; 2746AEC02AF95138005FE0A1 /* CaiyunService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunService.swift; sourceTree = ""; }; - 2783225F2B0FB0EA0026644C /* CaiyunResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunResponse.swift; sourceTree = ""; }; - 278322612B0FB8EF0026644C /* CaiyunTranslateType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunTranslateType.swift; sourceTree = ""; }; 27B7919C2AEC36A1006E07C6 /* Easydict.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Easydict.xcconfig; sourceTree = ""; }; 27B7919D2AEC36A1006E07C6 /* Easydict-debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Easydict-debug.xcconfig"; sourceTree = ""; }; 27B791A02AEC3A5C006E07C6 /* Easydict-debug.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Easydict-debug.entitlements"; sourceTree = ""; }; From da78dee41d293db6e0ac5d990a27a01a58c86f7b Mon Sep 17 00:00:00 2001 From: Kyle Date: Tue, 7 Nov 2023 01:31:23 +0800 Subject: [PATCH 09/37] Add basic support for CaiyunService Add basic implementation for Caiyun Service Fix CR suggestion Add caiyun service transtype support perf: split caiyun test token to more parts perf: improve caiyun supported langauges dict Update Easydict/Feature/Service/Caiyun/CaiyunService.swift Co-authored-by: Kyle --- Easydict.xcodeproj/project.pbxproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 922f7d7ad..9d2797d01 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -212,7 +212,10 @@ 03FD68BE2B1E151A00FD388E /* String+EncryptAES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */; }; 17BCAEF72B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */; }; 17BCAEF82B0DFF9000A7D372 /* EZNiuTransTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */; }; + 2721E4D02AFE920700A059AC /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 2721E4CF2AFE920700A059AC /* Alamofire */; }; 2746AEC12AF95138005FE0A1 /* CaiyunService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2746AEC02AF95138005FE0A1 /* CaiyunService.swift */; }; + 278322602B0FB0EA0026644C /* CaiyunResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2783225F2B0FB0EA0026644C /* CaiyunResponse.swift */; }; + 278322622B0FB8EF0026644C /* CaiyunTranslateType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278322612B0FB8EF0026644C /* CaiyunTranslateType.swift */; }; 27B7919E2AEC36A1006E07C6 /* Easydict.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 27B7919C2AEC36A1006E07C6 /* Easydict.xcconfig */; }; 27B7919F2AEC36A1006E07C6 /* Easydict-debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 27B7919D2AEC36A1006E07C6 /* Easydict-debug.xcconfig */; }; 6220AD5B2A82812300BBFB52 /* EZBingService.m in Sources */ = {isa = PBXBuildFile; fileRef = 6220AD5A2A82812300BBFB52 /* EZBingService.m */; }; @@ -646,6 +649,8 @@ 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZNiuTransTranslateResponse.m; sourceTree = ""; }; 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EZNiuTransTranslate.m; sourceTree = ""; }; 2746AEC02AF95138005FE0A1 /* CaiyunService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunService.swift; sourceTree = ""; }; + 2783225F2B0FB0EA0026644C /* CaiyunResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunResponse.swift; sourceTree = ""; }; + 278322612B0FB8EF0026644C /* CaiyunTranslateType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaiyunTranslateType.swift; sourceTree = ""; }; 27B7919C2AEC36A1006E07C6 /* Easydict.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Easydict.xcconfig; sourceTree = ""; }; 27B7919D2AEC36A1006E07C6 /* Easydict-debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Easydict-debug.xcconfig"; sourceTree = ""; }; 27B791A02AEC3A5C006E07C6 /* Easydict-debug.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Easydict-debug.entitlements"; sourceTree = ""; }; From 1a49e0517f919e9d9f6bc93c6bc93ec615a7ec65 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Tue, 28 Nov 2023 22:53:35 +0800 Subject: [PATCH 10/37] fix: remove duplicated EZTencentAPIKey --- Easydict/Feature/Service/Model/EZConstKey.h | 1 - Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Easydict/Feature/Service/Model/EZConstKey.h b/Easydict/Feature/Service/Model/EZConstKey.h index 83bf8f46a..1d1cd67ab 100644 --- a/Easydict/Feature/Service/Model/EZConstKey.h +++ b/Easydict/Feature/Service/Model/EZConstKey.h @@ -32,7 +32,6 @@ static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZBingCookieKey = @"EZBingCookieKey"; static NSString *const EZNiuTransAPIKey = @"EZNiuTransAPIKey"; static NSString *const EZCaiyunToken = @"EZCaiyunToken"; -static NSString *const EZTencentAPIKey = @"EZTencentAPIKey"; @interface EZConstKey : NSObject diff --git a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m index 93a67292a..0c8d8b86f 100644 --- a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m +++ b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m @@ -205,12 +205,9 @@ - (NSArray *)allowedReadWriteKeys { EZDeepLTranslationAPIKey, EZNiuTransAPIKey, EZCaiyunToken, - - EZTencentAPIKey, + EZBingCookieKey, EZIntelligentQueryModeKey, - - EZBingCookieKey, ]; return readWriteKeys; From e2aa439c12048d6bf0a33866e92dcb21c733825e Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:05:05 -0800 Subject: [PATCH 11/37] perf: optimize logic in TencentTranslateType.swift --- Easydict/Feature/Service/Model/EZConstKey.h | 1 + .../Tencent/TencentTranslateType.swift | 155 ++++++------------ 2 files changed, 51 insertions(+), 105 deletions(-) diff --git a/Easydict/Feature/Service/Model/EZConstKey.h b/Easydict/Feature/Service/Model/EZConstKey.h index 1d1cd67ab..3f0a2f65d 100644 --- a/Easydict/Feature/Service/Model/EZConstKey.h +++ b/Easydict/Feature/Service/Model/EZConstKey.h @@ -32,6 +32,7 @@ static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZBingCookieKey = @"EZBingCookieKey"; static NSString *const EZNiuTransAPIKey = @"EZNiuTransAPIKey"; static NSString *const EZCaiyunToken = @"EZCaiyunToken"; + // static NSString *const EZTencentAPIKey = @"EZTencentAPIKey"; @interface EZConstKey : NSObject diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index 11c25eabb..ab01578d1 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -15,113 +15,58 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") - // Align with the web interface - static func type(from: Language, to: Language) -> TencentTranslateType { - if from == .simplifiedChinese { - guard [Language.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay].contains(to) else { - return .unsupported - } - } else if from == .traditionalChinese { - guard [Language.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay].contains(to) else { - return .unsupported - } - } else if from == .english { - guard [Language.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi].contains(to) else { - return .unsupported - } - } else if from == .japanese { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .korean].contains(to) else { - return .unsupported - } - } else if from == .korean { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .japanese].contains(to) else { - return .unsupported - } - } else if from == .french{ - guard [Language.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .spanish { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .italian { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .german { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .turkish { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .russian { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese].contains(to) else { - return .unsupported - } - } else if from == .portuguese { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian].contains(to) else { - return .unsupported - } - } else if from == .vietnamese { - guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { - return .unsupported - } - } else if from == .indonesian { - guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { - return .unsupported - } - } else if from == .thai { - guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { - return .unsupported - } - } else if from == .malay { - guard [Language.simplifiedChinese, .traditionalChinese, .english].contains(to) else { - return .unsupported - } - } else if from == .arabic { - guard [Language.english].contains(to) else { - return .unsupported - } - } else if from == .hindi { - guard [Language.english].contains(to) else { - return .unsupported - } - } else if from == .auto { - guard [Language.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi].contains(to) else { - return .unsupported - } - } - return TencentTranslateType(sourceLanguage: from.tencentValue, targetLanguage: to.tencentValue) - } -} + static let supportedTypes: [Language: [Language]] = [ + .simplifiedChinese: [.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .traditionalChinese: [.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .english: [.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], + .japanese: [.simplifiedChinese, .traditionalChinese, .english, .korean], + .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese], + .french: [.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese], + .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese], + .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese], + .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese], + .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese], + .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + ] -extension Language { + static let supportLanguagesDictionary: [Language: String] = [ + .auto: "auto", + .simplifiedChinese: "zh", + .traditionalChinese: "zh-TW", + .english: "en", + .japanese: "ja", + .korean: "ko", + .french: "fr", + .spanish: "es", + .italian: "it", + .german: "de", + .turkish: "tr", + .russian: "ru", + .portuguese: "pt", + .vietnamese: "vi", + .indonesian: "id", + .thai: "th", + .malay: "ms", + .arabic: "ar", + .hindi: "hi", + ] - var tencentValue: String { - switch self { - case .auto: return "auto" - case .simplifiedChinese: return "zh" - case .traditionalChinese: return "zh-TW" - case .english: return "en" - case .japanese: return "ja" - case .korean: return "ko" - case .french: return "fr" - case .spanish: return "es" - case .italian: return "it" - case .german: return "de" - case .turkish: return "tr" - case .russian: return "ru" - case .portuguese: return "pt" - case .vietnamese: return "vi" - case .indonesian: return "id" - case .thai: return "th" - case .malay: return "ms" - case .arabic: return "ar" - case .hindi: return "hi" - default: return "" + static func transType(from: Language, to: Language) -> TencentTranslateType { + if (supportedTypes[from]?.contains(to) == true) { + guard let from = supportLanguagesDictionary[from], + let to = supportLanguagesDictionary[to] else { + return .unsupported + } + return TencentTranslateType(sourceLanguage: from, targetLanguage: to) + } else { + return .unsupported } } } From ae63db40fc6f5f806ea12d200e2feaecd72adae8 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 00:15:36 -0800 Subject: [PATCH 12/37] perf: optimize and localize error handling in unsupported languages --- Easydict/Feature/Service/Tencent/TencentService.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 5589b63e2..44fc2a27e 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -77,10 +77,11 @@ public final class TencentService: QueryService { if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { return } - let transType = TencentTranslateType.type(from: from, to: to) + let transType = TencentTranslateType.transType(from: from, to: to) guard transType != .unsupported else { result.errorType = .unsupportedLanguage - result.errorMessage = "不支持的翻译类型: \(from.rawValue) --> \(to.rawValue)" + let unsupportedType = NSLocalizedString("unsupported_translation_type", comment: "") + result.errorMessage = "\(unsupportedType): \(from.rawValue) --> \(to.rawValue)" completion(result, nil) return } From a6615e33147f3d6ac4a55d08bbb7b1a31c552858 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:17:24 -0800 Subject: [PATCH 13/37] perf(UI): add English localization for Tencent Translate --- Easydict/App/Localizable.xcstrings | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index 2ac6728d7..ba036c97b 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -2178,6 +2178,12 @@ "tencent_translate" : { "comment" : "The name of Tencent Translate", "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tencent Translate" + } + }, "zh-Hans" : { "stringUnit" : { "state" : "translated", @@ -2333,4 +2339,4 @@ } }, "version" : "1.0" -} +} \ No newline at end of file From 1fb0466b9c704b64b060756c4ce9bae72e2b0fb0 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:27:46 -0800 Subject: [PATCH 14/37] perf: optimize MMOrderedDictionary logic --- .../Service/Tencent/TencentService.swift | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 44fc2a27e..c1560c9e5 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -26,28 +26,7 @@ public final class TencentService: QueryService { override public func supportLanguagesDictionary() -> MMOrderedDictionary { // TODO: Replace MMOrderedDictionary in the API let orderedDict = MMOrderedDictionary() - let dic: [Language: String] = [ - .auto: "auto", - .simplifiedChinese: "zh", - .traditionalChinese: "zh-TW", - .english: "en", - .japanese: "ja", - .korean: "ko", - .french: "fr", - .spanish: "es", - .italian: "it", - .german: "de", - .turkish: "tr", - .russian: "ru", - .portuguese: "pt", - .vietnamese: "vi", - .indonesian: "id", - .thai: "th", - .malay: "ms", - .arabic: "ar", - .hindi: "hi", - ] - dic.forEach { key, value in + TencentTranslateType.supportLanguagesDictionary.forEach { key, value in orderedDict.setObject(value as NSString, forKey: key.rawValue as NSString) } return orderedDict From 9424bda26cb0c23febee907f02e945ffcdaa35fe Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:29:03 -0800 Subject: [PATCH 15/37] perf(UI): revert TMT icon --- .../Tencent.imageset/Tencent Translate.png | Bin 28636 -> 134131 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Easydict/App/Assets.xcassets/service-icon/Tencent.imageset/Tencent Translate.png b/Easydict/App/Assets.xcassets/service-icon/Tencent.imageset/Tencent Translate.png index 7b5394764d2f0dea6077b2f27e4a5bb3b94f61d2..d91e835f44e02ca6705deac011dc178300de8f4a 100644 GIT binary patch literal 134131 zcmdpe1yh_&)9x-#0t*BPvSYb~*ubJuT*aS6l9ja;`e#Ipl{9Xu24knyM5V7Lx$>85R0-@tUmV#D8s*|cvUFU?0+6E~}JLFzKi z4(JPVnu&kt6CKiF6g^+GW-pQ=iF{7H;OK_+#qKEkjH$+~+8xDTM^LZ*l zAcD?DRac%q5{7o@vjhg_@1CpiEWLNk)<{B!Q4O|79%yAxgXZRE*h%JAe;5`Qg<&~= zWyQ`cEjq#B;sY!WrP-9k4zq4|Z91Ni8IxcF&M2$(cDqO&T|H6uT{oWfQO*fr9OADk z$o`z*`)7F5yddIGnYJh*2o1m5fzv=u!cayAK>gZA0ssR|0C2A@;Om3``n;Me6Xx$H zFn~Ozj$~wH{2$XbH#@R+0m2N8 z$|FFkX(~3$*k=s*4bi-^=nRW@vefRhmpKZ{lcAFXp-&0DS6LnS>kYE>*6UWAf8Ya;0Kfojb44LNP$h z0R8x|#Z25Esf<6w*VyCzk7#pxO`KOg`(C1bSuL-pIpN29gY7?9#t8ZdtNXCZ=xLd| zkC!K)1wpKi;)GCL#$FDRgFe0rfh35r+p6ICB)NTblNsff(t-s)m!ug!v#%5TK+LU~9JBcAKl(^OndcR;?eY+_%ef(vpl~nF^5boULGKhB{Ew4=yJY4ymaWTNuMPG*!VQCrf)OSaSJ z^WIq*N}IZF3cgCmJFE3I<$i$yC@~)FPwFr&W`yq+HNhN|)$Emlt`4vjYDQ`ekgRJ~6D7FPYiFnEQRY?U1j)ZIS;sLkzk-XW{4fs1hHGgj~(hRM@-Ar>T0l zXMVH(a%E1OoSN!d&OInL6GNq$5#^w@X@Db|vhih-!e(gi6 zJWXu~8ES|XcKuXJf+a%^#7OGGQw87_%<$jH?eU%&^B!gcpC6^5HmJ&s{_{&q62Q(h z#4CIgAuc#^;U1n8JJ7o(TZxB?kkeHB=>G&TBRc5kv_!?8gxK?(z(cG6aN`3Z zbJVv4ycjpKL_BA{Xw3S-eqz_-D*gJO3pNpztql}mMe=_Qsn-c~-#;n2TXj9FNVgfH za;-+_&w+BbZ9ZVo49Bk~xoJG#c*7!U=h|jLCBk_e@;DeLGXA6Ym8w1xG$_0FdRTV{ zpr*lv4%0xM?Y+L~wU-zmXNo^ug{<-9Jwui6K2kxkXPGb?|21P^6zrHXTLp(@xmD^`j?{J*jv01K|AI;X)GhfrWM zue?i)w3kb3`@TuD0tmA7iZp{2lNf@Y)h?X9(CpHG6#h4y-ytTDA&Rm_J*PfAJfH<} zvcSAQ__ZVMM8VpNdI0Cq*s*E1X@*X^|4?6^G9n2_TEocmmMJdeuiEx2!{6&Ys3ojWh}%(6fJmtb|- zYy_Kj)yF(;t3CI7Fy)>vB{^VJLV)sx&+QlCmeK}f(A;O$t=NRcxc}I&5`~L|Y~7?F z!{c!P1$&P!^xlSoQBEg(Vlm7*-=d>};Vu2A4}VuP zASnbvD#=Xop`OmddvQM zX9y!q!qq##N@4ypvGaB`aoi;|kT$&K|5}|TyhY5vx#?h7b=nF~{UR^p_@#%g+55O-gMpu# z(t?6bg7G-AwGuMs@J1{-S!pF}|0VB#9MkR(&|TB1@eL02QUxgxD9X&lgh&9CP@x__q^$M10{H)xIq}m_^!4afT z%m`k{{gwbV%^|}Q+lQUMjQxrv87OYHLI=9geA;vbH?e)Qz?@wsI%LE7W?A2i>IpXT7M9o9~hRKd^_FIY}r#rpdYws@^6^+cz4?9 zZqDmRzT|475@3FtvY$pj>g=4IC#@6tBB)ux1gD>ydk{0W-~Fb2n)C&k_P@GFtaTS` z1ubh{qCwSLIYP&XL5Z+ox8$B|=kg-}EGkb+IO92JN$h2PTU6IyT{B(YMMXsdO;4xI z8RfT`j^^vBbAeKe%X#d8%kVO$jjp#0(-=cwfvVgxx%j{Hz$@aYi21Ud8-6T0kjun= z1OQvVi?s>mpsD&{NE!dza17}eC|WpVt@{7zMT&TPvUJD)3!}r)Ti9%^71sPuLZ3!sh(ojUQydtE9c!1vj? zFfT+Rr}bWmhyGHDi~qr61Za-*d?Llrdd*ook!NE+qudjtccvb&|)4zPyx2(QeZ2L)j$LyGBL959;(02YL>%@2g8&hCLCU+51}+Sx*)`Vt(@R$n4e!R)zYo=TXi~sL*0x;@=w=2S2c&H7r8G%8 zt~&2s-K;`GQAqs%QbRCoAPb@$eFyaBK+e-8)CnC7tb!1{alItF5mI`$_0a+qU)jyh z!Qu9&jB|?xIyO1M|Mo2LhJ6(6K&<6Bt(Z>u-SP|FIE&3X(+C#D7J;Nry9FaNHc~d> z63S&J@qdlw9b(!P2h8frZGF4DWJ{$G%g^AO{f-5!$XP^h-afIkfF$CTc2B5Ig?e>B zY-G&;E(F90f;i7#qqp^_FeidrLqdxAt(Of^Kxo-};yI3}{+kP54p7c-KieBCuZObv ziu8oMgn#*{X1Aj+9PFu%&Td=>v@ey@Alqklj6(3jF#Cu*;g?tahx>@)`fyDlA-PMr z%UewYr&M;Q+O@UZnkF(cA^O9=;DSD1Wt6J)JlYzE@&sgMo z&Jjkh7@YiNTXxiMgEQDR6i*R%67hfcTDtaDx+_igmI_kRp5Hj*`cQ`ejG-St&2EyN zx$W_IYER3d<-sE#knReeup8N_sWSd%h7Z5I`?G3VW%e$3Yp`2A-Jg_=7qjQe{+q{t zji$nmXeaxJrM&fa(WnHQ-BknI zLIg!GzelX$L-{xu)`2j_)R_qRrL9=t9Fdlv>rO=WYMH>Q>EDP@BPDQpoXUv!)1ttS z)J<~83_OHC5d6j*gy*G(kShHN&hbD>=W+7l=TBUuTI9jsTY?^8An%0t!bk76e`xhm zP|b}!z#5PrG74Q7oqxn>XiySzkd*vSu&G58j3)yuIWKxJxp>Fm3jJZt$4F2BWCOXi z7>C`&PgTUO%CktmQvVo@uy7+_uiVw#lqM~KW8lvc&95TO{{(nPCRZlMZUq0`vaP3@ zlRkzN+b0OE?0hx22F0H<4MTmgQm!ox}FkvnOb}nc+hvB zObTJp0EsWD)>>B-6GHiE=TGFmCL9|*CfA=$YjC}N(SU2J7&J zCE<_aEW`srZ_=X7+!{;g)T*7*WS7(8cen$>D@KtR)mX5O7p?NFZme|e?5=U$$=-pQ|dy4vEE_s)$)V1d~wNYU6rg#KQ z;vn#6v>{9tG8IK!^o-@=9l`wjyz7!=BVIo-1%0G*W@679C0``cKsbM2p9WBX&=;vU z*fLl8f^Y;tVzt8l`0K+gVM)-rI(qr5Et>WOOKW)OesN%xrsbvj)HAZP7BVz;`@(9} zTYL$ewJYAtf2KPQ#dt}BjiTr%M;80Tdo{9Um)XhklueJVJxg%@W`V}B`NrO6@NH4b zo3fh)`43s@dQV zq0=HW*sZD@bS9pwNUqm*l2-PAS`6WKSv43-FrI~;lS)Q@SWgb5VoGZU#0IcvlAnJK z9RF%0;W-}lPpWPkAi2mJ!j=A;f=CDa3t@~1co~{T1;s6hCu7ymEc_{{K}aw@GB$yu zWjDbxjXzcP>5}%iBWpi6@9!czdX_VLbGwuH7H>?+PF2vGXTh1# z%RSSDU_xSRMYB&U+bK--4lgwt%??U)kA*#p7#ywI*X0wm9dY|!Ov!i5 z(HUP%>~Y2Wua<@hgei|O?oEYDn{`SAwp<+jF|U7bbaZw3EHyh;xISO>ubi$lue7;8 zxee6z?(Oa_LtdU%UU&1$$H%2PVWV%*`;o?NiqPy$i>LlrQal`poaERX%~d#Z%dQ+q zW53R(TQ6+R+)Ne==N~Yb2|)X8EJ^$t{4u7rP2!XB|y2ZAGaXmS-ap*4!7&XK(Ln!%c>7Cd9=#KvLGW1e9RQw8A9pI`!3mr zpra5LYVM$S4_d7fL~KefauvN;*l+s)ud|?K|3p;Lv~u~1#EL%8$LaK_m^HpL>S}Dq z^YygU_>7DK^r@@kuS9QIfbwN}kbxkF&n4;TV@)!nL-I^qiRn+A)JIheRk`#woojP{w-LxQO49}1c3osWW+8ou;(Vvt$bh-K1jLb&4o3{>uTfRtzBBxS;bUF8DnK-)``P;Z1MNp7W1uwPY+%By7_fNr-+f0p86+K-co9wHapi&h<{YWZg@#(9tMcGICm^GJvz zppm)CMV_kFu`C*FAcZc`Y>elNc;eS>?M^@8aIMdkX+>K!f*Vp7s;oW&=W4xtw^qF; z&UUMO4d#KV3tA4Yjzo4(cgEM{wU103JCbCv7Ny)p_4j>W^cV%Dlhly3us3>VCZCnB zG0mna8{g*{8PFqrLIG+=#^6L2FaDH|u9A0n*Fsip@#A}^j3ur;xK6tHAUx;vzJO?p z-JH-~BSXmsGqpDunH2L+G}C>aXE)jrqnr3u^=~BU3k6F8r#5OS=IQod@2N8I6>?gocf-UUzL{D>lP) z+7|-X<02lPBeVObG8B4t8`v#Pe34|3!QmTtNC?1t=UKY&M<(=|=ffJ;<-mW^FDq!z z9cT@)a{LQ~uc^0H%1iK4XDn2Tnr+T2^i70)pk~$89ga% zcseU-K&(Hr-I5udaEZ6D_X|hu zLv~rF@pnLyG`*`3HojMf@C6IcyYnM;`5ehbJT-jG$hdYAZc*KHAVu5yiF5Go-rT42 zxk6NqR4kQv8`%jec?|V*=?~LgP4BRGDh}-OqKI{|E?{z)W+)5*Bh>d8ZR1J?DC72O z)fw?!?N7Jvr=2{+wvm<@j);zt#xEY)O-fToIY%q^``ia=C*wNfDZJkzsd=eF_A}El zNCQ52|fcA{sv0Is;&E> z+uGb`h2*7nh;kEf0N3QfIF5BezbwGADGsBaG#Z?ms&F`*n*rfOr_t~J3?(Ck5114S zX8H|1b!Oa`CUV}!5I8JAnL4b>9@|2BQFr7~e2lAN-Q126`TMs=D@l z4xF*HkCAItsULM2_b}x2GSUGKBNn9Dggj*tKa$>&30#tSaD z`R;ioWI)7y5255E(l03(=x;ytNYZ}e{*WzHW3L1wfkQxgNh4mT3n1a{pB{v0&E6@( zs6CpG0TrqHCLe#5KDv&&gPieS^F>iBrngfPq60J5aq?c06(dwK+=VUGhi#sgy(_L) zLU$d%BAZrtYRb!t+=_U^Py5+IGNN$a=|uci*Lp|4>*Es3_ytUZ=g*Tp!2r_4EW;hp z$j3c4b-ZRfRvi&MKeK<_;J45&I6AorbF!^AlO6A~(W` z%*X<~F2W}GSby7fyz8`0zaqHv!D;E>J5nFB=_jz2M*U-4#SWIcyisqZBA`W_4s0(S z^*Vd65+@+)g^cefgDxF1U=YKgS@U%A2jIhYq3o zy(imp))M=R2{I+$S$eibqbG3nvH=}grOH{ASw>+zdIxzh2@j^8IY zi2|cDFMo`N+|0y?ihiR`vUSyT{+Y4#oGaltA^~1zNw1zEq|o=;ff>Wqqm~Jo zuIJr~;}e^k!yj1v=2I$>j2e#twg`_eUq`zlf?f?G-^bgE7O5hf9iHI{c_?@}9)lc{hfvG`5sxiQcp@?}`0;oKD@X8& z$esQm_KGp5?j*0?9X;S5ShlwwpSD;>=HC&&k``S8d3HUHmOZ2bl^vD=+5*on$couS>oQV0V zjXwnkfvDlTEhLIWG~fW3$JTR9zHR+#-Fe-~{mEvMRd11V8VOXi`{c!*sdQ%!on-r~ z89WYVuCq^(l#Q5jD~IVfKDDO<1%p=aq!w7#jSxGItbOq;Sp#m2tc;Xt*jN-Nel;IA7Iy(Vtf=3g|INK zCxq$jH^2aXafMxXU3*$RlI6RZmU9R?szj`AexH;=g`U4DQw=ob+0lh$94pwO$ilQb{TOdC{#od!-2hXku=mluSfEBd-J7LLI1|9uRdBj)M#5 z{B9!MaM&mxc6y^$e38QKdrzTX>8<3Wm^ckwo1$X6xVk0&NFt~yIlA9K?8F`%3APou zPorp7%xIo4pB@3UT)UD~&!IdtC|C`hi`yAw?O`W+w+UuZP|?KtXmfV#@`*ks>UcCZ z@1?u8Tna~TNJ~uA%PdR;%9lD#N^_+!=Y`=Rci5nY-SGKF4u8Y9he-@1Zv`9Ocj#Nw zST-PMg^y2q1#d{~El!3ZYHDz8#Z$SJAmU1OQ^G(Rwjyj9TqZ)7S5B&s+#|#3ei>OvMf-Yd61sH=p2Bz5J@SFodQ# zJjRzEExM6^PX(V@|Z|;WA94-K1>kaU1n?f#KV0mRieFd>;ko513L$Vq(C! zV;+ACTiDXh38r--o{eIQVcL&Z=Roh-_xq-HN>}-s=cxp)cj|9n8R-ih=biXdpSSc@ zxPa0FTQ3k}ehp>dhqM0V&0|Ed0)xcg<+3KsL@8Aw1I)lwByk`Vol$46=8Nzy^HGtOGDM^Cz9#fK6A@*<>@SLHz^UdrdU!G|&5qufj;z@ zZn4pjkOAtFe&4ACm|oPwI1Ku8v%zi=XGJA=RJYNHCXov2)N#5e!#Z8_*AQQoq-^tYvf^iQ#oQHU>jUMS&z?vKb|^!nr=0 zdR>3xX$deUJatpw6j(-`?8cjoRL=WxNG*$xM0g|?*%W*AEq1#3@or7YfkUTpiqGcG zLUmTmPE^bep`88Fq(22bCoZ5iPg(kNG<7MCs@`gN-NvDrg&apv32#t)0pSWTkaA^A zDKC;hC53&3KNB@0c}iw-MF-CGZ1j?zb{5yX^5cUf4J6PIbcxVi}3j53h$>; z4U=Zj!5r3J72--JDg3T)NvH7n{JHjtkOq}g?+uKdp z{t$wGy#;Tklh?uQ&cS}28^yVlf*6IJ9gOeKPIMN1l=LpMEsh6VnA|Jw4F2ZR#qlYh4n8Zvx8XyfoWla ziyX-7f{~+USjBf4rO5$s`#m;d6M#8wXEPm>ouZp#NkfX^?|j&!Y!EcpwsJ1QLL2w4 zo6%FWaAXb56p00f()~UJ@K#vPYSUE$3^dv`T%K=WR~?cs*>BXuUD1@iSMhE&Q_6n=Jfyev&-<`cWUM1``_Clf(Q3;eFFZ-_rf!<}w3=ZI2@e{M}hl z$Nz@n9gHsvnU51>H8w%h7Gw;&USErGo(QLh;DrYiDulQ0?~cN8m5B~$o@8}ZKsa|& zg!mZ(!dmZI&-e~8GwyrnLM8M3b_oR6#GR{?!|b09!)EX7XCYd1v<+vPw^2*b`BIwE zgX5N4#0p!|F5ZjCuM*{}eBSbO zcrXx^QyywBEsHs)t_k0x#D(EU_Ao&MQV@0V46@B1JMm0jsa?Qt6o3DLEKz7E%RBXF zM1c-1Y_uUqc79*`Ub0p4o_7?Bd;xEC=5FlzR) zJQ7dQc#TcacpZQN-$lh_>%;BcXP=#W%}=X}n@^g!9J}-GnkY_-8p3nLnkQRi_rMvK zj!v@~k2y>^oDmUk-vmY%oS1?RJjQ*~F$ktcyXbA?f5MF*4Ft)@nW1=PqTBZ_A+FYu zoo2!B&5*(G&>=ZPm@B;bqFw;1fj8$>80!k(+URLbdvW}|<(xb4k*U|lRpQZns70ki zaj`=zO)bA@)ypDOiNXTX#kC)H_2oCB)K}5voBDI@oWjjJQ}JR`@Yb`El9%?1W3lVo zualN8Ymo1{RDbQux}--a&N88_f|8@Wf$Mtou;xkwRV}KT*8V(4rPa%*9Lwu-cN-jc z<5;M3JqjQ4qvVU%J7PuoBaSSV8RM@QtsSTOv~^_`Fc(_|tu>m$A3M$Oyl%he0!8rG zKIocwsRM6O)E44L61ANcjFREqUoPO>L%Uvah1uWMMxh${sEls%YZ^N}PL|~8D-KhT z*iVcUB(N*=X$|_b6?pzuQmPyiwC|9GH1ycDN|#965DLA}cHE11T^>jecL}%50cB1h zI`(~Pf%z8Y-QoJA=u#c2$CV1--`~y3dPnHJZ^`4LgqG1R^n9CC&KxQAw{{0E8PkoV=EQ(M)XE;{-Nav4DO68vkZE_}`xA50134AWl zrRilcvG#t1UxfSnbB*RAz1I3ws_JTc{1oPpsyC?NKDiY*TsEIOvqD?tKZ{7x-kP;Q z{kCR#&l`pczyiKt_d++&Jm=kaSu(8Gppd(lpbY+SW)9qS+CT0>7f}H|LZn&GgA~75 zp#(qf(Cd51z6W&6f%!NyId6<=vF23Q|0z(;%#Lo@m2iUaQ<@OJ8_lRut1Rvelh8Lr#q>Kw{k zUsEY(A0yB9&FbHMhbc&ES^JzXo>!W~b0b(qA08v*T}d>GZ||S@bR)OCjkj|YF%s2b zDIcac@{>{2LL3!+duH;57WjraF6tml++iaYCFX6YhPcKDwTo^Ww_?&8rw z)C_PpW*Kk&7=&I($IL7;`sfO|qGfr&oKZkrD7rQhD+v?eIV?mNItyP7d$rgC=oGvzKdBaBB`Hu29O?Di8e}DDEt{ z-PCKZ@zk4&P|9+KeF$Z$wwriQ0~{zJSKp8|crU4bPppI4ztsA{;x1sX@09osCI>}~ z-w3JY^~lj)-~v-%V`@^)h~R!mwe3=})!f=QbBi2+8%h%4Z|$_dlzEbW2Wv*8;Licu zVF{R4t?{^%kaL+lt0}T|Ht7HP^=Mr;I;W~CM{R{A!H-n3>T^c+=Z(_rLN>aQCd)5p z=Q;Ox`}S=#kR63z^Yu&N^rcgj){+%h*7WVXAsDj5@bK?9NzewBzB6q$ly+n{$PIX) zut(v&yXg@9a-`5X+X=4Zn8gMn>*b)A=!X_ny6`od_F|jBw;>4uZu^wd=5#+(iiE#q zH8{ukIZu}LG%@f44OnCT?8_*`w(iZf8s4NQQ zlGSfMf%kKGe-Bkgq@T@aF%d#P%wt?~-Uq>SkUrxb>=1_dL~nGX2^{mk9LVt?*Wd@m zmyuI`jeEc62qtE2b9?FT%c!ty)By_|;|&M4@ZTS`LykPAbQN?$p5jKYasTYB-s+7z z&M2$C9KOy&U7>zpSU}_@2XRl>yKUw{O!|};dJo}LA$r-dkD$qqPUh2GE==<_a^7-6 z#?E}`*?1GA6$x0?O2G-IGrqYsI-y3mh-rz7_@t&X4Y^|z%C)m&kLO)?C8sH&w@s-P zF5~ea3oFH|{(H1b`K+_~HV~GCs4zX!ph`7EyzlyN?S>1zqQvSX&yK@&_=b>}6r46tKn4=qdrh8-{M$v}H-__JooQ=oUB$KG_0&~=T9kM%O7_a(hE`TT%f+dM+HSqzu#;iw)96PYoX5%S}G-A}ULQ zY}iWKmRfaLb!H0NTjm;@%hjw@wXQRl+GDZrB&cA2jaA%i#6VSANG(xLgiNHhno6Ew zm(51QoxUUB_mSWp7jH3sy|>@d)NG0l=wd~Y z67eB$eGelYK=p~t_ri-0(nH4L#{ud@VUS+O+;fApKQ*^sk**a)>ZK_2?L!2N-JF{O z!=dtXi52ZD_Akzq0e(6^A-QNK5A&@j=9ablnE&$VsJVfHuqrU@@(-1Zkx z#kb}N0C+OQ#Rr<>NNhO}zB{F5187UPIdqkXqp|W!f3KW4!R6IKY_s5eAjX-5C}T6s03yzMlLe zXVYhuhF~T*(w6K=(_oa|aZxH`Tl<>j+xzj0t`>H+!KS=^HP_N)^6v;zqEJnm1LVs38}W&S_lkL9=(y@BCt zhr!(<3Pzfq%}&pySe?QGM4Y0x*QvzN3u4DJm$~L;#q>)oosXxgJ!O`3cXc?m^=mc# zM6Sm_TV)@fx>%w(fKAbFI#PZJHDx|;;dvpibeOTSbz}9uu|^ULqri-b`o$KW%b83& zMn`^FdM6K3TM$4K*4H&QYUx{aPe)tmCAjZ%7b`XQIT7;l zlH7!-d@Hahu+q~w7Ixjj+Qi$!j}iIC({I3O$V+XuW#u@3f0hJfXUnR}luB0ZO_f1bVG z8{kE81z2^|+rIFly(BPXTjFwt9+H|<9hr)DlT2NW;hf|UGv^76t{l0wdj~k-=|-`ZebjVG-TZK|Yo3h<>oq~c0&pVwbj3UW2^q`$l-vCh^-r#U zIOIRD4)EBEI4hX@b2-7IS(|=PymY?BLu}~@9K!|LX@}q9_0nXFxs#*DUkIh zO-JoZ*Z6QXv|jGEGo82HwT}IIy%ka0))fPMLB5|E$WVEHFIPUJ z4rnpW-~c$SI~QI^83M#n9@M>p_xR47&Fr=Bw3@UPWZegNux!`0J~560bd%Dc`@Q2F?sko@t!`<&>T=Q2e7otoQY!iqn->mQ_K4UsXa>M&Q}mlo_q*1- zOZT8ujUDn%Qa(3xJISZA@08yYQ}`yvxio?_eequ3Y=pywHf)Hs%?Qr`oekE|nkx+O z6=xTR^$^dIg?kCMv;Qlg!jby$4t^w(ccU(i^HlpHKX!S7Tcx2!G>_Gb{-`>Nyc8(l zqbj5B*^7?aM|%m-XHU)gfR~7umUTNogw)6f?PBob07E$2?kpj@mdhvgYo{MeTQWtB zS#IR`trtTs3#6mLak|7n|MUypapS}%-i0M&~R`sTIr6tt`KTYD7tqx)+Kz{-4uXG1s=ROaAJwYPzA2h+(| z)#F1CN2)EG*kC$6g8)`o@1hPhu^0h%_OJzMHxEsn4R*cy}wR)~ap>1Htcb7YyaUSY@K%+ZVzt~PWr?ODjJ`bQG7LcVq-z&itk>fFJmHVVkV;Vdy zgrW(ITmeMN2&{i7dz+RldVRF5eZ-bf-;{!kF&yaQvcjZAT5w~@;{pN1uVzgyol|_W>&o>MSuA++&lHH&3(L8qj}4< zgXzs!I6LhaW5xm)537VMwZCXM-YytDnP}zPmg%6^;{o9KLe?%XZ|-mRFsE)pw!K!i zp80Ccgmsg!Kjfli-H&qq$gN;GUqKYO7jm4E;b?r#2d$jG7RBDQFcQ$jF!8;k>vr}H zS={=C)+w37x9&%$#epD5gn>QN!v3>V8n#1iUn5aVEk(G<{2@wL)4%nw#DgwDasB*G zr*R!};&Wm#=dN6Dp`=)czcE5La`2-ebDhe!>8?q9$mBB^z9Yn>Q}(R%jhsIeS%k|b zq23pROZ8bd#RjdT49<54h-YQ+%ur~?w1pom6y@aRA(|Pj0=g>lysc*%J1n32&6&~E zZEpHgL)!b|gB-UgakVUNL<7A4Po&pl>YO&60n_WU*$u!<y@7=Ipy|A1fh02lJ550DO3Y9Nvp|%q`XVEAJ=U1aa#AQg`Bl;kUsg*&HQsZ)&>pB z)|r<(C}izL%oX<_)>4=-2{*mrqIXDRo_6Ju2N}`3`w;IVeK%fUcOUVbJ>}-;qR|-k zLk}`)g4q$7A=3T{b9`2>RiEyad^11nV8Bryy$D@g332exXe_AOt9l$DJ8r12 z**2dMPq;vtT-r5`6dxM_H94P9oqK1eG*;in?!!3y)J!vUR&O%)5<5D zI&^iD`aaz*k=Ga4K@EJXoh5XMxVP_aw%ev3o7WuZ< ziyo%^&5KVjDh@?mYCu}$Uq$H~)?RI*?OW;wm3>A?QSKH4M~q;m9p$Y%3LBK!@3KZqO|f1Kw^hs zCDcljtrBoV5&=tmpy_7gh(&{~?=|Z26;h3+v^>XO+r8qtqFrCV0!{(@7T{R$KD;oczR=;NaHI8$5ha03Pb)SKpU!S6lEu#r|f9#-evj+nWA59?Sdq=hV?Z~Np=V~4?eC*uUQLUjY zA|4;#66ru{_O2mcZi9*atm%l}@vx|%2^EZsHK(;Krb-q$a|$iHJyQ);P!ZDer${XT zuT>q{BX@*G6((TFOt7x{Q`$O0DzV~_rXpT|3S}OlQGV=0SfO5MdDf|yFmPu=)2Tud?{i^9%nUb_E z!wmyHnqs5ngT;b4@lMLj9CZbT)P?fVrHpY7i}4|U7_^!TP*FLfn>(44QdACy`t_DIvFbY4!53R(H zBCPep7bmESZfk7{yzD;^e0Qhnd82w7BSn8vVF3&bY-cykLFsBz#95n@9qzGuNr<#Y zrD=O-OrWyl+Bt0Gzaa1(410oti~{>e^l}bMeDB2pw{JGWTjoF{u!T3KTc?$QbF>Ce zH^)Pi8<P(9oMqJfFdbpEPjq6jSJ4IarL*`$akF;!{5!wtsLF1 z^6cazlCuQ={V#x81vBZr->S9Ip=>LIROT0nBncxRqedx6_@Gk<0TS-bP@EqR7&iH5 zkPf^eTPVS=#&{j2%wa#3hQv)F=DO<7lj}2}`waX;lusb z72_{c@4f~{n4sz^y?9rX?#=YSZxQl(D4b~FmQW`4Oi7EgA*3_&T?Z0^%P{J6MQ?`LtB8v6)pYFfE-V*1+ z0rW;p*2Ct?-(IsA0zF=9pq8vx;TW%l9?2d`ZXgG)Jo#qMPNQI04S{ilc>fn%fb|#d zHa9nO(A}GcTx2~~ZHl@-a%+P2A9>~rem5VM^Ev(>0O&v$zpwk}|9zug^k1W0{#$g+ zFYf}BG&<8OPU?7b^K)*VbK9{4bRq%@tS)1NILVs~5b(!fkb|#t=gN@2I-V&YyALz3d^ke&htVRvWYC z4<2x9rq-y#N!|)(MDJy@|GFxr#aN3I-n@iY8sePw*b%)lz*pu%hHCNsG-j!qj@cxyPs7S3i5Fd-1NP zxF31dm>b=sF}?&Rvsl1}juvA6GK%`^CO_~B#gAb9$AA1s|C*mo%Mv1J@irnO4WZ1a z4Y!&FaTAs`BwL?tNL)r2?dTiWbJ9hdW11{ZKf=J2^7BRjvjOxm=)(}e^PP!D9(lz5 z=5PL{(?@fBo|W&S`ehHQB@yii@{Xst!zVc_kqf#p0OE?`xJP;D41h?I7V;wGqk?1C zcopYZTx+xJq}ICroHqMi_=QK^wws=Co5r8yMm54JSLU?VIxfM;=ULhGBthvrqXe}U zU^(A?M4d7SbQHgg3gsj0F%LpIR4@i?Pfey}jkqNYThj)2QD|Oo4TGxq_8R`8G|Tg$ z0R%-~Bm_tcO4zrcp>(GgHO@2`0iBi(^sKSqUMNGK~{++ z`w*J&{0126n>je|{^q0qLtpXxN714gFKuvTL^iGyt)LI(Zw|rC=0M)x1}3>f%YmZ4 ze`qP{u68pnQS{6NU<8mx-{P$RHVB4ix$0+}zVxLpIh~j9e((2w&*`H%-Bq?ipv4Ca zfcOE9<6X6)8v`JZ*edm*EHJZ5@^C}EMpz+a2sKjo!)X+4T%|6QAdwj-Dvq!vFH5hL z0iPtUhFU29nLD)8|E!1Hu6q{TQ6(Kfp%K>@hqvf!e%hDi^*8F=ZU@RA$A}GS%~fDj z2JB(O41*sydgyjPMx4a5*S7882bCWbsI_1*R<$EEP9P!D`G`UAuni59xxkhB6|ulU zOABGl14_qrTAroZbt8rh53?`22?5p`lI7JJ)`*`EIN=PxkMq;e>F8Og(9lM*RU!ob zH>-<4$>cD5M9lXkUy>Q43@$5b`ZSzhAaE6t&ZnC>?fY}1<+W~M|G2y9!iU^}N7uVo zzJ056`e$?C2u6T^!$swUAC!1lz+qJw6ct`?@q1o)mY`?E?b$o)KKQ2}bQfQIp&Qdi zSKco0)3MMil)S=d&Uk_m&`$Zcx-W)rDZ)Y1F=%}4crfhx+Tpi*-i%JmZ-*x?Z)Gfv zviP`9*|mlAIgA0$3*aQmM<0FE{n?-WS?z;D7^%R5d!^4x$pEm~_Dnz+r@9Y${=0Gc z3hi1S!z&q4-QXJlEF>5i8M^q=3#d53s?3)|Kn9V>$e#^=yKXMKbI!cOJ#k-I@An_& zCaM!!SCym{7)SXsH5=aVH=OklRCxd47C-t|eSWxya8*YvBB@^7$4vf*lK%7QlPnc8yB?+&^V?-o$dKief)#H; zsGiJ7rGK)QfDt{l`Oy?~u<1o^$BxI````bc-8a8=v0J-Nc=Z+nYp`Ql{;F!4A}nQj z(DZYda)4)}6F)5WF!j%7K%NCt?#w>jamO9*cYf!0-1XOA?`Nn``p{|0pT53Qo!X18 zHHjC87Vo%eofrTeA=QmI1O@=41<^;y6=KxS3UGeEKf|9?cKQd7Ss1R=d>zq?ThJdR znSZTnH}$R?%I+(lyu;0WpKtd~X+oglW|^jCQ<{*--qddFIVpKxijr+zO*bNWTR7lq zu!6G(tVNL_W(5Tq)6=f9nBF+vSPmYv;zPUqMr?gubzlVag}< zl1Yu+{k{{WFNmM>BRXe)Qls>lb?*LK=G+%QewUlSPiBG)+LGQJz{t=Fg75dBVxkHs z`ROLc*;^FeFyJkLzxvC+a93Y-g#@hLK$zXD?-lHKQR7$ir!&n3SJG4}!c)so+KsL221Ef}{?`&%dsa^bCs$64u5)Wfwz{2nm2`5T_66Ll^cfiedSLwV)O23T2?yV)fPKhE z-f005Rs6~?|FYY9)E33rfj#1907^Q0cwXNt7#-8QFY(cX)PI<}R`>gGWsN-t!{QAy z063NhQ1DFkGfPFtTPVAB?eazdX9gGzh*Pl&npU#25NE+ zDD(BK_@U}IUdP%lW^~kN1W+2WZ-=4Rd~0L3<*l5BZOdaFdS_wl65#FEb%Uec4$=_u7vFgftZAwboX|w9IJJ#*Ff4w{VqdK?Z&bkpG3F-SM#aaKyAwc<5 zb+~ZudCz^W`{V!mC)(^f<*O@e+O(oi5Kl~wyMuEFWoU#Q3!y;!-#Y#6VOv2Mo^E&- z@_igw3MvZvqSr?Xe-f7y$VSxyJL((UQ9cQO$*EVuYe63l-`!lxgz?;o3I@cu7Ga74x`)j?F4z$41fi^-}9oBH`cy=8WI9Jpe zoIMDOVGV*XDB3v1%Ef8@#tmnyaB&^=w#0cnbK$uw&Ii`&iOY2wr)(=%oL{G^!47ddP&-7zMk4!3_K`urt~pj zc{MOz-zObq&)F1g3jFrBzwIls^8|XU_0X15ds?kuv=%lw(t9xgawx*3Zp6TF6;@D~ zi27yvQ@%EO%K&TgJMhC_67?QKfRT&KFH&OUHF`i|IO6ejVO2v+EUv$i=C}<3 zzBNI`IE%_yJw5Rcz$v017sr zmNmscranx3Os@$Zd}!MJqm~2av>ZU6XRjao|Ma4(-{H@e!g(3Fo?_qEg-aJd_cO0` z@A{4RxmmpqSXH4aXIThoS*H|s>Wt=2;S*fqKqnmF)j;|dQ~C_dQ21Qii~yl2dyIe& zfB3`x)IjzK#D+pAbuAYdwa*Ly|KvBJt5sgDNIy!up@N908uDRBARu@|mV5(6@nzUq zjoJ@RfLbP~E+}0)q#wAh?7s2EyWRY*NjJWr<9#)~&xyWl6h%NXmoTcePu57w`cbw7 zrbbT~4~DX7ScjlvwsU!y{B^tXz2!q=?2EB>|4!}p|K{iKatn`-xpk8pCEyT(LHUo5>E$eyp@s#m_g9$m7wi4&e_qh4Dr(L; zbGr^rr)=fgm2XwH_q?njc6U9~n$sD#wKcuqU<%y$)0{$-O?$5qtL~|P?GmO-3;Eao z!X2$4Z%1Einrmo$qzKmVH$sLs=F{5UZ{UNGR1aeu^t)D$+`tO)MI&-%0{r$DA>}na zEe>cYKtSrl^y#uR`*dlu+o{)Dzxof`-2DAo4$w@1)2@F1t&6OGvagD}hq0@}1$3bi zztaBT_dnpC^Fu%EXTcWyF_)@cFvcg^i&5ZTCxnJ9&+=QfrCFZw+rnmW?b7q*^VjXl zTfUXE(9(Me4M!aIf+t@FzMIeIEthMfFK&BLydAw5z;Qn#ZVr4Xeqiv-5^#v#-o1O> z2S4~h|B9f&#^p#`&a(q**T5_n=}O6Oe@F=>Uv}@O2}AEqshxM*Jqhp#1mV zRdE-6;eI#&=#-nRZg3Tih|z$y}HPQ33|F9A^RixBvDh z?&z(@_!));Z8QX@2}{~b+)ijCFS%k4)cZzpeo7q-2QWx60(e~zo?`^CQE>O}-R_V7 z_>bLpzx!QZkr@E&g~2WJ*@0%d)}DOdhE9G4@r3$H^{_W1suMbTgpu$w`B#ftlgQwB z6@joj%IQNTx~l56QKmlU9;~?Y&)(+tJy6ow{zoZqN&-|yg690$=;Sv!v5Q|h6-mO1 z&J@rAzhLkIoE zLPoYgYq$&qdP!?^jeK34-w2(%s^ROhT#P2eVSORaB5r~wpWgAcXB%$-&@WNe^XjW} znh{W3d1Lx2)u>LbgwN%&K9nLqHMY)8FC66_zInlY{j*QFg-2~UKmtlqgPgT#x% z#|W@K%JYUnz}|uT?z_*=1Q43B3Y;0VlwFQ4)3r6}+z*YWExW;ClG;KmJFsa9L)cju z3FjcKRLq(cq}HgU@2HMT;R|VeGPSI)`knXL?QWM2NLjBh`i*i*+B{RHd~HqBMJQ|( zzviWb@<;81OVddTxk9)yZJl=r`taa+Vrqgh57*gspx;YguSlY6Pebn7)7VWKQ~=-1 zWw;jAy%^qv&f=WLlt!V{Sa+v5VvLRW;+%RsDBpTros_AS&J=i_Persg$6K$vhPNRS z^7C{yfaEUxo?8{5H~K$D`2OH42`%l==ZIeVXXuZFtl8^`UTtb+32b_Ft(z=wao_#7 z@4HLS)qB%>Bp78FV=!R+GI-aMBClryM7ri11d^TZ1uuNQd*A#1lUMY1=D&@c5Sj>6 zd~<%}8Z*SpqWeU3D1vT{uR*kD5IBa&u2qK`J#wL{J4Fl)i^47Pw*Ztzp`>9lW@0$C7;x_>*Y%AVb-|Dn4 zuCxZn?JJ5O>h{Dm^+F3uoDn^E%;=+!Vhr%g;Kq#`-FLq89rvLReaJ5p0E00L{4#cV z%cN&w2dT6V$qWD^6h=W_QF6y>a@2Str5|Q9_3D#zSDw4yf7NeYb+f*w&O4%Gn)cUT zCwUEg{OBKn$=iS05G@x(A>uH^1IxnLt6nYrC3Kn^0Tga<)|nd;3onGjlMk-u_$Ufp zfcEBnC7|ihW%PK3XtXub*LfQQzXtiBwZc`;3-s2nTQ?mz4;vc+E!fs6-r`y@EJ1F( zwfkFKp|{Bd>O(1azXMRlKx~U+3v-MGj)VWS-OrC~*wiHlY(@jiF@>8H6To_M0RW{UFXbt?pHa*Z75 zuWvNs>hy{_Tlsc)T9sYu_ViL8%A8R@irvcFOaOfq_kQRh%385;%i8!vPnN>+aMqHzexYT+tvqLTZ zH~#}Ze32vBd{O?e)4Y%mqQ3CAY5hU#z!JH|4@#>x=W#B5`vbkr?n$1$`n9!FVeNL3 zX6bdvRqusxpbC27h4`8WVtB}y>?E(KuVj*K5Y-(ETqbkQ$Sr63a&70jH zeBclLD2i!T1g4$ME}&&Qg$iv;?ONaS!BS(--cr^%*cJ>9n@#`Qs2-&cUu;&uc!d#g z&N=6}&wu{&zTd_M!{DeH3?|Vm3%xFZ3b59sQ$b!sQm+O;1Cs0lqL$p%MI8G9U-t(UKc;%1KWXhEdRy2M^j-p?3ADErO**#%4!1^g~uYCODA9t5ue!1T_uw1z$+Ijez zxvr$mzzhIA@U4hyMy%3nqAM3~QKTRXOHX$d86_W-`G_|6vE%>X_KN%VKRxV5pEyFV zKuu}tQ@fpI98@!s{YXjI8V~uQ63eQ7x>T1;d3vw3+V|N-bCov)FdV4Qw_!0+*2zMS z+UaT2m4)C@a`16JJPEGd2%VO;`ZGMehH?EZaiDFYb{Q-@h`puPL)u#R{uV|&4cB!X z^>X!?uNsBt2@n}kopq?97}J8J*ZExpRZnB$8)ys3sWrL=7T@<;%LGQhihV}zqH=+L zFni*BerR3&nnX`EPaWQ}V1~a42?#enhJh)Mu3vo{~~CPxU6XHe@%6x&IZ`% zF8GH>Tt&xVvvdX)zI{QAvon|tV@e^+h=u$&zxmDXr7wM{AN}(j+H8O~tij)dvwPS> zQD0=al#lyDuWiYfv$i!0^YFvGZbpNp54vu{Yhfq&QS!hOVi3g6W(3H?GlTW#fBxtG zOM+aRi{qAds6w^Hbge!0%}8mN?*{09+H3U6-YWOjY_Fn-X?m${+Eh zbsxzscKly-&I4}$quSD>Q~oBj?pfu=N+@!B5#@nPEG1wM8P812HOb-eA$H`dX3Rn(XA5RLdTCYat2JN_|%gTV3zr9gdYe&j96n`H?DSVWyj{C?t$XB=NBpM1{rmUV;wtx@DfB?+eCL){SZs#Bnzwhz|U3Z&A10{KIlJ>x}Y=9 zIrn^iZpN?mSCD>PIfJ*bxNu`<5o{|hMP4r7lzB1s?oy$pmG2H4Ebj2$_%^lXQ@3@u zhNrIH>kId+dHKeB+M1H$T*GZ)G1OA0GKsaI?^;x~wqMezf1G!*FgNP1|JVE79T#g; zAa4ceZ2^BIw%vN|A+RWd6G3?L$tSz_zW2S}5J#vo3&7g}y|{jP-Ea9`XijB{Il#SG z&i8|XBl`o)5a7)KHVxi*uLyyNv%AlRD$;)DXMVtu-;7Pe!rQFAL8e3da-<(a z)kgnDBYl^BEa#qkuDjrZ3u+2K-Z%(v%n%qPpE|+SVg|q-$xhICm~J#+E2LE1#|(hc zZDFgb;=C|v&srw0EmgEei5u5^=APRt?#i#-=SF8X={WOAEt6_vl4b|ybkZ3&m+z;K zVMj4zkaN}%>K!%+ZuEXVEmx?=%XZ2%rlly3;_Am2;f&MTHLD%{MdiD~-@@1`!d>S@ zaW1J=e{+c9oKUVfuP7Dx#jb7yEY4f{6h3Iho|uw6CuWZ7IpPz-YetTAGmlKVZ+`J% zx3Ehz>lri3OZvnh9|bapz(k1R-v0KtyQe(mDPH;eWjO=tAnf(N80wW?-rA85`)yYq z-)g!x-VpZc=)3e`6g(k{9fKC*;G-Y?sJr*xdwo34qpp7H?3LDnax}c>#t+H>fEj&G zOZ3u)P=#LD`V?}EZHX@7s(X^x|d zZ)y;Go%FB8WkGIYGgnaum&N$vf`*&07hf+GV~yj`U_MSSien5kI-{>KHNNTucb@m{ z`4ZRAJYIw+Usvj z^whKjl}`9m872-|S6vs>?I^R3QHN96+}eIUuXPMuh4>aJdGHvGt#KCR#wFu;5iDto zX=(-;rT4uTz$mjY!rd|oe79u+!lp(*c0Zfux1=YZX|!3G&tHmby|yP=w;*9w(K9hp zne?+{$gM2^XvxiQs1>OQO%tZCeB~=0{=k6) z9XFzJ8xA7cbq`nq-N+;!Jo=gvIyOwW~g$>0zh z0Ry>9-5LN*HMMSLj|M=W?T|!b9TUfw%^$z5?5_UCoo-5BJe$nO^`^<7k^ zIcN16=ooJRNQ(KxQQ9hr_5!-zk%7&;ltnLVM0H%gN!d@Be&u)ZU#&)~x#KV(ueUFv zKCZkWUQAyD$l{Bd5nwee25FsAr_tbgqQeR|4eRtZ#h)1gy&4ydRWEK=FMXyFXLnan zz-$;=op<}af>$DkVDVaXtWF2DE3Dd<3UW zxz_3MsCxPVM?ZL$OL?OsANItQ6;x=@?d=6$T!!bFYx=1vc|ta}e(Yl(^WVO({%mZ{ zUz1*xX7B?Fiv>ZK$a^sW7FF@or#^LJQQ`m-Y^ud>6sWzB=7cg$-<0)%9}fJv`r;Y) z=sk08t=2Bfb0cn2mYdf(UeRgPPdQ^-Z9%h9fY-@xmR^Ub#}J~xo3H0steN1p{KnAg zjuf%z4$69fp|3R1j1geo+CuI1HWkGK)!diPT!tg&74h12J1mr6D%YkiPcyW%fm1Iw8M^lOY-P6@o@jyv3EKJyvhZ&C2pf9cES zfG00bv%CR@CU7n68FiiV)+kz5qys?0Hx^st=s7o5FvfTUkF7c&iyznPO5eG7o2D!` z>OE#g_!Anvm^32{O{nt8RDCl&jCGm`ppf2~UK4Ch85B3MweqK~ya!KEzaFDC!(R;l z$G1MPD^mvT>x}PFduTzxvzTu_?rSbAUcVR3VG0XoylqBbv-E(gO~Q1y$dA5l=D*^HSkrxx)6M|@Wi#R^Ro$>m*~A>H;S5qu4+ZeWt^u|M9Hm<; zf5VR?MVW9N;+A76@%2)~y=?EYqB>u?ENI|re=EKR-WYHQsk7gD^X2RJp|P&QE8myM z>4js37#AhxdD2;*T7;%ag6P&rKJ+?9{j!hcL$_vqG{kuZr$#rrz1vIf$_sUHioUGL zv&WQy@ede;A8Qmc3+kQ-2y@^{+JtZ|2qJoodKA-4Yl91E)DcD0MA8t_^?)Gd(9I z_Qup60evq(hXpX;uaw8M6mYb=>9YIWBiCrkpSJ?E_XeKYGMx!O(A%s4uLUANF%S@v z=FPB=NLiAo^`l<))AF|9@McC-|gX_nRwSEuaO@IAd~%OTlN9&upu>Yrl1ue`i@I z{OS;(lAG0GKWs@1;~L!z72@-~c*W$IQBdfY1x%@%#ItE#fkbW?H?$X=y_AWX(Oop_ z!^W9T3b&#ULtrp&F-5KF?WE3p`TTWT962MP>+)?X$jg(#@lqofJqsAh;Y)&Azx2Ch zGJ@2uQN1O=^EalAhLyQ7SKdG6F8!(wN8x~=>^N;x<~G7d5SmfI!9cHl?Q8vOfdU8@?svCF)&Da290YVPoS*(p&0T=UT4*~YcIU!OKqqCoZb!}t=%kK*V07pDDee`%)Vo3qVl$NW zj3|x~FruY_GG6g1y+Z3J(Dd2tv5{%_$ZfOk_HSzzz(0?RM?Ub5XBMG|ApDhI`4xXi z5F4sUXLf*ia)aZ5J;#H?m@v^t>BIC_j8cxw0)aHAz3dV-AL-l*%lly6=}L!Q2HUEGFx8=H_|$QrVJ zZAvN3j3Dc9eiA3jSxM31+*eW z8`Y!S0#h?(v~l$wF3m<(MNA}KmYSTr}VO$)jBHArayl` zu*nUc1IZW|3{TB~1sfxMK5)fXF4wPL?=HFI5`Q*;DSR98x0QW^A#EU7dNlw{cKJ{< z0O9P!9!LseCM)PA4?prgjtG)dEnHUg+FwZ{5Kbhk?5(;hzP#P<`sX_Uj9W&%5JG@S z7)bz)N$?=wcp1RFmv_2Gu;GJKf_GswoLz(zNxb44nh^+8Bt*GnWM+R{;}D$YX$|r4 z6XEfY^`8;VWB_9ivkxg2`M?=)6nm?)Sy->FdCXHtrHh==zPN5uiuh)Hu{L?KW4ve~ zYoO;-VZ|yD>h@Et0`a#%{348ft)93J9}hH#-wd0-DUE>5%LllI{8~Q zP{SX1n0*`9Lo=$`wvqCbo7+9*Er+CYvUQE~CxTJc8)QU<@wGY8#Dlc3VCVALD9PvC(Sz`D;sW7Ut`W z;S86BaUQgFLSI~F5OJf$!hUh~i)Rq!%?QYc%w&D?lb@^|6Krj@8G#}4zsXZ=6m%Ze zRAA>t7DLJ^>e&E5+%#=XCcm@~Q&2dhke5>Kj!PEYcI`5IlKz8e_!&}&{JaDa?<$J0N z=(Mu~;xORrg?ghT_+@X zz&E}5Ew$bMCMd0sQN<92X4Zn06*S{V%(Io%qLoE$Gyc;G?!n!6-|fyi>#SO%V)&JC zkNPnHOw#Er9+^TtITJIC734fdehf9jMq?2c8s+>nqoyJkc2wQBn zL;I0L3v;ERh9-tUKh?Kx2g)EQMd0$j`+C6@I&-tKR!6h^#p%$9voKs0{?>1GVRlMf zz8ol3C*ADcDfjIQAJXAKdOqhgYoMvNs*G3d#r2QLs7C&LY8c~Sd~8~u3;tPm%E_nb zsnz-Gv&;Yl5ft}%6QXh2Ft}j#bb`BxmZG#yaP8<#jhcz6BR~YV7vo;s?QDEU+X=K7pmNvU>w><8)^ID+R z`;mbjBQpRN@hL1RIJZ%2r?3CT*9TaP_huCjDg991^Fh=-2pmIV?NHG!$96*#8v-AA z-~s=w0Ito$jAqZyP#M)F@_`rtz0UwZEu(uxLl6bTyxgcs1}S)r9uOZKKRWwB#oeIy zkf%mAyNV7X;R7baa-DWM6hD8%bv4d3RMV=HwaRNi;x7z;eMX>J`>m5V%g^IB_f1#{~HK z=b!JF1E7txIP@3G^yd&80Fnlg?1`drvRC|7?KEbc@rKK1-R#aOH#xFiyOQGYDAx_9NL4jf z-#0;0;*H{mS%GX0@&9M<&7Ukgj(fklTdy-c(=&rvfx!#_k`Pxc<|0Z@1VuUYOew7Q zEWHT%SwC8#2!}#HOZo>S{o)9Rf3m}2$qt1bPm;-?LzF~IBKbs71Sygr2?8L9eFng+ zJ=6PkH-A4_C(o^W`)=KRd%9-^)qU46U#@sV{z(tQH(^R>D-{ zY;8+DgH^Hy|>gU7xhaa?+J$q>Y>?Ll?&>i~e zB_Hlk^7m9SJK<#-C#_Q~0c0KkM!;9U`c>N;2xj>N*MrWu?HB-ikQWJqs9kd0aqe-P z^=~3W%l>Fp*x3I!ZibC{mLg4P$sgN~=FxWX5W9H#D=E=n3T>y!L`6t`EKi_84rb`m z%9VKyeIssq4IQxy;2=5%g{LSzZ>?NLpY7mC@oo2cH0eNdD<|8f;qHR(p3inZw!>f# zV}#e$<6o*xg}KXX;iYHSLt|OJ0CWQAqJxg_G@mAvS?$M9o(Ru;?z5WW)54jil?vIr zi;ttHHswo-{XHI~+}OM4Zv1!NvnwFaT+7SL;R|2*f^8NAHNG#v-ch!D%p)-Xl+hik zN1|!TkXj6gfhY@T{qq)0fm)NJ{j|H%rAB!9JJ-YX*pX0Y8&O5YcG#|?Fk1!MUHP}d zdt;}&n!j$&)9_7ES|TokRy6nPm6qe^#P9yC`_A~#iPztI(Gw~5`2j#%iS;!;{3B`Q zHpXeaLwk#d-e2IfSSpEv;5~&;;Sw~tcQ4o+!0_?rr4jKHuQP5pzji!Z;}G77$Njqb z4+@Ln{IAjnHJB^zX(+@|#uoTBZ zdWPoo+9_?0<4(kP1y5R}OOH2q9Cejv<^fP=zw(u@gg4)O(+q;NXB@cBZ>jU$5Z>XR zVGMw_Z?}WKeqkM;-Cw0rbZl=Fz>%lX0C0g&DvWDmk!JYUuWf|pl4ku^D`GT8g9>99 z>bobK_{Ovoj~bJ6-K7q%uC9i^ z`m4Xn4FobvU3Q}ZIA10h<@Wa3A$+^myPoPOROpV0LDXl5niQz0WsMIIx`4TekU5wxh6tupfYi^R#J*Jn8Xc=gxBYwg39x+4iakNdzNz-&SO&0&-7S za}OZpo8HZLz1#Tr01LNd0iL*0cP0P#fB*O4_19m|VF~xT47}Ixw1*%EzQYeYH30ag zckLVrlNx!}w;wH2sd*gB{+jE}@cgr@p|(=in&SzDXpevSqePkjm=R#$1An$(`H^4) z(Y67!rxAsvi_8=dxOUhywEJ^+_-@#{$M5ayIJmd2?&(D=-RSQI@0hoyy){G}*$URf zr(0S*Ku6&1JQ)G11CL^Bxojo51w)BRzUe#Bmsy(9guvNw{q>db){nILk4EpzmN0OB z>;t!Nifo5px;iv99LJ^FqiwoNI+`o2PlV^b_J&Oc)OP z=Y9V3pEm)CpiGAV4nhk_B;Iis<-qnE2u|p*@rRKq!@zjDJGl=_>rQari8yWmP+9dIhn1_6 zE_EqF^kBe!=56&u+8nOXgIAZbA1@qH55Q7bepS5ytl*K=j`C+u zPj}G(pxeI|e(@K7QKto-vf0xvNU0zDSH@1|oxk_`E{3IKJMo9%?=UdK(l!WgJG474 z;&h7#-FJ$1*8Gze2CJue?b@~Q5C8BFxgW+s>VWM=cM5YSo?Bn!ok*=)8t4{!0qn4G zmj5x!QeA-JS7TM(|KFMmW3?k{F=#TNn5G~LqxU~<5j?zd>X!U&{b<*8y4**k<?dp*?0Dve|?$4qBr1?SC!kXr;tonLEPOeBxirkjPJR#EPejxlj$Y@@m*DFKH3TlJ1Lkua=iX zwY*~2W@SbGnk!P;40S0NVv<_Uw`?$)e0W}31JuKom*W!>TxYZ_jTpF{U&q^ta633g z1sl0DEH;klrnb?NN10nMXRR2f3dc2c_fDwYR7uneVXQQ!;Q?xw*k;-EyvAA4pZ)A- z!}RoY{Kf_20(DqA-h=DT0hEm^obC`i^W7`FJELa*Vxe15`Y3o5I(%`zmtTH4{P2fA z>{_RR^C5x#qh1qt_cQT4ZAk^h0pg*IMWqS;wD5oM%{gr_G9J(|90^>JbTK$45)&Co zlFKU>C^^=?4;D3#+X5YAEJP8Oz-I)s;-PrRkLZCsy`+@2;FM1f*8|Tu5BGcY_1_ee zL0bZhztW}3Fv{3itcVi1>R6FzmO?g{P1%OFcp&hl$iY)P|PiByf-!_ z;43m23Y(!?-;8+_epBh%`jyRKkp4O<-VC^MwG<|G`kNYlG5^`1uNiHY4L+1e0qKFM ztoW35tyAq$(8$uCnJwSzu=7tC%Jwx?!C|3`K(&j{{h#s3T z%0^P)7rgP*j1qZe`GgzJYcB(Z%4PJmd&VFOhC%kAAIp%vvGlPCJ;ovPO7OSf2qE2e z;SA39xDf-tEq~)%JE|7guAbn95KuLGx|r`syOuX;6M#5zuVV9aV3)NjwEzG5LM{B{ zJGJoPlN!DgKT6aMg;#5u>0e9R*x)`2%>Z$O74}2he_q*RULxAML>t*A2{I}!o z^>~ALvD5tT2Cvs?SB8Ud?IxW3c{-jh_=e55!=-VzLr)qHBY=0mz{6y~pZmF=Ge0*H zJk9N-vsbVO#sH8QkZ_O%CE>|cyV?kE{N!dBYaT~TNM1|usFj+_V?E%H5IJ}b+M>uF zhQzcI_s&ZfiLXRZo+MV35G`unM765@66D2BY<7IIG%hXkt$b2U{Ph79B*dZDXeP4x zON`5dp(`qMxuU94-VDXDYIykkY^WDE)zYsDL`s0Y-kHw7PoD`-{jxTO8P6h0 zxhSIHGb9-@#+$Fa&K_XLdMLc z{+ZXdZs6&MV^H|E66*m>`ktR2Ah~w}+s0HGXX1IWF&=*Wub09HpLxWJt561SHe_Hp zVqM^oRuqEr2S50M)i>seJr@8>-Z++`dS?Hpy=EuKV2Jw{z-fgG7-d{m z>wmMc8jhSOgirs6N+_LF$$0Gn3C`sEl=a?J-)w|0{BO5Iby2&zHD*MkfP{x30a|>d zg`tOWAo64=K!5WpW-gvI^0G0@H2*S^N<}=~X|NPIx z%F2ofM;}j(5byooZ5;6L^lqbjr}Ucc(l?Oidv0zneC=yr%MAczHQ|2kG_6s^+h6lT zxyWRB>^4<5G%}>2p5B*!a3xF@XBDp2plK#CO<^uDU;tAF?{`<*)I=&V5&c@15m1-n zuW9+D&Zvm|G8RSN<-8Ijt?OTcmK zii1MOjx(@}h@N*>@EEZi62uOHIQ)Hn3$k~=-M$(CE&~ww1sgw+T-a=CBawPoxFSJc zos@9V7NL@~v~KALFe53b#Wh1e(ksncH#V708I@NMFp-pk@62d|7t znUXOrAQv5}ARWT`Zsu;)D=dK{&Rgs0O zs#pyvTRL!bC|qdJE1>7%R0yXpoRTmXeHxorf4;D@-K*f#@@IYm`K0}*X$uP9jE#Bg zO4fdlWwg3*T$~N1qp_R`qSv9J?IG*XqS5;@h4IF0 zcLruMTO)3YK2B5@ww-M~4v+9AZmzFf1ui5nl z!D_Nyt*ps*id!vdhQ0hZi?UqD#Cy%`FVfw+Q4ZHHs}QKn$~UEhv*TaoL5~5Rw8&3C zIIGHzvW?}2fk9a^!~mZ_V85X1Pc(aGa+s!)=|zfG-qeQ;%_?kGYT=1bstZ81w4s1_ zW<;LOt|GFuBuhR!bcj;@~Kj#9(CPJ`-h+3X?wG=MD zG#3iBV`>F5V;F(KxFG^Uv}&B#oJDRidjE2)q7g{P_J`N^}TFg2+j2@OYBuRh6ZBM0UbSdRton&`*J5GN8U zSa@h8u7#Cw>im&#?1EZ?GA3AF+msQY%{HwE0YiZf4h?#!ds!dZrABz`CySaidP+kU ztUKpKInjajp;%GTlORrM(&b@n!B5PiJ0W9Jb~8vH1>CeW_b6ddRV^3Z14$NT1Jow43v$HFCx_UndSqMys07tr}$EBu7x9~C&GXE-<%AU zV-FdH&e}F|6J3=*>H%2zieg2d)o8FuMlUTk!^_WC!@Dos3>%9YT4+v&#kpl2_M*7~ zw6HVyn1GjLY5K)_;e*77j{gk5o?_1vkqrSpdUj08j|>O>n&18SLs3}WQRZ8GgCCJA zvcKHqwYA(F_Gh!q9xPzVV3 zT-G9PxN?te6_e|bG}0hzIECHG^Dy{R7zFDe2S{CfscOR9__6UY@jfYE^q}c9@urhK zQ4@AY3sW-qF%XM@L%N;*NGaTW{!IA0|LcuVTbu|rE%95sDFuI6X-Ox09F%9F#Oy#R zUKu6Oar)t7;q|NY+QVVo)`^!a0uu`*_>~5eaGCi~wj;JY2J;Jqm6#!Vkauld!2dBSrNb)N9Kc5>a{>6slD0ZD4Uw?kH@% zmozyMI_pyUv|3{((r0F)Vu&JOPkuhyjRaUPAAG4Pit)_}rO;nW` z;<~>f9P%fo6Z6mnX>qr?4%?RiMyh?~9-L(@)ShD{4Nc!gsafE_OnlG}F!zywBCnQIG;aP^Jb+Q?;6 z0(4vzOtL?#=ZLllhH^pe_`XVV|{Es(Aa*bf`^#qhJA*4ptIm9zXK z!Q8vV(_5>&S*jPn9lSev@??1Akwm_o;!6% z8E$M)zqRT`w4xMIZvKqo+|)Q4;VHemyJEOgwC*Gw=qFEH@S1#~#L0{2aS&eeiPDD; z6B83*ZEels-Yq;Bl)rxA@QnHZAL#+OefxGee*C!c((84<_)&^l!$e)nxU}qxapU;uCql;7663263e6J%dSSn({mHuNZ{2Af&mPmvc@(Bv z%Th@^=!(BmyY^;!3QxB0H4_2eDw0~}5f^cE;hpgoOgf4o%xdlbrG_RFszTqqvJf6> z9Lqphke|hq5AgObA#vuSl*8DX1U|F+Y5K+S{)T!8tmQA^UtQNOkFpl*&=_^ipFBUM z&41LYo^S%7PvvcRt-2@;(h)9A6g(^=<1@c`9MsW?luT#nLz7n|D292cCT&188+cN*uz;2TB$HgY4W$ar*sE9?0_``pGAJSYOxP9J;#^0N=bU z4|4u@OB;N09x@ET_Q0S1^rv@=c4YDQUqT@ZBqW*}O$mqv>7{Y4IalkStz1nwBe6Ax ztB)uO{U~Z&@r{fVcPSz!!o}A8S~zxGFUB)9O-&@nSG=Su$(b*31`HSc9p+Xq7_6TWQwS0;WD zSEP<9ks2!*#v5ThTnnH1<+EDjZ{Ye75WNwQ$R*2!UJBB}X=E9F!mr| zh-yKb4!Pn&p!vtnhYz3cW#`$Ww5@2A+4ip#4-8Kkb2`m)W4^A9fn<2*1cpl$1 z0szqD`RS*hHpL1*J=|do_<;OC8_LX;Iy1hZ8O4aw!w~Q=Cz&{0ZXme-LA*md`6Ex1 z4+`AtIK3bE^}F0);0`YC&ab;6|Dz}q@{O?vpT702Zy8FS4}#+}++PPD)Q8I^E^q(z zmbz@GO=!^PTGT}_il6yeHb+a(`0?xAjQg8`{YyQHU3TtU)jsR%T0SMtAWNk%^|{5) z0KGEdT@7xuW$VHikYLu~t-93RVov1%0@uven#+Q8+py(zYO!eB-?^(Y090nNJ6xJj zD>zJ1XK7e^LRCCm2*=J&hpHxZF!Bxz3qGiL4GjY{B_PM-UDmM0a{Wel^vT2FNw6xssLcnoYkDLsLV91-iEzi0)Rx}hccgqBu3&kk#5SGLf{5|cQZ!O;8gJajlI5dO- zz-|?+IH`nJet0AD5ng7%k-vHs)3|v5(1$)`M+74{;jP0Ma_|eL)6c{1FF(@tXYc`w zF>$ZEwC zzxA6>oYPBG@9i3sn#S$#|f|@1Zm<_2hjP<6QDXUm%xTK)bEUO zV_{aqqp3tpL*?ik6_N4t^xWUl6kb-ScvwaPyj+-*5ZkDRNeOj?8!H(qI{J29`ww^S z*N~&UrygJ$%HNo0Ipf>(QsT~#NJ#~4`$5!;wl#2LL^ zxOC}Kc>nv~Z*_gY^S-YJfC~x?fH$@Lud$*X=%g`FYN&jTo=BLq1d7QCZ7z~anEmG7 zKBw=)B2|r}Pac{K1+}(a7DwLli-v?yCR6D~pSxOTnwxBFwDVaAwkErT6OX!Vhe05+ zLPD7?&M&Bk=8*OT7}G9$6`Kfn<|4fYXnK(7rn@~Vp50~0ow+a>#-?P7EYVvbC5b+j zFo~NNu?%ocd;TwkPksJ&&5h=7yiAaMQtb{f+gus@? z)+>Nc!m>2$GG-ymhO)x}Mzl`F5Bn1wfn359;h>z$YhM-+y*wz~yrEtYMQ|aBfb@4o zzE50>H?Sx6wzPVZjAiuXVeRSLUA`$p@|Aix{uIVq?5%-+@UBytupIE8|M{QW1SN0> z$)U&)?vFk8m`z@UHUz%c36wnsg8LJO@?2ch#$1U}U;qd3#}zh)48|Gn7y!Th+rJ%t z?bm)SSLnS+r@YATn;QTA{ont6TMN%5Knw})gx$-|4O+irNPYX;-!=o_Amn>bxbL56 z6bSxCcB7AH+}yN{iurPtJyif0iX;QvNz}xTMnuV~<3nCgy_Y_Vk*xyloYM!=d%9#zf;F zrAN=voJ6q$CtMkOI>0g>5R8(N;1gWF|A4YVy;#sZh`NSFC;0B7T041gDGR>faglR!6DC&ODWHNvqcDaQy6li(q}1UPz6P#hoq=ttzo zI~QRw+>C(unE6<=effc|nVA{ezz70Tg%6#s{0V~>T+7SLwmmFL@Sr;@KUHKDKlPjZ zU<`0{vu|oMC=bNtT3Ap6B2oD1^B^2|YdHC)9(ZpMy&%s$_gwg`-}5>&7fdw-MTgeTGyq~KzXYBuY4rjx~_?KHEDP`%8Utv#8J@*CSH^o z^8ikqJ{GRtkYbmjtZB|iLBRE5J*?E{!nqF~3jgNcpN#9nMJ{8;^ihC9>Qo<)5Ua3I zsGL7KLhMctqn2 zHNms25Utcy))#NGKf#0Eeo_c8nJMMMx0LSO+yTP{Ab=D z&Ye9S-g@gTwX!ugNO;*snvJH|{EAg0q}*0!eW@NU5T5bp4;`S;2F(4j-&fd?Ki zxK))4f#UxpE`A_SClRO z#Ah#j;^I*J;Oga^KJJ6)>xJVW`ICPf`Jpbn`s%B;9FRF8`<=fL833_hyU9BIS|4cp z8v>U@TyDOt+26|=Th_@gs1wF?YqT`gWMv;1ljZVnAOK*buJ}s@$vw<>?|$xBLOrsu zHGSiYm{HWjp(E-!k#ZE-qHjx zMjFP-)9SKc59^JEaP;9q_@!Uhw!&J$zzKhG&dK3C|690I zNxJc4GjGGv3X6Ui7g?x3;FE&6Kg{GJm`6o38Kzc#eOWyKs<)*klPEK%`guP&XA^lY zO1McqNHIr7>D4Bm(x|Vh%xTqAUn@G_WA2LPlFT0o6;6|ctNiOCjynv*vg+D}iw|qe z^eyXoV$TTg9bkhd`}RG;9lCc4Y+A*1|GSXq?n=`IeyYfLW?lm=LWjLWr0*yh@(ax< zY!o+29D`>&1^{ucUAva^1wz1iH{^duOzRSf{Nmu}&6_u^2Z;Ru_S=of0MJJ-$LEam z@0j-}!eh8WI1q3E>bm@<1cIalU927qqY$=$m^wgum~)8i^?={(0~#5P?Rn4jjkN0V z2aXtf+qfif+h|2rr9C-&>{4AV z)BD}!>^9Dc8{9GFqGLN{dTuC-a;Xw-&n<-O@0<%~PpRy%IqlodkmNVk&X>c7KKzmJ z^{@Ts43j{uqG1TgpvAiAUA%dmy?kICpUH|i^5=#?nkN3<3xFbc<&{@#9Q|$>0)TdC zP8Ify*%xQD{L?A-uh_=KU5=bwK*eEj1d-}juld><(x z**BcwY=1+jwgk1_Gzs*|n_5c65w!ZCk;k+!V}(;|4Z&|H+T)Fs;5&qjJVgOEI6<#4 z5#D(iKg1LVW7H_z*<(mj1Z3o}>q1&mE{U7c$qTnuq%_rStqEDI%|Ctei0!xsOiYE} z_(aRy1gyg5Z;JMsmNBV2UL*A?6RmUBoPgWc>fy{ey(<}uWyORU!Kwml6Kc$VG8}$H zlmCu1!v|>{^R*D@u-x5w#`KmU=UWMAWR>C2gi(1Re+|3A!=8e;ah+G za+td$GeliQ>uew-B@wBO;7)sdYY%arIwT1eq@3tJ=Ojg_rl)}}>;e@Jf58+hV_|JW zieGaLDrMzKlb|XJpD4|$b*osWlya>1&4Y25A1^B_33=EDtGoDO)xr29UNQ`z38eMS zLU`wm)o|vcht;!^ArK5;eESA&Tr7kSfB3^P9(>81@Tolb!=Ts?=Vk46i3xxlV1%H@ z;qNehPmKcnm=I_A5bQyBPA9E@j2)CYGuS=CaKG|ALIWUvkljB^_oc$e3t@|(Xz2X*oA0cuYxszil0Iz{9)bZ3 zNdOp3OgMys$buqV5_Ug4#t+CCBu1zeEM+*YadvuNol%iza192^M$prS)~&CvNO6rF z62H|eplkYYwmJYiB4ZxPo4J3S0NsfUk;U;XcohtdP0*@rFEi@^?qWerWx z(q|t4uj z@sDqerECvB{P32RzkPpX#_|;JJmdfFyYHG(I0(uRdipu)H^vQj=;ir+?|WZ9B+xG| zVZ^y{}69Zcj z1Cw0>UAV4gC5ze%-nv++Xi{kO1gN6W&745nbL&%TJ#9_n;QDlaaJ+Z=^`@RYd%h8y z;*k{C#FWPL>4`RFmT;^ED&tBg`)S?!#;W%6*IbJRGufqd4gMls{3mc`S@X623 zhVm(O;j(H$$=4g&MpaiC%L0eO;9v1<<${#%%U`dBA3ytUI6QGi^jD0QhE_C`*=9Do zs6}?kIN{JCP7h>4VdrHh_{m7&FrSh(HR7@jh19iQVy=OPABuMLv9M{3zo;Xr$7RqI z8yX5w+6C=uSHd7*GFo09k@NxbGy>hDzbI^X&KIf_6^lB~VNcXU=1p9CYtc4RqV6a# z!T^f1dTg=6k(t?W{`|wHa9Ux)Zpt;rGygsQ>HJ3hyTt%Fd-iNw>L|%bU(4I$GXe1G z)vKmZQ4R;)xuQmKK`(n5kYAM8u#WD3mJT{Dc;U~(;<#JkFj~Fr&45)83U}rKP!IOo z?LiIXqeMf*Prps6m@jGz@gM~z1%LG|wXxPG)Rn6-X@&D$o8V8P6TlcPf+6$H(6?5^R7#Rc3vm=X=#Njpj4v1--;&Poj85i z6tqRt{`J$8w?U?w&!r_8u zTFdAtNV%ILv2g=87F%PLWFH~yf*3x_+}L^%AM3=zFj#2i80&P0hvI{!p)P0{O`JS9 zrlpI>ZP_HIyU6Q%jtV9xS?qp$=(s~*_o3%Bw> z(LDB8Y;oFL0x>_fs#@dfinwR4^BW}}>4h@n>;meVyUsZ7&z;F|w1~-98YhK0NY73q zce?+Xxz1rtI9F_g=w;4><8j{jeNf!HJv`+Rd8Y1iVNm_#CqLQu>_tgD0y6lFqw^;| zZujfFBN%k)o4Ka(-1?e?uUcL(i`l)-v=Wk5&e8bYJn!qD$Upd@c6ykYR;v_U4MR;p zIdcRDs2p9_E6mzgceXkFwF=<)DJfLE0Hx(k?@Ja5{H(O9t!o@_MYz>6Cd@kl3Ni?m zu1V3}l5m*UrDcMCHT4`8wbXB3-L@L$!AO|Ul8y_HoXM6eMwJ{1L_tSFF+51OBBOw= z|Jsda_}l;cN1?u?iGej4Alg5mtT4$UwZLQD0Nyn>&!$8`r;F1E?GkUg{Q=K#2lv>y zjB;o0LNq8iw2(jz|Le{$g~G)O>;jer67N0d9EfG;Z^l#c%oMkTA3b^)ShjR>eLUQ_ zq%iRk11#QoCRU59Oay%J!G{ztc0b3x0^>)=oe6-@<_Zl($FswxiVp>f z@?Tk5F#~}2yTPHbn7l?_Snh}s0PUXVL3v=v1AaJ9(&s^O@Ah!75AcdP6wWjF_tHx* z?R)ly@5dR6)OG>jQB?N1FphI~1gE;sq%@WUO=(Rz!ai=aqOL-Kq_8lm#kWizMBMS$ z&>4EKRL)pWGrcpC9#Z~u?0Ve#@&En$?Q0&106t-8r%ecSyHXwR=j z?D(PTZE<-aF;OupC?-Y1E#{!0WH5%vzbPgm5qawVEQU>OPz9X!9d6OSC4qJiFT-|U zMYj*5)3^V7jMJXuv_7V>yTPX6-JXflj=dX{`zd8(aI9%O5;x5j-Tnwci~xpY;AcTb zXhBDQUzGvyC~`o(Qf%Xl(Pi<)VWWcrmt)ddMH4YA+8kacnUTI2ZQ*?stzz*Y682ykKxB0C4Qqfjf0wlqeH8(jQ^Q!f_`d4_07%Cn|c;@XlVeS_|QeGH09M{tdeXkdUN z(F5>==6<}=6upPsb_<=&P(ryDrnQVO?f}@%pZpCuBhdL9i_-Peh*#T-y)>yYbe(X= zIX*DfMM>l;{8u^25UXnPV0}|V0K&mu_nYdzV)wy<%CVqhUN`0>%u3Vhi_mU?8XvcE zl66*9@~0a?oBphqb=30*HID##NJI$|#A89qAEM5Sw_K7)Ub&udCeO@`B&BCuT^VW zVX&!uYrx!JHJxw_xE$;t(O3IChf)VUUeyQUnQU(KTRN= zdzZ1JtOrVgR$o=17GL!XAHMr@XCG8I`;@huOEMH{>=LT_Qf4WL>f~NJSAMRn({Gf+ zf4n;!8pvlZ;}W9WkGKp0IIJtc1oXf?l7FX@XAWs1AKjEzH{vk>JkRiuZ-|u>?1L~Y zj&6AG7C*|~=S#ph9DY2{&(GUj0D4t;$KUIj*O|S}=g15I|L8jjCeO;3IpjVcwMhbf zxVLUJ!ph>h)>P}fSa}Na^Roz)I-0?8V8y2px7 z*Shum7-ofQY2c@R>Cy11e zo_LSSoS{6F2k&M$3aHS~5Wtmr4GkT(Bb4upCZ`#m<;6W|F z8r{ZPz@kH(q%&5x{oW0!W41hd^^wXE8K5QI<0Rdryx7^eqxP5cQ1USN9 zjVgfbgJ(-xggcC&zgWMS;|VP0i=yqM-45$GVuc}$%ED!QXa}}8 zjfU$GAn`0e2AD_*ptDAI_VKT8G6Pkbl}&Fn0dVH1A}b6XYEL3V>c)n+OLeQPd+FCh=QnhHv~o%i+eGOJN$q7^qjv0rc=`TxXvgJ*t8w zBK3lv1pTwue^V0;sT1G+$JfHspLisUotB?yq(w;VqJ|y}pXvij*Nuu6y#njzNT;8R z#7V%3B)$gahcppb%$4})=gQ%=mvr*st2()iC4&NBxuQsAnu=_h*lz8Y#QhXz-*`uc z%{~;bFaX)kw=PS7_4^yz@8OmvdCokl2w6FJ{mp8hVWR$fE6Gt8RahvGC{T&KH;%Mj z`H=$k!oSG}AAB(15f6Wy%acf#dD#!|*RQKLNv8k;>u@cI7?=0XxGBsq&){~qTU?A) zqp-ol#lc7LBjt&w)$Q)Ip!n%Aa3g?c!cc_wvV&*ND=!P)y$-NM66bsZhG&P}Yu=33 z0HEF}1MzG2U(bRhEEO{grfd23jRjj9%*RhOueYu0D}Te;!W9J!o`WR2r#txG$?(qi zK^RbOr~!A|jqmX~@7?ft#UP9&fJbN4B|4$B;h$5HF%XJuZh(aD%94zL70#|_`B62D zO;p0{aq$o!G%rmp&x7$?VY<^AzIA&poH%hjOg*L^1JxM1=W*7JuScR2wW0m-&+6#k zrK@X(siD^V7^e(Mp>AqVftjO|+6_>EeDk1SE(n)2X=AAw{_#sM>4@DM;giouBM4`` zq#sp`oVR**Wnxx@(Tzm{vYoklU6aZroS5$bO;t@wpvzj^)w>MQLm?bLJsobmvL3YW zkdZEySoNbDI_LS$lE24d!3`>pRUqRHOtsJ64SBJd9RV=_YBB)kZmfk1O)(ibG1dei zF;x~W6PWaO`t)hxiGq`Zh03bOR%HiTfV*Qc^tf^dlhKz6stXq`Y(ehdXByz&F~T0j zhcZl+Kni=%o>AD)%D6qW<6NPU4{yQuqMP1>Rqg%>U!0dHeQ@}_SKNES-|I_SFTCuj zS8u=lc3v0AFLmWkI(?3#b_ipxCq3r&_u$dCLptfBUfvaa;>k2`!=T^A&y3&XXs zsRx~)RMPRutXsIB9VNi!j!C@!-8!4CE=t&8E@}2jEPF*l;orD^D@IKa5zn31VGaeN zHOjjSN#+3D36~0Q(sKdM62R2CqEG#J_W11n=CpUhr0>JPr0{$B49`*2(Bul6JIV{? z4=?&%EO`V6&J8Js6>!A6*PWL=dH4L{2S4$nSIGI{yuklX)q&A{L8%mo($({05`vE! z3*LhC%)0PRwHP%*BppCk9>NzGzuFLHxCm@LW>34krQ)WAs=WY^I<2t5PZTgv;Fjep z%ciS-GDHA6@(6Ft52m@XU-XV0Cs{8(KevCPr+?v82{ zD~cY(Xe%qLIK0ApF8t$IvV0YRNK!uboZYZE1!o_myl|wF>HQc*?+7{$Rl@L~o{nod zAchFt|65(;(N_P&hiKiRCLsMENn?m~`XezCR9g8T;Qh(!A4+`cQgrc-Ftcx4uW{U7 ze3JsvzgqE?uy{ioNomrhMa!cqFv%V*e)a;O6>8<69syQ^v;k$Qj{0V0?{zFej#A@L z9Cy@pml?6{#SFL~aK0Q4zqW7LksQD~Jpk@}K7jWMkZ1DI@3Jz>_(#6sCv_s$3omd_ z;oiG@y?{qN<2>*9F%git0M2KxFNEC*H#!3VdhJ3nML}T5m1nx@EJy_(ij4iJJ6bK$ zja#Zb+S$!Q z769pje~?RP$Y~-@m$(p(lFF|Z?_vy%nM(MPF8MHU1yGSV1rK)4p43i$IcnNp`jbMg ztDE1NSZG?sU7S;kwLYn`U^c#n0;K$l*(rcS9i@c!b*$cm6Wm&@ng5aAJ1{ths4VASik+uj{ z?hJ;X*pCvQh)=zTV8eyC9DC#Yc}taHKJOx{rBQK+S5V3fw*Q_ zbqO-C(-L~vPvXeY<6&%kD%O3m90Q_(CD|*3pvc@{o;qaf?s1Rt*gfGm^r zFwg*dryLS&qz=|_MZpk-pk#O^4GD|PTUXa|*i@Gu6UEF${}?gi086YkSy%>{Vb9-o z`d~^`1w>)Q3fh@YH_T8p3|x#G>GwE(k750>5E^4gX#M71k&ASvP9N3ywG<|fU-q!W zJc@7ej+|UsM2W?&?3&iO9X&p-9r+Y)|N6;z5R>4SN>~o7DyL$7Dik>UW?nP;PZL2E zIHS!@%`;&WaWNtB@ac(g?dnFDkOo9qZdTW|?Qkia*5Nj^X1MaoQkbls z)xf)E8AHzXIfl=A27gIFd2c5zvJ$K3^D zZ@fI+p|Fd`8Tppqq2lxc%9xl3xAUbHs(PSA87!)6)ktGmeAUtD)Mw04R~9LnG0h-l z*8TG0oQeWWT;OkE&EZG*-~t<({Gug%;=~Et5pPgZ2zwXwoQQ{@M}dM1+=HCMI#0ld zc9(Tn5udx{o6zfyly0BNlFvFNTKTh=E(+l)ra>&UF)Whl8t<&O}R zf;7IXm8@-iSC`lI;p+HRHLdA!U_xHpKA7}qEpU&;6A?zg+ZqDkU>r6Ax~Xk{ANmz%H86dbymS^HW&7+A?Sdqy*w)ms6NsFLk28d&(zI$fM!RUWn9yTQU2 z86+L?tc>y=qKMFW+Kzj-Z(E4nEy6n*zmq5HtJ-i$My5uHtc;Bq&tfJoqEZ<*rF-ek zSHypno5Soe^~e`jZZ2z3ZtRFh_x2#?aW7rE6qc5jY)Kso)mzZ<+wP5p_&8VMP7m=N zH{lFPfD5IIf(DLsJf6c7jvsDN+Q0w{KJv^(cQyL~fQQL_@Bo7d{7xI^-GiHhlDfHJ z((M-Sp!s=y*a=-8molOUz~56`-Tczs3evA-jn+^6>}My5P0)SF~L3Y4)^6gpujZ!-$C zgpN}HCpiXKFh;+j0yjbn;CL;n8^5NBYZC%QiLtTH^kH?i=cVuTWN~zhgZo+nsIh-- zyejRf@v3Xh@E|zl6CG(wIAmT%gA9T*=V#RIe_gG8wLC;S!eUH40AKk}OX1or?So#N z4P%HwE97N7--yhU29G2;$wYmAzXa25`Oc4_@o&uS!OzJ zWK{hD>{hw3DIuu+&zbzEodaz@dIh)DnGWUOfo#ODaOLiD@M^1*l3H(sB{c@76u#yA ziB(zUDz>Z2%^sW8WYD^l9Ya4|5pGRlmp;e=SF|n@P<9tDUR3$F%cWjP0f!R(m0$T4 zQ>ZS>z)M&^$G3w6jtgarA#wZmZ5viVfuL|{Nzx*RHsWxBpR|aFB6lNzXAkd}HepU9 zt@_V=<}+pl;14eFfSbJWj&Z;E$7OxWZiXh#p)^UX66urYz;>BzUpwVV^6Zi}#sHC%2vfdVJ z30vw-tsc;pyc9>~NW-H=vJ|MMINjexZTCxe_rlz&5bE3k;Ux`X(3W6rx6bFWXH0|R zI$xkNuERq%7!59jDQyS5w!9RYI*Rzn*l|5;PXHMq?EkPP`6h9trHpIgf%B09GhUo9 zqbeGWt=C?lf6gfIoHYf>2d$xE`yu#iA%OofGa)eW$GC`{L;Y~rB? zoU|gL5SBKyk%R%fUXSds9`bolU$idU6@?i{`YtLRn&L!`Jf5WZhmbkNK* zO76mi3#RBSAAL|0ALaPulTU`HpME;l9iv-WusrvPtRTlvy6#Zk7y>ANj+Lc%;l&qU z49`FRyzSJ-hC}oSc&`BI1IvXU@8AIUAR2%J<|7~ZNch7){6ovT$3;=$c=t5GkK+Wu zZ-4vS_B`sJK{Ss#y;0!nMKgS3B|xVG-pjr-Y?SYNWB{ZerPM^MC!(7VSC#DpoKpQwpNS;VUka% zu$B(p?0Po2p>^|2eyVEfv>gM?97_7RGsD0z6VWfpjb*i9=>cHheOz4w<;Ne;d;sCi zWKq0(oQ#~ts+It1?|@=+(k5@Qm2k6qBoyh{Lmml^WXln!v*(VF@e46_jh2*g2ZvAE3ag=@x5Hc(*tQ z*UwhAXn1Kwy)5=^Wpx;e?OoZW$14gD4R>khN($Y25e*i8;QH|_LhSU{TeQe26dp>H zE^t-=xB?s&x5IlYZx{jZGQ;DN7SFC|59^$a#~ynuJoC&mRxe+F{q^vLFMJ_<{p(-1 z31-04O;0|2T%P!(9qTO+y&dsr#dGYj^8%%nI?sn292h4UCiDWNu*0O6;_dc43LM?= z4&%31X~Qdb&Py*JfA{cF-;u2&c2R62#`!SYWn=tc8A9EVVkvP74F*A9=O6i2pg{$q zI&KwxYs_9go|fOc!6_^eRNWwk^CJz%C2nO&+AXq9p>Qz@H~470RIE7muATgjNr~CF zh&GOnIJ8`2EZwD{Zs`ypHr-*~01c=ywa#t(;EV)fwv`i+1xMHH=8CL)ZS7mq-tEik zwb|5ot&LE40)m4C+GuK5fXZ6dryo*xt+oxWX)qr1rLNXGyFEg?_HdCRR@WdK{iyhB zjm>cSK^Yc@M3DXk9r2JCJ(;ovuU@Xa(Fm{nOs)_2fH*3Qqo2Il8ld{HX$sX zD1;AuvJ|FImo&RTy%;)kfL;o0kD?AHI&=O+OruZrgC}!WMXwAXhO5Z3a&NsM(1nNH zvtL8FXcU;afxQRv&Rv)>PSggp8L-7UQ=a85}vUo~7f*bWF5Xu`rG$p2zao z+uXY#cBM&b7$R&;G>mfrj`HkuX{)|7tlvAlaoOhz){O#;fj{_zKL~&HM}K67fh&IS zp`b|%Vt$k5fOX0&Qtb#KYYW$^oxIh!mKy25;oUF zllW>^MxNJ4a*Gknoo#4QXw(b9sXKe^Tmd30_y$pS$B!Sk35mm|oyr-WU19pYA0Af( zq|HTq{M_H;(ldd>AOPm6r=ALb@+W^{OBG3n);Mu^_PfXJcL$#Ff0jIYKHPxtcqv^x zUsqFn5A_hJ#nmug)@V#Twm{i`>y+?7&n|1+q$kbf<3U%dJa^ z&?OtsTaRBc!hKZEnP`GS4DIKf*$xAEr=N$l7l`QYV+0_gqL}j7@$R%)8X0YD6l4-j zAQ?AWPof7w2M<~M&of>4)#jSEsMU)_upji+7RQ+R%KW;`{wJ`iUHK-pvmGtyEU`?m z5lSKGf@Ko2OY9!FsjhRS3u@NcU(*skdTfW{9454Cfh+uuA9cJA(nbI%RmtR{7jn!k} zh41UEUKD{PFM%j!!U_j6#XblH^)9e6(UYH%vYuI2RLxYzDq;_W=}I^O?>hJuivt|O zrSzNXq_}zIcBsgrpe|VzR$gpUCUI35^6u)qoISAf-Tk2#*RS5iaOG8LQU30_)h~xl z?+)*Gt9$;E-Mjg9fOLKB7O!_++fmR10B@HUV%fGraf_fH>QoiLl#sopiN- z&)u1!vkHFi_kPdbF`S^Cw0IsS zO~=n{{)ZlVC|6S6>)_$g1wI_ltPWsYJN0+iJAHRvkgn(1X&r`^?Z9@!=V^8e!w>r4 zmoEi$KkmCt8ytgNhX@=5J~+Jnv!qgFA29*Cs3*wsCa1Y+RMuKrnGo!!P)Rw~vGx@3 z->vJ;=&k8&g(E{-;kHAMcVxD(NYNOAh&wI=a zhN;7qFr(A=Sht@$Xh6BkgVuMUsJ+N_a@^7_%`0fkhD$Hpk|Cf#0ic-8DS9KbBsnUX zbY|aQ3MU_#2-V`6(Xvt3(xvHA7(b!(lH}r}rDk-IR}MGQj=wO?TKvEx)c9zD+`V%G z{N4*=E8KY33+!(5SNU_oVoi;KG+*#GmIMXc%KN0o-l;QDW;oPnN}?C*XzijfDRWog zjE7qtNQv%+fE;9TiSP0JnRj>Hlm&j?I`lZeL)S3w6QB4*;Iz54hX8!UPmP9NxPW8- zh1uEJd^{hTQ<|WW@4^iX<_zrhsfWGjz1#eqm&2ClsPpHdbEJ4%RXRhPRC0VcH@;p~ z3yqc*8pm7~tEWQUf;Ee`7dKDK@BPvcOi!Bo#Ul(w8ZU<=#VF!rkn78N{8 z0HwsHIatU3I~7tU9MwFft9)Y#UaRG#W^JRmsV#uj!gjU`G!;T7dWkOOJ9kZU2WVOA z)tp+`x30<$*^?0^(XGEoqYx>Ys2A>%b{d>fH+v0Dipy})a6?CHKtM{B8T@Nu_SCdC zf>D6t<;pz9(l3UK@GI@NFKudP!u2rOoDMf%SqrOg2oX(i2!xL$Vl*(*KvYeN7G?FR zXU=HppJoDRv!QxvBb+>UEXIKrMI|~8KG-HRLQDQ{Yr-MJ9=5rFyx>2AF1Bo9T;lD_ z<*5#c?r;OZx&*hEYZrih_Og1e0$N{FHx&heqen;=uYQ@gex|1nnIRSf(oi6_@A&ox zIah8DOWFH)_@KCiqqM!wc*~n|!OtD<>E-_1@u$TN9;X3+a1G;F8u+n~ea!H5!n+dh z^iSVWOze3;F95WpGys?8gLlH2)W#OKodA(QZogrK-)YxL?@rSn6`pSCGgrcwOTyzj z=~}gLPg2b?ljcd^oO+>kge+pcJ^8`kaMLz^r+@FBi@TNDd8(!!Y?fAJPYT?JNpRM;jLl0e% zLM2k(2&W&K(OvO1QBNHX9%#k@QLIrfqw&gHnk=IwfF;cwFE5XWSHCawBMyBsUZ8jw zAjH71h`C{zu3Ks`xZ)TUIymciVg$t!eF?kgCGnA+{_{E6sh?aQ4#ID z0Jg&;lo-kvWl6fM0H8Y@mw%J?*8Rs}yagU?X|pzpcmeq_&W`EI_^%=8#WHSV}6Dk z0BJnuYw9=Z=XMP|3hegv^1;TBmJV(IfE~T+pvIOp5lopMPON#%c&8$ym7(*!9eU?) zX&Nb(?&&EfeT;xM<(eYXGpZNoT(da=cy#a*kB0ivSq3D+N}iUMSqT~4^v2MF2MGtXtS@WAT-GEf&m7^pwxHd` z*v1(cC6V{wrQ`fgf|0J{eQI`D^TZkmX0%*@Y3IOhQ&S@;qmehq`$rzYmTi z)^BnB>eCkB1M5NUDTU2-od+OW&=|XgRzy_f)x^YP-VGgLyD(-;{M~uD0RR@to)rL0 z0vy(PD?9CON3c_Wz}-!j5Kfq1q}!X@F2cbaGGnat$tj>3d z;Cb+H_5i^7dzUCfdv)R-I^tafh;f*%n7EUqx0-jONR{uAZxw}-$T#=4B=k~e2%tw3 ziUL=i9pEBBglz$Lz7IgMC3w5>x5A4S%Pc=z9YVX)qjz+|JY zBZ9}K>)HWOk)&rMHE06CWR(E?Y;#akPsZFOt!8M>NLdKJIT7Zs&xgxDs)dJtRy_jh zc_0dl4w~#Q06wxJKkn~)suYfWRht7XUe$y{hE{~wTufC^f{Qrt*2=_i>-vJVIIRc5 zC^zb@M}j9}lHK8*C+hd%V-5ppb;n9%80domLk|G^M3|LmV(sLLr;jqGrG_$`p4K{3Ig}#){Ty+gefC)cAuU?q7z5zt>TJ~m z15Umd!Z>t@C5LputTi}D}#{eN7aHQw-dXGl0_`u?P&x4ds{K*G2IvjYw30!){ zy@wNLKinwN9|ewnd54$YL(~s$FTzG^0HhRl7y)^ZzE$d$&7_uR>r>Am@&~W9xraUQ zvGd7zTzDcU`hu)XCEy%5q2@}Ob9%3Os4=^E1Co>!JI2VnGvSAw{9#+ zfoc}J1T8Bv#-?-zn@=7Dr&{${blqYXx_aWn!fov}hyg&08*~{#biv=$+W5md69B)yc)0aiBW&K1U~I^k(UQcv4)>{T9tp2JyBZ#ROlKT09I}d4L1Z}={4*{gM-Kvf z1pLfL9|_<6*UMoN1IQg9+Q zPt)&C!0ztUiAeYE@a$LYT)4tatU{}fytvEwB`@RwCj;6yfkFc$1@$N+yvOe^Do~U! z-QnJf9wwQue)X&2kN^0O&3Irr9r#@7f)D5K&I^<@ij<3I;xP`-R>GhA+~;h|U*dYa zesq8XIM(Jf+njiA5cG-<9Zm~99_guvo|eb;JO1G1)Wa)Rt{CkOd#~QfyYp$Mc?1WB zlh+0Cr99m!-eKeIjR9caEMI2)c=OkcD&?_1;|5AqFn0g)N6*0CY4v8Z;#l^#(ulB* ziaf@K7ws-8+>CXmTu_VbL>I+{-XtU^rO>!r54|zix!uBsUR$`is+DgXWFvtwt|fSy z7+2K(K{T9VMS}o7`1o$L>6udiYnytbEDQp=Wbx|+$3>mvkSkiK5=cSA3k9{#m^8@g zd~D0hJb=TqW8rprUV8!vh!%sj{xuw-xdDw52LK(l<$46;xS?Q;3%n>P^6}1_8i&>X z{#ErFXwzSk(elD#c=h?K;l}@XBdi8(e>$$Q|MfL3Gt^y8ctw?E4HC7us+w%Jz8FrN z(L}OY!yXY^!dc=erbA?73dhu0nNfT4b{T#BAmUL_-JcX-Voea~awGYWL`u zrPCJDdg&huE86Q$D`xs6y2umcb+~T$yZLoQ)9Y|h+l?2oW`yd-M9;Vqq(!_5Smg&F zo>4Mnj=1)%Z%uThJ}%^4uFwO3^Y=lCu^yiBU3v}Z<^>;0*;~-u$&)K(@S+gBg${n| zAJTJ%+P2FfB}!43h$J!x#|I!cKz^Jn%ppJpSY%<$)U(w{G3C zNr3cnkcU`ak&e6ZmptyZBMna{<>_9h3;xj=0BwAVs)__!B2pi5%iBUMihfK611!g< zZA{>9pMCW2_3N##Oi$%tPL7qIq=l#9@HwEyb2t= zi4tW?f_UfDnIIF8-J?)bntFg$kW^9zSX$4fGYu516jV)&JfTf)Y~q`|to5x(o=4D= z@0t|#hPLw^*IH}V^KWjhgd-=%lRW@rRA?4moQq+^Dx&b}n!llRYl1}~DpgctT}R-S ziZkKL+somJ@~qhaO<5rdk)kBOP^}>Y)ha7$(RSv-gvRP`8E;A@4F@z<3|CW|_B1A! z!`a6liM5bq*>%X40!q;uGt5p=oDg1q$+CYe<1ZLnsd+;KgPAxkpqqzGGMGFXp_+p%*nK#An69Pj*sd4%CKxBrkl^t}N+>rzH;0@K1T!nV2iY zciwr&U{QuBUlcxJt{_pQIL8IvRE_{k>z#P`fBDN_4!`jmzhT1y!zx$KoOgOi%Z(1t z2k+2^kpMlwa>rn~c<~}paz#!Y(oOMsIAN>+z+l0p`7nYw)!$Sf`4v7#?_ZB7F4eN9q07EPid; zClctLXNmpEi!vbCkx#Bdt3r8pYCs^lX`2Xr;ujwaPdusCk?1JXy^qFMVs7#BesS_XLh1C#LpCBaD78$WGanK!WEdxpyVF%ay#;4SvU^hG|RKolNIlJW3fdjPlqCrOt9wEVALy_!?uEn;9(_#B|i z14br_85&T^;N&Dg=orS4CQI_%fFKU^`IXXyA|gFE0!a7ahaa~0L1}@9c=S*Z4+F>X z42pZdhj*(F_<23rOa6?`0D#K2@1B=7k31iyB=WbNK7c!ZNGQeKI&^eYX5BEww0h;I zTa1>U;+niN5!UkF<`b2HR%blQcOoCh--5<@A(=X_iF50kVO>^>l@A+*c>Kg{D~d=` zhorsh+n3_gBk`qNQSv%Z%ntLRl5Cp7)dVK(#nR9@4s|KSf}Yv*hd6ddyJu1Fl2?}P z8SS`t?jwi8Bfq4c0k!VwLKh*@>ZAvto^fbng`3bfN-+f#E}=r+FaDgU0Kd}+4xB)^ zybg5ME&R>T<_3rcwhk65UR%ZwFd))>Ov44jJ$Akj9)D07gj^0q`e{A<^Ve5J_Ov!f zVk}xMChcliBBK^D-nRR@Hy=5f-YzBEhaXmn^~0R!Kcm;mE02I@*3$L@wymK{GWemCT~O!w$Y>ypmNy&X@a^&LiqYeD#>t|#-GK4dHaKuhEZmNR z1{5@{d~o5s>^vWyhU3K_x*vJuksKacJikth!~6RiZ@gh%4(s9f)7^PHY@UJlIK$M5 zVet+FH(CRrM~VpGC|(7SeCYPEXYZX+BSQvQK_;|eo?@GTh{!Ciy|=L9*NwTUUupzw zEf8`L)9OIoN(6|m>0|=AlL>|~i!RcQA2|&E@x^dTSt@nu=Bjq`(>nHS31AB1#XQACQ@R$nws5r{DG+O^E_nyxA*LsNpmX;+Q+{!A!R7ONijr#Q411-|gdq+c;xJeC+t$ zKF$_`&aCYQR|{+JC%#3iK*rpdH+l+4H-598-^lm$JMN8jXCWw09IatmwyCmoK6Fc; z?ti+&iIawVeEeJ?J7ul>MW3{V&NFifSQ#*^qZQ7iJaWzBN70RV$SLDcirU$Z|83;ONpz9rD&@%1d8LO za6~in^Ok;wgBGv(Whkm^It6fziEmm6)vsYNZ+`R^J@p)ofC^g_Yb-#Emm)3;iSYnshy#>H zfjkVAnHO5YP%VW8t$ZkJc%Z1A6d8`G$?`FSL4d^X=Dggxh3$=BM);7(BYnN79}>xK z!6AMF@qw4t zFkSB`R^Gjp>}mSlPgcqJR2Ef*@*o1LX<|VbP zO3dJ5zE)Nlx_*47+&f9`c(>%FR)nX8BUVyX=@xME*bdtQ@uxvXKr4QdDUY1oTX61~ z5+T35nUna-8k16ij;x=_(g4RmbGi3l=Lji?vzYjRzXvSNTmWzKnPlSiVB^HcJdN7vOqBM zrKS`7%F@ojFgA|~!1O-Stjo$FE9PwBKTny5AyGZ^a3KdRh<)_fgM5i2p#>Qkv15Wc z6Xs(b2W#2^d0d+dDHA66*0u3aWlU7W#-Wv$foDHf4!MV?6g}F*a-c2`?eV$*Bwm7z z8BF|IkFh?rzvsMad3Sv>Rwg0C)1O4@@d&P>$`@k_mla!l$$ztw)1<$e6jY>}?;-~n z$%FC8gjG8_6dj6@9sr|P0viRG3T@|!D@*Q|FJCq|AAe8bNx_YU_SD+nT&58h8fg9d zJ_Nn!O);z%nc_sI*ow#^c@%X;qbM`=S^{m>ZrB?m`~(cmJUj+T-DzBQaortcX{6Mh&*d* z8Qc7gRViHU#wS0u;lr_`I&zo&@$DB_mB7#Lc{L@eOV0P%Rd%U_u# zNHShD3QU_8+@4d*KWM)JHdVr3JtK@NL^B~HEN>jqUC+@ z;>BF?MZUDqqSLYZO!;Gc#$ot^PpnA)E_F7RBe$@isv9@ZYC{f*^=Od3oT42Fl( z0kq@64><0?F#hj~9zQOBPvh`R7(*T$ZR=?bW8kz?d-uMP|D8Jcg%N-QkMnk?__h;I zU*4T_C=nb&Rk}dJ8}Z$baajb5HO$X;;rrukDU_{nt@7SYn)+~z1uYzr8&SMb5%P8T zmY|kBsSA3VjdPNcV;P@2vjv2cqiomarT8=$kAiJ#)1C1{+4jN2Rpv-5wx#7k%a;a# zCh4s&NziH!0A|bCx_vz&nAP~TNpF1E=y6iDqEU%5cT1QEi?yb3HWk4aq&Xmu4Pq&mSP2S^bom8>Q{E#>_bfY#VH=2$3(5l^(h`v{3(SoQ}~n}R0&0{5G$&%4ULDJK$ZZn>tddOqJ#}SZ%P4cnn2i8I%CtC zH=tezi>yS<$PhlxC6MaZC4$tPhib}&$&IL0nt_od2rwU`qfk`KyTEFQ2uD0BvC*#= zTKhG@6SppeoPtOicAT)##Qe%jbTa&4PH;TYt3VesIK77hM9mHLrYvYL12b9()V9Xj zSAiW6ETSP9?uQRM{kYTTei*15?e&AqitZlYO^T~q8t&JtUZ(NW=YH`0!crXhv&w*3 z8B>Q?P9k4j3=g_%CRQK5>}2O@K)>f9hmRkjzitW71Ge$t>9GGlWAC263v9lx+ei6X-(Y8MNE-_8enSkgT*v-@NWdgn%$jJOWtxkmax2I3R zrXLM4Vr&#puI|h?sw5!fga$i-O?xKT$&b21D>uW>hh{MHqT`!Z{PHdJujmv&Cfk{* zqh0q7WjzOGc&Q+uj#N>gZe*Zq*XGq-j#4(_)KbxdHK-MV-db7+W8)R==7$Nz#32L} zYo#MTdb6+xsvFgC?9eG&MkiS>1uBFH1g&BkJ2bAexQ%OeG-ue!x$zz(aazK z+zcksrn-YILwxvZVR|lT(;o6eIz$0IykeKR%A|T7H1CA{2&C%e$L@s~2+WbtP=)Bz zXk2J4D5m7GWvPI~+c6r3;jOE?(?}>f{0eoAu=HLJR_lus$ z3s=a{K{(3Ol^rlB!%LSg*_!=M61tanCsga*l`i;E5@*hwF*=-<7G!(^&K+s71d#95 zS0Z>k@bc{R5YDr|)8j!}!#b8GvI}7999Qc1-g7$#;1R=17+gGinRvOkLy!KgpY$4W zYT1{qZ>TJTpY`n86U#pD{vw7@RZN7tN%lcxMfjdjNEu7e1&F;^8r|ZU-f@s_0EwT< z&zuXeETIe{26`bU(Rw__M8Rozb!XiC&{1{cPbrLG0$Pc+;kk8H%5$AbbNa|N5wEEk z`6td`cqv*Q2LT*g+9fR!L^0FaUB100<*AK4$h-u!ZH+4>KT*+ccv6(6>}gF)F{?qY zC3foO1TVBolGoRzSQYQE*2>Snz8Svte@dx}-ezGvtk>7WsmG?m$3CwudD#HS=pk=v zi2$Qo!BW1acJRCPdLw-6Z!U$gx@IENidP-bRw#l~?}jvSQNoVh{AxN`a;h|`bLG`S z)Oy64=&IGVR8r7QrB~37gVX1$;j{nYg5p>rN>?p6)-L}4?7jJyWyf*nm+!q=yV3iK zwYv#`009yNNKg<&iV#gw)L8T!`^aNUvc~$+M?cYjhW~+?TZr4s*bd2_F?ajBKBO5r@8ovMBV0Z~kR;nugI+LX?+_nw(mG+hWa=2XB1v$6AAHdA4Fw%antR>F_sxbl7)5sR+pdEL3<47XX_Zp}$txT={on~c z*vXHI2!7xPZ{X+o74*3SOZfi%`)#+uoOaW5&}0Pwl@0LmBfg;5gtr~PocHa}xf5_n z3l%$dnM7VO7XaQuwmZq^^eX^-y`jU3?}P7zR;Y@h!t?>ntCl>cttRD%GB3V(OJ{SU zgWz~kRQRq&0;BQ|pULmWVv&|f=;ZpHw7aX)0F7|*!Me<(=3H3zTA~WrKTOR6K5!R3 z&@N+$6!Nz9`qnGpe(&il`!+^UO?OrfB(1?ec+};eBcocCBTzD08=BR>ba_SjB3#j? zXMk1l>zYGwV_g$`^tPeOoB9Z>%X~pbxTg(qR&@zDbr!S-_{wUUQwtf~8|T;3%V$?K zgrNMN?WQYhXVSsrkCl8AHAw)LCo3aNM%2W+*I#@)z3_Lh>gZqX$*)QQE%bJGNy>$; zdMPT&ithf7#^z^M7c^l|`xXfD=8C#Dwd#S5e!445X?5XTdgwXLM8tMji7$jkc@)Nm zXxKRhGVZGyI(g}@&ZX5Wdo=4`_+}TEq9*3ga$+&I{LZ7 zbvO*)c3ocH;K|;p2#;|6I3obJ5ybdEt5X&=OoXUBrIFr3eno|yGRj!Cm{%T9Y6C9r z&Io*$-_#a(tK(w~QPB1AfBYjJj4|(FWO;t`%{R-~>om)N2_6EMRy;!x%*>B?BP__| z@4&>Yd|LPL7=|9WxPapso^co;b{izU7^O)at$+3aKn6SM;Pr##NDujgtRr8e9L4)i zrgyp(0P=?KwjqzqTdlm733@z~5NJ$QBx> zQY7**{|4rPmUrmP-~*n=@d8Zch&NnwJSIF7mVN-yWgvp@Ct+5` ze?cvp#kI7wdNs}Jm|yk=SkYMcoC@%)WXt&Zs^XsCyDQz*J)mI-b&;#xywKUDqllFk zTEVbO6@-sGs$L8tZfi$D^&VJ(mvOeqj4bt&A!do_TW`FZp7@pf)8gD7GxSs%H@ccr zAOp}-Ia*h@!m7p{<~R1IU;OYwTDziZLhCM773dw1Q6Y&PorKuCn(n^$DBTApJ2n>5 z4(m#{a$h|JOlU;58=CldN$dT)*Ti%CK$`9C(s={&M>$H)40$MW$%NqobzUp(4wDfI z3FhTOo&#=N_yEEbJo@AGoGuIU6zFe{grvT)syP5E48~ekh9S%=0lHJnFJEF$d$p1< zxE4nEpv%*|x$o0y<@gv*TJiVaf4_Jrd_!CA&fhCVYe-y6~7wP3B!05`3xJKdLuCP0aH+Vtr z3LuKr=+p9SmV3P|q73+OynWC)a31lX(5X={A@z+tbIJFN=Fcz00i%D<{^{8=qo zV-K+sJ6u7)a@#n{mp z|BQ_E{U;Bo0;1FskHtt_`YXrq6|>m9qMnnvjeS~~pdJG@QBt4(th)Mps&z4pLGiV& zIt;%mN$ib)%gaGQe$%(Stc*k6e0(lvlixVvn+)GPFA;(3guAGiDqr%PsrYoh31wnk zk8WxvnM5WMu!9c6h;pXuJsf^kX%&-UFvE!Q9%lg5^+Cv~?jLlU?tw#CJ`B+W8-Cyr z2b1!sIMBj`XZ*Pn7IeAi-OjNBAhrMwn#1mqme*c;ZGd)!4a426fAG9nyc~WSG;(^= zc;35rZ)yDDFVCN8&>uxZU((JyCY`mgo~F6Es{*h`Ewu70u0HZfxCtQv8+xFRf=A(` z`T{1Q9tc6XAE&7j5D-zgh829}t&1QKbjOcGY-my&_z|o7W1<`eqtjVX1>m53Fq*-p z{IN=ToXcv(FI`_z>vfM>uNb{K99`vgB{wtHQzcTJpIThnQRv@T?bXViLMQ6K!h zI{vp^^h9v1j;11kq>IzebYs@OX#eunZn}19KE3qHa(e0`>K>D~?c*;PhXdAS!@Px4 zk9X1w|FD);FRrAy8BQ^To~9IPen5L}BON^Kypn&=S6_mRKYkjr(7XOMl(3P`z9qah z4JD{X!bHfnDiGug`~EY6pxF-Mm{yXMsbo+3CUH?VDp=>o(~d9ik^2?YbeJE~ zb!%LZPgagcpwFmMyIV(F+i>wF#jIQm9o8$TFCCc`l)E)0L2 zTwPx5hR5bR({iL4BaTtdpEYJWifGX}IHl zpa~uofS@1uak!I&=X_2A|9*oZeMgU~ce3X4-hf)rR9~&$JynVj;|ne{ZTV5oo7b+p&A?ZHWe%(gxXX-nRo52x=tIWl80*N52i=OXH(K9I+JFD%l4e-Q zs!_mtlJNqk08-s^a6J?PF7HrLYhU~P)Af%<1cDZGZ+1OB{>(jo_>a!j?RC`T))nmNr_J~RpKbuT z^KXlfrQPYxm(JS6M5|!X@Z%Waj*PM9ByhF?lm4g}9Q#x!9X+9LGz~L!*CZ>5s0^-a z;^Cfsn!b0mkej@ju!xc}tFL!NhaVRH{2BFHXj7uL)p7*FTmw6LSPLUD_NpXs01%aj zwpyYlMIx(T^4h!$B97Tuz9ZX$ct1+`HrxR$T=p1V&G+$um4dD_79!!>^^^cXMav=e zq~)9&vpQB;t6GX;T(VJg43+Pc<(oHGY)fkR04(m6%xVD*ui#@~8HPB1{CG*TPPd6B6%qUXg%5o2Ni@8}U*2sp zZ*ruW9RR^?;-d-YL%&J_%eM0R`&q-fk(EKAuk?T_7Q!!J`5@n)x z7vHR6J#b88Wvy#6Fq%$Qa6y+d-!zcsB@Z|L-0}B6J&H1Gy%{X_F#Jj<;1W~x-00>M z48Q_xlN=!yQA@we!00Wm(m;b!TxC2%9>}=3nn2)(t1s??IF%gPH9K*RS?{Eub?+MT zPWuk+u~Pss$|hTGDk#Rh9@n&NPD9q|;xA<&*CYWHkYKT82k+f)MjCK;q!=d;{fF#t zTvC^zvJE<#)z5HIIZ!4F7DS4`wfi8Gj>r{=j zcb0Ia92KusDAY6Yncuiq;aAfFhFRVBT~$8TdMoMZ{p$V~@5WFOw?#r!swCJM1ERZh zfr^t7Ac0bUHBJo1z%-{qLkfn7Tr@FKt1D==_T{5ti-PdDC`WGo3^DsbU@o+JS#b;x zs}Kr;g@+jccrzNoYy}-O4X*IU4`;uIt8`TbqJWB90pLt$e|8TiYDUWW<3 zfWauU2~g03pWFp6_`x$3kaymB$9fKeZ_>(h&O7wrnLFWxu>v3_J?3#VJ%dBf466;I zXQs|u6W%aC_{gteaJS1p=Z)t{T);&+iT9vYmv!W2z)cdzR$)v>Zxy*8&xH{piMw*s zG{Ovf|7VWvVK-(qJDm@_`s58f1G7hc>!ujOALBmOIno#~r(+5y;3ptGhUmn>7L_SE z6p&wLpCmH7%doP{joH#&RRZRAsU@wJwhgBs1FH$pLS?C*6sTIl8#4TBvSBOB?88?m zQ}qBGIn}%Owy><0#@L;cQ2}?yC_3PkHnfb_PLrK|CNK@ZErOb zC_sZ27=PrAlnylo@z7Hb!mB@iSCax|kp&7gd-iv=d~g4u#k5BiKU(Y*ZpW2LwN|zO z<=RTqjk8+vb#W;zXzhLP>TG)TA6?mD>^spkG{r3%s!dQaV0h!`qwRF${<}00kzM;F zGr@G#Be3@fX@?j7ly?0ENCZmk>iBnWlWzT2qpp69q{=DPVk98l?P4$WXK_>U8j@3pE+~JCIAL4;%|~`j`QKO z=N+=Aw-%MB~+_{X)C2*%;E$gZu{P)kNx9f&FjQY=@zbu(AW&IWq(fcGcMJux*T>iinG3Y7%7=PRE zUlRaVbP{4qwJcUOBI2HmRF8cWtRe;qWlwz&n%LM9F3+Q!$*4?c6Xa<8CXBMI8eQ;p zWpR|@3dx^?mc^LChri#0pSZhk6P*f=ilu}FAK~J$P-2$XMVuZ)L2hXUzv@7aA`NUqOv@Y|M)470;DHbSOg0Svh-=s#oHyQh!zLT% zILLzQLpNLk$edo2BS(%HP@bRp^Kc5=58tL=ENrBxlp z+nv9f77uDMp5_iXE^%N81*#wN0-f8{`n?;MY1Pa4%h1z8Tidvn9{l9N)Zy?UIbe}F zUGS!RjR*u3E*iZXDgF4b&Zga+BZ6R{UjVYMv$ML-+)Q_$EVd$s7A-(fp&@juU;wVJ z{&!y01gdp)ORm$^Kc6nVdnH|bO%)~CZQ>D>@Tn9syrgA_93;cP#PGS{Gk?_Klk1kRMCZ7Fh`(BSE3V+PMlr;nICgw=YH!H7|W3@_Azm z+d}KhyRu!F<9H6?=5Vmqc)?HKWvs$(dF6Dr@{Gci`Iha`CLMOo+A}-ZtucPB9*&-7 zq4VBT3x8kHiZ_K{$h56971p&jT6R-~N4&`xUS2tuS_iMB)}ixhY4MG;|AY*?c3*Uh zCB>_BAyeHv@dRm;og31x*RS1FK~#Vy*KN!%rzbvpKzSuuFyo)z30x7kHJ$O(KP~sO zuXWS8H*}7``dtc=0mom8MeXV|vwJO_R2RLHX?#M4{OAh5$Hi;|WqI$0P8IvbWwrcu z>YgehwuEqXF8%x;E^3{=Bt}nwF`!?im);X3XbiBGuVnP(vnMs@K*qeYracL?c@i5S zS%h9DwTfSF^juU9Uf+B7Qks*zwX>0ozv2@8j>Z=lmZ-xcL2^$KS44`ZC}-SW;1`MUlxI4W7d03=9?iQ#Y zls4VrELRM}8eyBc=X}Bs-SN>2!Mn@5qL{x2E=HL&G{IMx)f0HYGvvX31NF33ko`}< zG5%kNC*Dbn7GY2ZXgAffF+cYKh!BG%Fa-jT7V@FJpIXR@G!&y3H`y~&Bp1mAybzb z6p?3?aC(od01%%(pu-v#vcljj01b-a7Y|m6eEXfZWRMx^;X79mP?r&n0{@O07&qkR zAJXJ_fnUKzdNGDvr%s)+z`)@?%CNEaKK9E$ z08Zk7jWK(k>5gW;!KgImblGQsN)J51Yw*Q8&rNQae-rFh{C1lDR(Jv@_zKzZ&K>|! z!K~Abe69OW^S#iT(VRebNO|`~d<4)}(;r9#}?7KY(I* zO{wUmMBS_<4uTE$$f*7xi<#KPBYgVh9F$!2ql|d7IFwd8vY83r)`d}IoZBu*CR&(G z#+%VnyFKgyP_SXil^|rNwE4|SQ6UmC#$Jd1%-*X`_y^R5t`_l(TEMo3USTs@l1H4( zJs{o?AYJcQH1UqZaI_a-YVBT1PkwH%Rn%yqTV9B~zVRYY^kPm7s4Mrzo4xeLi&xTI zOZ(@Ozobh+8Z59pzWXDZNXXne!sKs8i3d6Iv#s@n@bKo(x@qk?2V=|#57Ja8_N5ya zcBQv88BiO?*+fTJw`*N+D<(N-OgNn*?ey4__vtjk%jwVqyZrDZkE)Opu_{tU%uovq zt!V#)8&^e(b&Z;6W+hMgvjKp50FXCz42??IwWf+pSJz;%i!|vTA|krd6^xYc;~t(E=vgg)S#4rO2e7f#k$be|beVk_ zlOED z0uQ6iNrd@K@u15+p7S^uhF}RGJqNfZn1HW`G2xMJ>2Y|0&tyX;Jw^*QWCC3(1i8bn z9$y~*Pw6>i!3I-N*~(>;KkuYmrrra9GOxZ%eV}LnDN2+CzqDp;jkU_={=;`k0l#Ox zw}8d0_JGaQf$1-OW=;nM5SkaFMp0!d5|HEPtHy1C~yG*V2UE2Ll%6B@JDkX5UlJ< zKlx5K9o2kipL8L9!hz)tgyB-^z%e*nDP=Msgco$`Gd&O|vh&#gr7(H;pk7o=oF8801m7!pC5z|t{HPOxe zc#eJfgTJAK6+r7B94^w!n)F!C7wH;>&-(w%moFPG_+j+H9fePPxKS{p;vE(ibccoC zN&fK4@y@usJRw75N%*woQ&0c&Dgb=so~NafwJ+a3{wi91_k}`8>F7OD1f1TstQM|5 zY`Tj%a&>-&-PwG(Rw;x+iP#6PcsLxU-+4roD^vCuP7F;^(E4F>e}r5Q_4hLF=3w(J z*wS;INFj_NxX`8@?r7pwtxT&3U}5Co$tY?T`i9oBA3m(5Y|1U0Jcr>k!%PAVy!tUO z;Yg_>L7b=y5BlJPh`+i}<-_W|dErRh>GHYjrqotj*VCuI@KMd!7ktD6uW}|+d(tz8 zTL!m#Wh4FUA5N>=UPfMi9)(+Hb~tR!Z>0M_s;+msD*{)K%*H33D(~V%t#5V1zy0b3 zZD^p)f>ha{^-Zj8%>~%2T@By++0FEC{>yiz72XyH{P?Q}Kq6vg8 z%|n=(+n-LI(3k--WhjJXiy&O!rO^3<*>?R zLA`W@!`=s;hxC{@P2D^Wd)VBMSBUy?`1psF-+svEH^+th@ovaxG9J;SSxYtoDIAa3 zeZFnZdSH1bJxUznG^Yyff%_z6GK0dz&3^rdvVjl#|G)OyFKmZ8JAXmP2Y2Pi&{q~! zhB^K*k zs26MsnUZIabV=_%&`yimp^jE0N&v_i?c?qne7N$X{Gy!fE(lRFdaQ+~b=>4icn56) z>GN~=CR)TXynsMtTzFqZ*-K_n&uG=kNXmfDsTFPG`LJ2&9#gD_ zko_PN8Ae*SGEo))xS{ZB$>hf#OrBl3xuvT(KVVtitS3Kqce6|S$O+m+?c@ro z^27=6mA}&=K$o?r__BBEowXQ`y>AVuR+@kTfC%xYR|U)0Hi z581>>DlT5g^Z*aK&A=t*#0(ncqmX5vkOVR4kU5d>tg~2(Xgrrk$4B{})b%UHLF%QC6&Oz~VrK3Ml>m&= znhpV5+qjXA9?_;ys+jp46XaM)r=%m_3l}cxx=<=g<^ot5r_fY@lO~}Lj`YMg%pE0- zqY^-Cm`Xt2l^)-1P9$VP*E`+e(1@#EQONNoc_wapA#xWq;e{*G01VG>zx}rHAFcZw zxBeXX_~&s!Cr@j{5q@!J$s?N%@g9BwTaW8bd=H-Mype`!IpUx^kZ;^E_EEuP4}d&B zBVKTL9>(9ac$;Dcp!rL*Noq>5=(^{kGPl9XzhdX&6w+M`lovUb{zK$;%zYj079|a3-F6 zzzNIN$_OJ~g=_CS$$58L)8RX-H`TJ%&TOCf)x%QElD%60;2KS{xU^`>*sO(4tNkDU z=1uMDI;Xs&)vQ>lnb`XI)pT>?s=EJA*#<_kvyN@7@Pkt%3@0cdiwAn?nSXY-79t+B z?tHo;Y5h^@V{iW+l?o~g%GkClE%4T(*>7=*SFM?BuW9H*EN;wexMERT0IP*buRg6# z!+pS6v{-9+^$g?tMT;U&k$5&x1Zx@5R07 z(j^Wix1BtB(q_evA{02#p!=WhcMK`-n^oR9AH>N!TL7~aam0gvoi1<~6dcd5yzb)+@$c`7$O2bQfTo6 z6))&UlHegOaE1gAcvr%=7!=OEa#1iML#q&f8W&!NCpEs2jJGB&TnQwNana?!w5m;j z4&G-*k~ByBY!if}FlQi`jrMQZWh7vOClG?TEJ@_Xoc`E7a7EqtD=XTq@7~#T?lKDtMH1!&BkdIpZV24De-Up$kZNE7}zu}Gs3e=18XiFD(yGbgA_ zSrs6VkeVV8&-4yF@j11!piSeRyTFW==w0}6H@*B5Rc@B)*2SjsVA5((^hj0$xp&Ol9`*hvMciMn5)(d*16Z_zj1FVFduKfAGig5aGbm z+rhHO+zpEdczQe-@}QCe4-p?YxR6Uu?@oUX-lxSUGC(dkp5vl?oH}*Nc6ZF1We=P|VYa0aQ5?B?hxAOQ{OLnp*PL zm)=XC`{&Q5jwWU?-+uX__e#i%WRSS?FokydQs0yR&J6UQ3xqYkZ?P`j@>1 z)^yIp-s7`rALG3IgKPxggM5^dqcVu~mp|cD6bk(TkfqrlvgC;sDm$dN4_5D1M~Qgs zuI^X?v24s7LZu8^{G>+}6NVc!#Ny$i$@dC<$%Wyma~j^bc2$Q8DFcX)AgIx`O@+r- zt`zw4pVUp$_~&tMh7&KV6-HimgJ!>91xq-xuyR@e6KW9r5U4vX$Cl>xm>!huIoqN) zdovwBi7s$3h*aMai1OEsZ~Wz#U$II=N5Y1eS=BDt`y$3o4Ol-Fe)x>Php`7T@KM;% zW`=ecwLCnh8nS^7(J- zw8j!!jXJqu@2{2zg=&fdqKfMN5-{_@xett3SZXXvdDFG3rb<7(2o?uYY zNAA~I*TpV`bk`cMkT->o0btBsib@JptY|KTT28{}FdvZ+Jgs-S1SqPEfdv0>Iw2nHVsXaovcwNeuw#7NvA2#wKzQGOjG;*5LH z(cQcdXyF%ky`ucQ=R_4=^(-x^R<$5Iv;Q7tFcm)i*%ttgRW#*Oq=R0A*Is+Qh(Ogg zE7(*F{17Q7p@#gyY5L9tFw_AbX+#0@jxpm%Tw24SxN`z|JirGYI{@-d>yBZ7dM`kZ zm(v4>EBJ_K-cO!9SvAm=Kpqu>%LSc>xpEK{(Q@U| zAKLU*r{@_%98J(w!D;5fk@Cz9INRf2lh}-IcV6j}ViUNrs;JoBe@+(vy2hZt`G1^G zYpoR<`^H$}>{wJ8M`po$_cl1x4rHh##~!kh6-B4cLR`)cWh71+R^WOa_Wf54KwIa2 z_P3rgW8Kr_zmAp>LRF)X4yT;)9q~jGLwGHv=fAHR`#0xhmPJD*n2lZNu_1k{Ya%}1 zN%udbgD$Y!!hs(17sz8O3i#QsgYtzoM%9cwtP;k%rL8dj@;Cbc7y!bv8j_{cD-8I0 zN{Nrl({C?&x8h|L6=VpcXi!E4H_HiC__F^pnLzVX{})f6*FcHrbfwtUGNckfpN((R zY$&(*hm?im*;8CSMcAl&(1?2lTQC0}G6+{;R8K&0IY$zqYDwfV6~>M#T2%77Dx>#n zb%t$DWn?qjhDgN@LhW?v(iKf=qf1+JT9i*#Cdoh1WF-LkyB(K*mq741PhO*xCnwy7_Z!5 zG1nk?0fsmkf{1vzzhB&Dt=1b3NUrWiZbXLH>R#-npa1Z@O#eM;oh^E8_aEXGUByL(psg9+_nnf`&X)hd zM!||bY=nVOO_(x5iyXb7M=`6)jBp2(yb%CMFgU$aS-|+)#!|Xl1tTI;n6(t?SpZ%U z7^(#2y&Y6c+>c%iRtHdzvWkv+T`r!!s(QmARZ=Kz&=$5nYKss;Mij!$F0#8GYCP0E z^*)ANiIL-1&(%{2IO3tIoMS9T09w#6+K%Yb1x6P)c|#Kg$R33}f0NI}dB;CMs4;dNK9r_b#sPQ)29 zA4Yo`{#!4h!(uPKe^USkLqWih$PtDju#a9J8qaEA-t*CemS|eM)~XUXJ$qeQB3fG* zD%JPRXrYx65UQBZFBeh>j;Mw?VDf7i9RB_EJYhoLqH}x~0?%^R%2dl$-QA2+^IC-1 zo!$VIp0upi(|l*QdPwGV@Xdk>l1@&~W*T#x?VMyat6A%99mCs_P-$h0vi#KDDtX#R z3OO0KmI%+tbkAzP{TXTIwkGR6{l!Pp3|kFHR*^C424}3jx5^3yK6-Xy(=t36$G`uU zO#JnOqC2no8>+ylhQTlaTleZ@g4CN^O$YDWofet9Kt5~ef*x~P_&{1uhvM2mNyvvS zUiIdNpUAkRObu2q70<(@ijnqHP@AK@n(lj4t1VO}Oa~N{tw#&xpj9C~qtQw~{?QM0w6%7qROOBNDC_H5 z0YjuJKpiHkWT}Ttq$}?DjdCdEeEb^2#{0)U_Ax_47WtLaLXn4&V?TU)0Yb?m&n6dq z<#*_Z{COq}x{Sv&0T4eN{&g3;5e5zR0NBh%K2b@a$Aj|*f=08)Yco zck;foJpki4SGlIedCw^w6Wh^_fKm_?amu^oBppvX6{UjjVBt5|S{!6ZU7#h1S=d23 zW%$Goe2{tU70r?H*XfHNQ<#v8t9Ud}C~xv%;K_I0HZ)xu)wTk9odO7g%Q(j#2cc-yGXI6 z#hU604wzEEs*-?J7rddem9OCno5a(NLL9mos>ub~yh#q=0)oBbt_l|w0=hAf(RDTm zx~6$58awGI3?Wj!r2mW;_(A6V4j_d1&y#n(Vo7lN*0 z{DFz^xI>iZ;DH_yX61(r@h45AT;NjyV9R0NgMNgCU+@V{mOBzxlMDQ&u)1H+towgZ z-Xnd;jQrr8vOxvlPH?xq0)Vc#=ai=Z?bSpQEQu5?Mp5O^9B=NVNB}N=O}X%9A4UN( z@&+B@PoWYJnF_t8!XDv-<MY<~A;jk4<|C4AaJ>o(QBAykh3%lpC(nBFgCSlP} z&i?D&HPuKZ>Y2H2T56q1pM8#9|0L|*uKK0y4 z$Dw0@TUlMv90c*Bmfs%D^7@Fj<7K5lOHE~)w1_S$cr+smdoY_j!ik>?m+Mf%3a4!M zq)~$L7hjfe!iC$>5wlbt8LKxD6fkT#KuN+`H@}82dQ0Mwnu-3^8RHdE#mfOlXI^K= z1szPJ3f8(>hPFu+X=WJ4$r!EbCm64MCV4VapvFTZ?MWz&gNZU3d`3j^J`TS>oJtdd zvqQP`6xHCBLxAFY&uNarjWFPeJ8wmkJ`Uw!t$4VQPn|wI;Kwk; zxpU`?4miPE;5XgDqryP;{qvFV)f)C!}x#A^*E)zG1mq9f=daH?a*%+(nXd^po$r`ZOTW1Znh6`5I zXFa!|qlHxwU%8TQIH)PDa>Joq9Z{AId zor5+>k*<73c-WL>mhN41+E#RBE&b(R$OQl3OzO_uur7Z=iZ?E*c*H|}kG!>rbeEqh z4_JMhP-t+>AXGTr$yOU69C<=P%NMn)9O+wKriCbojuhA4rS#kX^HXWJ4h8axkV=tA zux!uY6%Q2^$>ODNUrNva;Po`GZG)xr6pw~DXl-gaMMXc``EEnGq zm#5i+w)6uHXva7$^f;Z3?(oKMwILQ1JKf==0UT&eItL(+Bhp3`JU4C16ENKCxQxj& zE1wo7@{0;Z1IvA0@PG2;N%P~GbbuRigkO%tZiA!|9&$c%m`R?A<5sy_8CRqU*&t73 zh~s|Z#0fifF<@@zJv8?1;lZ>5W2&8W;*s6ywddcIVbR|0QnWHtYGp}*V|}Este8l_ z+Z%;W4_w&ta8Y3Mcb+5Ty`X|nAc{bQ0k@Tc?D%lCHT;Zyqp`UkVaozjw7N=*q+&zl zMnfMKEpfgtM93^^o|m=5*}QhX+t9?nm2^3M;Ws~)+FFvuw!fNkC<<&XB!_}lVO1`e zjJ0{28NQ!@cH4GZHgNEzz+ISpT^%rH-2c|%L~j`h-_ zc&W;VAQ6Iy(l3CaWeX(y&c4!4XJ61RhEjO!Fzbd$;RY_Fv#v8LTG|0nWezzLCk|Pf z2Wd86rN%r7HST#(NMP9Ozz^lz;0;W8qrnI9%Qy+D;vE2#M-zWda9i>793{0%0N-a} z;aSoPizZLyZFlxsdRW^`TQKaBWaR_jUKkqqt`8sW9P?S5%A4mW8Rsc*{=wp}hdEikg`S~Svzp4eN3245}r?Za&v88UN zN&F+RIb#i}BXfoo`YH?>BAVA8@G;%x^i5+m&~Nr~9Pn{f{Dp^m+iw(}fQk2hybNLF zqv9nB-CDF@YtJpDdyn636U0YFB7f8 z^X-t8e|fhf<}ywd5^=Ft8v-4AU{PJV%ry6chTu>lt`<}c#k2UzlCuXrr4osP(OP&i8D)THE$!f{)u_+IV zc}}miI%oE-Xy*Ujsl7|aOMVO$_~tjzgDMu!@7DU)c=(Thu##@Rrxu3x24HO6_UTu= zz3!@d09Mr^SaHQJtKHR%&Nhhb*{@bQjdu(uq>ZX*vt*HFi8Sy_aVyY_zd%9v0xHiC zu{iUTkvh@PdmD31R_6>3ElsXJo1PI zgzRpooNjXu0P0yEjg$dO;rPkD>D5`O;JF3Ycfy3X6yR|^wTH1rx!`4WPqL=CX+1&#gx?OR$psJ#f(GPaFaq&x_pRhK^s zeN8wvHm`&;AE2j7MTpH>-FjiA0Fx2jcv|kmHKm}iU!pC!TY6-Lm%5iVzhPPR2o6A! z5itW!86a-qU`RBv@dgtcRRLISUr%=(ImQHky)#VU0|qTEopfMJq71#Z_r0V!1X|Uw zzPxJ7D^Y;!YU0mo)q_?u8b8pVRavCmu*4DeTWTqyAdP1)f+CvdvtB25!YgSsBMqZ$ zWjW%_%W5+j`3|Er6rl*10FN{PMur#Z2`pBTtgq?V=2@LI`PfMbRB#5b91I|NnM{=j zIL5PM{2zY|Ta%GB;BEZyePRS-+@82-4deR1-QkhY9Ue5ulW6Ttf=`(P7Z>RSj~)oN z<_&!nw0P$VV;$ivL1Y*Lf8xhTPqGpL{CovKo(J$0@$!r#oFNZZ01(e87rc#v`JjhI zo<<&@I(2H|;iX$4o7-LiKvSzs*^;1#KXE9%^sUz!nl%H|Bmk9H0Y^yGic60Ou#be7 zdI83df*GzJo&^O681|0=#no}#xBs`FPQ(}Y3N}9E%BTM+=e0kCH`4FEjIE=5Wu|1f z7*8*{+r@KN%kWr7-BlNPN9PKx%v?`Tf8nG~{u7G6;TW%lJ8z}Sxau@PtUCIfHU2OB z<$AhyMyEHjZ-AmA?t`BC?=g&43*cr-Rlyi*;d4{>HgwBQ0&-#HIa` z9#X-Oz*_4@y7zIN$^Oa1Nrw$;??Te1-3COX)zhws&{Diwq^H!<#Vq5!s4m<`6tBAO zZ4QKDu`Pmm9csZOlFd&Did@#V^57W3S;5eQrOA>U>w zfbv0Qk#c91Dc$Q`=6qk@|Ni%_Rg00~9hm%EflrfxM?A>T5TAPbpv{Fp%9<`(wrItL z@*YB}^rkgT3mjf^;~O*qB#tIWr3OQt^TjhQa(V&kF8IYCc>s%SE?)E_lktNle87KB zw@!<9aM_WL1ATBoGv^mN;m@6l85Iuvb2#wx`08PVZ`Rdm8P56)U zO}>2bi(fPu;ScS4`X=RTT5#yX+v}t=7{^72-F>Q~*4si_J-wnvf~KR$ zljP0#W5iptn!wk+m_GiQd(%-`|5}@kb;gjGo#WLkT)~uN-&>Y3zNqg1@4uUNB`rx( zYh_Jw(rB5}L_fOA2hxBawD>DXskqypF(v=F6HIl*cSIyT5hg$FQLy{4_RRhb%~N2R zqE3SogGGcssnK3(KpC3Ki=OR_c_nX61%;jBY%RJ#h>PSgp8>ebXKx6NNlcQRe%Xko z{NRgx_IeAvlNvbyadG#zP5+khYyvYR<0!>jDX&q4fbC~^viSRB92G+q)*p{$jCy9) zk}7j2_oc;SQ~)G?l@UH~T+F}^BSUNH`RAW6jViqMe@~9rMhW?pMB8v_zL&S3TKcOH0(tGOUXp+V?P zZd`bU(~R$yt~u@sm!~24L;d@)o8B<0T+o(2wI^oSW3J-8Bb&Ldmj8mrt(P_VZ~oAY z^z?rvCBei$$=vwjBQE6wpIAv5L!CN^q5Q}1-b`2CS<$+GEz#s8H^9{mV6kiRAu+oI zRGbvQr<72r`y0o^5=Hb1ux=b2TKb%RXnY9P&l})f5vvmO^3PvQpIymQHOv$z*D726Z+T-QH6-My8ak4pfxEk;jst6*|#ogNM92b@xo6}<f4@x?yliT|)~*ePxO7ekLB#|Sd+9vk9dP%+4( z94&A71s_EpEot5{mg5}hA`W1ArY8Y@=mCJnBx#24mtTI_V8Mr8$a7r$&?he7d5($z zcld!XXyQm8GGTM3Xw^=_-#8w|g~P`%H!5rx&aL!EKFF55Wbz-fhUZ%$w@K1@+baMi zleW!kJ3aj5yvCZZ%Mk4K30bCOQI!&!l>;{^_Q(&~!yNbV1!b7vqaY0nFCr-wR=jWb z9`O#NGmalKB0?@xE-mah@{w%Vx^@QR-(5+oGgs3yzi~3nKcH5a+iF9!F?SOq)dq|{ zFH%Sv>t8>+k)HqF>uKM-l*COLXu2ycFT7xT%;sZUgu&N~^2>QJ(o{)!EpXwNOXga4 zTIoef7<5;FeAIfMOE<4;to}?d?LQ`EN|4}a!Bge2ndAoU=2`s`;`*i$lIntjsN;a9 z0)UgB=(DH6#WUALa*xIB{3snF&Z&jYf%C+hmp$(xF!{o#;J~Xpq%q7@`R&{kO!b2g zM;DypM6ONNwx3G*R@a{u4<(2_4Eh&5_JfsgCMJ99mqU(4Rdl1H8TNZt(nC)cvKIjI zl#NkE(v=~`1&3^z{m(cv#uVil4*te}4*@;-oz^Udj*D^huYK)nrm%@0LpaKT%Z51g z9AF&b4+Bnm#^D0XMY^B^9?$Ucjc8B^{;dU2QcmW|Gl*7&!m?)FMk8^eFf0bfI z>T+-krFXTOF}&8Tu29X37l>-0Nt5HWGw;Wr+pV#G!C^QhDk$*7$TyOsz3gNAdQrvy zdF}bX_TH{EuRZr^VWW@Pr(LQFVA&xRAtR#qV$2_sg{SULwXmRiMeBPtL8?YHqyWLE ztDc)^lD|M~aHhe^UFjDu^wOspvQXDUj30vsBD3}xLIN41A6){Rg`iFhQ?L-EIsn7M zkiX^&XaeBPtC}-l{3*y1qh(VDQ}AN401uPyxIB~2s7QbrZj|8<7{42{#xw8r@-$58 zIUMoB(`2stKAPc&#nlWw=xb%j*m0gL?=1fumU$R!s+8UT=%F;DjhX0q0+L=No0plT zC3yMvx4&%)GL+*M1_6 zvKZZQ4jF+5K6vm9P242%W5|FOJv@iO5B>>*9*(piAL8PfxB|`qZsE@;nNEX^Y0?i` z9Q^aiPkypw5C2K>w?x>XhudEPkRm`Mu+1ukxT7sXPe@t(?2YT1oOQrIAZZm_@`n(B zM~zzxtn?`S##aI&L*iqDLhi9r&Y$wH?mVv9;J0WfU{w)i*8x?fL&sPwW0)Pcy3=)5gzkA;3Q1fBNGraRF21X((Xvl`V%Q+$2VL8E$c()6 z3?}mk*g?_bp!_Mm%uQnaJuhLZLd@y-a~4>ES$xJ#W-znhzQ_JD<7o(h{;=@f-W|S; zE!~lM8KWMk0Ic+u(#M~9JW-z~zu>|5_DB7YUgYUz;r#jY>8C&asTrB@%eiav%fmPO zj1hw-4ui)t1`fBlxTy4$sWHF$5BR{K%xM)zMF2V&Pjp(iCR)T5G~ynW0%$hj1iiS2 zOah;G;^lpu0|r>)0*^Gn6Yubkp~vv^&O8Sy6_GalZlxpMop#fX1A6ofG5L>501m$> zV>_LmarAF(4i0cbhN`wIC1I1##0}%Tk3DrPE$*6AVRQ8$iItcwgGD9FnRoty#&g_D zw1EdQ!804!LHH_s0JY}fxU@DW$ElIn#%oua*NhykU8RXld92m1JEJN+t>0&V;KL{9 z(?>t6R)&l|O9jpN6K^EFFnD02^Q5!W-+%v7TD>CrD=4?JN+DbjRf8>>dt?K67NPlh zI7UIficiK(RVDLs= zwEi)a&CA!f*E-zNkcf`O9A}%X7#r?zfXieU7)&p%9#f zj{0$J-MI8I%eeL(o!9QJ%j#{#v7m2_20|Bj{kBg#qYS^~s) zAPhG=E|f4r-}~P8N`o54rXbmO>rZE2(57A@4(P!HMjJnjAMfL?FuE9So}=ZB;T*;z z{&4|^<4(L0H?*iwAgfUqbbt*Q-g$-|X&C2#&t-s-r&1H?rcw~k(2EKR&&0FS4*uTH zjyz=I9}@t1#v!}Nr`w&jozKB>DYT}V*pSt1&*%ftBZmV${Ha6fM(ctO51|4eSomi=w4r1afyzL&b! z_iCtMS7I>$LohAvoja@j+&8pAQ>Tsbl#&!aG`upPf{mevmg0gfi-&vmjA3SiA)6C| zP1UX~Grvck$i?#xMW+|zT@Ok#Z=ODQXp456$^~~I8EDcL;_ubwShi#LGa!|9tG!@ELheCk)0IgQHT3?c$ozXqWOe4M;>>61@5^4j>- zv+9!Clu28A@4A{k`D-#LY7B2E<7oYJ1T@F_I$G6oW&+-ie)OZ#_(HQkP54xfuyNrP zbn_EN3HFWylbDec=mV zNPG6|DJx`=$D=9Vn$T*1>ej?J5DP`r6d=|>YlCd8U+dE!da9lN_Pc9o{W5z3$OviY zHnx@}d{(vXRqe_~K_mm}4nGQnhoPwkVft{!1oy%6QYgOx|DhhvgBe7(mO~*o6=2p? zO3+j(cPdFmYAs48?zPfKKce20x3v+g`myJ=17?nq)pm{fBIFO zZYG1f&^wgcbeSU`(eqjTE-e2oxGi5A1S8|x;9F$6lLp zZv)PL;(O1$>~UD$)ZspS|4;(kkpN|to)hLsFb9N-o+K&(82-V#kB)!L968^S~y$l&f0$o z-413d^3A%~9c0tLh{D=fx)Ti~sQ}Q^z<#mx4a^8=fBR6n@bXgn_y6ilT9pN7+v2Wj zFiae6(G?&EAEbYSZUF8wFRCJ_+j&8~7_?}XB^MpWp&bretLnX2+LiX{*^HGSD;E_< ze30s(3*$c+f=_{;lWYcT@QwJmR|L$rdTqeVy($_}Uh~jtKYRUK%qjC)I*OU$I`WnI zrQPn$^zmPPAaxGv#r!b--b!xUJ`!G0SEiY=WZ4_7D8@`T%X@t9(@&oZ{#GjMJngqK z-f7G3PNtX3csqPX&kaT$gCCVyTK<&fr=Nb>PXF6Z96O17+baMh4x_@>vpororDkSZ z)n)kcXYWq$KL3Wb2W>KzzD2tA+1SRqS=6Evc=5wSzw=B60>e^MUEoQId6K!tTo6&|iH!rH$+uEDv7FbuUUI58@ zsK}OkhDL9(mAUNAo~J&1wwoq4dH04fixl) zl@cXPmPzG=A)^^Zs47faUD6U$&1*0?_$!%<@<3{v9h678vTTe3s)czOj5vdb3}|$e z1~`^RMlK%val&_Vck+w|{F-&`OUQaBPuEouTiDl1Pd>ZbCidb-WwWcHpSJRZBoRN~ z8h4hWarh78&nVI8dLH*J=G+Fo+;3XXE-TUy`7|xcAJVy%5{P`9R-8ePApmxPjFltN z&HvlK{o7@wAj&6Y8~b%9xZ7L-K%Hv)7AXJ>j-ApbC2g~XrP&{Ps+0ci?)kLz)-|>G z7uD^r8I?Nwofa%zyB*aQP(WjJvHfD zDEr|`Wt6^ggHO9zDMSu(W}svQX-V_Es>;&h9%d@5HIFS+W7t|~vih>;>Iu-haBU8t z#?BX2Nm$c?IIB9mWpR}wu_(c;$ATh=iT@z_~N%MIj|avcA67Pp({hO$Z;xyRgy@H=_(Wcu}A|8)x|pYFuGa*ezBbWaTfwI1Cjl97~z zG>HalIoqbK7R2Mfay(t{o|QS%WH7p`308BC34t~QU|M$)c2Fk35s4gzz!bK>4*Ml@ z<7$E_s5J$R@N+ExIJQP1h@1X(9qe8tOTz*^ChJL#EsX~(udd6WOK@_?fJ>tE+19$R z(JG@Vs0!6}O%UL~p3eMiTGDU}O9pA}Bd!pgKYAsD{M)Q6@}eNpd$c3 zf?FDgUR9daF`y``gn8V&H#P=hxJAy{L&s zR2Z}qoj6}zm2%evFEV#?wJQ`0%4(E?ab*Ta;o`%u$2E$|@GuV6tXCGMR2Jdx}xqU2P3KH_vh*#@p4^t_E>Oy#g}=#PF^&Pe9!R zW&Fl2#tG%j#pXHsqXn(|B(9WS2`ql8>{%M=7Iwo8=XR1G6&a1&8$Vsvg|l0my3drB z8C4YL7FgGBSi)g^-7*W4Q4bj?g1* z7Wu?K5ntT<5zRMP>klg5%KVuy4@$(TJI-0ZsFighNPU|okeCYpATLRHrg`tnK$SQ!(eeQGV)TvWe zo+;N158!}_io%^xMsIHq017UY917pefGPu8G)#*P{YnG#*S>sr`o&-ULe@d8K`HZ@ z8BG{em-dXbxjI}*1&rd4OsEJW_TetigbG(m%5`@KLzEO5ALckRL!DM>lN)C2hryP`qX7U}jFU%GxTm>+V9m>M4SLh@M7-NA zgNT_*RZo>n+jL52P8@z5Q;jeXsQUHeyzdW{5eMfM|({VkndY$^yl% z|F+h8?>^B^A9>=KHn+Jf+oo+Q)tsGI_chDF+@S>hsuVKsTX)cLT0tl7HJb9qXqe#u zWD{4tFx4ne{)&P{j`@|nmW1F{7gAQ+T9=G}2}dQuna9r@ui@nBq5XFYE&?_ygMs*r z1AN7u7-d&Njt8bX;yn(YPSR=>pD_N$1Z9Q_O~tf5DX|zIDn?eVQAM+D7pYW*!2}nH zyp?yQNznzj_H5~rC#;QeUUmX|4Dit4?c$5DNT`9M$$Q%7dE=&z{XLhS{nCA@y{Po5 z4obz-hV+%Du1=<;0zfZ;DL+-_|Kor7k2d)a7D*E=|8UW|iud>9oit7DJAXe4-~-Mx z#y@sTB%f*RKl98p=@Xy$#QP%Or_uwUgioNdno9zhs38b&@oZ`-C~7d5UBsUK%I@^y zk6umfwR_S+XP@Q*$oN~Y0Sdz~baxl*^w+S0U_cGtoAH1P4*TN?3QoEIL+_6}ARF#u zL^q0#n{34{BZk@JFH*^@ew;7Y!&jjg$HE_23%B3+aX)@h)ZB^RHUJ6`=n$g+GOjUc zC{YI*1W(3A85c<)I@t~n3MT9hY~gs6pZOFp9!fq%6-Yfu)*qeW z1^$S8l#@OojDQ~uiukyDHKuhdAgS|>v{T3_OMqFTY(ch9B2_=~?Njebm^3d0{QrD4(Ess2^@Pzj-D z>O;3F3FPt{hByh#Fx+YS$GjEFEO||3;P-y-_of-ej?${C+uMjnnNg_NZ4hy_Q2gd} zBv{P=zw5zHdhn^kQXkiBk8vgxahOP%$he&ebst7yHpdI%@eHU?7 z(1D-dtI%mZRXmwd&baW@!X1X3iwaXznp|q7c)UsNNfIP3@R2bFGf#&dIMgU3L+$&? z@fx3H@ac*0p#`25vy49+crQg&sexZwlcn(|rr@1tIbaNqyOGgbF}xJ%04`GK&;Cm_ zYMdht?%;DAbW^xX*3uWWHbKYZ@264mG#FpVygx*xg^Jx4DnB_LlNYkpN{g<_)^hJk z`jsy~k~;gvAKm|Q7KQHisg}7T4^;;K^qc=Fz4zXG)_v;yI1b7*Dg)4%rW+-zX~q+@ zLjJcp-iZH$b`N>pj&wEUVHke8|7rcR?C;4ZpR{rQ_e16Hw)X&3I*1P1%oQ&f0VWx@ zcWW-dKf5=*`NE5-yQD*cw2R&BjBjiciaU&8My03(xQ6Y|kWFaaoM7WK%t9~jjX-8Z z3Ca2BOLG%i7>R~3VswK!7-)O<%kaDLE7Gdwv&$&bF3F+5jS!r;;SFjI8yr%hif2I- zk0JZO;okJ26C)^Pz!_yye5{u>BWYP6OIgQ}IFKD8dz@G?s3=nz40$t58 zo$IB2hv(Ac?EAluc#x|MUN+K;;*;I=PtCOUpkh z0l6&u%7I~Q?Pn)wPQppVJFRp~66c37+mk@#*)S@Elb?+9Q*LSf=fhaT@a`0U`#!hJ zjD#>k9gd)mE{dzrsG-D5ED0C&(4KFlL)ugP!N-rMo4w2OGv5-72aFMagU%!A=W;Sd zNYdgOq?`K$y}0LL{m((K6dNpWegV&K&S zM$G-s$IhXG@#p4o5g*cbNfYia(iQLH?oPQV0!8}mrU2i2Ks^sKF!m>FQrHQ7aKhmd z2et#CA$d=Sa}}xMUhqa_g+v@P_%8q^xOslT+;HGBPX|DZ0hi-I*km46`E^>Ou$uEC z@VLkGC@Q1FpkT9~H81Bz_ucfl-_opSZTriRoee=z-%>&GvZEL^2@^N3?V0~f#{bQ? z-qzAnKY})lf3*Bjrgd4?-;LP&@F()-gOZ+Gkp&^MTN&3R`4baX*~IF(=blSXJ@u5a zNI9Ma|5l`DR2;Xx2Ox|WUDRRx&9s}YkkVJ*VN2bG+R#oD0#o|cFCI*9y?7zbuISwC z8)`%9T=BY#N`SXu>!JC3t^`MD^#Ua_ba)LOdeDh`9@kDhD=xbA%_%EGn1zpv5cy!h zv$WbHc=G4iw#;Ez`z3)9mGEVVA>q{u{Ah72PxKRV$;eFfNY&0e{b9)IL6Z~qdX}!> zM3ojbDe3L6oD9C+eIEklc(I=V+XUMXf#m^d6Q0VJPxcF06jV$O6~(3}pDz%ACV(ce zF@71oNo@>xL-1yde*?O_f`{hNt@%<#)ah}W`G4%xOnU6|8vB=sDOuXS$<}wU@&dQ6 zxgH$_wv`{(uG~of?*IAsX-!IUmns0Hjc+QJM@1!ItAyL;QUCxz07*naROQMdyp2CO z-@|pqZDjBck2;s%9nPwC`;*5U`t$q0|NDK*SnqV+;cw7-Zh>o!ee|j3NlAbd7YeFh zMG+z;k3|v`iiKrG2R_zGANjc3|Cv+6XQ3Vou z{WK#LejkMk3r62kK}rVyOen^1EwBTKq&UHl#|3L>Y;b6SzztE%6QBZlOKUzH?tQ-j05H^_$ zNZs=&Cqp(U=L3AwTk%C8@8ewXJQ?&TY7x7`L}|0#9`RE8PzbIR2vwzz{2{>7&JX6D zJaexNRm!jTE~a1o(!;iMCu=NOoI|zC@Ox}DMFmVZQmZYQzxAzer&nHmB`xfl*Roz! z_H;3R%D0eDsv7t0K=J+R?7Ocr_WhcS4;lq{w*z!Z!r8d@0I^u>T=AlMK_d)I&dzd4*gqD4WTqaVwO9B{$@Fd$`B1=Rz3`a1%<(5CvDzaf4mHRPhWv0W-|W z{P#tu7v9a77ef`2pRr(Y{6w7c&qy-|0O#_`0?b!G@?!F$JH3>03IM+kwD=1-jmf5d zBH7!h{4*|tr3}X(Np~JtrK#V)A8}MzKcv5P^g)Y5l7*!0C*$Y(s7PG^iQ?QGIbOjR}~tTv3znr_Oi0kE0)Ox9fhp z`P)qVluHaej;?o*}K2{G4H6JnW8uEC<@ zAXSjdsM5Y;vN#6?&E3;ZpZff%bX^CI^jfqqR8de@V_U-kE6ZADBxAr%Z!9U!NO)Xg zwOZCzSF#SW*c$zh=giEQrf!Hv@?ir8@hHDV3-tnhP~ zO04?2;7ee6a>a#YDpNkMAvg@P0H|npw4EfCsn)D^n4G(qp8M)OseKoQT;HNDj8f0G zXoemXsX!<%)idy?fBK)&i!c7nzE|S&7`cDwwju$_!>DU3G(W_tBtTilpkvtSrJ@3W z(dXnpHvi$yra$-Jf4?Dx@sHuGiqf6=blZCXFkP-9LO^IC#%|FLg+?+(fjW{8hJ9B` zPyfbDdf^{51Nq&hG_Tgin)ZCRb;EOhC`n6QjSN3xAo%N|yoAptFw6+=VPFd9N>vKY zHBxwQ`kpK2?b4bw@;uH-ac&KqWtyUj`?O=N=vFeQ{35n6K=D4=U3B^j*rm4sUiWfZP>H=C3ay_N*%Oh#)Mg&M*4 z)oY}wl4-~zze_+{N)>2MhdU&QFXG%1Nkj7d5}i%34(YwC4}*)Zl0RDQ!0|a*wLl-=sto$ZoDP%Px0=52)uT2nhv9Fr zC$NU>NUHU|6=|N)@ymFA^PAsHufFoKo$b)oFrD|N7V?4o9qf?paQWUo#)Ge6_nqc! zSiIrC)A4VX{$}|K_*j*~J6-=cTK|9W2Y--`A3t7}jWGU%-|5C59;ea+pc>Ic>Wv8d z9cYf~?eln((lNb2`^^;ut$A~5!L!K-U6GGHHClt=~W1oLIaK+@1VL3IjNIl81M| zi=&XKF^BA2xYJ8n7{~Fcx4a$?=A0Je&<-wcJ=;fOqXb5|s{D}p$!J!kXi#FK;u{q< zibujEQOhMa{(8%zW)2OsH|X+|VJA(bT6Jul!q`feR^Ccq`tKf3dmd6>frjO%l&gcl z?gl5=_-1>WqjUN4)%1;j`we}!f>DH23TR1{8;@{ByZa&xqP-w?4Kxs zFyx$5!6a2=%3Kw;{Qc@zziLv!FE4-f_d8W|ZXLJDof11*BaWhPnq?5(6@&Zd)Yoa% z>nwP-8fC|^&;HkkQftr6w7hmhEemZRA}vHi#CAC=CWe_BF0>M3#5PV`C_6V61|crv z4#Ne&DBhG|33Kl&}`=ss8s2T%u# zdc{)|W%qHq{yRXX=HXCzIS+ur_#$MI`}o+IMZpz`_ewz}NjrU0a^agY{!{~4>s?I; zPR^t!zpSH~v_D5{MoV~Q)LUA+AE$yayB`M*it&%X@yF@)*IrYFg6>hB0=TxKu2ME> znx5O9tR~}wIBrEelX3GQ)T9#FYQ9l+si<;M5#WN>u3fv*AN|oErQN%=LtW;g>mR)L zLphmB1z`IV9?-nr8o=<|x#7j#6qI%43j{FD4`B7Ures)a;`p!3q{lydPg-wt5|efZ z)Yv3PztShs6Rfv!z@P&YEv5{#*oddtMNUu6hJ#FWB^Cv!eix~2xjMc2`?iQr0lCgk z|9c+6cw>`8kAH?xo`DDMPIuF)02CeXn@uhPiVH#+FBO)>~HN(yN|Wfip~kx*jO=b1*{ow8GT<|DEPwo zyRM1~N5n+z@f&>q1t+)d=deR1_R6@U6AQ5Z@1};wxEGEkJVs^{k$@*7ju3U;a0%iU5-X ztC)%JL-(Ns?kovl)Y0!4bsTz_F@IYBI4T9S`hnw)i{1izxx;^^QUQ=qLVs)_xv;<$ zN(&M^BTTjvQJ4iuDd~=4VmT5xw%w>&5%Zc5_{D$mKw6nQo7#GB(JayFWHc~T5z{3a ztSkVph-w(aVN~L-h%!gK{TG?dwJi~3F>Lmccz5#JEI-5H`{fpLq~r`d=>4WIV|Vv`2Jp(Z8KEAFEN)EwLfU!t*PAPan=#?uzuWJzICkTcY4R@CDWi; z0pK#?h2xmHfN5Emy~g-E%c*_nO8TvTc_g(Ll!KrtT4GkGo9buA1}4_s{CO`G004(jps=ZTUkowJh-gmL_R(8HVLpZkqV zf3Cah`4o8<20mK&82_V3kM@xcKM)7J!%zVM>cU$|E zf=+N0_kP;-H;g+b+b-`G6NrBk@h!4cu&W+`US}<>blyu}_!m#4nfnC8BwImSrCfLB z2y~Qqs4;O6I%_NIYW@H3>E^PGy($Z9YVrGOp0?IdFN!X3!Mh$mfG&*D2QXj=G z*p#x+xTI@!R~w*Oiv#7eua&;=Kire{pO{bAyO)HjC4np%EHGe@9s{-4^#mQqt|-ZC z%MMx;AaQ4s@b`-LsP`>LdWR$CY3^sWl2gBb(_6Imx%a!Ae(hOhX1j`aG=9)`j);AL zy?$o(R`D3=cSU2^1JL6=DthB#heMRS2*fv0;#*_xj5{{+YwJ6@o-U+QpFWZv`_0+Z z(WXB*e!Jx^;Cxe>A7JC5ObqB~;@|(9{_byoB;`4$3V^<9UF{BQsWq^t%DFEsgwoEr z(fPPD@kX4UzdIAhhg7E{fv5lsqeeJ0|5^HX_uY4=uYK)n*6mNvLEh>ghJUB~Po)B& zf*$%})9D4V4_Pn6TTvCXt3Nm9J&pcrzmc@-{&xEOe|s{m%wI?=8`>X06OGzh=*;kq zDLR42nefiB&nM_-U^7X`m2mZ3D%HM(4WkR*2hBC7DdaMh)J9RL-8WPhowPVsIaZlx zFDPDdYz`OqN{F}r9dCU3spR41E~i{cV;tXAc+kt~gkME(>{DJoh0fBy=mCh+7+FZu z?JT9)BiGY!{lQ^%{kPIuN8S8r4&l?=rb#!t)UU>PDdV83$e;e@x%7YipZ`Y6b3wfX znjnS3v@U-t6sjPo>OME82|QMf(5-M)8pCHgcj)dE?NJ;?ytgCnQG9(E<`RgOf1W@1 z;UX-y{QdvgdlNXzs_Nc<-Fxd+b#?W~(A~`42r>#Z7!(xbAs{g(QDTfDi6+FvMB~#$ zeKE%8$CsEqV_tkF{$pay`^OmnACl2 zty^8wt*+_rs&n@~dsut#wf9+T?X{=h`@P?@BaS$tF~^S(u+R-(;*1R^B2C8x?RInr zF-o|1x)9+>N>KpRbCh(TcQpcwi-tvf$|5k&(AfYd+_l#3xqiD1)Rtunn$Rlf)-hm< zI637KQDQ~`6Qj#$`0&k#CBL!1!3f5NB%eg^#|_Qq2cy#C#hbtW={$GJm#;%>V~$_` z!2S3!A|wYtz(>#lv%Lc;w^SDY9k(pG@=j2`Jn?CbIyP+ba9d%uzULwFDdgX27Y@&= zOM2c_f6QKb#YxtGtiCgSe?4N}jmU+HM)bPrPjma++UeT{L_q)HqyK1+YW06F2Xjd% z^E(0bF|dESudMq!D2z`5w3dp`youD&-{jc13&|(ywV3KO+xQQh%~n49gHKop0WW^> zi~YhM{9=xOe`#l{yq$)dcG`V%0$5}y`%@?i%>mI~H`lV3#_ zjPx+_&_BBZF1h>&TcLT%y~b34v;YFY+$47ZB;iglTp9pKM)m}d(W3)Sz&(eFejt?b zH&NWN;dzofHgsY5P=}~TxWnFm4Zz!^4N>E1lZY-jwQkrfqnDm8O#cw6DKSuowdb?8q8OCO`24D;m zK%2n!ARRZ#oT6L^0BI+`ID8^MZnNab>g+9E?o1xSRM*y|(jf(@E043Hdp2+0mwsTLEexZlAt8?D(K-7;>eydgnM$gmV z-*12PM}K4o9dwWvC73?j{}zMcE1#+v)2p=_5*|He6C^F{25%Q62!kI2hl_P)(o> z5JTT&tlU%LfJ+UTPD6qA(T{%A?z#6~Uw6aW8*b@jwRBHUSp-!geRV{_00Kc03Ob3M zg#;^@+(IhzVk~Qe7pQXKjE7A#3^V&62V0+2*h>vWh-pUPgmFjw>@p8q176v3|Ox~ zS9E7U9C6xU{vu~S1CSB=OdbHd!}MQ(>v6)1x>SF2Yx`h;<*36sH>9aT;X8xn|$mc$} z^5;|dSs3y_Km`{*&Bch@KMa_5GH!c#dUw20FYU=^kzQS^_5r|&f2IBr+gAOlz4%v7 zw!_XW`NF^Soso&=*kt)hoTSxXMTuB{^NnwO(?0d7Pic$aG9Nub77Cm!sCad){4eQz z4*CPT0aCd_?8pk)#%je?5a~8ir{&cOzZJ-I@|#SW$;6>7vr)c$9VaTsMEU1owR6uj zeLI*F`Q__0QT_<0jOt<|2Ge@|y~n>w^q`|*FL z4lzqH4U|swv5zhb8SF2U=m3q5H9Glz-%=Xdt<_AejFEc0GT`4XOn&;$XYVm7kZZ!! zURfYp|1@c)EqT(7>4WI$FWC0VV|I$J`F+-lb=JSs{-$HL*-?`RSQIm7@gHzu{#&+e zvH$(Q|H}66-P`D|p)O6e@DfCY1ZraD--z6G%o+xqeyKBzXU|&3^8_%Xco;f2`(g8r zAaK-CN7*~x@eXJH^Q5S=QjCrW0HG3@l@d+}6s8@dE}bG!)VcshG-w2RbV}fhfAs{b zuiT^i0(6wA4khW;;-tPZtCQ2BWo!r`3k6G>2jyXIl&w%z(Jih=t!d6O{^U?xNsT&% zh*UE%f zQ&WDn1$~wiGIcbm`lair#PHM6yv*I};hcYZvcU4?P+qk9z4{(TbaK|N>Qi>;Gs^mA z)?0Cfg6ZD%vepP_7Y%Vqr>7zTx~x6@5KPR6KJ+2G@4ox|z?4vzGKyO0X7YVzZfY9k z8_%BYQjM2y_|JC!?chh=*yEXq!yf-#yLS1dKEeD~tXN_1de^)B$X~Pp@r(y+A^T64 zdyT@Z5I5@mz#)WeVU+x)$A><0`-TCunp(BIUh4raeA%%!RDMhv%n@h&PPmx3%%$`B z{zT?ni@+*qE=zI7pAkOtk<&LS_+|xFJvtMxTFw4CVQbuW?{h66%y#}U7aTZjwcFvO z;itx!Xy-;AUL##wM-n7b>ng%Dn153cp@)n$6ZM7h!@b9i0mw8JA21Iw=$rIt*e=CS zRmjHLip({;biQ5u;2 z)mL9_U;5IQ8Y)so{t(s>4ivp(W_%oVEQ_{)q93&loX4I~?%A^Ean;)vE$|S5^nFJD zY)_@X(r@4Lmbcj1XP@nJ{fn9TgM*o@0SFwz0HFzUVj^Q~(Whi^=z(BC9W@PUC%&j` zPi;BaZu`PkjqsO?x9g-p8eRkqB`67)(N9zpXo+w_QaK=n+s^poMl|SXO3@reDS`07 zFZmMMG~@ZF7+Iob^eMR#Ii6CIc^p}In;AO1Zd2)wDK71$j1$M45`LO_MVp7+1k;Su z^b6Pi!XnOiHVmCPe@vZucDEV#r@orDEFuM~mt?|j5*O&dQs0AaX|Y(TUoBN^u)M{7 z`E{q*+Eb+2V!NM`VyZgA7luz+OGQ@wYk$Cqh-JBC_uhM-eei=Hbk+Z|Wy_Kd?=4IBWgxI+R@(%p%4BeI``@2m`Nr)vN5X%P#X8m)>R^+HbyDe&MvvO2BnFS_ zKmD`s03S7c97`FH%@SDsvy37i3UylAj``d~sFzxepCD(8Z# zgCGV|0`zS>^gSrND9N~58@5W%9^2dVh_qzK+cD44qE@!&=@X#4VtV|4X5FyFY?d%mL~cnL8m*%Fo37gCuHh6GA4{4hsTHYYXk#_k%bEMnTW zN}m;jXTe{FR~SF*Sz^~fDOlJO2x5q0Hnkp6m zo^i$*_U?DT+XdOsB!zG=UfRXr-w6SL4 zQfu}cUa(jG&Z$;Dc%N0uyG7t61Z1=}qm_w2P#c5`2?G4#g6GRh!h-A=O%b)#MCWVg z-|%Z>*zj3!4zFjX?Fg+$-j4Q}(4J<^$-mXmoZep9FX7RCF1IO(w|3#!shkw(yB1hw&8Dk21NPDwwY(-v}}4TI{;Vp0JH)thP&j^C)Nh zXv<*!?BDl}u9(9kQvGv@kCK%{Fl)6D&G~=9KJkfvafT0}bRio7Ark~x2f%9TuIXZ6 zK4XABdiddo+k4*g9zW~{fq?bA9gc&DhEM)(Rtj$zQ`d#as!rn3QR8aDZSs%*7uMN4Y4Y zoTG6keM}oXr}BZ{jE7;*SV@)e6fj5U5p6l)r;@dKyZHHb7**wQUnm3B!cO9-gj~7l zlIdnYIn<%K%@2M~WUlH3XEpilsy%H-oYreE{cSP-eueAXsMGm5JKMh_M*PyENpPl} z*$IHM@1A?^vH$h{_X%D))JKsWCIk~&fK5A%-Udjl**C5IW1<|R|4g+X2He*CTHhmH z*Pa~=wBnohyrEt3qc27n{S$xs>e{ty?Y-}PuN`~rvEFYHWTW3k{5-tH=AMiIFkzkN zZVfDrMEEM&)M6B>qUr1}8P~oSlGPlVb=bDpB_R`-x&FZUn*}md7+gI6Z%XD!G z1e6m6M@BSy5g?xqaQJ#vM{>2Q0MpGzcQrDch6zB^wWpEgs3g*y@c1eFK}UXM?Z>lb7nhs{Q_QB_m>pVC+JL z!0Od@?%ZR4`X}$zg4(D2{*6Z5NYk~u7??*G2xg9&KZF2Q{4>gDy6V6G_y2C2H*ao~ zI8S4yD-EdWPH1OQ1*8Pz$!HHP{$C{TK7C`6+~qG0JBflLI*{ENEN{P43&cImI3 zXoLNa>JEXuiYMt$M6O>%lB-IGwEDR!>c^Gmbc{q!1r0SpW)f3~x6a$-yZ?u>&E(lX z{La^C>JX#;&6LsT(E*Yjc!2r4V9-o3WmmwWgQfhZ3}S)=`La(Cbw9zrd_kbRZ#wg5 z8Y~H}?D(%}F>AR;SMsXM^0Dg*9vdp|uw{quv{(Gzv9@fZz6;d;3PVd!VgZ0OTaG~A z1)#G9IPgbdXvqG@pZ=NM@x!|Xvo8~_6?Gn)v3+NBVIv%SHcTFVJNInlxtL(K!&%;M zqPoK9dDg61<5N;Fbu<7xZ++`q?fmo4cflaE*dZ`P9uvV|=;1RJ0Q{?&Qw=~yM=1zS zr+%&%O-&P@HJSk5&nzNYDC>Y9U3yZ~sb|OO`ru1mb(+oyc*2Hsdtjklvwed)3tgQi z-B+%3O5=}ng(mYS2MFVw8Y(!GXATRWHJ!Ix-rXwE-sqa;<4(>Ed>;B_Gp~k^z&qm>ZmKFvp*&)H>sze%;N5ol zn@+WrCrIO^kw2#ZbCWLyyjC^TPhv!Z$GrK?Z?>1c>}3tDK7sucQFkPvY4#aiGra+>|;zkb&WL%Q3nyh^XO6^156VEbzBhB2sGRxmygNY{ zA8s>;$-98Y=$|2en)hevzFxCzP}_5bFTH(F{b?(#dCGp}4QJZw6V<;p^4Fo6GJFYo zz@?V{_edIGlB+5XpU&~G=z8C)?O*=oV^$fdXr=UW8`KrtIy;!myJiL$7~4Na18ZeW zqeB<|+eG!BX$^tTZj?CZpZ7Ps;SF~A<(D@=gX5SUKtNy%D}IX|_aLAn0>E5q0D}Je zh%jE9lBM>A5IVzvP%)vY(U2dC;tQR$XiA5f=tfgN_q<*^-M;*H2^~O(g`RIaSw-W^@n2IoCqKOet^!X$fHm_?HhdY7ln&A}|_PSrN$EN0@lt@159*kGa&2t6NMzX{EAuyefrPql(WL=_LYD8zOCrp#C7IAcM2%> zP_vS%#sNWc7d1M9?0P2x#yDnn2@QpssR7395pnP{QE1{EMd&gaO+aJICe`o~7+5ckx>imO)yRE#uU)uw9kd^?AkGW~r zY}OODYtz~NR;O2`cIC`NnvZ49mv5r-=i|ccrm)TSm4CV0xHn~4QO5@Rp($yA6x0sz`K*8&ra7jC2B&WX}X$mk}HKopGqTs z)quce)BxxBhu3P+uOS`N`J6&G!#?7|=tfclg*1%}{fG+V%K=d5|tKh^?ABTYV zs9*l%r$6;o(vLp+sP&b4Brr%TAi^)jucv z{l;(nMx%5v`(XI7bu}*x5RtSIr;%`xIXWT$%+(Y?$Zicf=#IvlnhJNSV!k2cjC0op zi1sn^@iPM0FD=#RvvhC3vc41Tnveg`s=L=(f8ii$3^XsA){nR}>8euiAi==VG$=m@ zPUlKJMW96=N0%wRu|^vWg37la=9Vvaf|&mWdLDK@Y_e`(jBmzgYU8Jwd`MEujbHzn z)-7L>CM@cd+9Y51>EV*T(=^RIntl_xD2x7-l#P6D1T!G9KA$X-ia!MtD+vN(jd%UbM*goq-PVcua~yV33}}Q85DJd~D#p)79)w~R_PJ21 z5`5@y{>JY7!S`*|O09`e+)_^(NudQOs-MIBLm){dBW)_V<5+3pJ;LX+-L9|C_wu(Z z^L)nfRLd6l-(Njp+_8TjW=|UY81>_3wg0PM{c6vea5MsW(|YEA3d4Fo1f#~(> zPzmk|VDRG*MMNRq>A^42*5nX8fu@|PtSO&Vl1`u>cr$stlymsgY@69DL~9{Lp$@)qvVG;}yXxcb43iLO1$dcBu@CNfA(pA?zoa5hT z_T;|%tpA98_UivC=C9i@S@1W)LP1ZN^%u`XtNukOT_Yw)1ug80UAa zIJ*N1>iZQKzvA|=2rx74aJ7^OY2cx2A2gaD5Bh4~{O(9dE1 ztO>xh>$3;0^z$R9PH-SjRLW7O`BAY+mqHj&AM#ZJMKN_9Zsvpd(%PaOb8e4a{`+TG zea+K0Sl_`wNkmVCP&c6!HH4}abuyZme^mgg8WAz_;-UwBd8RfPMq|Zx}Lh=*Hddvi@FW>R*Y1n1JLJ(@UX1hXT#D` zZ6AKz4m+b@uYT(Zwwjy$H1Zc9E32QDSlN%@T9ZageUSA7q56bKV&eVGGtacY{_DTC zQ%^nBZ~KF|#%gNRri`Y-1mOiQ7~aD#;&kmU2BwOEiM})XEEiGj*|W!m02cAlH}QMl z``%|i_j5nzS<lC&%2?OreH>jd0v*+;fkABJm>kB94Uf zG=D`Xv$yHlq@T%OD#`TnChh+J@&nFRHy?Mxg(GBEei8vmZPh-5s5xc;SWahoDMaO!RS>KWUe`>4*Rj zDwTzZOy42E@W>}W)k(A}TI-#h8vC)qBA_deFWRsE;c<58sWsbLdBSQe8nh8@iBde0 z$YKP>)+-2jFg4VzNf1y3<`!xi@$0EqIhPtDD}Mk?+eA*m#HMPKaln{PA;er%iKt6E zJHc;XE<}eJRbNF8Mm3&2QLXanCW_nXaIiw(@fOez$NI8ll^&GB(#W2^#YkNzROm^c zY=Jp@2JBKfu^>-tRc(9yr*_JPW&5Sy-(ckq&va+jpIuT-ll%^!JTy>u9HJh@ zKp4SEFm~ogIYkYE`qG!a)CnxiKf+0aJO7Sf;1%~mHc^l9?1fyn#ZdNO#Vc9dbAt;H9y*?uebKs#ej?H)B(~kW3zBI092h(j3}&#SWT;(eJ)f) zvEaid**Y1J)zRgniuNmSIo`hf&%5o1H#}%7%4@7T)T7nX1A-u;tWlZBo}M%!h8aR& zlOMz#X%mL&mV0}??m@ivX2Omt#xQ;36;<-_VekQsZ^S5Ol>hjUI}_5rUi+_8GiTxj z{@bT%55EavVwbaXfdS3lH8iCp)}1`$f-Q?CL?=ZCmX8Up&Fi z{^edPtx_C)*_9eo27<;K6=i_18zZ2q1PA&$@QK4{DC!t>#tt0x_xIa7-}z44uwjFJ z^rIhjI1thpMG-gRQ|m~FyKA}_=rjhRuL3ui`vn(VVDEa@yKLRMb*>dac%{GR`)LRa zq|5vBz7$PI1b~IQ1^|M~Xba=Et~`YhyF9?1=N>`C7%HvBRi#7CE`7sFTeEJ1-SpY} zY`Gm_MeTq@Sg31m7S$|6F5WYlLhthDSJ@Ei1Xs4t!!oK%*~@1C#4q5@F( z1!)3rVJD_EnX2T8OViziGZ`3@iNly4sGQPQ*KnToB*vCg;atBCBK0GMd%W}`R!g_i zIslz>-n+*}2A;5=zx-4?@nY@M*8)J|($6^2&tFJJ-;|%95}*i0ooSJBP+(^A#1StD zWH5F{Sg8MB|N7V4QAZtR?|=XMZO4us9w&qf;)cn)!*4O#&HmB8c1r~h?Q1_fzJYUW z`W}6gll?g4XT^#Yo@vbU6DNdJ0%#BVIqCBLvs2Rf549r#fL33^+ZLQjB#_n3%~jAG z3{%p`$QJ^rldw(7393}7ekQso@^gP>t!-F;hJE1^ciGSmtt_ps5P@a1C|v-UfWU$c z**=@A7cLcYI3l~Kbi+V0bFbmuu%oj#Ji3laU?3P#*po<-MQM-kfD`uQ;Y}`P5(Vf7 z$YbOJ~~)X8pH*Od`3_toMHh$gFe`+1)Q!{NS5sU@<#X}g` z&g4W_?t-|pUxgxV0D4rfnC4qqz~@H70i&#qFX*vX|KTaN;@Dx^Q{HOBS`$zZ1@_Ly zDt`fFabQ&xz1V}oR;0J8xmx+L2b&R@6W;`N3I8@QFC0wlrWx`NA9NxT&9r>@DNbT+ z={;+|7EDK2*v;T3yry4gU4DX}`iJkkuj+J4js8pO7j>@Wm1v&Hl2#dJH;DvMR{Se` zu&~Q^l^(LgHy7;J-+h7|q|^QUI$!Sml|hK$(fpJ%e@Cl+=!NujK69{RTTsFl_oq^clh!>0|Jtza4qxk@mq4ez3v(BOS2veGB-!hYgGnZgDSV)BNfu z#zM1&TH-F$DFCkqwbH|g%b!Fo87CzI?8KBv8S#@N`tF;S8;d#AEHd$zUDu*&u+b;xRd`#=j$yRT{%(4I5topy*P z#c9S%{^=l_T*4_kfrE*B!cM-O{H5&BHIz;@F?a;cUiA|QoX-d-yr)ki7Q)LF8|>L? zl@(j;yqBG5FMZ2V*0WB1QRh}5Fhm!ne6U)7Tyua+0DO7@F(9J0AXxsbCKwm~c_NL9 zb>+&H_UC{8=k}&Iy~(#-QD%rV#1;Y@L^z)={DN4w=GT2+S{R_8w2sDO(O!NED%@a) zMdz1Xa*6LwdG@oP-4Hxs@R$%9;@v&FKW#D4ktu+MybC~NEg{B-Ob|wqMIrAy`>3G2Bf9qscR#W=L{1!$zlTjW^rx>_i&e zr+v%)nv;~Ks8T@#pz{FGN~vndh^mSW>3o1awWn<0h@JL}uRh(5d9M1DG*OKF>6*m# z?wY!(7duTFq)`+1Uu2$+vVztRqy#OJLyFb-4Tgb9byb2#wI>O0=Qqke7PUo(k0RjR4++Ke24T4`U3qXgh<};N6k-P3in&y z@)mpLD_>~?0|SmT`c}Zfjy@HAZ%HC{l9kSpi%F(v6HNj@P~kSA^VtjPnlbrcBzW;; z#YPCg%@!?pKx~;e)gr;F?bF_C5xA8FJLS@{z2@z@Y3=xmt7j`(oW-0hM16QzqkeJw zVz$VTa{?IgWg6T0jG$RATVOe51EX(c_O0)&1&TC$_^nTCT;3zj=&)$qR(o`;S$R{P z2L^P`ensc@>$W}mSR!INbf>EK-n#9qZL{4y57{%%J;;9Z9h(#L*BKQi=8tATAS5VA zdyrO^Mo$(fLdG#3M17}jC|{UR%bs)2Irb0#@DINCI+Z_>mJk-OA>a^l1c8M;Xo%X+ z+>ZV@o;~v%<~M}sOB~!2eFO%MKm7$kkv_&Lf15UKvcLSxzw`@zVE)7jCQrW#9EJc8 zeQ$naU~Wq{845rgzGiH(K7SZCFj2_UyK&>j<@euz|6Ot~Fase=BP6e)RHQzNqNaLK z3e+^a&r8~aP32ujpkD+Bj8KD9pz2x*QQcm*>pu0kegE1gt+r#eEvxG;0iDnWp{_{9 z%Ngpd11M;VmaBbza)1mMs@Z?p;{zYRcKc7?F5Sd1+oei=W7CrV)XOk_4wDa|5BcIg z352W_DeGVfw(ddjddtgfxHc#ebDNb9+GEdq$usP%pYOMVZmr~;fBF;JDEgk)K%EL< zRpXzm0KueFeamlVN=CS0N^#Fk-oi8;j9V3lRuwDB~BJE9VVpFjpU)a&S$Of ztK0q8RqXn!AF!x{8PfH-g_4c}mTG_B$Q~OiY_lUyT467_;z(P4vP4f- z`0Eg=5v?OBNt-mH_)IUk0gnHr*CYn0ZqDrG=gpMsw8^V)37M0>B}M9I|Z7mMwQLJOrmPQ!2N!^)#1? zM=P)KIa55v;F%9#;#IHES61`8f%s)Q*}7&$Dv#Ig`p;~)J8yc-MxGw9HOto9;GQ&J z)jzVU)8b(gi+}CVioRI-$yv zh$E2Y?|n4&Q_nN2s!wNSg0E)kffhyDubp70xOsQX%|=^cGXjG^f9g}8vJZdw!}j#k zPrEvoxEv~kz`zJC1cLo$+zni`7=UTh7ntYAM&%FVr+;ydKMPDbe5&1uKHmoeLG9v2 z*kZBgod6)UO|Kg5o`r~Dl%~lfGKjL@xq5gvDkWy^>jgvrS#nJ@J)(7PDkB=X`OR#4 zh4$*75mG~@}B?I!{s^-RoE({X2mnc6ki{5f!NeiXm^{G^ci4nO zd?D!hJ`01_^q?OleEs#;yXqg9F#mi!(s#|$!vK9Iv_teIF7N zn;_9yUmLKcZnu7AuYK#wKaw_JxvlCw%4+-A_ni(Nf+%w2FddlA4AD)}EO15qJsSa4 zIK^_F!mGkk(Nf0wB73ouH%>RBUs2aa$n@-qKDdeC^HI;l%p`fjqY$f>_oJWX5%_7! zT^=hdA_7muNNrH{=F!}v{QWKnf>o$u27oJc>vB7Bg3k(EO_Cq2Sk$Ex+@o311yehR zAF|a)*6o6yKhaJ&U#p(iC=I9eN#&mePZG;e92Z2<9%1n3X_hNRB1|S%UVm3KK%`#; zfDEqt&E5}v`E#H9oF60n)1Usdv9cSy&;(mJ;+&CIr^k3`RK&HbTB=bStlN&es&?ZSx7m+wdCW>ft87i*A-Yolm1(-23X+_N zVIs^hcTOrS>1+Yc6wvo3wQ(YV`flJgInpnN9(;hTb0NH8A~?MfX|zxBKXAW66sDUa z^`Cwn7%wLyRvVl#^AS`>4KdO~+oZfwTyU)$p+(>XNB2l@pj4S_qNS4eJ^e6#-PFfo zPtJU(`2kVDkXwIMo#Q{K5x@2Cwaw>mvh#j!xs{JrqY5S$`P2*AGUs^;MwE}D077BO zF#mL5n0S`qjI75Vd(1xm@sIn|01Llh5b@COgW=OJco2l~!-O9UBhP4NRG@C+8DW5S zpnc*y=AAafW>7;I?Td{+@nHT44KRJ$l6cR1-t+9WuYIlk%+LIcrzJjNT{9K~^Hl)& zv5E?5T0#bDoCyFdAmmlX*+l~rI=zj~?+XMKrnLdJJ#~BVwyItKg?sFYI}6rt>$RAx zUsD1QJt=c_f*aEV`Yxm%Qx0fr-RN)_?u*w4Rgh|TME4LB<@Rim6m(xaY6s6+^S^0y zmu?{>w>rkl&e>8D?pgs14VVlo<8CoB=d(MbWG_dVAJeDj;%^zQ>T zFoyUr4BDOeJTMAOj5PCog7B`HTMPuV4y`3~`54-Zwxs=V!}y6yTN8(8)22DbfWz++8yk1M^h?U=iSw64?^7fH6RZCH3OScq}|3Ia#y?Q|2%rF$$vV@kN49 z)$NY2RqW=kK4#mV*kuDfYppoaE5@v_< zO8$-?;+1R(0I2(Gnx_|e^Z9ib9BOJm9qLn3Sf5Vv8?FrL<~}WMD(mRz+D_ZBah*Nq zg=_4D3)C-kjzmF1A74*JJ9|-CZJMOr{7l6UgQ5h2!BgbGQj1*xa2oOBL?3%g70PPfvpSFq7KmN33v=MC> z?TSFKe*JoT*~?z$2l}wJ4->*1?F^i*X^(;VDgdwz5H_`BOb7tjFkEK{POh6MK-CMy zt}yx&)h=th7rcaBfKKM65!m}k&2GDHkKOjwyKQ9aavQKitv*<`zTRab^e`6f4Hx4t zDs2z<4U7nu79B3@)!Z9d!4PCM+`wlv>r5+);E^b07Sl(xB%;a2m)rP|XVc6aK3L?L zx}n_ycg>v`)K_gL{5h^X3ix3Tb2Oer-+Yu`VG2Madq(i=|9RC)&?ksI8%gDvg*u=>Sd6sZXW6=~0b7MIc6b=Gor#YoEX!sNcK* z5P1fn-??+AeesK5bV1-JKlzD|1Yrg-VuTrxo+lU#X)(bx0%q4fuo#H%mv-RcJ)XQD zZHM5udi831@rz&VjQ_afj%&mXb$`B}(EbR4T{9X3^Hl)gAfP2Bwk1}PNOn_UoXEIS z>a5)o!A4czWK_5q;iD!-7^rJ~z^;2G2wc0*?z;J5+qczhxikU{^-5X^2J@+Di(!uz zj=_e+WAwv6Dg{2gj5!G~JUb0ki4^QYtR#kwB+LW=G!yx<>SdIP4}6qo2VZ6eKkym$ z)C$WrL;wH)KmbWZK~zS|p^o=v5&psn6tN%uMvDPIO{FMy16}w=&Z2#echvj|P*o@S z?bFC!E1N6ZY}MgC_UsEb+U5%-#2qGLiK<_;&3BXr5MaxMke0P5#mI~zDx+vsk`bpR zc|@K!Hf>P>*Wl!|HHtIjrd8O4MI~#M}WFOw4WP45^gv^z51?)oaFE z8XN|%18N*qGtMz;H#I;mx@Ae5!coFuE2NN}l2)aOuO!4t{1YPr=OwiZENQ5|+lG60 z*s}G*cE8CdYwwT@_E(||30Qs8WPk7gi#=yK30Q8~%P>q#V@{BI; zqJ4u61bL>Lx&YuDEu-et-21P7;2BDkKhd{-aO~Q*pCfFIS4ckz0msOT+w}Unn z?W_xqwbRbg34RB|^p!wu6r+9Mr+xgS1h}42CjTC|&+IISH?_8>LS)RR7zJt(ywFc! zC|~{RSAA;WM?dYXKplW{ z%a)i4BAuho?J(fXUU3^7Q*I>@EAiNA2_YlGAm?c$dSbus!9>iBpUqfg8pW{_5za{!YISwdg6s%@A$?FT`t zs`L0q>O(eC+-v0(H9Pv`4R+=W2JDD4v}b>naLUoWn*Ud>33{y2;7z!9Z30f-iP9(r z4n2*2K!h-g=-UA@nC`6xZ6=P0i^`5RWUl$9n{KkteC9KD%PqIqwr#p7DcfomOex=g z^UMr{@J>7)V1~*%;^kq4A53i_8|o2th&oZ9@WUPc`TFPMfU9^XUH%>B&rN=u-pAs; zi!Qpzg#hA5yLsa7PscDYUj=~gt8?hCvZZABFqrYhKq%1N@+6w>j+UPWIS~zq#;08Z zq)Lm>5|;`BPi&1s$i^Qr4rM34V~^ZXwL5Qq(th&otybT?+-k#8zSMQ4W=$6kX?2-T zGb?%BB?u*E=qjeh$dR=J98AOZHMG%)4?z$h26>{Y~awE9e4IYcE-8u?Vx8U zFyqC(vOjf$=nkXuREAl*(;8qOgHRA=EKXA#!lN@pY%-0^BK_jBQ7>Z{(Fc=a+u*g= zUhBIDo_z92zb+O=M4UW>A|2`J-?8;D;GwdP{!Tm$@p$lG3=Ayw|I|OI5ARXORO3`< z+=R8-;4}OJFR}JQH`3X;=br0l_Md(B*$whafJ`FxM9#V+xFfeR-$|)~@5CB*)?nZ9UlB|bxXSUV}-1D8PegBpx z?C}S8T6JHq?ibL4!CJ2`^e=0Ix~>o3)!LL#fW#7|C`bp@)U{XLOPzhJ5P={B6Mw+* zfrp)yaUNMggP?8sdWC-?@?c-6Q6!g>gV#t;!hys190Zho_&0k4IBJk$%+N zLN37~akety{5vXWP7~xXp)Y;uOZMIGe%IFxz}R8-ga^~7?HTc7Vy-&g>F0z48+Sa> zUluYdsY3`&)DM$?CmeiW0v{0`I6(+NXyRG1Vug?PIk@KqFL;4%+O)~j5*NIMY0WGA zyY|d6AOYap624v~NSwIDgM(=qF=(C@@*OQg?T;jzyo&Ob=Mh}4&8h2y*@=ipC>*xPZ<0{m9SA@bmQB1%SLqGg^Y_z+ot2Qkt*#4_0o! z9{|qnEJ&%8rKB+?lIH9cCZS!BZod*5}o z0DtWa-?YB%1#f~V#Z&+TA^f;nmo*VAonTJCBBnp2eVDc4u=TI$u{9g|?c}o#v13my z+UnyaDruI5MSU=Tw(c=~<4iuo5YsBCT{r-UP&6;4B6tRoStNpF@?Ocun>(CtN0RU) zscVVwh`=O4MwCToN83@cR;J=@2##}%op>-Ub`9Km>#g>+uYJu0gQuQ)sv!iBjx>yX zgVFI_1^gHZ$2%|=i-|gcgTO7gz@K`v&VrFX+xNJT2Ngf(^l#q0*#!aO1irx?>A+o> zfX{nAZiIL3nPXsH3IJ;C@2Vp#Jq>``6Iz_;adO2NJuy~@e@6Aa?G>k?>&JtSCm-&S z8uVRkN*=62*RMWW7VL2%U__|tp1Dk~%m^y_3oHCe4WZyJPfu`&N3Ou;m$XT7K9`}IePd#s{W{42C-|L7Ce+NM+1 z*)b=UZPhVq8=lM7Au0MQr8O^sUu|;p7=oFgdgVEE>G|=9~SBoE&6 zjIA}Vh4fBcFyIDvXg;Vf%%1w=chErx*$F3{;LQFx&v}lqeUB-W$r@ls9+BT<({|%c z9s?2pz9kL7tCeETH2^3==^=efRR9Qj9Yi`Ye|-o})}h{sV5jCKwjLJ%;M9aMCqI^; z2Ru^LH0kdP_5vou&jv>lMD+P^rcB$+X>>*9p&jZH!xhd^wbJNu$WZ0cnmsJdz)$Yn zYmYwgv~7Jta|abQBRdJS;H{wTgC#X-PhHanXcb^ks)Lu1!U!(q#iU<%PV*t&u)8rak)lUWTh0;p@_*9-YKjk`{CI`W1G} z35VM8rxb17MyZMYcwUu3>U~#|s4V1+p;%rtJU}QoM*wI9kark}t=##_c#tQSD?ybw zN2K(cygZiwBjb)X7a`03Z?>s!UR(eCKk+%u)L6mf5gqhV8I|;3BUEN zZ`tj)-|i<4?%liB86gZ2tw6+gA<-KV=nK~bj=&Gh9zltEqS|M_{wb%N;Td_r3g@w@iSF)&{RfZO%KteAQA7AAy5yMvA8>j1&d zn|4$_A3oZh2!G-+&5(>?;L!p;58Z<@zTuhyXefK!eG!1ziQc!|SGA`esoMj0K538q zbgTAU*KPM!9o;#!(pHrZ);acKQ98kkb8O z)$7r*jlG^*SCju+bj zHGU#39yzFa?@>Xm0iyzW>6&R`;J*9rGoIUSyUn!&k3OnHw{-3RE8St1aROmpm>??{ zVlYLRAj}Si%7_{!2;<8$&}kNL!eo?-yfKuAe0eAD5N3Ao-faT|1OA}aXOw@&8E3eS zJL(eknK09CggM24`sYp309>I$%$Wv2WZ4)0gCQ!GLj9Uu@d z1b{S+fdJqvk@6^nX>~uZzbIy|dHQmh6A*R7Vo`hW*_Tf@^m`5VNl@4$f1OCy-($;H zud==sy>`^bgYDq;1v^se{8dLtm^oO=dFJw^0f6!Q?h4N^D^k~5QW(gOSYi0A6+j?h z4FUHNu-y;_x?{%<-*LcqlNSbHvKaj0Onm%crtzK4CPHEMl$kPeEC8Mn9Z_wVRr@tofH64@9j*vx=&7ceVAcaF~y@{o+9B<2l?;v!)um!@Q9Nr^`WM{AmuH18xBW zRA2F+)p^X6FxqD#f`xen-Ke*%@{lH+My!98COD)4C~FRP<(fV_WL??Tu0Pz?tXrk0 zU~3Q4iHWNP5CNs7cnB@d_}hdjcGoN+3R)m5FAAHardgvj0 zqzKnuY4g)ji~ooy4E27~~F0p7`<@=$iv`)_>X8(lzgpBC18AT1K}-6dVNBF^qp1=7El zBnX^-{?YdE_wN$J7je)(OAQ#I$LV-VtULsxmBa2g=Vo9^hX4V10eAKd&*E{p<#=&=#QXfBf;sT@c_(W2O$Sx#k-C z_P4+7jJOeb79B8r%0YRt5kO*|pR#i#FE)O}rG6pwgb*-`#p{Be=NRau05H$1+AZE# z3_$pF)v#EkHVlX`q{q3v+|PJ+$<}UIVS66hF16w6?Cg9I8WGJhLW4%>ak0=?*pu|h z#74>x2IgHaXapk-L$Tf`EkMck4psDMKmM~^!(l!o-{TWr{%M z(obLSa=ZU0583Ts+^K>oM0C3%nl@6b>ZHD5m5C_=Mnay<89YvQQ1~tY2?N~5M><#k zE39j}7}y^MV5E7bk020Fq=UJJ`KN#SCtpk$j5z#f+onvElYA);?|b&_v5POh*fkfy z=+OdT5Dvm`w#(Lq-+2t=`{YcacTxbDX<54I=KuqYe|@f9+>*|~NSyNqd}pB+%boiC z9$S5kwh!s3L6|FZ^o*dZQqLm zqTH*(RF>O~U%k(E{uogOLMB;7Lwye3VcVluL;``2?kSrVEfjS>6{jHTY(IHux7A!*mNo`pm^|$meT=MO zl&#E?uwb@~tUvI95BRG4V6@l=Vi6$BpC=4%82&luoMXoyf4r{?U`GJujd+v`ce^?V zoUT2uF#tL1i0PyN(2)XlfgE5AI46YhYmtyInA4mhj2@P$-cejuu;*TSv{lRdigGXbZAyDJnY9$QJ-oH~|6-@I{X0QaMB2WI4>0B8E!s)r`;ihP(Iw0k8}E8{_>YQgU<^ggonwy!>?;EJq$E^#L}yKx5mOi zVvuRvpWZUGD8RSNiEkdFbMQBva;T2W-K|{$+G-^EpjW)q5AB%&7E|5{fbaj8M;iS% zf%^Fb%1_yfefQZw&w%w;*V?x}f0ymJOADS@y(o^)Awj_7Z2vGdC35*j9y%gLzY;Ja z&|^1Vx{fXe#>GG|c9<(Ff9%i*{P@Q|wvT+|BhGA5vBOwHSco{|0`5Qn>U@|ydE+Mk zv(7rp&OGzX4nXgMn5P(k)OEykQUK^!p*m8tE|3W^K!e4jF*f6Dd5GiJ7%eAOsR6mP z0A}aC_)r@zJtejOp!JHE)bk?yale95WMl-4?C}aaY!d0| z3IbzVrRy;k1Ht?Wfyp8iuCJ`N~%|)+U5s*Y0AV z9R@ln0JMYO^;-ZK2qC~ZZpQe%*y5%&7SCzB-61FIaG+CGX|TOp#{+8{ptx}@M|7rN zO;|RMeq}LB57+lCe6rCD^oa4J2_U;=eVTq4tlL205PRSU+wEIl*qQD+P%+C|E5LMt zGj${aUmw6bPt!2rAu^slP5-W|i-A@Q1QTcEk70BleysYx@x~kdh+X^{g~Nzp%EXCy ztuQUD_=l1I*=L{ad3V+Poy7Fwgw-(tK%E^v(lrYR1F*sLq%{D}Je!^hRFkS% z;iYT|Joo30w%T%?lWx1R5qeWoFuiIkGoOoxaZ8}ks(mi;Nk*eAg{6asL|nBkv7!n8 zxcCs2{xVx@H-7#>yZ4*gLEuvX)CcVWET3HpBHCVfNe((nnE3_IP8pEm*Miu zFZaWM^5u^5ckRW20rj!bBbpght78Iy%Fxt7&7eTtqz4uQ1raRRFN_mX=i_A@PWQx? zMF8t!yqvao_!%WT>g0oLu&_fL>NpITuqJ_=PRV`FUkQ;O(*Zz~MA;*FxGM{jUr}2V z_U_XWt37GXlOq8O+t=7vuKJ1X`>9q#>w+L{S5SS}nk5(v+MIw>Msy1ry~))zT?|YG z12A+(_OXrbi6@@0KmF4`bw3zB{xJX8UKd(|1Hpu0{^Y|Q0F3;f|NQ5B)hKg!Og5EP zUN~{pt{vmG9TNaLS*V566brnh!F4sq4%39|)3Xo)8jMnof*5a2>i9yx**TYPu;Lmm zg3`A9A=IHW;Qugqty}gSVgBxNfExMht)N4EC`YMWv^|5kbzQ4gAHvE9b;U6{fR*(% zwnxnWt5K27)dLV5L)ZS-yEg;Eghk?Wg7bsX`5Q4=FiY|CvvlK88j6bFT8129F zo$oZR6^6mWd}E(|Fys7jyt9p?5IR^0c*PZ0G^QUySefnoyYS}(0}!^3n2reml6pHP zm2{+LT_97#0E}KKf+@l%T@*ltF5iOR7a%RbnLT#&$*XP0@K&9_pZ3>_(`F_cwTm#~ z6%T=V*o4L(dBBi~n=}BVOQqnKGY6Ra?_Z`xii%X#LO-Snh)>CSv|w>n@esS~#>efZ zPiw29;&Qz~Pl2t0Ipa4Ou?qm`VY=*DPKPsC_%uz#S6+ zgzl~Yu+aJ(9FiWO!9R!mpdwGZ^66g)ner2t^GO0Z{1{!$#b5j~X#tk+(`7qs!f)w| zP6QK!rbBqBV8kkXvSg4irGs_=02|E%qw`c0Y)sm_pRQH)Gy=qWfFgyEq)_5ThO2=& zHE_Vz+jqWvuif(%9sMgUK)p&h+Jel;QRDV(7X)Ifmals7I3bXP?Ww%-Ab^@QpA?5O zrpM!Ue-WHa_E+#ZDg}R8g1w-?Zeruh@ zaH|@67o-V*L>9^gTeYcVXP$SQ?XEm7j$BcgEb--$s@4jKF|!>HBf8bbBtlC7f`wA* z;Xq=3!{AC`;U9L2mEt@5Rpzx?kM-79>5!mxcFq5HyKVVy)oOcGX7xy4$Ed{Ur;1!2 zlx0sj(FHV3TNEfrGNP3MI2uwl3Vc!GQW`$9OH&trG@% z*fFW369wwRm^=nxr<|AXhvhIlXY;?0%o7JMW~1$Fux>hD-=6oPvaMV{WYxl;h^Ex^ zlK%>ttFIye2!szpV7e4T?=@E7OAWv(gQ6C(7Bz~8InTtf01+XgQsoYG*@Jyn*}B#~ z{SQB~y+75Wz#(NIS!85H1<{5DuNK=HwYGplAplT579#qC+e7p-s%*joml8Mvz!mi% z!l+1k@0x{%ff%L72pi^!n~^qd%)R&CYwvp3yIeS6wLSCe2nsw0!sN>c^JmQgWkWDH z)ve--+_)#kE&{}EJQnS7p-@fd1t$^;A4c7t zn5HvXIcF*WP+m5~h#vdpMJ4OEReeX;;FHVjstn;x|3Bp2XED!-yLw|CRGJsucAz>gGevGPPgdL0M9(dpZ`{O_UV|)7Pr=8)) z>Ux+mX=d9*K9n=h(3xgH0N~J{V~#n-g#yY#yr|28DBoFR zcq~4;KGViPa6AE!)79lTooff{7V}nENjiQ60OtI;AE2PM0GluAvqO(vZo@hvxTw*+ zFVM?+K~-A^i#>|3e}7=2!SR(rCxigeI&BG5`81%X_mwotuV{d8g9Enj!4>wIzkSdu zkE_&L6QCQ6C8BUKutrXbLJ8_4(Pb$lZau7Npqzs3ixTAV3TRw&&qsD1s*qfK;*^8(ftdps#PhmY3Gq{WtBktN-#b7Xs=M0w@tj1@&lKV?95D z^X-lT(iquO$`Ay=QHvp-KP~><*Li}0=-1=fshBWI7(OOO%`B{Y$2;C(-}uHibgCXF z?5V%#@Tt9f_qm`^A{@SDAobs^6M z2Ii#(peq2(MOWxlo_PkBn1A?i5}>nv7_|tIGjc76!{t)}IuPi>%hp)$K|?lJ+a-du zPnQL0=K!bjrGJtUTL98d0*CE@aQWLbE25FTrXEV#nE*5AvY?R>PCygu);7SRP6}L6 zILz+5ZJS;5(Z{U1L!};)?1FAzygls%U^XAIzzgJMjIDyy97Fw+%U`=c3kCzxzw-9j z!WXkEBpGFMqTajT{cgMV+G};j{|X;z(|@bgnnwN0y)O?94Ug4ujRo5gpAb;cs3G7Y z1gu`Y+J5(Uf7ju+&hzt5J+KiJx@J*gpkvy0sB%Y4R{-b;8V@{>=I~s32cd-BacBr{)K@>@>)RIAxw5 zGWDNqPk|O5YHJkr&}ShXfV2WE`Bz!l86d%6pl6-^@Y<*B^MCueRi4yRL^c8_dmhaM zcqvAehGL=K*O>vFkeCF4R8}zK21h)ZSJ#?<7=Q`J$T>BbWWSu|r>+h_GuE_qb!gv^ z{m~!(k$v?m*ZRnxwDchij5yTrvCrQFX803jW3(P4cKpI0o4kXWvo_)NuYbKS{EPUl zMTiBAr0bf+hXM5k$W=#7CwoZ8q>_%*tP5n47-(`aT!~0#-NG4R7Vbg-TvIU;FZ9@c z-;RWUQ!ehYBTgHzZG%r(U%$2#I*0Wrjm31(U1$D&cu)>ViZ+d3jr6s`KOJ9`l6z?Z ztp~n=bUrwr7wMHRwtITcFj`5fci;0UQ5TEvYD&^Fd=XiDovzK zxd`0^bBBT8Vof`ZctteT;>|{nZjy0G6*y9GF%>+vw7O`QT)xo;4lme_!L7bJpOyDS zgz3B1-EB4l0tfaSP^OCkfU`S6^SA;*cI@Y8r(!Z%lc4JZtGd2;S>Fn20yfx#x0me` zfBt|CJ%A>F^$JR--2i13wnqsy+p4XOK*||^AUzC7bS!l!Nrqi@Ij34`&6 zI-iAyZ+`QeZTa%$KKDD24$ZL7TabjDV2j(yJmr505y7JhTG|y z*mBzzj*6u~ST~Q>(upOG_~k%rk1yJ}FMfs%^=`4DI#&kMPqRgY^fWz5rAo@q7#KK) zV}<=_;S99bL1DwgLwaS=DNTWOoejdMG@)`0vMHBFf8sg~)A{RJZ)1Y3BVBkW479!MD z_NuN4Uf$R5ivw4d54MNDKV%orY+4~OtFOB=yQt! zj-^IhT5t^jWsxl4-HyTk%{Sj>Z-3j{?R($?~Aww5kYYsJN3xU0nt0nQ`5ShHk&=^Q+ooCyiurx!Fs8ZKL%ZJZ!tFPf0s4EM}Ze z&2#NJcu``p+2oiZo>GyLD!%~16j+1+E*q*#3Mgu8B6Fv`+P0{x3Viosq0(b(dXBI? zkM!C<{^j*{&o?AID2yqAy4DM@l(3?+HhgtB#dOnfgh$t202pBVp1MWDjIj1Y=Chyu zqSXFxw?`j)T+>6#d>09QlG7}QhY~4^#dIlg4#*4z*933>zrp<3^S^fOT6^2u-lnas zeGP#iR{HNBN;h;dVxW_Q?U@Jwfm{DFRH%+gB>}i=&jkix_hN{Ct`o=qI=_|;18i=W z3xD+brJlaVEIgX@vep5-@K>H`Bg?mm=W7~3+_DXX9t%8|37V1)$b*xY`FHRT2j4&WB3i;G{Sie3la%Koj{6`siaPps@s>evb zkA28>JK?|d*t757Xg|2-Q5_n{ed&Elo8aY1XF+-Kp8PWCdcno$K82(>_@G7;+J z{m8>l+6O-H0sGG{|EH~7wc19spWg)pQNa*KdvrSFJ{<&9(iDJC1B`p>YA&C4#hZd( z5>gU87(VY9Y|i@Uz@K=>Mlgsq0L1T_rG)`$h4Q>MK7?r@p;H0?YSw(Ard613q63S8 zARTTuUU1MY606N`g-TJB4L968AZV?I+yqr5n>Z_ztSrEG%Zx_RU1m%m5sDvxVX#m2Wl|l$Sv88%tw1q^9@EGng*D8 z%E3b{OBkW1naHdlLjSM?EFEQ!T zcO%Xi1Ea{9zwpC@Vx1?wc~DDk$q#0h8F}~^9i}b%Thz6|mtFY`D;y;Cdauqe7t`$% z^REuGJAl+M{WO9L5Mei9;sF=O^4RXo^2~e$iWrf`A&WCK1p&eo*M$s1lOc6gTf_QF zn!*_FwY5Em+mm+>+sFRb&341TY5GD(2d8xb!h@y-yv%~Z5<#{JE`5TZm`hNG<3Fi)9_(fS@it?9ylq1x1Q9Fw8IYYe6GcR4sv0=&ygTT0o&sYQF- zSSdfByC<&PRSBXW|9`Ktcl_Zy?e4pNEP=0A8lWE8I@dot8-REXlXo{fXU{P-q+Kf7 z&c}j7m_Kd=f_3ZG`EkVTTnL6wDO^aQl3lZ8F`$c}S_Ob<<6@=)KqKR>0MJ0i5^_L@ z7?Fv1=}2A(bU}=_p#6A^PB@Tn*>Od?^onO$ZD5b>t?U*>7Ln88J!KZ}4$#A_eqcsuYf_6SIqX5HC=W}om0(TA~Ai#xkrtyk6!b?1S zhK<0M1QAAf)Hv*1)H!lS4O;C<7l$pFv@fy^D=r08s%#u zM-L-ntpO=&!5mLgS|q*V@sb#dE%_7@FDOR z-k3T_`MTHie^khtRKP0+1~i2==t4`W)}xVsk1ZQH*zWtzHv50xbCZ4V8eRRWt%5e9 zTy>rRrKtE-!dWTYQkhi5#J-|dvQzX_M!eln7noLJT*+^Lzga#GEPzBF`%AY#!lFuz z;-t1IUU38HPDf#jd=7KfSX4foP3_SJJQyNLR;d9uZ znJC;Rd-n%m(qX$~CLOsOanWHQ^)&rLoAfw|!d@nVEPnT#SCs9^#|P~G8+O^?@PLnO zm?QW3_>9Pt2G(Bik+#w~p-W?BM;Mv-nt+s#hd}sKZXRW7KLu?IEZN@Od#%`;=8tQ2 zF^8UIBF4kEs_zin_1G@^>_2|b?)u(3d(kV7HV!+2*>K?zrmhoZlExyYGtv}6Mcjz- zDZb9FJhIA49WWFd6E^M$!;Q&@`3n*7+;2ou&U+Iz@q#w$84koe48Jh_6rKqN$c+I z+qZYDP}3<;H_cpN0K%MO&`zx58d6bX1rKXmRd282h(Q0`uODsyw&hWK^oLt)d2x-H zKRW~Rd@kM;Uqm~b`u85@ovbnP$uFRT5tDA3Mu3;;fS}>J)+lJ`$dm*O1J!bExM=-$ zkd5euxVvt6)b9WBeRko?o@HlWvQC1Ha@90Of#X<?{u_?{z$lcD51QMa5o zUJ-=%gw==yL?$6-!bBlN0l1YXfk=~hIfsts8O$E#;>T>yN`y2X3lV^>I{cZ zede?FPyh5W+xpa2zs!dbHR}Oln40en$3UxzeeL^66CmscFHJRT;b!eBg z71aECpInVR)&!M9BNVb9!T^W$(CREEEomLVEjQm`|NPJYY`5Net26!;18OS?ZN0r{ zaz>oVv*oW}XXwN9J-PZQ2kTTSbAN(4>k*DR>L`2fd*ADa{=n4pYZS&~^5gl>uYS-i zO@}d1`NlWCu{Q@ZKD4k2%DZz>$2vPD0N6thJ=E0zjK%Nb_klBODwSK+P}QcM$6RG{ zVU^2l-_ydl-X0s!qQGCg@|kwk|Nf!XcWU%p(SiUD@z01leb?vsa~waM*bQFci^dvn z)50@?3IHn_`In?dMi3bu(IPC)i534&1XiPa5opsf!TqJx)>~U?_ulfPJ$Ua|?bLIR zwu^uH1Y5O1(I^iyAO~CpyO7`;KKH0AN z>pL{1zue08ex*wSL{XXm9o%P?Ara@gX3=vT!5KC&o%y4xSKhhs>0l9N;S~@p7LWC4 z?_ym;`C36EL(N+_vk(#18gu0*RkY@eSC$U8>du<|;6I9Pf7yW6 z0o46eKh~9qcgmj#4|9(Ne`q04`=4>f8D5+S=cUX1 z4@3(stUM$fw&SyWNz*cXPZJs9@IdP0L2%$0UapzpfQs z?9(o4zjjRwl##!)X$c3M=I2b6kzkg!JIH2?N#%gp`{O-R%r_(cY%)tX7AhW@P&#KA z2mtJ~(QX7l$R81abTwTN_0oodhh*>zSrh|#4!4jqU@ z*}#eOJ@QjcV1IyR%|VH&0%ek>O%f_S5edPE+wrT{h6x6i%H8muH;#mRM&U5B<{Uod zO$^x`j+hjecS37w|GL(WaEc@C;&(C$72BWOV^{yj=j{uh`=UMe_!EBcPii0V3r-Up zYEQGyoy2Ofk!D^hJyTEnfZMz`(#|sv>h&@n{tc`(>R>LMl_IPqtpiH|c8}Kb#Qa z@IZ~?$qN7o0eyOU)zNQJr(P*{*DMtbKr0(YFHVRX9*K7Hn(t}qp6u7=pq=mj-x2%j zCx2wcp|!TGutp>7g7x(K<=c9@8QML?+@`AA=3?K~R4bH1#_%OpHWZ|tq;?n$bZhL%>ec|(8w9kL;OFFK3 zivolj^&g+Z*AdSiSqYdr8ujPQJ+(3Z&dej8hecnIO<6L()B-9%2Lyl^`G-wCVg9_o z{`If7-}Orph|U37XxE3ph5PxR*+bn6?0rsEZ&>(&(#b zYusNQd#gUmt^m*$MT^suHGq(J4!&`L6SX~6g`g%M-bBZAM_FwCG-O@mho$<1= zRzPpG8?L$6dUafHU26iE=S4!`Ha;Jbdmbr0y91mFdnPGw&tMuqzSDqmG6HY>0SHDd zcBH%-VTzaXO*Q3+;>5@`zg+5#Hl3w2gqN45}3p4CN3La&3V8VzJx!wakz(jk+JWBvD4yTTT~;Q$r56&R07G9Rewc_G?_Il#0i9v-l&~;f2OrOW zT*OU90Pt@tgA^Hsjdxvz+advAV-}}tEpiM*%L2`=S@ z>-bs#!SGY*5Im%Y_L8e!&XrPzOc|t0g?s|R7Yq(^=RBtuYRF#F@rP@B54YjRhwaAy zd%xZOmHX|4(~h*~UviQi@hr3!f-2@#C@1Fcqg;7A-PaHE*|C69rJDDqwT#g$so;8Z zp@#b5mJlU$asZU0R`0&$QkoIA@~P@NqrYyq-g1X7?D?AAe(U#a+twYf1?lfyDcm4D zYKlmrScTR7Vw|vkdfw=KQ||NO7v|3*KMo%P2kcI`{PN4~5B}f}ToA|$2ZZy)G=bx6 zK2)MxhIxYlO#w&+Hp;{&81|^ZiC(560JOpylOX~?YozY`Qo%rwV7f)P6P*VG?yDc? zw|XN+O&YAC7C|xM{V%Uw>qPPg*Ke_9^>wyySjPp6nI=eSe4gMk?#9J$m}Y+AGbvld z)*)xZPGk+2Ur5{tOJ#@2a0n6O|8#kbdq|K`-rNZQ8~tNpe@qx|ZQLA(8{ zKe6w9>kd2e_=D_>=bd1uKj$c0afAdJ7$NDw3*Z3Zqe0#hj+&wm5n2uLrdjt^P#t<7 zQzF#;0b7p7l)wBCgi!HgKmPCzyZ#$D*f+1g$?m=9ejCzdJtZCO+uNfBqM%bJFBUbO zg4(|({XdKo)HTk92417_^x`Ioa5$4I;WdRFm|sTwFn?D2Q}$o_rC+kQzV)r{rUYmP z2qz2^%s*`R?EZ8ykYPZ_00)oFcV^tJrk!7FoQ|9X*eHmkTkVwYnx%sQ$SPDEMyio3 zJ;8rOvE|1f9F>ubcM=$Yb6G-|$5&cLzo^BB>vrkuH~6Bs+pm4pRungy*4U+k|46U2 zK!qVf_Y2}0*v>)Rp85~)Y8itnh|3gReay%|TTP=3IMtuL(}c7H09JL&uc)aGMxTS4 zgD&d)fSRT?(x@~|4KRxDLG7=R?dpMb+G;pxkNjwlJ$Uym_N7nWW+y%CI6LjR&$Q#t z?6tnts*|=6rizi5XQ=m7SNXItloI1ePtJMrn@U6-k^wh9@89%tbne|>2(lTPM28oR~o3?82^8JUjn69Ri%4su2kk!5<(J!A4lP1zvG=?Rm5ra6?J&xH=pC(C z(1>pgR8>yGdVz_dt!ZEQ&)=^Ok1u&LjGq(2@uwaY&N%CoaLjRyVL~Hn%Vo8+l(I_M ztrshZKsxCi0mkA_tWpf_@weB29`bcReSy3;2s~eAF)7*@(ZHrnn=}H@+a2rS?=8HC zd@u$8Gf*L-mT6|4^e7;C4qpv$p6R&Y+J?wkPQ06lN?`nYbcor?%zI@EBt0D6pcG5`#l z;iu71EDB}Yc0xcofFhnF5KjPPnH**yesmJ-(X+S25LDvgqB1*}2=~M|3}erqCGsE7 z3BXte1JHZLiguIIOKFV9-Y*6N%+LII`e8LbOWT1n5ZYdD3IDlnQ+V<>8^Yvik%Wa>A0u?n`?)cHIg$R zHR}S=GpeuxjW=CP$ShqZ{0>4CppsD5Menr$06+jqL_t)(4eKi$v=bjuTDP_-EPLwN z@br_3fs0e!8nS0_G>G~BH{J75>FM+F zz~d#)gMawpUv_%iv8AqNd|kNkuW>+7?MdOmyOxKBt|LN2{Zt(Nig*CoDsHC(DA?So zfdfi#PbkY143HNN6iO!GXa8&&86p%OVm{`2vcVYK6f%gp7N7%BdjbhdgCh`Tta(is z1!jntAIA=3RG^|0pQy#|fo_0a^TvH)=}Rw$C;qT9jGs~)#!ssW#~eQ=%*VChQuyj?jFTQVSlUd?#XS@*anyDb-=faScVr-B_&(1DA=JmQRxa2G!a z@*wszKFVxu?hczaZV$_!S!rPZ?6T*>uAO^uH6txXNvi8`qT&=YYPtZ9W_+0y!*XyH zbe+}LY8We1+zx8Dj{Bj!@M}b2?r)*?{6Tn`pzk!fEc*0PhtV)8F5V-6Q^x1>#v5-8 zANtUT3Um9~<1di!GxHRfG?3H4z4zYR*Diou?Ebyw7yxW#YDcjp_LA?)l`A*(5|qSA z10^+J9XRyvIh0OUg>MHCb$Ob^dDmkCVDiFn|Bsf3j#mTL1x&?S0qhXKX@YyOQ(zpv z=7terAw{+xjE`tG4{whxdhW=Qok_m-xr(2?XYT7KK#r_q@0KGAs0X%3)>k)Ril7#? z!(l_s9pTmHw(!TbFNDV)SRSg-OP(~XAB{K6CjgNO)Y`~E-P|eg(0DnehFfPMmCCc)pyai`Cv|z>lwpVt94KHm9 zFRp$uy!_Jouzvl<(6ntwXxWP&2=`Qrukm%+y^Y5f$hbwc6W?86#_ZuL>sY(d_m}rT zFelZ>1y}mxu$J(Vk9;J&>s{|EYy;%o>ElGB?@m*VM_L0IHELe6WXYah>fxJ`=X;4B z#ca~$IL2dVh?HFnUNjzf@y*TdNZs7Ia~tqYfG5Bg$Ftx`E@_~54d7YjkUodZd0cA- zVy*blOD)d<0LU!Aza#wi&efr-X<}&To(y2Y3l~pV2Mhb>&m5`-ZF=qavK~6G zD6cc@*|Rq^<8#T|wr;a)`}U@=75tXXTf?p$&7rxeHP~4^c1O^D2JE&!-|1Gv+1x>4 zi}z407xLM*J{tij{wDlwqMnL>$>~%+8gMZL@l3zan3Wr)X5b+{k8Y-fj^So#Wxoq~ z>bX!B^kCs8v0o?4JC>n*EHn3qtNZz#0RlULpKi*ODdBJb_HS*)zw|-5R{KlFQGzrQ zK+Pmqjt2JZ+4J0l2^0PbadiTq4g%tw881HYY&@|6_4d#rf=qpPINM+Uej-*8qxPn1 zm)M(V)gCd6TCu6NR+X3uMQyD;YPTq@(Na|-sI6v;wrX!$A-3T6?(;mK&-Ztozmw~F zpVv9Bb?(=F+bZ&b;`7R_@#0TEP1QKeCC7&H-D%*mNEHz9EV6{+=sKnK{h#ev5BvWd z2HgjL9tgg1Ox>^~(%Elm5nCyp482_YiHNncY3_OwuT^A5sn%(kK!1$8+N=Mf{D^L_ zDWwo{^j&nObJ4fmc4Q<=&3QN8|NV_=cIc3k73ZdXbP7Mv`54r8=53r4dE7r1^7eD= zQxRVfHHrM_{6)};@h*i-uW6PB8fQF3XMlLgG)9c>} zu@c0`!p>#o3paTdD-&$*PbKqaOfu!)n~tA=f**>_du9h*;|gi={lnG}&EH{0;njJ& z&-e~0R!(!|6pU0xvYI=;AVr)mb?Q{fZ_AoSzIn0laU@mE#y#HI)LVFDWH;8ABk8Pl zyzLHW7jK#;64mB|$j~{c+0fvotxsEB$=}#DAa@d_ zWj`!^mynx~C@!YVS$_hnyMBsR-_IVS{ero%`IL4>Ao#R<7WRNAFORHZoTVcADtWpL z^=pY82g-R_9)bBq(Rf)a4dX5@8SSgvsn=%mF-q#p*q_OqasUz zM~k@g=x+-76^*aJpKb^|@oh+}{e!$!(aU9E-{8pc$TU_1y2~qIYw_!;gNgnF*BW*Y zniF$A_=Vb6&OosF(pD_vbobbJBbn<5r}tn!NB~O*M$$M=$;TYMN($w4vjA%pv%{$c zrL;bk)@hV_j+JOGY&l#uvx13EJPf*(uOk$-Z9J$_1#sNI+b?jF5dc-BmtEXF71UMr3h(jc1;ShAH@&0^?IMQVVB( zg3ZOBCZE*|eAn#hgW@;MtjK9nY+14K6MRs<_@_!@k++XiE|0U>d`yPl!b15r6k3eb z=i`GW%dUcKGJfAj?lfIpBllU;U`MoRz;Y)@WO6(hd>Qz}-IkSzS#Xb%6L|3$3=QbK+dw>lp8{h}XMwrxB7vgkyb8Yr0FdWB<bL=IPAVB=`9-3b z*(%Vq?Xeb?dE~6bm)=ql`3Q1Z(&(h}XX0J4tIqFg!c*KU<#||VwxS{b=MN^NMx3`_ zXcswonsB>ucYqv+AN}ep`b1GodXZi%KWMPwfzIIw7wvsg0crCi%PjIPr6u2v!8oFL z!ezcYT^LA?i_fw@#2iIm${i3z#UsB+3@`aha-%{s#AY5%7%u$wj`(DeH^E8#*yNRC zje}~KNfMPu8M16gF$1n7<1=L!_~y&KP4>h!vQRzigG*z^TLUc@kt4la}r_;*#y&b)8rC6l}@CY*>bcX$GCyG|O zahG`5%6~I+_@;R;S*bc!a7WCqZ;e8tycSUC^910pf zirCP15JAJCM3L|p9z;QA+NaXQY*_zhh&yQe)}4E@B?GEESuF^*!hN+;E1so|MVn}E zcKgu9254$p_B5TDO~P-9lv3WLDEP-RjGAmwxt!WlO>RYdyY*K8;qT3r)<(n+!zEc> znEVu&uB%igtj6YbP0+ldOtQdh81|Oc2GUq!oo6{NUjTst|*#y^RU zK?J)g^Pdy(BT$d6v-?>D+4yctP(96Kh)eMN?j`?7qad-%9(4#??FwZrJSoyH2-6*X zjZK`dwk6lGhQD+UUHwwfG6bqJyi<_T9r|V_J2|wPW+%<{CvB8T_`&F24^2@>iYh9z zV^6x(Drby)i+FbY^Qi>Q^;$yG+Ir+K?yww=T`})89WsNF;PH`!OQ+U%&)2~(taZcCyZ%AAwEOVwUqL^|`mV1$qQ<~CufjDt zbm}WM5aZY)8FWJc0{MC4mrf$IIr;&h(G|_i?#uBb0Y)juqa;_XW+!8PmS`#^QRsWW zN{E(8s{Kl>(|DP#Cs$F~=5vV}aEr|e(+amOE(d)J$%ide?>(x}ET&~i{_c7seydZm zp5+iO^~CF8=Yj$yTUQj^j_Xjam8}Pn-yOZ{rs7l3Ousb4_^n}`-QB;&%GfeP?Dimh z=!R1e2N~8^dNK+IP`)CM^o-?cNyKo^8o1O%JjGr(uHIg7yvk>iL)iA+t}}bqbR$(| z8&&pU``sM&6_ywuU>-2Azg(S<&)1141KS05XM1w&1~+=F~%4IEAvTjimHU)j!ulLxf1c-Tg+ChY+%{!&UqzLHfghRBWMI(K7#)3r$0)N$H`O@V%k?+ zh%2TL@Cm^z83_h9fU1D8FBbYt98vmSD68E;3CKO7>%R<+Iqdxa=HK7-gHm&^{?>;? zlMP^FB(LZl=aJyRUhhmmDz9@AYb=JtEISnDd1dmM=IJg3+v@~4>gLmNdEBkElQ0|h zO=b6aiQ?TL-7eet6QXrb|1gl{TT4e4%&TZah|5X+{z8CnQ^8Lb=M**R#ozC5iQEL~ z7Thz@WG$3k84cj*FgAN16)jaOYh3@NFZSq*Os2T$YVR-lF-bJf7b$CMp)J=-7QR)w zu2L{ouTo2r^m4qiD7#!sBRebFy2L6|le+^>^e|EpuI^IG#QIP=agEo9Y4fWY0xCZj z>aVc-nVzyWG_n;`xFNfbu-~I=X)xb+EW-eJ8nLe56^^^ZeG_q74!hpodrnk7_s&(H zoCk&WET6mTPQA4|8;T^MJna`C5ri5;g7cqJP#f_y+QZ9;gL_0it9w^dmV^AFRUVHm zL?=4_V8b#6dnJ`yL~kW4@Dfg@elLv8Ra1ln?sRLYam6m+s%>w0bfrF&U!>nw@?hv2 zN4p$zZc?Q>B9sqPrH#||jCnD@SlW5IG$%MWIU>RG$%B5~726)`fo!7%O$SMV1|#kY zI#b)6*=rTd6YRa$ecZ}i`m>+(XLtkJN!K%7rY}F+EA)?@f%L3X)-<_wkAL)xj@rTmKTvzMOf4w^vkCe zn{xf~W47!4vyGG&bxmAo)c5F#+8=LQ_67pe^L*pw@5mOdWv-{H+Fx%r5c~0&EcLT~ zGaKdmr>cyNVo7x1Cvs~8-zHN_6C4!Vt_`WxiL|(NysvdUKOAkQ`AO{iIE?eKX{sn+ z@36M&V?(Wigxx8#@wraxAVDZ)w6$GBp-Ri$H&{32ea3YANWv#@?IcIK=$UiqV5gNI z>({Fi3k{B^H|!OA{IUg1~P~zJ63!+$?%VmMl~o$Q^s?nVntSK_u-S7Jl|- zQMAa|=#I5bA-XB?>KE2rzG|^8x}C&u`<8@kd)Ye=ORS4oC7~`Wx9Ju;YNm4xBYAXh zXCM+CbSPs+7@)#j9YglY;4oP7{+pT_%I(jgdpmH}x9t~7Hs>QjRONKo;)qk(Aw=yI z0ghi=?3AIPm3?u+l}(BpYNb#)cUQa9WE<7srU~bM6wzT*@NU)I{%dvjA#qqT4{o!L zmiFTA_RWik+W7MHoWOWF0ofw=OmAP?3)g~;D0B~V$hM)RT2RZA?>|3i&oUi@b)HIC z%iU*U2yAfr`19}&Zu-}Qh03`%-DJ_PHDnV(%Hk}dY4tTsS!U_vGVK$q#ogSRUGdpK06XKRt>CtL`}|H8qi^<_|EB1eeOJb{JRD zyBY{8b{(h4th%3IEfc$%s%bQHcAs^_UO97Rc3xR>@F6ewmzJU?F5E$C*oti1<%qIEWO}$zmb( zQeVb%UR`GN>(_lNXXhod)YvvKHX0ocE?NbDpLcRz*07IZA7Vh)Cy9wOz2{D`NEk87 zlly&5(@4e>83CmQud7Snc`g)d<>$QKp+8Mc9^b#8kMADRo-M)Cywxi(mVbB6cE6z6 zXB^cVbGCDr^A0RbScbS7x?aE{;?tvMf3{u;j;zZ@e`>$x;poOOLHYZ4{@@CkSJOE6 zZ;HlSPvj>P_~>*%^GM%2HB{uKvL(5aiIUT2uF^NDb=*&G0thc=&~n96ewa8nK>X7!_h2*>Y0cEdzFDY1EMClbbDx$k@#9{h zU%9o*NtEB~s9ExKNosm69c>x^0ltt}Yd<&Y-uk2!?uc%VZRM*}H%DeVJ%@NA9&RMW zu(noV&0l-v2{|qd8UEflx>NlQk)<|X{-}AQz&WK({$Z>02p!U;C~lF@#nC$?5ef@xd}$fe5WF)&9AJPufH4ojctpCwFeFR#jFtD7;Z= z%bL)VfRkU$Fe!!wI|r>P&v`oF*r(7zeewkr(}9Mj9^=@KNi2Q@J_k5~gg~e#vVk=b zTy)jEqI~)H-NyUh&1@y}Y{#*+9y}0E(JCy&6r-?Bf9IP9d8*a%X|B)W$F-QVh-O~G zng%Q;capWZG@t|=k;O^lskqF{44X7t!>QE-hw_dwo%qTiZ4H}FbG^F$ zYO6^E{<%@MwdZEBuY z3K|=7OITtMK~;V*#wNcG~mMYQmu)gThakw?s_5=rH^{cURA zEBH8^`qc}%EAQNXT0V-24R2Ph4i5JB`1O;MZSxh zA`TcJm;1H;;Er>5kmz2#W(n8hY6;=%E#@?l%vjP}(jXbK5&ZtrY-r49#dQTu?6Lt3 zA7*2_M<}6`hA9^RvqgI_DgfXgkIfe#wc|L|QnLR|GDojFJ_eD)snsnQ#vZ60@_rFHpDp4wJq>szih}_+A#ax_tD> z9?*5mQ8J z(ej+i(khpI?{R%$h}eL^!Y=n1_n0g6<*{K3y0vdO{qa^etT3%Ha>=07g>q6+CC{Uh zmkU8o;SLhwTF!$SZ3gacWWbAt?mXhe_rCW`qyQ?@} z`1~e?(hPU^+VT8Wcps|;DhD4YJX$!Kf2>vz)YriAR!#PupAN7 zqAJUpa2ZyRIl_-jA3{8OtnQY=f5mRqRVX&9DhLVEx)K!3(@u}Bndv0QHg!CqHEOC> z;s_khaXirwbL{snpthNO(<$g*j>OCcQ87AaH<6Y@o%W09Tf+~jMKKaXQQS<|Qt8{P z%e`E+XyXn_=s-={$n6b{c%+4-9ADLMmJ5vsxB;!JSiHRGW<_6j5DNZY=cQDV78qIR z%YcqO_7PSWQ+wI+;iVWy$V?<|@^fPauh&A_we{ZopdgEmIim-g&^CZEr*I{Vl?Z!m;PAh;ls1b#qF-UtNdDwW& zKleU6_wYkmVhXrvt}Yr_xC_P{C>rEzI^8?NQ3i)+OmiyWpXB&V0 z`J|Xw)u9`i&jeDVJAN?A#_ID;(Z)p(T|&QJJgfFjVBH_yieVF)BKe#_o@(taUt&aH zXJ_~s_(WC5;^u0%DMk3MfiPEfw7Zo4%~>ZFu~%8Z9 zpNYg+yEp{W3o-X392wZ@!a2s*;1h2LrSIi=zSDOslG`5fgtE{Pu1j{bb9yO|6Ml1w zEmV}QJz<~q*Eq(_g$d=ORy`eOj_>Mgw0;%~se8_`S5A)`q?K?4(piZiHY|R+C1`ii z2KRuI`Utp$Kc+5m0JcdaN z|N5kR>OMsVZ|E&)Bk6Qlg7I`;xQ;r_M*7f9Te}!n1gG@I<8Svv6Zn2y2aJc&am|vU;FC&&@($+)POY|#bU>DWjv7wW@WkD?w z_FpYbv^800eI_-_Gs^}mM%H`l4M6bNKR=c0WZ6#L5N#-LX`}FJYHe;+`Ie0@-c$)S zA4Lpu6TQ=R1J}Ge7yI7XlFLl(fE}cI^u#@p*JWx^_|>_QT-hyWp}eyT*(1d3lL%Jg z(BeMwc@0i>s_csy5hLHJs27vF`maRd3$qOs_EC{8FCf(*Na5bMt$*E!H zdX_Py)3feNSW+pO+;@#P6+6%m`matrB%w6LL?apBiFUGjzqwLw=c{G4yZ#n;>}~lZ zt1v?N(Y6=4tVPH@cH9WNBC#QnLFl8<1<|Fd_%xN z^5j#dxLxygz>k>tk!e6C`(ZALy+*C!t^15jbANDks=TB8U!(4u)IVah0CBSsv6$L7 z1^Fp>j-5CznQ<V((JB}u;Jbfm$Ldn@(&X9adTOt!6Tsvm*l z&3BiWmZ1zj;OJS~xy|XjYfpI4guSZ0+euz=tGV$oa}>jy7xpHkt4x=^lb>0PVyfk0 z6ZZo@0+qF$(Jo)ZdQ@vur9NcknH79mH$Df%@Nq0>;LI41x>Q+gVz`V0zNritmK~P` z4Sv_ezlb5O;j#fQ)O4eM(ARR})U3WPEg*ms=OJ4pfJ6w4GOONG`XdbcBMM_;UCTY_ zoLVx-=Siv34!2h7Bj0|{*=*CSF_B=Wpn=p3THOtB{CPJV;r;prM;~HqZ=xxad7O5+ zs`kNX%#q^fkqD3k5u2T%>>;fSemIwi$KtnDPM0G)PspEU=2`BOpqtvbaq)Q-wUE{0 z+w}VrF<_2@k0~_@PU7vaUj3M~@M$W96Mb-djN4aBJRDNHcPHpqH*-vPLJd_fhy2K% zq%uVEW8a8v$FyjsC};1SYJ&R+=w#8qI2Cw$k1>O&=mzdB_sbUD2RaGgN^ebH8LfBhikSm|?>p_w^a2s%Sd5qYh*CxC2UKU?mWeyb zdWO9W#c}qy>l)eZ6dz&J9}p1DCvxMbg9{ryX|FpSh8SgKQ^3Ks5g!dyX@x97o|R(W)9FN;fJ7e^&XPTVtb(}EFnR1 zT0`>fTq9Nn2yQMd%`fPzy6l8*Q3*-0XqCW1o*thB4GqweE%EDtn0TMgZ%uElXdge! z<}L`muMymolIhBHsi2$9T^#ntPu0-|!6$F3 zl)BPV9#W40ZMDV+p|bD)fGZqplh>~J6y$lnkzGOrxY<4`JsR8q=TY>DTn)TZ%X8raPm(web} zO-3C#21Y8?8+~^Ta8YZjPL`zhcUH-p?k<>2`1yN#&+-PMI_oeE)~h>q@hv4{&DQzYir=Y5h^hO5BKF!Hl3 zdS{)m@RTq4m|Ub}A;N_EGHq?NJ?2ujoQXXww4TnkfPI}D?Pr0Hd!xYggMBU<0STwo;|rmlM5CO;sjdcS+sIO4!YKD#^heF~jmLjS+wDRt%NRL>)#Tz1wI5a$u)xe~L=#|>Ru`~eb3UovMIT3(>C1jCM=9)Unl>S~6YB{(jtkGOV(58u52r<7l}Xth<(vdQo+e|BFu zZ}FtcJv_)gcF$wk6ihBAyLOK15n4`n+FQ0T3Mt!`y|QNg%F5`l-)Ga%EaAf$%Ab=5}b75SkXcm zqb?}5S`^VD$i%`K^5albh3HeUbzlYCM~QV@;fPctnJLG-vn~ z6LNjj*D-vVHs-Wwv8bBvgF4aTr^Wd2hf}33jg3+U1yaHsA%sXDLVs^e8bVooNcFT& zqJhp`N}BHu0-h4Y#6ZbQ#=OJ37kYj@OU5V21Nr+$!_iP7{4!$xA@OO!IA|2tj)luD z7bKP3ccrbR`C2Layk4sLFm1^I?O-3e+uaXRFitApj~YcAyB6t&@Qh%ue!8YO^edW% zvhIbS_t~)`qa&f(ccCI0-?jB)HTGd>lF!ecx3%|HR%;&~h&oQha5|o4+Br@oTmJ6S zv{ML6o&KWXB?A2n9tJ(&vg)FP9HJMx^A&C?-AQxweW-dG_x%p!cI^p@jbFVARGo3PJ4>6R5%O5*N5<@nV7PiO|b4!_Nt0C}nF+rqypw}-}qOy*cL()r0 zJ={ov$^Tf;Nhjj)ne^t+?p>fohs{1-BQAO;IfVn-q_@FB)w za<>*LDrA4%7{a&M$ll$9_(g?%66O@PxdD@Nwck8XyGM*&2e|1J9KYAQ!fW2XEl8{d zFa!B03yM|W#PLgZ=#IjW=Vt9+AW2q7@7q8ud z1hz!67}c)92cwpt`xB!TpTXL)Z;IV)`P+)7(Myj7qc@~qMSsM*#ZC>um4*~bB!>#Z zZfDCdRuQ}`U<`vFh&eTztmL3{Er2u++>L5<9C*7%CVC)&S)CDs7fJ_VO?G03_|^yj z+?zHa@f0e(>4A+=uj}rnB0b9@+1g{=>VO~3_=`=?1s!da7hV)}Fr|<4LlfnoEKNkq z)A;hG5(V%>OV@lscO6Y=F6|pIp$04YA)w)x<81X6NBgxWK5kRCdAp^KqxGMZx3LVJ z1ur;@J(rSeLjc9ZfGs%|GDAmsHRRXk8rk;^j-s509rz&INKvN6AKyA)Z1qROe#g{x z2gJLax7fRfg|TDZ-=^UX{i-KL7T+2aY}y6Brc_bV3ntSfB_)B5avT@a0l-zhuH$$* zY2Pah(fUX3LhSIiSi8blIeez`DDi@mBugSLcQ3QOWvwZ64 zooO!By)p{#_`Z0o{@&*;dC|KO(Wr4|{`6pG>9t3YH_XycX@|Jl(Q~~h z^;uj_6lY0P%WVrPGOj+eVfkl-^zIMTQ)Khu^$lb)ri4~0Q+X}sZ7yrtbIIa2ipya+ z)I&u=cXUXvb_Fl@syx?cQ=pPXS2o*OI)ojp0XKOVf8j}7TfPJHW=S2nd$kGjs5?_0 zmzbWJ&g`Jua+*h4TZu8ullv7pkt}|T0C)>(FQ^qPOQ-PTwZ6J3cFeQ+isUv;XL^`G zoMAyY?A;M)j*M!Rfhe!=n#;2sM1+y9-e>7i@h76vCY?>Tjc+@y&f61+)HE&4Pb@Uc z=%z#Le1G3My-|~%xxVlkQ(hQ;N?o0BW;yfsC5zaj&tU?*PjiBU@4c5N-9YB&)|D^g zEyIPn2yj4Wafid8SlDnJ>oI}G8XmlYCll9J`dGbiXoIBwR11E5=IiLo^I_^cS6JfN zl17wjCgihLk9BB)087>k(u^mlfF+fcC@~##pXPP^(^Z>lyp11`j9-#Zf6=}Ze7U)sP`_5A&j&)4 zqJu@=*JDI}t51SzZ#1|d`nO6j!dj_;H_y>m}Vv}^o!W|~fYX<>IetA5|=pp?9 zsg;p|T6G+Nl1h|>BHf3Fy#TWDc0gi-buHph>1anAG9C2&ICiM+8`o3k=yetT8vV)m z@)q7tl{Mi9RbIQ#iY}3)e}AnDotA^6OYSBLr8_p|2y2FN#HVQNb-S%y(~Z-sb?6a6 z%P7Hw_e6w^ggx#R3yK+03BeE7DJMeF5<5jp|Fr$c!sqx6ZtK(Fi2+VcD2jVB6I z)R;K`FXXegU~2l`Nd~3Aju)w<2ocq4d034HVC>&xyot+dh%?7so+qh7 zS&pl&#F;{uH&mW#>0U;J-l!rOp=GliZy>mSxQ1-ZkFDzlTju#hO^t@Rr@o4Y>GO|53Z?6$v7^im&oVPE1KMA99Qd%JrVw?2Qq4s13E`#a$2Hx7yJPY+OAFX)?N(QYvr4;gkN){hnM*>hi2LMXi^PT)} zr^Vo&`Wrj>9rjF@I04`f6OEuZ9NGw%;}#)DA90vfKxQWrmntyN=g7A#Kx+_`L@&p0_vVuBLEWl_*JvFTB(k;i;|F^I@9>|q}j3Z>-nWc$b$O+paOjDLnC{OM} zUVEzHMozWD020lV2VGCQIWL?9Id#3xk}?4neY`!ryA5;!&w}$QjiPvgI{cqyQVHHZ zn2W5L3n%rOA;d)x2SG0rDE4&~iRN!!7R{V>Z-D{azr|$T|7omIobLuYvh|1>C+0lnR zhk4jMGv`%Rj%qs49V15On%VYh4)1eg;XP@4!5Bj&-`lt~#n4VF;Ckx(Z?TB6Veefs zCNPPe%58dOuU6C!n=O?3NFz``H7G8Id@80u5(p(Y1ucK~7$|z|7{^Dv$1J1;`mwpW zc?al+bXy`-u^q3gHnTkb&j?^Iw8Lr05kQ9M%i-TnnM1e!t^eCK_-Vij6pXn9PnEV) zQ8QIgEQg&uzp}4OiKLl5qx22GJe%`w$8}QXG2gJl-7U0UOapw^e;4&l=%cVRz#+xf zg#Gq{6+PVkPPwkxO2@OLUP??9fj}i_%$~WwBK{Gzk{$>iGNA<*W;sw|GcLlR=(Pu4 zJWDn9t*2=~Lt9*r2CT3I`9l^o5Z!=9-Kk%Bso zk;>lvPp3l3-f;hV&rRBox3jeM?VfrJ6jG~5OSzT8|1$~;^!`lKu4MjUpx}6LB0fl~ z6nn;)GOc6JB1|#X0giABt$hW`mbVLMP_Lg|&b^9kT0_aHPpy8*%d+?XA{$|1VPP?n z`2X2Pfk9?;W`;1n*qs1x0OVwU9|?}0nSe$_6Th;9TNr6B_PJ%`ZAsND*+;*Ex`NSR z-WP&}q4gg>eLC~BvdVh3Ly~Ul`TVc%{=29?kk;Bf*!s)5ad`-AW#biB`q6KLM;e3z z%O)xiMy)as)lQ>~yg;&ps*8fpURNItk_&0JniPeK07@an0-=()X#Ww_qv!9X)kO?t z{<*@}WzdY5pWugeDPbIB7uDJ)T!e2+f(P@6b}F=K*995lers|}7YKB&*~}xbJ)%8{cUSZ0Ho7{cp(Xz3t|)vVOcm0 zj6H7F!-Na7KBs!Y{t$wlY5}d&J}*xjGGm3PcJ4H9y$w)sDP~oM3^$|$5Ws&OgM=q& zV(f)N;{|^G9H#ktb##APZ1Rz=p=^yjZi)KiikZEFh%|I?aro< zUq`bcJ0HLoM@xV3)BM$YGATBCeDmCr{M6-Op82&enM4u7n)81c*HJYF`u>124`Hhm z7!8b~n{X0Q_{S_aJc{TiMjYBsH>)Brd5m}Bg7XLP@qGDs79smnyp{0xo5fw8AROtQ zya2qCflu?%N8)UAMg1mn~ znk*xiOVq?&o3Cd%$PktV;nva-7lbTFa@*A5E4bHxan}D?SasRav9YnlH{pfNfTmX# z?;B9zd->6*aojR@&2^VS>$NDi{qA3xn3bNM zp0yFRvu(=pIE*QxtNg4gq5TxL=e?z;v!`EJu8VBHN zz8Ww7P=O}-Xjaovg7f7DzM8EDo+3e3v@@ju!|g^+LqkIvL+bzeO!Wx1>9(*l zzoDauy;wM5LF@CEsCKmddl+Al`N$kI{M!5oMG*3UkxhIy3#QJz!l4FbFns~#8F&YJ z#D!jC9hPYp@x41A!~)?iR1W;(#S7#B|Cp`_7(%eBTeM_$2;B{AeDG5Xc{C5h3No&z zZSF0wkqCXm9~JGKsBOu9#c-ixm3I8__yF4Dw5!LuB&%h!AfBBL2hxskE%ktafbK3p zgm@UhtX$T-Q@Q#7`6{7%pz^bZO8_fR_`^Pni*dNAhx`L2xPq3GKm$23>DZe6p+N^+ zF1sYoeS`R$MhA)yJ0%D^x-e~VDamAR^fv!1TQ?{{QM>wn!bn;E4JA$lC=&l`P|)gG zp2XB84L4z)j2k2O)l2Z8$fzJ|XLpd?IK`m|v3b)$<@2f*1Hn21U&N|iAzQK)? z5UgcQp%ez5M0#+MQK(d1VqU(s!EF*)kp$9Voh47bUnEngt$X>_?vqmc*{>b(H&s<3 zr_}&VgRvA$PkPrl{-2QPv+gwy2o8tQk)4GyQJ!->^!6S(IwhGWKAe5)hn{d$vz-?gmy zzwr);ct#M=nccC~%nM-F;8(=|3aaSg)wHjr8udF2;+#Iv;E&3_<|`9KwoF?^N+^#x$Y- z9iw^Uub`MSrs9>0`maJt;V`r5@cnLPhZ!=+e4T2@p-MR5+lScU;e?^{Yy3C=@ov0T zn1ih;crr)%j<(Fs&Ef5qGeRe#calBZ$Zz}gksKdt;yy}yw zm|Y*L+P?-nSPUB}Xa&Hh6vpwV$3s!!tA_S6GvQ~y6MO{rLy+VgS5W^(;@ApOiIMiz zM!@MG@Nu8?jaSDLZ>k*A_X!_i#j!9=Rh;OXy#wqHcn)uE0Sv^avWpE*WrSYrX@OAQ zpnW%T9U~El`pMI~icl!jLgBj87+~-7Mq#s8L)>C|`UeL8NkUmD*{~naMFDEaw-N0d zukyG?4)-bdHNQEJL@9zDV$>t%YgBGm-d(Lp2v<6#L23K28xBuRp;Cf5XDUD=^i;z<}MDnrz=H_x$Wi{`Dz%t-Gl}hvsBt#f@ z)Pq?(-RDmNWk!+x`3xlW=iWK;-m@pxA9?;$C;vTt94^pDZ-JC^0U(Xr3Jk;N&DloP z6Ze!5dC<(f#5(X4$`kGRX3*d*XO}l_<6B6$1|o=yV*NPvzkQjqQK=NiG*+PPkcjp~ zj7m*Y*(@z`cK=Lj9?B>`Y zY}>;EsYxrzM@pP3qgBFdGMMoQ&B-7+&fGU6wgMI_FMqG2Fhejq>CW1gxc$6=NbMod zpANeov^=p3)p3v%adyhcM3$=xHT~X=e9f%a>&ro6UG)VkZh?1-Y^lnXd!#j#3wt4#%Ba;w`w&_RqbsMra`iOD+9> zopuED(SzBRlkc&>xDY1KyA5@v(d~nai3)iFvw8@YDb;KhGmDoZWw12&Os^T({W_Js zXR<*}W;`$#l?b}vSq`gdmFH8}!X#o$V?YzDNua_H1B@0Ye>HLngO`%z3!+M6MmjvB z-0xUg%1cQ6>&`2{`I8^cUIHO}al|M4XT;)|Hg{OTWzsANbR|Rg_Dyryi6qb@L;?kt zschd<|AT3hFWAT#URxT(1*pG|Ol#p`F{J9)^zk`4OLagRYR$|%WUK_;+Sg&V2}_#o}UN}RS&N+p^i^x3^1KW7gc>33y2m+JE7p8#2r z^F$zd#jF2hZq$NMk5cwcAsRPLmx@544}s*O z4Lu8KN2HBpy*^qQhm{8p!0!oTHhla~LI$E>=R}^Sc0}Q)-A9^?hz->P*NRX?rT^(h zurY^%`3VsEcGd^QKW!5?^Cc@R%ChihLrRghi3Jyb`x?Mq`@zODy>z<`n%(R0?&_b5 zvz>^GNgHpwsUJT?aN7yN^Na|z0IcXRy~wDY?5HiM`v4{6ouREK$QE`6Y(|FpytIhu zoc2rn5kK7XVh{WKrYg+^1s-_yChN*>CzPG+wQzSt`|LfUDyNqn0ctUJSnK}yN1)Q$ z%m3)VHr&B`+h6j91p80wa!Ye_pR#NJJ1mY9Ao%+z-m?cRJ#)Y-$K(O5ov;_PGMMF! zwLF?!x;J2PTU}%Txwn@vViqam%2lljD=If=DMx)oh^jdVoIffV`_S&NXQCg19;#?f zm=!H(hoAD(!%`26#0t8NV(?0Wh%|!EwLREGtG8+P0O#z&gDmez_a9a) z_w9%znOGglk$%vV$U5=L=*5qx&!Q?14i4ynCRp!Mu6q2NxB#_x0G8|TPU=AH?Cjn= zc<=yVPDpEf|9*S6!OL<2AiU27?HMWrc%QwtsLI8;w!YHlLb5*nuH+`BURI$rGA1i0VmUm3T#|bMPcR}Js z<$!M&wwHQ|PhaVCcx`a!```*pQ@GTb&?3r@_Z5-wGY$ia1w(Y51lI&5G))lkwpTm( zo}fXtaqQTWyS56$MQ^ENH0+=pk8fbzDykPXvv&6xmMMC5Zr@D4WdXePn5lkd(fsjz z&!D0yJ`F%ydwfNc(e7%2o0nf~9QWK0zyrVu{?@|l+sUh4XM3VU zW_zu6DCDa-2cpmc6|BC!-s(h}<@e={WoGZrZJI7>8~IH8+LMrsLYWA<3?X`t5I(fj zNl2-hks55JN{Ue&UJv^!I5N27Sy1kfj5=H!h?{WW5>^2c4CJGGMI7iYvE-}-=9hAP zgD`vZ1(dp56DY3*Z6{^gA6%-IJTB~zu~WHuOQaXqHJj9s6>$;1BKQSQ~0>PjOl!SYbucPJY#j3n=hGvZk%_sfm796HE$wii7d(FQ{`pD0 zh5Nu~_xl*3Y91DS14Yu5TVKtL6v9gnMPI#_`t^T%myjuSMPN@k{=28U=6)u#8CYv6lYV`Zffkh=cP_P= zvkbWK3&Nt|`h`#deUhqNYs=B)7yXUfQsXMHoC<7i`0k2vw{S*^OPI;*m97m2*lF+p z0MSv=5E^$981U12_`SJ}arH!d^p2%{8x z^u^0D`+md1Wluh&CtnxU6vq2Ss@QRDGuEWHq#Nw2y0*2RFy4s|wsuhI+Dl%^*do39 zVMfKQr3_Q|3WJHXbl45EifHLn{epiIm!gz;r#g9A;&U2EFW;O( z%Ji1fo0p0AG|$uDo2;)eR#D;k^a|^XmI|YcPWeUO{(i~xG@mXXp8QDzNdrT#fpS4E zAFnsRmy7R<`Y`gP{DYBGQ~7j~k@FB4yidRe)= zkH_lLUrMGhPs`;Q&pYMsWqH1wIQcZmpEQs(FgOjA19pAI@nQY(3NJ-_lX>|-d1}O` zk%lCb-^cT^#Fwdo^wKU`HsL n!+g9vPrsbG{Pbw($dmMNUtIx2+~~=(o%|& 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 Date: Wed, 29 Nov 2023 21:59:16 -0800 Subject: [PATCH 16/37] perf: initialize support for secrets customization --- Easydict/Feature/Service/Model/EZConstKey.h | 3 ++- .../Service/Tencent/TencentService.swift | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Easydict/Feature/Service/Model/EZConstKey.h b/Easydict/Feature/Service/Model/EZConstKey.h index 3f0a2f65d..0f041f01a 100644 --- a/Easydict/Feature/Service/Model/EZConstKey.h +++ b/Easydict/Feature/Service/Model/EZConstKey.h @@ -32,7 +32,8 @@ static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZBingCookieKey = @"EZBingCookieKey"; static NSString *const EZNiuTransAPIKey = @"EZNiuTransAPIKey"; static NSString *const EZCaiyunToken = @"EZCaiyunToken"; - // static NSString *const EZTencentAPIKey = @"EZTencentAPIKey"; +//static NSString *const EZTencentSecretId = @"EZTencentSecretId"; +//static NSString *const EZTencentSecretKey = @"EZTencentSecretKey"; @interface EZConstKey : NSObject diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index c1560c9e5..dc8b6dcc7 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -40,15 +40,25 @@ public final class TencentService: QueryService { //MARK: API Request private var apiEndPoint = "https://tmt.tencentcloudapi.com" -//TODO: Implement user token -// private static let defaultTestToken = "" +//TODO: Implement user SecretId/SecretKey +// private static let defaultSecretId = "" +// private static let defaultSecretKey = "" // -// private var token: String { -// let token = UserDefaults.standard.string(forKey: EZTencentAPIKey) -// if let token, !token.isEmpty { -// return token +// private var secretId: String { +// let secretId = UserDefaults.standard.string(forKey: EZTencentSecretId) +// if let secretId, !secretId.isEmpty { +// return secretId // } else { -// return TencentService.defaultTestToken +// return TencentService.defaultSecretId +// } +// } +// +// private var secretKey: String { +// let secretKey = UserDefaults.standard.string(forKey: EZTencentSecretKey) +// if let secretKey, !secretKey.isEmpty { +// return secretKey +// } else { +// return TencentService.defaultSecretKey // } // } From 3e67fe78ad35d827794cd8c7869f0b7a3401480d Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 22:27:50 -0800 Subject: [PATCH 17/37] perf: implement demo for authentication --- .../Service/Tencent/TencentService.swift | 128 +++++++++++++----- 1 file changed, 93 insertions(+), 35 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index dc8b6dcc7..272072a2f 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -7,6 +7,7 @@ // import Alamofire +import CryptoKit import Foundation @objc(EZTencentService) @@ -38,7 +39,6 @@ public final class TencentService: QueryService { } //MARK: API Request - private var apiEndPoint = "https://tmt.tencentcloudapi.com" //TODO: Implement user SecretId/SecretKey // private static let defaultSecretId = "" @@ -75,51 +75,109 @@ public final class TencentService: QueryService { return } + let projectId: Int64 = 0 + let parameters: [String: Any] = [ - "SourceText": text.split(separator: "\n"), + "SourceText": "\(text.split(separator: "\n"))", "Source": transType.sourceLanguage, "Target": transType.targetLanguage, - "ProjectId": "0", + "ProjectId": projectId, ] -//TODO: Adopt Signiture V3 https://cloud.tencent.com/document/api/551/30636(https://www.tencentcloud.com/document/product/1161/50430) -// SecretID & SecretKey + func sha256(msg: String) -> String { + let data = msg.data(using: .utf8)! + let digest = SHA256.hash(data: data) + return digest.compactMap{String(format: "%02x", $0)}.joined() + } + + // 密钥参数 + // 需要设置环境变量 TENCENTCLOUD_SECRET_ID,值为示例的 AKIDz8krbsJ5yKBZQpn74WFkmLPx3******* + //let secretId = ProcessInfo.processInfo.environment["TENCENTCLOUD_SECRET_ID"] let secretId = "" + // 需要设置环境变量 TENCENTCLOUD_SECRET_KEY,值为示例的 Gu5t9xGARNpq86cd98joQYCN3******* + //let secretKey = ProcessInfo.processInfo.environment["TENCENTCLOUD_SECRET_KEY"] let secretKey = "" -// UTC date in yyyy-mm-dd - let date = Date() - let formatter = DateFormatter() - formatter.timeZone = TimeZone(abbreviation: "UTC") - formatter.dateFormat = "yyyy-MM-dd" - let utcDate = formatter.string(from: date) -// UNIX UTC Timestamp - let requestTimestamp = String(Int(Date().timeIntervalSince1970)) -// Calculate Signiture - let HTTPRequestMethod = "POST" - let CanonicalURI = "/" - let CanonicalQueryString = "" // Leave empty for POST method - let CanonicalHeaders = "content-type:application/json" - let HashedRequestPayload = "" //这个常量需要对 HTTP 请求正文(parameters)做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母 - -// Components of auth - let authAlgorithm = "TC3-HMAC-SHA256" - let authCredential = "Credential=\(secretId)/\(utcDate)/tmt/tc3_request" - let authSignedHeaders = "content-type;host" - let authSigniture = "Signature=" -// Authentication header - let auth = "\(authAlgorithm) \(authCredential), \(authSignedHeaders), \(authSigniture)" + + let service = "tmt" + let host = "tmt.tencentcloudapi.com" + let endpoint = "https://\(host)" + let region = "ap-guangzhou" + let action = "TextTranslate" + let version = "2018-03-21" + let algorithm = "TC3-HMAC-SHA256" + let timestamp = Int(Date().timeIntervalSince1970) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + dateFormatter.timeZone = TimeZone(identifier: "UTC") + let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) + + + // ************* 步骤 1:拼接规范请求串 ************* + let httpRequestMethod = "POST" + let canonicalUri = "/" + let canonicalQuerystring = "" + let ct = "application/json; charset=utf-8" + let payload = try! JSONSerialization.data(withJSONObject: parameters) + let payloadString = String(data: payload, encoding: .utf8)! + let canonicalHeaders = "content-type:\(ct)\nhost:\(host)\nx-tc-action:\(action.lowercased())\n" + let signedHeaders = "content-type;host;x-tc-action" + let hashedRequestPayload = sha256(msg: payloadString) + let canonicalRequest = """ + \(httpRequestMethod) + \(canonicalUri) + \(canonicalQuerystring) + \(canonicalHeaders) + \(signedHeaders) + \(hashedRequestPayload) + """ + + // ************* 步骤 2:拼接待签名字符串 ************* + let credentialScope = "\(date)/\(service)/tc3_request" + let hashedCanonicalRequest = sha256(msg: canonicalRequest) + let stringToSign = """ + \(algorithm) + \(timestamp) + \(credentialScope) + \(hashedCanonicalRequest) + """ + + // ************* 步骤 3:计算签名 ************* + let keyData = Data("TC3\(secretKey)".utf8) + let dateData = Data(date.utf8) + var symmetricKey = SymmetricKey(data: keyData) + let secretDate = HMAC.authenticationCode(for: dateData, using: symmetricKey) + _ = Data(secretDate).map{String(format: "%02hhx", $0)}.joined() + + let serviceData = Data(service.utf8) + symmetricKey = SymmetricKey(data: Data(secretDate)) + let secretService = HMAC.authenticationCode(for: serviceData, using: symmetricKey) + _ = Data(secretService).map{String(format: "%02hhx", $0)}.joined() + + let signingData = Data("tc3_request".utf8) + symmetricKey = SymmetricKey(data: secretService) + let secretSigning = HMAC.authenticationCode(for: signingData, using: symmetricKey) + _ = Data(secretSigning).map{String(format: "%02hhx", $0)}.joined() + + let stringToSignData = Data(stringToSign.utf8) + symmetricKey = SymmetricKey(data: secretSigning) + let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map{String(format: "%02hhx", $0)}.joined() + + // ************* 步骤 4:拼接 Authorization ************* + let authorization = """ + \(algorithm) Credential=\(secretId)/\(credentialScope), SignedHeaders=\(signedHeaders), Signature=\(signature) + """ let headers: HTTPHeaders = [ - "Authorization": auth, - "Content-Type": "application/json", - "Host": "tmt.tencentcloudapi.com", - "X-TC-Action": "TextTranslate", - "X-TC-Timestamp": requestTimestamp, - "X-TC-Version": "2018-03-21", - "X-TC-Region": "ap-guangzhou", + "Authorization": authorization, + "Content-Type": ct, + "Host": host, + "X-TC-Action": action, + "X-TC-Timestamp": "\(timestamp)", + "X-TC-Version": version, + "X-TC-Region": region, ] - let request = AF.request(apiEndPoint, + let request = AF.request(endpoint, method: .post, parameters: parameters, encoding: JSONEncoding.default, From e1057498da9e7fc2eaf6df7853edf097314f8a0c Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Wed, 29 Nov 2023 23:08:03 -0800 Subject: [PATCH 18/37] fix: proper json decoding --- .../Feature/Service/Tencent/TencentResponse.swift | 12 ++++++++---- .../Feature/Service/Tencent/TencentService.swift | 5 ++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentResponse.swift b/Easydict/Feature/Service/Tencent/TencentResponse.swift index 7a6279ee7..6c09b6b35 100644 --- a/Easydict/Feature/Service/Tencent/TencentResponse.swift +++ b/Easydict/Feature/Service/Tencent/TencentResponse.swift @@ -9,8 +9,12 @@ import Foundation struct TencentResponse: Codable { - var RequestId: String - var Source: String - var Target: String - var TargetText: [String] + struct Response: Codable { + var RequestId: String + var Source: String + var Target: String + var TargetText: String + } + + var Response: Response } diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 272072a2f..08a78511d 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -78,7 +78,7 @@ public final class TencentService: QueryService { let projectId: Int64 = 0 let parameters: [String: Any] = [ - "SourceText": "\(text.split(separator: "\n"))", + "SourceText": text, "Source": transType.sourceLanguage, "Target": transType.targetLanguage, "ProjectId": projectId, @@ -182,7 +182,6 @@ public final class TencentService: QueryService { parameters: parameters, encoding: JSONEncoding.default, headers: headers) - .validate() .responseDecodable(of: TencentResponse.self) { [weak self] response in guard let self else { return } @@ -192,7 +191,7 @@ public final class TencentService: QueryService { result.from = from result.to = to result.queryText = text - result.translatedResults = value.TargetText + result.translatedResults = value.Response.TargetText.components(separatedBy: "\n") completion(result, nil) case let .failure(error): NSLog("Tencent lookup error \(error)") From e944ac3257a6eac270f2562a04d77c1c75716f71 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Thu, 30 Nov 2023 00:29:59 -0800 Subject: [PATCH 19/37] feat: implement secrets customization --- Easydict/Feature/Service/Model/EZConstKey.h | 4 +- .../Service/Tencent/TencentService.swift | 51 ++++++++----------- .../Utility/EZLinkParser/EZSchemeParser.m | 2 + 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/Easydict/Feature/Service/Model/EZConstKey.h b/Easydict/Feature/Service/Model/EZConstKey.h index 0f041f01a..c5fe96a54 100644 --- a/Easydict/Feature/Service/Model/EZConstKey.h +++ b/Easydict/Feature/Service/Model/EZConstKey.h @@ -32,8 +32,8 @@ static NSString *const EZDeepLAuthKey = @"EZDeepLAuthKey"; static NSString *const EZBingCookieKey = @"EZBingCookieKey"; static NSString *const EZNiuTransAPIKey = @"EZNiuTransAPIKey"; static NSString *const EZCaiyunToken = @"EZCaiyunToken"; -//static NSString *const EZTencentSecretId = @"EZTencentSecretId"; -//static NSString *const EZTencentSecretKey = @"EZTencentSecretKey"; +static NSString *const EZTencentSecretId = @"EZTencentSecretId"; +static NSString *const EZTencentSecretKey = @"EZTencentSecretKey"; @interface EZConstKey : NSObject diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 08a78511d..37b394685 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -40,27 +40,28 @@ public final class TencentService: QueryService { //MARK: API Request -//TODO: Implement user SecretId/SecretKey -// private static let defaultSecretId = "" -// private static let defaultSecretKey = "" -// -// private var secretId: String { -// let secretId = UserDefaults.standard.string(forKey: EZTencentSecretId) -// if let secretId, !secretId.isEmpty { -// return secretId -// } else { -// return TencentService.defaultSecretId -// } -// } -// -// private var secretKey: String { -// let secretKey = UserDefaults.standard.string(forKey: EZTencentSecretKey) -// if let secretKey, !secretKey.isEmpty { -// return secretKey -// } else { -// return TencentService.defaultSecretKey -// } -// } + private static let defaultSecretId = "" + private static let defaultSecretKey = "" + + // easydict://writeKeyValue?EZTencentSecretId=xxx + private var secretId: String { + let secretId = UserDefaults.standard.string(forKey: EZTencentSecretId) + if let secretId, !secretId.isEmpty { + return secretId + } else { + return TencentService.defaultSecretId + } + } + + // easydict://writeKeyValue?EZTencentSecretKey=xxx + private var secretKey: String { + let secretKey = UserDefaults.standard.string(forKey: EZTencentSecretKey) + if let secretKey, !secretKey.isEmpty { + return secretKey + } else { + return TencentService.defaultSecretKey + } + } public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { @@ -90,14 +91,6 @@ public final class TencentService: QueryService { return digest.compactMap{String(format: "%02x", $0)}.joined() } - // 密钥参数 - // 需要设置环境变量 TENCENTCLOUD_SECRET_ID,值为示例的 AKIDz8krbsJ5yKBZQpn74WFkmLPx3******* - //let secretId = ProcessInfo.processInfo.environment["TENCENTCLOUD_SECRET_ID"] - let secretId = "" - // 需要设置环境变量 TENCENTCLOUD_SECRET_KEY,值为示例的 Gu5t9xGARNpq86cd98joQYCN3******* - //let secretKey = ProcessInfo.processInfo.environment["TENCENTCLOUD_SECRET_KEY"] - let secretKey = "" - let service = "tmt" let host = "tmt.tencentcloudapi.com" let endpoint = "https://\(host)" diff --git a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m index 0c8d8b86f..cfcd9f8fc 100644 --- a/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m +++ b/Easydict/Feature/Utility/EZLinkParser/EZSchemeParser.m @@ -205,6 +205,8 @@ - (NSArray *)allowedReadWriteKeys { EZDeepLTranslationAPIKey, EZNiuTransAPIKey, EZCaiyunToken, + EZTencentSecretId, + EZTencentSecretKey, EZBingCookieKey, EZIntelligentQueryModeKey, From 7e224ee61895cb8007359f2cdb0b6023df223078 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Thu, 30 Nov 2023 01:02:25 -0800 Subject: [PATCH 20/37] style: format code Format with SwiftLint --- .../Service/Tencent/TencentResponse.swift | 2 +- .../Service/Tencent/TencentService.swift | 17 ++++++++--------- .../Service/Tencent/TencentTranslateType.swift | 6 +++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentResponse.swift b/Easydict/Feature/Service/Tencent/TencentResponse.swift index 6c09b6b35..fabb7066d 100644 --- a/Easydict/Feature/Service/Tencent/TencentResponse.swift +++ b/Easydict/Feature/Service/Tencent/TencentResponse.swift @@ -15,6 +15,6 @@ struct TencentResponse: Codable { var Target: String var TargetText: String } - + var Response: Response } diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 37b394685..14ee0e18e 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -38,7 +38,7 @@ public final class TencentService: QueryService { throw QueryServiceError.notSupported } -//MARK: API Request +// MARK: API Request private static let defaultSecretId = "" private static let defaultSecretKey = "" @@ -82,13 +82,13 @@ public final class TencentService: QueryService { "SourceText": text, "Source": transType.sourceLanguage, "Target": transType.targetLanguage, - "ProjectId": projectId, + "ProjectId": projectId ] func sha256(msg: String) -> String { let data = msg.data(using: .utf8)! let digest = SHA256.hash(data: data) - return digest.compactMap{String(format: "%02x", $0)}.joined() + return digest.compactMap {String(format: "%02x", $0)}.joined() } let service = "tmt" @@ -104,7 +104,6 @@ public final class TencentService: QueryService { dateFormatter.timeZone = TimeZone(identifier: "UTC") let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) - // ************* 步骤 1:拼接规范请求串 ************* let httpRequestMethod = "POST" let canonicalUri = "/" @@ -139,21 +138,21 @@ public final class TencentService: QueryService { let dateData = Data(date.utf8) var symmetricKey = SymmetricKey(data: keyData) let secretDate = HMAC.authenticationCode(for: dateData, using: symmetricKey) - _ = Data(secretDate).map{String(format: "%02hhx", $0)}.joined() + _ = Data(secretDate).map {String(format: "%02hhx", $0)}.joined() let serviceData = Data(service.utf8) symmetricKey = SymmetricKey(data: Data(secretDate)) let secretService = HMAC.authenticationCode(for: serviceData, using: symmetricKey) - _ = Data(secretService).map{String(format: "%02hhx", $0)}.joined() + _ = Data(secretService).map {String(format: "%02hhx", $0)}.joined() let signingData = Data("tc3_request".utf8) symmetricKey = SymmetricKey(data: secretService) let secretSigning = HMAC.authenticationCode(for: signingData, using: symmetricKey) - _ = Data(secretSigning).map{String(format: "%02hhx", $0)}.joined() + _ = Data(secretSigning).map {String(format: "%02hhx", $0)}.joined() let stringToSignData = Data(stringToSign.utf8) symmetricKey = SymmetricKey(data: secretSigning) - let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map{String(format: "%02hhx", $0)}.joined() + let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map {String(format: "%02hhx", $0)}.joined() // ************* 步骤 4:拼接 Authorization ************* let authorization = """ @@ -167,7 +166,7 @@ public final class TencentService: QueryService { "X-TC-Action": action, "X-TC-Timestamp": "\(timestamp)", "X-TC-Version": version, - "X-TC-Region": region, + "X-TC-Region": region ] let request = AF.request(endpoint, diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index ab01578d1..a13ea3a73 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -33,7 +33,7 @@ struct TencentTranslateType: Equatable { .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian] ] static let supportLanguagesDictionary: [Language: String] = [ @@ -55,11 +55,11 @@ struct TencentTranslateType: Equatable { .thai: "th", .malay: "ms", .arabic: "ar", - .hindi: "hi", + .hindi: "hi" ] static func transType(from: Language, to: Language) -> TencentTranslateType { - if (supportedTypes[from]?.contains(to) == true) { + if supportedTypes[from]?.contains(to) == true { guard let from = supportLanguagesDictionary[from], let to = supportLanguagesDictionary[to] else { return .unsupported From 06e9fb0eaff9d05ebfd8aeb7dd01c88cb6e89e85 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:44:27 -0800 Subject: [PATCH 21/37] perf: add self support language --- .../Tencent/TencentTranslateType.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index a13ea3a73..a767c69c6 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -16,24 +16,24 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") static let supportedTypes: [Language: [Language]] = [ - .simplifiedChinese: [.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .traditionalChinese: [.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .english: [.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], - .japanese: [.simplifiedChinese, .traditionalChinese, .english, .korean], - .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese], - .french: [.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese], - .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese], - .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese], - .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese], - .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese], - .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian] + .simplifiedChinese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .traditionalChinese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .english: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], + .japanese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean], + .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean], + .french: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .vietnamese], + .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .indonesian], + .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .thai], + .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .malay], + .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .arabic], + .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .hindi] ] static let supportLanguagesDictionary: [Language: String] = [ From e8baf87efcacd47fe03996091ceb3ccba430418a Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:47:03 -0800 Subject: [PATCH 22/37] fix: build error --- Easydict/Feature/Service/Tencent/TencentService.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 14ee0e18e..b35b10908 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -64,7 +64,7 @@ public final class TencentService: QueryService { } public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { - if prehandleQueryTextLanguage(text, autoConvertChineseText: false, from: from, to: to, completion: completion) { + if prehandleQueryTextLanguage(text, from: from, to: to, completion: completion) { return } let transType = TencentTranslateType.transType(from: from, to: to) From f03f9e7ed74e07a20ddf2c8af6516c564680b54a Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:50:04 -0800 Subject: [PATCH 23/37] perf(UI): adopt official name of Tencent Translate Co-Authored-By: Tisfeng --- Easydict/App/Localizable.xcstrings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Easydict/App/Localizable.xcstrings b/Easydict/App/Localizable.xcstrings index ba036c97b..c5e7f21d4 100644 --- a/Easydict/App/Localizable.xcstrings +++ b/Easydict/App/Localizable.xcstrings @@ -2187,7 +2187,7 @@ "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "腾讯翻译" + "value" : "腾讯翻译君" } } } From ec5bc26b6bf36024bce20a985b3005bcc3eb0348 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:17:04 -0800 Subject: [PATCH 24/37] perf: create headerAuth func for authorization --- .../Service/Tencent/TencentService.swift | 87 ++++++++++--------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index b35b10908..09de911aa 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -104,17 +104,18 @@ public final class TencentService: QueryService { dateFormatter.timeZone = TimeZone(identifier: "UTC") let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) - // ************* 步骤 1:拼接规范请求串 ************* - let httpRequestMethod = "POST" - let canonicalUri = "/" - let canonicalQuerystring = "" - let ct = "application/json; charset=utf-8" - let payload = try! JSONSerialization.data(withJSONObject: parameters) - let payloadString = String(data: payload, encoding: .utf8)! - let canonicalHeaders = "content-type:\(ct)\nhost:\(host)\nx-tc-action:\(action.lowercased())\n" - let signedHeaders = "content-type;host;x-tc-action" - let hashedRequestPayload = sha256(msg: payloadString) - let canonicalRequest = """ + func headerAuth() -> (authorization: String, ct: String) { + // ************* 步骤 1:拼接规范请求串 ************* + let httpRequestMethod = "POST" + let canonicalUri = "/" + let canonicalQuerystring = "" + let ct = "application/json; charset=utf-8" + let payload = try! JSONSerialization.data(withJSONObject: parameters) + let payloadString = String(data: payload, encoding: .utf8)! + let canonicalHeaders = "content-type:\(ct)\nhost:\(host)\nx-tc-action:\(action.lowercased())\n" + let signedHeaders = "content-type;host;x-tc-action" + let hashedRequestPayload = sha256(msg: payloadString) + let canonicalRequest = """ \(httpRequestMethod) \(canonicalUri) \(canonicalQuerystring) @@ -122,46 +123,48 @@ public final class TencentService: QueryService { \(signedHeaders) \(hashedRequestPayload) """ - - // ************* 步骤 2:拼接待签名字符串 ************* - let credentialScope = "\(date)/\(service)/tc3_request" - let hashedCanonicalRequest = sha256(msg: canonicalRequest) - let stringToSign = """ + + // ************* 步骤 2:拼接待签名字符串 ************* + let credentialScope = "\(date)/\(service)/tc3_request" + let hashedCanonicalRequest = sha256(msg: canonicalRequest) + let stringToSign = """ \(algorithm) \(timestamp) \(credentialScope) \(hashedCanonicalRequest) """ - - // ************* 步骤 3:计算签名 ************* - let keyData = Data("TC3\(secretKey)".utf8) - let dateData = Data(date.utf8) - var symmetricKey = SymmetricKey(data: keyData) - let secretDate = HMAC.authenticationCode(for: dateData, using: symmetricKey) - _ = Data(secretDate).map {String(format: "%02hhx", $0)}.joined() - - let serviceData = Data(service.utf8) - symmetricKey = SymmetricKey(data: Data(secretDate)) - let secretService = HMAC.authenticationCode(for: serviceData, using: symmetricKey) - _ = Data(secretService).map {String(format: "%02hhx", $0)}.joined() - - let signingData = Data("tc3_request".utf8) - symmetricKey = SymmetricKey(data: secretService) - let secretSigning = HMAC.authenticationCode(for: signingData, using: symmetricKey) - _ = Data(secretSigning).map {String(format: "%02hhx", $0)}.joined() - - let stringToSignData = Data(stringToSign.utf8) - symmetricKey = SymmetricKey(data: secretSigning) - let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map {String(format: "%02hhx", $0)}.joined() - - // ************* 步骤 4:拼接 Authorization ************* - let authorization = """ + + // ************* 步骤 3:计算签名 ************* + let keyData = Data("TC3\(secretKey)".utf8) + let dateData = Data(date.utf8) + var symmetricKey = SymmetricKey(data: keyData) + let secretDate = HMAC.authenticationCode(for: dateData, using: symmetricKey) + _ = Data(secretDate).map {String(format: "%02hhx", $0)}.joined() + + let serviceData = Data(service.utf8) + symmetricKey = SymmetricKey(data: Data(secretDate)) + let secretService = HMAC.authenticationCode(for: serviceData, using: symmetricKey) + _ = Data(secretService).map {String(format: "%02hhx", $0)}.joined() + + let signingData = Data("tc3_request".utf8) + symmetricKey = SymmetricKey(data: secretService) + let secretSigning = HMAC.authenticationCode(for: signingData, using: symmetricKey) + _ = Data(secretSigning).map {String(format: "%02hhx", $0)}.joined() + + let stringToSignData = Data(stringToSign.utf8) + symmetricKey = SymmetricKey(data: secretSigning) + let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map {String(format: "%02hhx", $0)}.joined() + + // ************* 步骤 4:拼接 Authorization ************* + let authorization = """ \(algorithm) Credential=\(secretId)/\(credentialScope), SignedHeaders=\(signedHeaders), Signature=\(signature) """ + return (authorization, ct) + } let headers: HTTPHeaders = [ - "Authorization": authorization, - "Content-Type": ct, + "Authorization": headerAuth().authorization, + "Content-Type": headerAuth().ct, "Host": host, "X-TC-Action": action, "X-TC-Timestamp": "\(timestamp)", From 93a91762413d584a8705f826df0b2fc1d5724247 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Fri, 1 Dec 2023 18:58:46 -0800 Subject: [PATCH 25/37] perf(UI): delete Tencent TTS in dropdown --- Easydict/Feature/PerferenceWindow/EZSettingViewController.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Easydict/Feature/PerferenceWindow/EZSettingViewController.m b/Easydict/Feature/PerferenceWindow/EZSettingViewController.m index ccc1e63a9..b171378b2 100644 --- a/Easydict/Feature/PerferenceWindow/EZSettingViewController.m +++ b/Easydict/Feature/PerferenceWindow/EZSettingViewController.m @@ -131,7 +131,6 @@ @implementation EZSettingViewController EZServiceTypeYoudao, EZServiceTypeBing, EZServiceTypeCaiyun, - EZServiceTypeTencent, EZServiceTypeGoogle, EZServiceTypeBaidu, EZServiceTypeApple, From d8849809a829ae95f1ed389f2d9c1fc738b1cf29 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sat, 2 Dec 2023 19:01:29 +0800 Subject: [PATCH 26/37] refactor: improve tencent sign --- Easydict.xcodeproj/project.pbxproj | 4 + .../Service/Tencent/TencentService.swift | 130 ++++-------------- Easydict/Feature/Service/Tencent/sign.swift | 95 +++++++++++++ 3 files changed, 123 insertions(+), 106 deletions(-) create mode 100644 Easydict/Feature/Service/Tencent/sign.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 9d2797d01..fb63fc16d 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -210,6 +210,7 @@ 03F639952AA6CFBB009B9914 /* EZBingConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 03F639942AA6CFBB009B9914 /* EZBingConfig.m */; }; 03FD68BB2B1DC59600FD388E /* CryptoSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 03FD68BA2B1DC59600FD388E /* CryptoSwift */; }; 03FD68BE2B1E151A00FD388E /* String+EncryptAES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */; }; + 03FB3EDD2B1B405B004C3238 /* sign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FB3EDC2B1B405B004C3238 /* sign.swift */; }; 17BCAEF72B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */; }; 17BCAEF82B0DFF9000A7D372 /* EZNiuTransTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */; }; 2721E4D02AFE920700A059AC /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 2721E4CF2AFE920700A059AC /* Alamofire */; }; @@ -643,6 +644,7 @@ 03F639932AA6CFBB009B9914 /* EZBingConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EZBingConfig.h; sourceTree = ""; }; 03F639942AA6CFBB009B9914 /* EZBingConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZBingConfig.m; sourceTree = ""; }; 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+EncryptAES.swift"; sourceTree = ""; }; + 03FB3EDC2B1B405B004C3238 /* sign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sign.swift; sourceTree = ""; }; 06E15747A7BD34D510ADC6A8 /* Pods-Easydict.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Easydict.debug.xcconfig"; path = "Target Support Files/Pods-Easydict/Pods-Easydict.debug.xcconfig"; sourceTree = ""; }; 17BCAEF32B0DFF9000A7D372 /* EZNiuTransTranslateResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslateResponse.h; sourceTree = ""; }; 17BCAEF42B0DFF9000A7D372 /* EZNiuTransTranslate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslate.h; sourceTree = ""; }; @@ -1952,6 +1954,7 @@ C4DD01E82B12B3C80025EE8E /* TencentService.swift */, C4DD01EA2B12BA250025EE8E /* TencentResponse.swift */, C4DD01EC2B12BE9B0025EE8E /* TencentTranslateType.swift */, + 03FB3EDC2B1B405B004C3238 /* sign.swift */, ); path = Tencent; sourceTree = ""; @@ -2366,6 +2369,7 @@ 039B694F2A9D9F370063709D /* EZWebViewManager.m in Sources */, 03D747432A07FB150006CD77 /* EZError.m in Sources */, 03B0231629231FA6001C7E63 /* SnipFocusView.m in Sources */, + 03FB3EDD2B1B405B004C3238 /* sign.swift in Sources */, 03B0230329231FA6001C7E63 /* EZResultView.m in Sources */, 03CAB9552ADBF0FF00DA94A3 /* EZSystemUtility.m in Sources */, 03BDA7C32A26DA280079D04F /* NSArray+XPMArgumentsNormalizer.m in Sources */, diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 09de911aa..a127260e0 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -7,7 +7,6 @@ // import Alamofire -import CryptoKit import Foundation @objc(EZTencentService) @@ -15,15 +14,15 @@ public final class TencentService: QueryService { override public func serviceType() -> ServiceType { .tencent } - + override public func link() -> String? { "https://fanyi.qq.com" } - + override public func name() -> String { NSLocalizedString("tencent_translate", comment: "The name of Tencent Translate") } - + override public func supportLanguagesDictionary() -> MMOrderedDictionary { // TODO: Replace MMOrderedDictionary in the API let orderedDict = MMOrderedDictionary() @@ -32,17 +31,17 @@ public final class TencentService: QueryService { } return orderedDict } - + override public func ocr(_: EZQueryModel) async throws -> EZOCRResult { NSLog("Tencent Translate currently does not support OCR") throw QueryServiceError.notSupported } - -// MARK: API Request - + + // MARK: API Request + private static let defaultSecretId = "" private static let defaultSecretKey = "" - + // easydict://writeKeyValue?EZTencentSecretId=xxx private var secretId: String { let secretId = UserDefaults.standard.string(forKey: EZTencentSecretId) @@ -52,7 +51,7 @@ public final class TencentService: QueryService { return TencentService.defaultSecretId } } - + // easydict://writeKeyValue?EZTencentSecretKey=xxx private var secretKey: String { let secretKey = UserDefaults.standard.string(forKey: EZTencentSecretKey) @@ -62,11 +61,16 @@ public final class TencentService: QueryService { return TencentService.defaultSecretKey } } - + public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { if prehandleQueryTextLanguage(text, from: from, to: to, completion: completion) { return } + + translateText(text, from: from, to: to, completion: completion) + } + + func translateText(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { let transType = TencentTranslateType.transType(from: from, to: to) guard transType != .unsupported else { result.errorType = .unsupportedLanguage @@ -75,108 +79,22 @@ public final class TencentService: QueryService { completion(result, nil) return } - - let projectId: Int64 = 0 - + let parameters: [String: Any] = [ "SourceText": text, "Source": transType.sourceLanguage, "Target": transType.targetLanguage, - "ProjectId": projectId - ] - - func sha256(msg: String) -> String { - let data = msg.data(using: .utf8)! - let digest = SHA256.hash(data: data) - return digest.compactMap {String(format: "%02x", $0)}.joined() - } - - let service = "tmt" - let host = "tmt.tencentcloudapi.com" - let endpoint = "https://\(host)" - let region = "ap-guangzhou" - let action = "TextTranslate" - let version = "2018-03-21" - let algorithm = "TC3-HMAC-SHA256" - let timestamp = Int(Date().timeIntervalSince1970) - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - dateFormatter.timeZone = TimeZone(identifier: "UTC") - let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) - - func headerAuth() -> (authorization: String, ct: String) { - // ************* 步骤 1:拼接规范请求串 ************* - let httpRequestMethod = "POST" - let canonicalUri = "/" - let canonicalQuerystring = "" - let ct = "application/json; charset=utf-8" - let payload = try! JSONSerialization.data(withJSONObject: parameters) - let payloadString = String(data: payload, encoding: .utf8)! - let canonicalHeaders = "content-type:\(ct)\nhost:\(host)\nx-tc-action:\(action.lowercased())\n" - let signedHeaders = "content-type;host;x-tc-action" - let hashedRequestPayload = sha256(msg: payloadString) - let canonicalRequest = """ - \(httpRequestMethod) - \(canonicalUri) - \(canonicalQuerystring) - \(canonicalHeaders) - \(signedHeaders) - \(hashedRequestPayload) - """ - - // ************* 步骤 2:拼接待签名字符串 ************* - let credentialScope = "\(date)/\(service)/tc3_request" - let hashedCanonicalRequest = sha256(msg: canonicalRequest) - let stringToSign = """ - \(algorithm) - \(timestamp) - \(credentialScope) - \(hashedCanonicalRequest) - """ - - // ************* 步骤 3:计算签名 ************* - let keyData = Data("TC3\(secretKey)".utf8) - let dateData = Data(date.utf8) - var symmetricKey = SymmetricKey(data: keyData) - let secretDate = HMAC.authenticationCode(for: dateData, using: symmetricKey) - _ = Data(secretDate).map {String(format: "%02hhx", $0)}.joined() - - let serviceData = Data(service.utf8) - symmetricKey = SymmetricKey(data: Data(secretDate)) - let secretService = HMAC.authenticationCode(for: serviceData, using: symmetricKey) - _ = Data(secretService).map {String(format: "%02hhx", $0)}.joined() - - let signingData = Data("tc3_request".utf8) - symmetricKey = SymmetricKey(data: secretService) - let secretSigning = HMAC.authenticationCode(for: signingData, using: symmetricKey) - _ = Data(secretSigning).map {String(format: "%02hhx", $0)}.joined() - - let stringToSignData = Data(stringToSign.utf8) - symmetricKey = SymmetricKey(data: secretSigning) - let signature = HMAC.authenticationCode(for: stringToSignData, using: symmetricKey).map {String(format: "%02hhx", $0)}.joined() - - // ************* 步骤 4:拼接 Authorization ************* - let authorization = """ - \(algorithm) Credential=\(secretId)/\(credentialScope), SignedHeaders=\(signedHeaders), Signature=\(signature) - """ - return (authorization, ct) - } - - let headers: HTTPHeaders = [ - "Authorization": headerAuth().authorization, - "Content-Type": headerAuth().ct, - "Host": host, - "X-TC-Action": action, - "X-TC-Timestamp": "\(timestamp)", - "X-TC-Version": version, - "X-TC-Region": region + "ProjectId": 0 ] + + let endpoint = "https://cvm.tencentcloudapi.com" + let headers = tencentSignHeader(parameters: parameters, secretId: secretId, secretKey: secretKey) let request = AF.request(endpoint, - method: .post, - parameters: parameters, - encoding: JSONEncoding.default, - headers: headers) + method: .post, + parameters: parameters, + encoding: JSONEncoding.default, + headers: headers) .validate() .responseDecodable(of: TencentResponse.self) { [weak self] response in guard let self else { return } diff --git a/Easydict/Feature/Service/Tencent/sign.swift b/Easydict/Feature/Service/Tencent/sign.swift new file mode 100644 index 000000000..8c557a61c --- /dev/null +++ b/Easydict/Feature/Service/Tencent/sign.swift @@ -0,0 +1,95 @@ +// +// sign.swift +// Easydict +// +// Created by tisfeng on 2023/12/2. +// Copyright © 2023 izual. All rights reserved. +// + +import Foundation +import Alamofire +import CryptoKit + +// Tencent sigh header, Ref: https://github.com/TencentCloud/signature-process-demo/blob/main/signature-v3/swift/signv3.swift +func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: String) -> HTTPHeaders { + let service = "tmt" + let host = "tmt.tencentcloudapi.com" + let region = "ap-guangzhou" + let action = "TextTranslate" + let version = "2018-03-21" + let algorithm = "TC3-HMAC-SHA256" + let timestamp = Int(Date().timeIntervalSince1970) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + dateFormatter.timeZone = TimeZone(identifier: "UTC") + let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) + + // ************* 步骤 1:拼接规范请求串 ************* + let httpRequestMethod = "POST" + let canonicalUri = "/" + let canonicalQuerystring = "" + let ct = "application/json; charset=utf-8" + let payload = try! JSONSerialization.data(withJSONObject: parameters) + let payloadString = String(data: payload, encoding: .utf8)! + let canonicalHeaders = "content-type:\(ct)\nhost:\(host)\nx-tc-action:\(action.lowercased())\n" + let signedHeaders = "content-type;host;x-tc-action" + let hashedRequestPayload = payloadString.sha256() + let canonicalRequest = """ +\(httpRequestMethod) +\(canonicalUri) +\(canonicalQuerystring) +\(canonicalHeaders) +\(signedHeaders) +\(hashedRequestPayload) +""" + + // ************* 步骤 2:拼接待签名字符串 ************* + let credentialScope = "\(date)/\(service)/tc3_request" + let hashedCanonicalRequest = canonicalRequest.sha256() + let stringToSign = """ +\(algorithm) +\(timestamp) +\(credentialScope) +\(hashedCanonicalRequest) +""" + + // ************* 步骤 3:计算签名 ************* + let secretDate = date.hmac(key: Data("TC3\(secretKey)".utf8)) + let secretService = service.hmac(key: secretDate) + let secretSigning = "tc3_request".hmac(key: secretService) + let signature = stringToSign.hmac(key: secretSigning).map {String(format: "%02hhx", $0)}.joined() + + // ************* 步骤 4:拼接 Authorization ************* + let authorization = """ +\(algorithm) Credential=\(secretId)/\(credentialScope), SignedHeaders=\(signedHeaders), Signature=\(signature) +""" + + let headers: HTTPHeaders = [ + "Authorization": authorization, + "Content-Type": ct, + "Host": host, + "X-TC-Action": action, + "X-TC-Timestamp": "\(timestamp)", + "X-TC-Version": version, + "X-TC-Region": region + ] + + return headers +} + +extension String { + // sha256 + func sha256() -> String { + let data = Data(self.utf8) + let digest = SHA256.hash(data: data) + return digest.compactMap {String(format: "%02x", $0)}.joined() + } + + // hmac + func hmac(key: Data) -> Data { + let data = Data(self.utf8) + let symmetricKey = SymmetricKey(data: key) + let hmac = HMAC.authenticationCode(for: data, using: symmetricKey) + return Data(hmac) + } +} From 31da70168ce235c629107fa15f37f6ca6210e9de Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 2 Dec 2023 12:00:52 -0800 Subject: [PATCH 27/37] refractor: improve tencent sign Co-Authored-By: Tisfeng --- Easydict.xcodeproj/project.pbxproj | 6 ++++-- .../Service/Tencent/{sign.swift => TencentSigning.swift} | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) rename Easydict/Feature/Service/Tencent/{sign.swift => TencentSigning.swift} (99%) diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index fb63fc16d..8df8dd493 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -211,6 +211,7 @@ 03FD68BB2B1DC59600FD388E /* CryptoSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 03FD68BA2B1DC59600FD388E /* CryptoSwift */; }; 03FD68BE2B1E151A00FD388E /* String+EncryptAES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */; }; 03FB3EDD2B1B405B004C3238 /* sign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FB3EDC2B1B405B004C3238 /* sign.swift */; }; + 03FB3EDD2B1B405B004C3238 /* TencentSigning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03FB3EDC2B1B405B004C3238 /* TencentSigning.swift */; }; 17BCAEF72B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF52B0DFF9000A7D372 /* EZNiuTransTranslateResponse.m */; }; 17BCAEF82B0DFF9000A7D372 /* EZNiuTransTranslate.m in Sources */ = {isa = PBXBuildFile; fileRef = 17BCAEF62B0DFF9000A7D372 /* EZNiuTransTranslate.m */; }; 2721E4D02AFE920700A059AC /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 2721E4CF2AFE920700A059AC /* Alamofire */; }; @@ -645,6 +646,7 @@ 03F639942AA6CFBB009B9914 /* EZBingConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EZBingConfig.m; sourceTree = ""; }; 03FD68BD2B1E151A00FD388E /* String+EncryptAES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+EncryptAES.swift"; sourceTree = ""; }; 03FB3EDC2B1B405B004C3238 /* sign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = sign.swift; sourceTree = ""; }; + 03FB3EDC2B1B405B004C3238 /* TencentSigning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TencentSigning.swift; sourceTree = ""; }; 06E15747A7BD34D510ADC6A8 /* Pods-Easydict.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Easydict.debug.xcconfig"; path = "Target Support Files/Pods-Easydict/Pods-Easydict.debug.xcconfig"; sourceTree = ""; }; 17BCAEF32B0DFF9000A7D372 /* EZNiuTransTranslateResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslateResponse.h; sourceTree = ""; }; 17BCAEF42B0DFF9000A7D372 /* EZNiuTransTranslate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EZNiuTransTranslate.h; sourceTree = ""; }; @@ -1954,7 +1956,7 @@ C4DD01E82B12B3C80025EE8E /* TencentService.swift */, C4DD01EA2B12BA250025EE8E /* TencentResponse.swift */, C4DD01EC2B12BE9B0025EE8E /* TencentTranslateType.swift */, - 03FB3EDC2B1B405B004C3238 /* sign.swift */, + 03FB3EDC2B1B405B004C3238 /* TencentSigning.swift */, ); path = Tencent; sourceTree = ""; @@ -2369,7 +2371,7 @@ 039B694F2A9D9F370063709D /* EZWebViewManager.m in Sources */, 03D747432A07FB150006CD77 /* EZError.m in Sources */, 03B0231629231FA6001C7E63 /* SnipFocusView.m in Sources */, - 03FB3EDD2B1B405B004C3238 /* sign.swift in Sources */, + 03FB3EDD2B1B405B004C3238 /* TencentSigning.swift in Sources */, 03B0230329231FA6001C7E63 /* EZResultView.m in Sources */, 03CAB9552ADBF0FF00DA94A3 /* EZSystemUtility.m in Sources */, 03BDA7C32A26DA280079D04F /* NSArray+XPMArgumentsNormalizer.m in Sources */, diff --git a/Easydict/Feature/Service/Tencent/sign.swift b/Easydict/Feature/Service/Tencent/TencentSigning.swift similarity index 99% rename from Easydict/Feature/Service/Tencent/sign.swift rename to Easydict/Feature/Service/Tencent/TencentSigning.swift index 8c557a61c..ce8978746 100644 --- a/Easydict/Feature/Service/Tencent/sign.swift +++ b/Easydict/Feature/Service/Tencent/TencentSigning.swift @@ -1,5 +1,5 @@ // -// sign.swift +// TencentSigning.swift // Easydict // // Created by tisfeng on 2023/12/2. From 693be50b93b10ce0396d46ab0b7fefe98b9b521e Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 2 Dec 2023 12:02:15 -0800 Subject: [PATCH 28/37] fix: tencent api endpoint --- Easydict/Feature/Service/Tencent/TencentService.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index a127260e0..20cf943b2 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -87,7 +87,7 @@ public final class TencentService: QueryService { "ProjectId": 0 ] - let endpoint = "https://cvm.tencentcloudapi.com" + let endpoint = "https://tmt.tencentcloudapi.com" let headers = tencentSignHeader(parameters: parameters, secretId: secretId, secretKey: secretKey) let request = AF.request(endpoint, From 3abdd7c5027a76cbd6c3c216778fbad72624dfc5 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 2 Dec 2023 12:07:39 -0800 Subject: [PATCH 29/37] Revert "perf: add self support language" This reverts commit 0bc2ab1e55e4578a53140129a06d079975e77133. --- .../Tencent/TencentTranslateType.swift | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index a767c69c6..a13ea3a73 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -16,24 +16,24 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") static let supportedTypes: [Language: [Language]] = [ - .simplifiedChinese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .traditionalChinese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .english: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], - .japanese: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean], - .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese, .korean], - .french: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .vietnamese], - .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .indonesian], - .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .thai], - .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .malay], - .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .arabic], - .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian, .hindi] + .simplifiedChinese: [.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .traditionalChinese: [.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .english: [.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], + .japanese: [.simplifiedChinese, .traditionalChinese, .english, .korean], + .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese], + .french: [.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese], + .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese], + .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese], + .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese], + .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese], + .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian] ] static let supportLanguagesDictionary: [Language: String] = [ From 8989471ff43cd0efd18e1e6b0d1aad450f64c7e9 Mon Sep 17 00:00:00 2001 From: Jerry <89069957+Jerry23011@users.noreply.github.com> Date: Sat, 2 Dec 2023 12:25:02 -0800 Subject: [PATCH 30/37] perf: update handling of language --- .../Service/Tencent/TencentService.swift | 6 ++- .../Tencent/TencentTranslateType.swift | 39 ++++++++++--------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 20cf943b2..1c471bd89 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -36,7 +36,11 @@ public final class TencentService: QueryService { NSLog("Tencent Translate currently does not support OCR") throw QueryServiceError.notSupported } - + + override public func autoConvertTraditionalChinese() -> Bool { + return true + } + // MARK: API Request private static let defaultSecretId = "" diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index a13ea3a73..43fb5fb7a 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -16,24 +16,24 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") static let supportedTypes: [Language: [Language]] = [ - .simplifiedChinese: [.traditionalChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .traditionalChinese: [.simplifiedChinese, .english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], - .english: [.simplifiedChinese, .traditionalChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], - .japanese: [.simplifiedChinese, .traditionalChinese, .english, .korean], - .korean: [.simplifiedChinese, .traditionalChinese, .english, .japanese], - .french: [.simplifiedChinese, .traditionalChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese], - .spanish: [.simplifiedChinese, .traditionalChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese], - .italian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese], - .german: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese], - .turkish: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese], - .russian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese], - .portuguese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .vietnamese: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .indonesian: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .thai: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .malay: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .arabic: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], - .hindi: [.simplifiedChinese, .traditionalChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian] + .simplifiedChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .traditionalChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], + .english: [.simplifiedChinese, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay, .arabic, .hindi], + .japanese: [.simplifiedChinese, .english, .korean], + .korean: [.simplifiedChinese, .english, .japanese], + .french: [.simplifiedChinese, .english, .spanish, .italian, .german, .turkish, .russian, .portuguese], + .spanish: [.simplifiedChinese, .english, .french, .italian, .german, .turkish, .russian, .portuguese], + .italian: [.simplifiedChinese, .english, .french, .spanish, .german, .turkish, .russian, .portuguese], + .german: [.simplifiedChinese, .english, .french, .spanish, .italian, .turkish, .russian, .portuguese], + .turkish: [.simplifiedChinese, .english, .french, .spanish, .italian, .german, .russian, .portuguese], + .russian: [.simplifiedChinese, .english, .french, .spanish, .italian, .german, .turkish, .portuguese], + .portuguese: [.simplifiedChinese, .english, .french, .spanish, .italian, .german, .turkish, .russian], + .vietnamese: [.simplifiedChinese, .english], + .indonesian: [.simplifiedChinese, .english], + .thai: [.simplifiedChinese, .english], + .malay: [.simplifiedChinese, .english], + .arabic: [.simplifiedChinese, .english], + .hindi: [.simplifiedChinese, .english] ] static let supportLanguagesDictionary: [Language: String] = [ @@ -59,7 +59,8 @@ struct TencentTranslateType: Equatable { ] static func transType(from: Language, to: Language) -> TencentTranslateType { - if supportedTypes[from]?.contains(to) == true { + if (supportedTypes[from] != nil && to == .traditionalChinese) || + (supportedTypes[from]?.contains(to) == true) { guard let from = supportLanguagesDictionary[from], let to = supportLanguagesDictionary[to] else { return .unsupported From b53cdb8ec47adcc7817a73663e9a46d86c6cbb26 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 3 Dec 2023 10:29:54 +0800 Subject: [PATCH 31/37] fix: correct supportedTypes --- Easydict/Feature/Service/Tencent/TencentTranslateType.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index 43fb5fb7a..e5ae973af 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -15,6 +15,7 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") + // Docs: https://cloud.tencent.com/document/api/551/15619 static let supportedTypes: [Language: [Language]] = [ .simplifiedChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], .traditionalChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], @@ -32,8 +33,8 @@ struct TencentTranslateType: Equatable { .indonesian: [.simplifiedChinese, .english], .thai: [.simplifiedChinese, .english], .malay: [.simplifiedChinese, .english], - .arabic: [.simplifiedChinese, .english], - .hindi: [.simplifiedChinese, .english] + .arabic: [.english], + .hindi: [.english] ] static let supportLanguagesDictionary: [Language: String] = [ From 751e7231073f109fc3e7317f5061557a6f6638eb Mon Sep 17 00:00:00 2001 From: Jerry Date: Sat, 2 Dec 2023 19:36:12 -0800 Subject: [PATCH 32/37] style: format code fixed extraneous white spaces with SwiftLint --- .../Service/Tencent/TencentService.swift | 24 +++++++++---------- .../Service/Tencent/TencentSigning.swift | 12 +++++----- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 1c471bd89..0694aa0b8 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -14,15 +14,15 @@ public final class TencentService: QueryService { override public func serviceType() -> ServiceType { .tencent } - + override public func link() -> String? { "https://fanyi.qq.com" } - + override public func name() -> String { NSLocalizedString("tencent_translate", comment: "The name of Tencent Translate") } - + override public func supportLanguagesDictionary() -> MMOrderedDictionary { // TODO: Replace MMOrderedDictionary in the API let orderedDict = MMOrderedDictionary() @@ -31,7 +31,7 @@ public final class TencentService: QueryService { } return orderedDict } - + override public func ocr(_: EZQueryModel) async throws -> EZOCRResult { NSLog("Tencent Translate currently does not support OCR") throw QueryServiceError.notSupported @@ -42,10 +42,10 @@ public final class TencentService: QueryService { } // MARK: API Request - private static let defaultSecretId = "" private static let defaultSecretKey = "" - + + // easydict://writeKeyValue?EZTencentSecretId=xxx private var secretId: String { let secretId = UserDefaults.standard.string(forKey: EZTencentSecretId) @@ -55,7 +55,7 @@ public final class TencentService: QueryService { return TencentService.defaultSecretId } } - + // easydict://writeKeyValue?EZTencentSecretKey=xxx private var secretKey: String { let secretKey = UserDefaults.standard.string(forKey: EZTencentSecretKey) @@ -65,16 +65,16 @@ public final class TencentService: QueryService { return TencentService.defaultSecretKey } } - + public override func translate(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { if prehandleQueryTextLanguage(text, from: from, to: to, completion: completion) { return } - + translateText(text, from: from, to: to, completion: completion) } - func translateText(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { + func translateText(_ text: String, from: Language, to: Language, completion: @escaping (EZQueryResult, Error?) -> Void) { let transType = TencentTranslateType.transType(from: from, to: to) guard transType != .unsupported else { result.errorType = .unsupportedLanguage @@ -83,14 +83,14 @@ public final class TencentService: QueryService { completion(result, nil) return } - + let parameters: [String: Any] = [ "SourceText": text, "Source": transType.sourceLanguage, "Target": transType.targetLanguage, "ProjectId": 0 ] - + let endpoint = "https://tmt.tencentcloudapi.com" let headers = tencentSignHeader(parameters: parameters, secretId: secretId, secretKey: secretKey) diff --git a/Easydict/Feature/Service/Tencent/TencentSigning.swift b/Easydict/Feature/Service/Tencent/TencentSigning.swift index ce8978746..b77cb80df 100644 --- a/Easydict/Feature/Service/Tencent/TencentSigning.swift +++ b/Easydict/Feature/Service/Tencent/TencentSigning.swift @@ -23,7 +23,7 @@ func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: S dateFormatter.dateFormat = "yyyy-MM-dd" dateFormatter.timeZone = TimeZone(identifier: "UTC") let date = dateFormatter.string(from: Date(timeIntervalSince1970: TimeInterval(timestamp))) - + // ************* 步骤 1:拼接规范请求串 ************* let httpRequestMethod = "POST" let canonicalUri = "/" @@ -42,7 +42,7 @@ func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: S \(signedHeaders) \(hashedRequestPayload) """ - + // ************* 步骤 2:拼接待签名字符串 ************* let credentialScope = "\(date)/\(service)/tc3_request" let hashedCanonicalRequest = canonicalRequest.sha256() @@ -52,7 +52,7 @@ func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: S \(credentialScope) \(hashedCanonicalRequest) """ - + // ************* 步骤 3:计算签名 ************* let secretDate = date.hmac(key: Data("TC3\(secretKey)".utf8)) let secretService = service.hmac(key: secretDate) @@ -63,7 +63,7 @@ func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: S let authorization = """ \(algorithm) Credential=\(secretId)/\(credentialScope), SignedHeaders=\(signedHeaders), Signature=\(signature) """ - + let headers: HTTPHeaders = [ "Authorization": authorization, "Content-Type": ct, @@ -73,7 +73,7 @@ func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: S "X-TC-Version": version, "X-TC-Region": region ] - + return headers } @@ -84,7 +84,7 @@ extension String { let digest = SHA256.hash(data: data) return digest.compactMap {String(format: "%02x", $0)}.joined() } - + // hmac func hmac(key: Data) -> Data { let data = Data(self.utf8) From 5ec818276059110f143a4179c6cf1881a224b560 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sat, 2 Dec 2023 22:19:29 -0800 Subject: [PATCH 33/37] perf: prepares TencentSigning for other services --- Easydict/Feature/Service/Tencent/TencentService.swift | 7 ++++++- Easydict/Feature/Service/Tencent/TencentSigning.swift | 10 +++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 0694aa0b8..829f9431d 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -92,7 +92,12 @@ public final class TencentService: QueryService { ] let endpoint = "https://tmt.tencentcloudapi.com" - let headers = tencentSignHeader(parameters: parameters, secretId: secretId, secretKey: secretKey) + + let service = "tmt" + let action = "TextTranslate" + let version = "2018-03-21" + + let headers = tencentSignHeader(service: service, action: action, version: version, parameters: parameters, secretId: secretId, secretKey: secretKey) let request = AF.request(endpoint, method: .post, diff --git a/Easydict/Feature/Service/Tencent/TencentSigning.swift b/Easydict/Feature/Service/Tencent/TencentSigning.swift index b77cb80df..071b0191f 100644 --- a/Easydict/Feature/Service/Tencent/TencentSigning.swift +++ b/Easydict/Feature/Service/Tencent/TencentSigning.swift @@ -11,12 +11,12 @@ import Alamofire import CryptoKit // Tencent sigh header, Ref: https://github.com/TencentCloud/signature-process-demo/blob/main/signature-v3/swift/signv3.swift -func tencentSignHeader(parameters: [String: Any], secretId: String, secretKey: String) -> HTTPHeaders { - let service = "tmt" - let host = "tmt.tencentcloudapi.com" +func tencentSignHeader(service: String, action: String, version: String, parameters: [String: Any], secretId: String, secretKey: String) -> HTTPHeaders { + let service = service + let host = "\(service).tencentcloudapi.com" let region = "ap-guangzhou" - let action = "TextTranslate" - let version = "2018-03-21" + let action = action + let version = version let algorithm = "TC3-HMAC-SHA256" let timestamp = Int(Date().timeIntervalSince1970) let dateFormatter = DateFormatter() From 43016daa480388ae591813b9d533cfdeb92bac52 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 3 Dec 2023 10:41:09 +0800 Subject: [PATCH 34/37] perf: enable tencent from == to --- Easydict/Feature/Service/Tencent/TencentTranslateType.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index e5ae973af..19743eb9f 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -61,6 +61,7 @@ struct TencentTranslateType: Equatable { static func transType(from: Language, to: Language) -> TencentTranslateType { if (supportedTypes[from] != nil && to == .traditionalChinese) || + from == to || (supportedTypes[from]?.contains(to) == true) { guard let from = supportLanguagesDictionary[from], let to = supportLanguagesDictionary[to] else { From 4065085a5deb487c62cde1645160756b273dc58d Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 3 Dec 2023 16:13:11 +0800 Subject: [PATCH 35/37] perf: add missing traditional Chinese target language --- .../Service/Tencent/TencentService.swift | 4 --- .../Tencent/TencentTranslateType.swift | 36 +++++++++++++------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 829f9431d..b84d7cabe 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -37,10 +37,6 @@ public final class TencentService: QueryService { throw QueryServiceError.notSupported } - override public func autoConvertTraditionalChinese() -> Bool { - return true - } - // MARK: API Request private static let defaultSecretId = "" private static let defaultSecretKey = "" diff --git a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift index 19743eb9f..1c52f6922 100644 --- a/Easydict/Feature/Service/Tencent/TencentTranslateType.swift +++ b/Easydict/Feature/Service/Tencent/TencentTranslateType.swift @@ -15,7 +15,7 @@ struct TencentTranslateType: Equatable { static let unsupported = TencentTranslateType(sourceLanguage: "unsupported", targetLanguage: "unsupported") - // Docs: https://cloud.tencent.com/document/api/551/15619 + // This docs missed traditionalChinese as target language if target languages contains simplifiedChinese. https://cloud.tencent.com/document/api/551/15619 static let supportedTypes: [Language: [Language]] = [ .simplifiedChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], .traditionalChinese: [.english, .japanese, .korean, .french, .spanish, .italian, .german, .turkish, .russian, .portuguese, .vietnamese, .indonesian, .thai, .malay], @@ -60,16 +60,32 @@ struct TencentTranslateType: Equatable { ] static func transType(from: Language, to: Language) -> TencentTranslateType { - if (supportedTypes[from] != nil && to == .traditionalChinese) || - from == to || - (supportedTypes[from]?.contains(to) == true) { - guard let from = supportLanguagesDictionary[from], - let to = supportLanguagesDictionary[to] else { - return .unsupported - } - return TencentTranslateType(sourceLanguage: from, targetLanguage: to) - } else { + // !!!: Tencent translate support traditionalChinese as target language if target languages contain simplifiedChinese. + guard let targetLanguages = supportedTypes[from], + (targetLanguages.containsChinese() || targetLanguages.contains(to) || from == to || from.isKindOfChinese()) else { return .unsupported } + + guard let fromLanguage = supportLanguagesDictionary[from], + let toLanguage = supportLanguagesDictionary[to] else { + return .unsupported + } + + return TencentTranslateType(sourceLanguage: fromLanguage, targetLanguage: toLanguage) + } +} + + +extension Array where Element == Language { + // Contains Chinese language + func containsChinese() -> Bool { + contains { $0.isKindOfChinese() } + } +} + +extension Language { + // Is kind of Chinese language + func isKindOfChinese() -> Bool { + self == .simplifiedChinese || self == .traditionalChinese } } From 2848e1047c38c6797076b0ece08114eeb23abc93 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 3 Dec 2023 21:53:37 +0800 Subject: [PATCH 36/37] perf: improve tencent error message --- .../Service/Tencent/TencentResponse.swift | 25 +++++++++++++++++++ .../Service/Tencent/TencentService.swift | 8 ++++++ 2 files changed, 33 insertions(+) diff --git a/Easydict/Feature/Service/Tencent/TencentResponse.swift b/Easydict/Feature/Service/Tencent/TencentResponse.swift index fabb7066d..71c2ff8ba 100644 --- a/Easydict/Feature/Service/Tencent/TencentResponse.swift +++ b/Easydict/Feature/Service/Tencent/TencentResponse.swift @@ -18,3 +18,28 @@ struct TencentResponse: Codable { var Response: Response } + +/** + { + "Response": { + "Error": { + "Code": "InvalidParameterValue", + "Message": "不支持的语种:hi_to_zh" + }, + "RequestId": "eb6d17f2-6771-4653-af6f-6b2edbf07294" + } + } + */ +struct TencentErrorResponse: Codable { + struct Response: Codable { + var Error: Error + var RequestId: String + } + + struct Error: Codable { + var Code: String + var Message: String + } + + var Response: Response +} diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index b84d7cabe..3923dd331 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -113,6 +113,14 @@ public final class TencentService: QueryService { completion(result, nil) case let .failure(error): NSLog("Tencent lookup error \(error)") + if let data = response.data { + do { + let errorResponse = try JSONDecoder().decode(TencentErrorResponse.self, from: data) + result.errorMessage = errorResponse.Response.Error.Message + } catch { + NSLog("Failed to decode error response: \(error)") + } + } completion(result, error) } } From 2e49e6f614d74ed1ccd43081f2eadf6fae78ec63 Mon Sep 17 00:00:00 2001 From: tisfeng Date: Sun, 3 Dec 2023 22:01:33 +0800 Subject: [PATCH 37/37] perf: map error response --> Response --- .../Service/Tencent/TencentResponse.swift | 25 +++++++++++++++---- .../Service/Tencent/TencentService.swift | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Easydict/Feature/Service/Tencent/TencentResponse.swift b/Easydict/Feature/Service/Tencent/TencentResponse.swift index 71c2ff8ba..61b1e7329 100644 --- a/Easydict/Feature/Service/Tencent/TencentResponse.swift +++ b/Easydict/Feature/Service/Tencent/TencentResponse.swift @@ -32,14 +32,29 @@ struct TencentResponse: Codable { */ struct TencentErrorResponse: Codable { struct Response: Codable { - var Error: Error - var RequestId: String + var error: Error + var requestId: String + + // CodingKeys 枚举用于映射字段名 + private enum CodingKeys: String, CodingKey { + case error = "Error" // error --> Error + case requestId = "RequestId" // requestId --> RequestId + } } struct Error: Codable { - var Code: String - var Message: String + var code: String + var message: String + + private enum CodingKeys: String, CodingKey { + case code = "Code" // code --> Code + case message = "Message" // message --> Message + } } - var Response: Response + var response: Response + + private enum CodingKeys: String, CodingKey { + case response = "Response" // response --> Response + } } diff --git a/Easydict/Feature/Service/Tencent/TencentService.swift b/Easydict/Feature/Service/Tencent/TencentService.swift index 3923dd331..f9ff8632b 100644 --- a/Easydict/Feature/Service/Tencent/TencentService.swift +++ b/Easydict/Feature/Service/Tencent/TencentService.swift @@ -116,7 +116,7 @@ public final class TencentService: QueryService { if let data = response.data { do { let errorResponse = try JSONDecoder().decode(TencentErrorResponse.self, from: data) - result.errorMessage = errorResponse.Response.Error.Message + result.errorMessage = errorResponse.response.error.message } catch { NSLog("Failed to decode error response: \(error)") }