Jelajahi Sumber

【综合】导入远程控制相关内容

niehaoyu 8 bulan lalu
induk
melakukan
5a56af333c
32 mengubah file dengan 1870 tambahan dan 35 penghapusan
  1. 1 6
      PDF Office/PDF Master DMG/AppDelegate.swift
  2. 1 6
      PDF Office/PDF Master Pro/AppDelegate.swift
  3. 10 12
      PDF Office/PDF Master/AppDelegate.swift
  4. 22 1
      PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController.swift
  5. 43 0
      PDF Office/PDF Master/Class/KMAdvertisement/Cache/KMAdvertisementCache.swift
  6. 182 0
      PDF Office/PDF Master/Class/KMAdvertisement/Config/KMAdvertisementConfig.swift
  7. 0 0
      PDF Office/PDF Master/Class/KMAdvertisement/Manager/KMAdvertisementManager.swift
  8. 92 0
      PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementImage.swift
  9. 0 0
      PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementModel.swift
  10. 0 0
      PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementModelTransition.swift
  11. 106 0
      PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementTimeStampConversion.swift
  12. 167 0
      PDF Office/PDF Master/Class/KMAdvertisement/Request/KMAdvertisementRequestServer.swift
  13. TEMPAT SAMPAH
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ComPDFKit_EN.imageset/ComPDFKit_EN.png
  14. 12 0
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ComPDFKit_EN.imageset/Contents.json
  15. 6 0
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/Contents.json
  16. 23 0
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/Contents.json
  17. TEMPAT SAMPAH
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00.png
  18. TEMPAT SAMPAH
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00@2x.png
  19. TEMPAT SAMPAH
      PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00@3x.png
  20. 0 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.h
  21. 0 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.m
  22. 133 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.xib
  23. 50 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionHeadView.swift
  24. 32 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionHeadView.xib
  25. 87 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionViewItem.swift
  26. 60 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionViewItem.xib
  27. 188 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/KMAdvertisementTableView.swift
  28. 57 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/KMAdvertisementTableView.xib
  29. 87 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/View/KMAdvertisementShowView.swift
  30. 78 0
      PDF Office/PDF Master/Class/KMAdvertisement/View/View/KMAdvertisementShowView.xib
  31. 250 0
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj
  32. 183 10
      PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

+ 1 - 6
PDF Office/PDF Master DMG/AppDelegate.swift

@@ -16,12 +16,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
 
     func applicationDidFinishLaunching(_ aNotification: Notification) {
         // Insert code here to initialize your application
-        //        MARK: 广告数据初始化
-                KMAdvertisementManager.manager.initConfig(appName: .PDFReaderProMac,
-                                                          subscribeType: .unsubscribed,
-                                                          platform: .Mac)
-        //        测试模式,默认false
-                KMAdvertisementManager.manager.debug = true
+
     }
 
     func applicationWillTerminate(_ aNotification: Notification) {

+ 1 - 6
PDF Office/PDF Master Pro/AppDelegate.swift

@@ -18,12 +18,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
     
     func applicationDidFinishLaunching(_ aNotification: Notification) {
         // Insert code here to initialize your application
-        //        MARK: 广告数据初始化
-                KMAdvertisementManager.manager.initConfig(appName: .PDFReaderProMac,
-                                                          subscribeType: .unsubscribed,
-                                                          platform: .Mac)
-        //        测试模式,默认false
-                KMAdvertisementManager.manager.debug = true
+
     }
 
     func applicationWillTerminate(_ aNotification: Notification) {

File diff ditekan karena terlalu besar
+ 10 - 12
PDF Office/PDF Master/AppDelegate.swift


+ 22 - 1
PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController.swift

@@ -199,7 +199,28 @@ import Cocoa
     }
     
     func initNetworkingData() {
-
+        KMAdvertisementManager.manager.fetchDataWithResponseObject { [unowned self] data, responseObject, error in
+            KMPrint("获取广告数据成功")
+            if data != nil {
+                
+                if KMAdvertisementManager.manager.infoDict.allKeys.count > 0 {
+                    if let adsInfo = KMAdvertisementManager.manager.infoDict["adsInfo"] {
+                        let infoDict: NSDictionary = KMAdvertisementManager.manager.infoDict["adsInfo"] as! NSDictionary
+                        let array: [[String: Any]] = infoDict["content"] as! [[String : Any]]
+                        
+                        let arrM = NSMutableArray.init()
+                        for dict in array {
+                            let adsInfo = KMAdsInfo.init()
+                            let mutableDictionary = NSMutableDictionary(dictionary: dict)
+                            adsInfo.infoDict = mutableDictionary
+                            arrM.add(adsInfo)
+                        }
+                        KMAdsInfoManager.shareInstance.adsInfoArrM = arrM
+                    }
+                    
+                }
+            }
+        }
     }
     
     func setup() {

+ 43 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Cache/KMAdvertisementCache.swift

@@ -0,0 +1,43 @@
+//
+//  KMAdvertisementCache.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/25.
+//
+
+class KMAdvertisementCache: NSObject {
+    let kFilePath: NSString = NSTemporaryDirectory() + "Advertisement/advertisement.plist" as NSString
+    
+    //单例
+    public static let `default` = KMAdvertisementCache()
+    //存储
+    func saveData(data: [NSDictionary]) {
+        if (!FileManager.default.fileExists(atPath: kFilePath.deletingLastPathComponent as String)) {
+            try?FileManager.default.createDirectory(atPath: kFilePath.deletingLastPathComponent as String, withIntermediateDirectories: true, attributes: nil)
+        }
+        
+        if (!FileManager.default.fileExists(atPath: kFilePath as String)) {
+            FileManager.default.createFile(atPath: kFilePath as String, contents: nil);
+        }
+        
+        let saveData: NSArray = data as NSArray
+        let success = saveData.write(toFile: kFilePath.expandingTildeInPath as String, atomically: true)
+
+        if (success == true) {
+            print("成功 -" + (kFilePath.expandingTildeInPath as String))
+        } else {
+            print("失败 -" + (kFilePath.expandingTildeInPath as String))
+        }
+    }
+
+   //读取
+    func readData() -> [NSDictionary] {
+        print("数据地址 = " + (kFilePath.expandingTildeInPath as String))
+        let data =  NSArray.init(contentsOfFile: kFilePath.expandingTildeInPath as String)
+        if (data != nil) {
+            return data as! [NSDictionary]
+        } else {
+            return []
+        }
+    }
+}

+ 182 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Config/KMAdvertisementConfig.swift

@@ -0,0 +1,182 @@
+//
+//  KMAdvertisementConfig.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/24.
+//
+
+#if os(OSX)
+    import AppKit
+#elseif os(iOS)
+    import UIKit
+#endif
+
+//APP类型
+@objc public enum KMAdvertisementAppNameType: Int, Codable {
+    case RecordIt = 0
+    case RecordItPro = 1
+    case RecordItDMG = 2
+    case FilmageScreen = 3
+    case FilmageScreenPro = 4
+    case FilmageScreenDMG = 5
+    case FilmageEditorMac = 6
+    case FilmageEditorMacPro = 7
+    case FilmageEditorMacDMG = 8
+    case FilmageConverterMac = 9
+    case FilmageConverterMacPro = 10
+    case FilmageConverterMacDMG = 11
+    case FilmagePlayerMac = 12
+    case FilmagePlayerMacPro = 13
+    case FilmagePlayerMacDMG = 14
+    case PDFReaderProMac = 15
+    case PDFReaderProMacPro = 16
+    case PDFReaderProMacDMG = 17
+    case PDFReaderProIOS = 18
+    case PDFReaderProIOSPro = 19
+    case LynxPDFEditor = 20
+    
+    func string() -> String {
+            switch self {
+            case .RecordIt: return "RecordIt"
+            case .RecordItPro: return "RecordItPro"
+            case .RecordItDMG: return "RecordItDMG"
+            case .FilmageScreen: return "FilmageScreen"
+            case .FilmageScreenPro: return "FilmageScreenPro"
+            case .FilmageScreenDMG: return "FilmageScreenDMG"
+            case .FilmageEditorMac: return "FilmageEditorMac"
+            case .FilmageEditorMacPro: return "FilmageEditorMacPro"
+            case .FilmageEditorMacDMG: return "FilmageEditorMacDMG"
+            case .FilmageConverterMac: return "FilmageConverterMac"
+            case .FilmageConverterMacPro: return "FilmageConverterMacPro"
+            case .FilmageConverterMacDMG: return "FilmageConverterMacDMG"
+            case .FilmagePlayerMac: return "FilmagePlayerMac"
+            case .FilmagePlayerMacPro: return "FilmagePlayerMacPro"
+            case .FilmagePlayerMacDMG: return "FilmagePlayerMacDMG"
+            case .PDFReaderProMac: return "PDFReaderProMac"
+            case .PDFReaderProMacPro: return "PDFReaderProMacPro"
+            case .PDFReaderProMacDMG: return "PDFReaderProMacDMG"
+            case .PDFReaderProIOS: return "PDFReaderProIOS"
+            case .PDFReaderProIOSPro: return "PDFReaderProIOSPro"
+            case .LynxPDFEditor: return "LynxPDFEditor"
+            }
+        }
+}
+
+//显示样式
+@objc public enum KMAdvertisementShowType: Int, Codable {
+    case unknow = 0
+    case list = 1 //列表
+    case pop = 2 //弹窗
+    case scroll = 3 //循环
+    case view = 4 //视图显示
+}
+
+//平台
+@objc public enum KMAdvertisementPlatformType: Int, Codable {
+    case unknow = 0
+    case Mac //
+    case iOS //
+}
+
+////订阅状态
+//@objc public enum KMAdvertisementSubscribeType: Int, Codable {
+//    case unknow = 0
+//    case unsubscribed = 1 //未订阅
+//    case subscribed = 2 //已订阅
+//    case all = 3 //无限制
+//}
+
+@objc public enum KMAdvertisementSubscribeType: Int, Codable {
+    case unknow = 0
+    case all //免费版跟付费版都需要显示
+    case pro //只有付费用户显示
+    case lite //只有免费用户显示
+}
+
+//点击视图后跳转选项
+@objc public enum KMAdvertisementActionType: Int, Codable {
+    case unknow = 0
+    case URL = 1 //链接
+    case comparative = 2 //比价表
+}
+
+//多语
+@objc public enum KMAdvertisementLanguageType: Int, Codable {
+    case unknow
+    case en //
+    case zhCN //
+    case zhTW //
+}
+
+@objcMembers open class KMAdvertisementConfig: NSObject {
+    var isDebug: Bool = false
+    var appName: KMAdvertisementAppNameType = .PDFReaderProMacPro
+    var platform: KMAdvertisementPlatformType = .Mac
+    public var subscribeType: KMAdvertisementSubscribeType = .unknow
+    public var language: KMAdvertisementLanguageType = .unknow
+    
+    func activityBaseURL() -> String {
+#if DEBUG
+        if kTestMode == 1{
+            return "http://test-store.kdan.cn:3019"
+        } else {
+            return "https://store.filmagepro.com:3018"
+        }
+#else
+        return "https://store.filmagepro.com:3018"
+#endif
+    }
+    
+    public func initParameters(appName: KMAdvertisementAppNameType, subscribeType:KMAdvertisementSubscribeType, platform: KMAdvertisementPlatformType) {
+        self.appName = appName
+        self.subscribeType = subscribeType
+        self.platform = platform
+    }
+}
+
+extension KMAdvertisementConfig {
+    static func adapterDark(light: AnyObject, dark: AnyObject) -> AnyObject {
+        if self.isDarkModel() {
+            return dark
+        } else {
+            return light
+        }
+    }
+    
+    static func isDarkModel() -> Bool {
+#if os(iOS)
+        if #available(iOS 12.0, *) {
+            if UITraitCollection.current.userInterfaceStyle == UIUserInterfaceStyle.dark {
+                return true
+            } else {
+                return false
+            }
+        }
+#elseif os(OSX)
+        if #available(macOS 10.14, *) {
+            let dict = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain) ?? nil
+            guard let dicts: Dictionary = dict else {
+//                print("不是字典类型")
+                return false
+            }
+            
+            guard let style = dicts["AppleInterfaceStyle"] as? String else {
+//                print("style is not string")
+                return false
+            }
+            
+            let isDarkMode : Bool = style.compare("Dark").rawValue == 0
+            
+            if isDarkMode {
+//                print("暗黑模式\(style)")
+                return true
+            } else {
+//                print("正常模式\(style)")
+                return false
+            }
+        } else {
+            return false
+        }
+#endif
+    }
+}

+ 0 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Manager/KMAdvertisementManager.swift


+ 92 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementImage.swift

@@ -0,0 +1,92 @@
+//
+//  KMAdvertisementImage.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2023/1/12.
+// 图片缓存
+
+import Foundation
+import AppKit
+
+typealias KMAdvertisementImageCompletion = (_ image: NSImage) -> Void
+@objc class KMAdvertisementImage: NSObject {
+    @objc static func imageWithURL(url : URL?, completion: KMAdvertisementImageCompletion?) -> NSImage {
+        var image: NSImage = NSImage()
+        if url != nil {
+            //获取缓存图片是否存在
+            let imageString: String = KMAdvertisementImageCache.fetchImageCache(url: url!)
+            if imageString != "" {
+                //存在获取本地图片
+                image = NSImage.init(contentsOfFile: imageString) ?? NSImage()
+                if completion != nil {
+                    completion!(image)
+                }
+            } else {
+                let path = KMAdvertisementImageCache.kImageCacheFilePath
+                let filePath = (path as String) + "/" + (NSString(string: NSString(string: url!.path).lastPathComponent) as String)
+                KMAdvertisementRequestServer.requestServer.downLoad(inputURL: url!, filePath: filePath) { progress in
+                    
+                } completion: { task, responseObject, error in
+                    if completion != nil {
+                        DispatchQueue.main.async {
+                            image = NSImage.init(contentsOfFile: KMAdvertisementImageCache.fetchImageCache(url: url!)) ?? NSImage()
+                            completion!(image)
+                        }
+                    }
+                }
+            }
+        }
+        return image
+    }
+}
+
+
+
+class KMAdvertisementImageCache: NSObject {
+    static let kImageCacheFilePath: NSString = NSTemporaryDirectory() + "Advertisement/ImageCache" as NSString
+    
+    static func saveImageCache(image: NSImage, name: String) {
+        if image.size.width != 0 {
+            
+            let path = KMAdvertisementImageCache.kImageCacheFilePath
+            let filePath = (path as String) + "/" + NSString(string: name).deletingPathExtension + ".png"
+            if (!FileManager.default.fileExists(atPath: path as String)) {
+                try?FileManager.default.createDirectory(atPath: path as String, withIntermediateDirectories: true, attributes: nil)
+            }
+            
+            #if os(iOS)
+            
+//            [UIImagePNGRepresentation(image) writeToFile:path + name
+//                                              atomically:YES]
+            #elseif os(OSX)
+            let cgimage = image.cgImage(forProposedRect: nil, context: nil, hints: nil)
+            if cgimage != nil {
+                let rep = NSBitmapImageRep.init(cgImage: cgimage!)
+                try?rep.representation(using: .png, properties: [:])?.write(to: URL(fileURLWithPath: filePath))
+            } else {
+                try?image.tiffRepresentation?.write(to: URL(fileURLWithPath: filePath))
+            }
+            print(path)
+            #endif
+        }
+    }
+    
+    static func fetchImageCache(url: URL) -> String {
+        if (!FileManager.default.fileExists(atPath: kImageCacheFilePath as String)) {
+            try?FileManager.default.createDirectory(atPath: kImageCacheFilePath as String, withIntermediateDirectories: true, attributes: nil)
+        }
+        
+        var string = ""
+        let name = NSString(string: url.path).lastPathComponent
+        let manager = FileManager.default
+        let contentsOfPath = try? manager.contentsOfDirectory(atPath: kImageCacheFilePath as String)
+        
+        if (contentsOfPath!.contains(name)) {
+            string = (kImageCacheFilePath as String) + "/" + name
+//            print("图片存在" + string)
+        } else {
+//            print("图片不存在" + (kImageCacheFilePath as String) + "/" + name)
+        }
+        return string
+    }
+}

+ 0 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementModel.swift


+ 0 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementModelTransition.swift


+ 106 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Model/KMAdvertisementTimeStampConversion.swift

@@ -0,0 +1,106 @@
+//
+//  KMAdvertisementTimeStampConversion.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/29.
+//
+
+public class KMAdvertisementTimeStampConversion: NSObject {
+    
+    /**
+     @abstract 时间string转时间戳
+     @param dateString 时间戳字符串
+     @return 时间
+      */
+    static func stringDateToTimestamp(dateString: String) -> TimeInterval{
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+        let date = formatter.date(from: dateString)
+        let time = date!.timeIntervalSince1970 * 1000
+        return time
+    }
+
+    /**
+     @abstract 时间戳转换成时间(HH:mm)
+     @param timeString 时间戳字符串(毫秒)
+     @return 时间string
+      */
+    static func timeStringToTimeSecond(timeString: String) -> String {
+        let interval: TimeInterval = Double(timeString)! / 1000.0
+        let date: Date = Date.init(timeIntervalSince1970: interval)
+        let formatter = DateFormatter()
+        formatter.dateFormat = "HH:mm"
+        let dateString = formatter.string(from: date)
+        return dateString
+    }
+
+    /**
+     @abstract 时间string转date
+     @param string 时间
+     @return Date 时间
+      */
+    static func stringChangeToDate(string: String) -> Date {
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+        formatter.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone?
+        return formatter.date(from: string)!
+    }
+
+    /**
+     @abstract date转时间string
+     @param date 时间
+     @return NSString 时间
+      */
+    static func dateChangeToString(date: Date) -> String {
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyy-MM-dd"
+        return formatter.string(from: date)
+    }
+    
+    /**
+     @abstract 获取当前的时间string
+     @return NSString 时间
+      */
+    public static func getCurrentCompainedDateString() -> String {
+        let date: Date = NSDate() as Date
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+        let timeString = formatter.string(from: date)
+        return timeString
+    }
+    
+    /**
+      @abstract 获取当前时间时间戳
+      */
+    public static func getCurrentTimeInterval () -> String {
+        let date = NSDate.init()
+        let timeSp: String = String(CLong(date.timeIntervalSince1970 * 1000))
+        return timeSp
+    }
+    
+    /**
+     @abstract 判断是否是24小时之内
+     @param timeStamp 时间
+     @return bool
+      */
+    static func isInaDayWithTimestamp(timeStamp: TimeInterval) -> Bool {
+        let currentTimeInterval:TimeInterval = Double(KMAdvertisementTimeStampConversion.getCurrentTimeInterval())!
+        if (currentTimeInterval - timeStamp < 24 * 60 * 60) {
+            return true
+        } else {
+            return false
+        }
+    }
+
+    /**
+     @abstract 获取当前的时间(年月日)
+     @param timeStamp 时间
+     @return bool
+      */
+    static func getCurrentTimeWithYMD() -> String{
+        let date = NSDate()
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyy-MM-dd"
+        return formatter.string(from: date as Date)
+    }
+}

+ 167 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Request/KMAdvertisementRequestServer.swift

@@ -0,0 +1,167 @@
+//
+//  KMAdvertisementRequestServer.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/23.
+//
+
+import AFNetworking
+typealias KMAdvertisementRequestServerCompletion = (_ task: URLSessionDataTask?, _ responseObject: AnyObject?, _ error: Error?) -> Void
+class KMAdvertisementRequestServer {
+    var sessionManager: AFHTTPSessionManager!
+    static let requestServer = KMAdvertisementRequestServer()
+    
+    init() {
+        let configuration: URLSessionConfiguration = URLSessionConfiguration.default
+        sessionManager = AFHTTPSessionManager.init(sessionConfiguration: configuration)
+        sessionManager.securityPolicy = AFSecurityPolicy.default()
+    }
+    
+    func request(urlString: String,
+                 method:String,
+                 params: Dictionary<String, Any>?,
+                 completion: @escaping KMAdvertisementRequestServerCompletion) -> Void {
+        self.request(urlString: urlString,
+                     method: method,
+                     params: params,
+                     requestSerializer: nil,
+                     completion: completion)
+    }
+    
+    func request(urlString: String,
+                 method:String,
+                 params: Dictionary<String, Any>?,
+                 requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
+                 completion: @escaping KMAdvertisementRequestServerCompletion) -> Void {
+        self.request(urlString: urlString,
+                     method: method,
+                     params: params,
+                     requestSerializer: requestSerializer,
+                     body: nil,
+                     completion: completion)
+    }
+    
+    func request(urlString: String,
+                 method:String,
+                 params: Dictionary<String, Any>?,
+                 requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
+                 body: ((_ formData:AFMultipartFormData) -> Void)?,
+                 completion: @escaping KMAdvertisementRequestServerCompletion) -> Void {
+        //每次请求需要重新创建
+        sessionManager.requestSerializer = AFJSONRequestSerializer()
+        sessionManager.responseSerializer = AFJSONResponseSerializer()
+        sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
+        sessionManager.requestSerializer.timeoutInterval = 20
+        if (requestSerializer != nil) {
+            requestSerializer!(sessionManager.requestSerializer);
+        }
+        
+        if (method == "POST") {
+            if (body != nil) {
+                sessionManager.post(urlString, parameters: params, headers: nil) { formData in
+                    body!(formData)
+                } progress: { progress in
+                    
+                } success: { task, responseObject in
+                    let responseObject = responseObject as AnyObject
+                    completion(task,responseObject,nil);
+                } failure: { task, error in
+                    completion(task,nil,error);
+                }
+            } else {
+                sessionManager.post(urlString, parameters: params, headers: nil) { progress in
+                
+                } success: { task, responseObject in
+                    let responseObject = responseObject as AnyObject
+                    completion(task,responseObject,nil)
+                } failure: { task, error in
+                    completion(task,nil,error)
+                }
+
+            }
+        } else if (method == "GET") {
+            sessionManager.get(urlString, parameters: params, headers: nil) { progress in
+                
+            } success: { task, responseObject in
+                let responseObject = responseObject as AnyObject
+                completion(task,responseObject,nil)
+            } failure: { task, error in
+                completion(task,nil,error)
+            }
+        }
+    }
+    
+    /**
+     下载
+     */
+    func downLoad(inputURL: URL,
+                  filePath: String,
+                  progress: @escaping(_ progress: Progress) -> Void,
+                  completion: @escaping KMAdvertisementRequestServerCompletion) {
+        let request: URLRequest = URLRequest.init(url: inputURL)
+        self.sessionManager.requestSerializer.timeoutInterval = 100.0
+        let downloadTask = self.sessionManager.downloadTask(with: request) { resultProgress in
+            progress(resultProgress)
+        } destination: { url, response in
+            return NSURL(fileURLWithPath: filePath) as URL
+        } completionHandler: { resultResponse, resultUrl, error in
+            completion(nil, resultResponse, error)
+        }
+        downloadTask.resume()
+
+
+//        /* 下载地址 */
+//        NSURL *url = [NSURL URLWithString:requestURL];
+//        NSURLRequest *request = [NSURLRequest requestWithURL:url];
+//        /* 下载路径 */
+//        NSString *downFilePath = [NSString stringWithFormat:@"%@/%@", [self setPathOfDocumentsByFileCreated:created fileName:fileName], fileName];
+//        self.downFilePath = downFilePath;
+//
+//        /* 开始请求下载 */
+//        self.downloadTask = [_sessionManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
+//            float p = downloadProgress.fractionCompleted * 100;
+//            if (progress) {
+//                progress(p);
+//            }
+//            NSLog(@"下载进度:%.0f%", downloadProgress.fractionCompleted * 100);
+//        } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
+//            dispatch_async(dispatch_get_main_queue(), ^{
+//                //如果需要进行UI操作,需要获取主线程进行操作
+//            });
+//            /* 设定下载到的位置 */
+//            return [NSURL fileURLWithPath:downFilePath];
+//
+//        } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
+//            NSLog(@"下载完成");
+//            if (error) {
+//                if (failure) {
+//                    failure(error);
+//                }
+//                [weakSelf removeDownLoadFile];
+//            } else {
+//                if (success) {
+//                    success(downFilePath,[weakSelf setPathOfDocumentsByFileCreated:created fileName:fileName]);
+//                }
+//            }
+//        }];
+//        [self.downloadTask resume];
+    }
+    
+    /*
+     status
+     AFNetworkReachabilityStatusUnknown          = -1, 不知道监测的是什么
+     AFNetworkReachabilityStatusNotReachable     = 0,  没有检测到网络
+     AFNetworkReachabilityStatusReachableViaWWAN = 1,  蜂窝网
+     AFNetworkReachabilityStatusReachableViaWiFi = 2,  WIFI
+     */
+    func reachabilityStatusChange(block: @escaping(AFNetworkReachabilityStatus) ->Void) {
+        // 1.创建网络监测单例
+        let manager = AFNetworkReachabilityManager.shared()
+        manager.setReachabilityStatusChange({ status in
+            // 2.实现网络监测的回调
+            block(status)
+        })
+        // 3.开始监测
+        manager.startMonitoring()
+    }
+}

TEMPAT SAMPAH
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ComPDFKit_EN.imageset/ComPDFKit_EN.png


+ 12 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ComPDFKit_EN.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "ComPDFKit_EN.png",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 6 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 23 - 0
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "ad_cancel_button00.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "ad_cancel_button00@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "ad_cancel_button00@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

TEMPAT SAMPAH
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00.png


TEMPAT SAMPAH
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00@2x.png


TEMPAT SAMPAH
PDF Office/PDF Master/Class/KMAdvertisement/Source/KMAdvertisement.xcassets/ad_cancel_button00.imageset/ad_cancel_button00@3x.png


+ 0 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.h


+ 0 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.m


+ 133 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/KMRecommondPopWindow/KMRecommondPopWindow.xib

@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="Named colors" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMRecommondPopWindow">
+            <connections>
+                <outlet property="buyBtn" destination="epg-FR-TYJ" id="ex5-gp-PnX"/>
+                <outlet property="contendView" destination="1Mk-R1-6rP" id="4CP-Ut-trJ"/>
+                <outlet property="expireDateLbl" destination="1jF-tp-HBX" id="vsW-Ej-cfS"/>
+                <outlet property="infoImg" destination="gcd-CO-ZbD" id="qRa-9Y-nf0"/>
+                <outlet property="subTitleLbl" destination="3DN-Kv-6Va" id="W0i-sO-A2i"/>
+                <outlet property="titleLbl" destination="792-fm-cg8" id="zaZ-1g-e1B"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" titlebarAppearsTransparent="YES" titleVisibility="hidden" id="F0z-JX-Cv5">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" fullSizeContentView="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="377" height="368"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <value key="minSize" type="size" width="377" height="368"/>
+            <value key="maxSize" type="size" width="377" height="368"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="377" height="368"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="1Mk-R1-6rP">
+                        <rect key="frame" x="0.0" y="0.0" width="377" height="368"/>
+                        <subviews>
+                            <box fixedFrame="YES" boxType="custom" borderWidth="0.0" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="79v-QL-pHM">
+                                <rect key="frame" x="0.0" y="0.0" width="377" height="368"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                <view key="contentView" id="YPZ-7J-Eem">
+                                    <rect key="frame" x="0.0" y="0.0" width="377" height="368"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                </view>
+                                <color key="fillColor" name="KMWhiteColorDarkChanged03"/>
+                            </box>
+                            <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="gcd-CO-ZbD">
+                                <rect key="frame" x="0.0" y="188" width="377" height="180"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="180" id="gQ3-dT-3vc"/>
+                                </constraints>
+                                <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="twI-wb-ko3"/>
+                            </imageView>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="792-fm-cg8">
+                                <rect key="frame" x="18" y="149" width="341" height="19"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="337" id="dx5-jK-ZzL"/>
+                                </constraints>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Back to School with Big Saving!" id="zzz-Sm-8kE">
+                                    <font key="font" metaFont="systemSemibold" size="16"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3DN-Kv-6Va">
+                                <rect key="frame" x="18" y="107" width="341" height="30"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="337" id="3ga-C1-QeG"/>
+                                </constraints>
+                                <textFieldCell key="cell" lineBreakMode="charWrapping" alignment="left" title="Prep for success with PDF Reader Pro &amp; Filmage Screen
The best PDF editor and screen recorder" id="9FH-T0-Cbn">
+                                    <font key="font" metaFont="cellTitle"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1jF-tp-HBX">
+                                <rect key="frame" x="18" y="80" width="341" height="15"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Expire on Aug.17" id="53S-JE-oO8">
+                                    <font key="font" metaFont="cellTitle"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="epg-FR-TYJ">
+                                <rect key="frame" x="20" y="28" width="337" height="32"/>
+                                <buttonCell key="cell" type="bevel" title="Button" bezelStyle="rounded" alignment="center" imageScaling="proportionallyDown" inset="2" id="boG-Wk-21E">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="32" id="ADj-aw-54t"/>
+                                </constraints>
+                                <connections>
+                                    <action selector="buyAction:" target="-2" id="kWD-Nv-lOH"/>
+                                </connections>
+                            </button>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="trailing" secondItem="792-fm-cg8" secondAttribute="trailing" constant="20" id="2hx-X4-RyM"/>
+                            <constraint firstItem="gcd-CO-ZbD" firstAttribute="top" secondItem="1Mk-R1-6rP" secondAttribute="top" id="4O6-Xc-d33"/>
+                            <constraint firstItem="1jF-tp-HBX" firstAttribute="leading" secondItem="1Mk-R1-6rP" secondAttribute="leading" constant="20" id="G2p-Wo-9dX"/>
+                            <constraint firstItem="gcd-CO-ZbD" firstAttribute="leading" secondItem="1Mk-R1-6rP" secondAttribute="leading" id="JKb-pf-qid"/>
+                            <constraint firstItem="792-fm-cg8" firstAttribute="top" secondItem="gcd-CO-ZbD" secondAttribute="bottom" constant="20" id="Ktg-It-xpv"/>
+                            <constraint firstAttribute="trailing" secondItem="gcd-CO-ZbD" secondAttribute="trailing" id="OkL-X1-plg"/>
+                            <constraint firstItem="epg-FR-TYJ" firstAttribute="leading" secondItem="1Mk-R1-6rP" secondAttribute="leading" constant="20" id="V6U-0T-as9"/>
+                            <constraint firstItem="3DN-Kv-6Va" firstAttribute="top" secondItem="792-fm-cg8" secondAttribute="bottom" constant="12" id="Xfx-92-DNM"/>
+                            <constraint firstItem="epg-FR-TYJ" firstAttribute="top" secondItem="1jF-tp-HBX" secondAttribute="bottom" constant="20" id="aoJ-TG-za1"/>
+                            <constraint firstItem="792-fm-cg8" firstAttribute="leading" secondItem="1Mk-R1-6rP" secondAttribute="leading" constant="20" id="eKY-lR-TGI"/>
+                            <constraint firstItem="1jF-tp-HBX" firstAttribute="top" secondItem="3DN-Kv-6Va" secondAttribute="bottom" constant="12" id="ho0-XN-3KK"/>
+                            <constraint firstAttribute="trailing" secondItem="1jF-tp-HBX" secondAttribute="trailing" constant="20" id="spH-Ug-QpG"/>
+                            <constraint firstItem="3DN-Kv-6Va" firstAttribute="centerX" secondItem="1Mk-R1-6rP" secondAttribute="centerX" id="t1e-3e-3QO"/>
+                            <constraint firstAttribute="trailing" secondItem="epg-FR-TYJ" secondAttribute="trailing" constant="20" id="vBu-KF-hO7"/>
+                        </constraints>
+                    </customView>
+                </subviews>
+                <constraints>
+                    <constraint firstAttribute="trailing" secondItem="1Mk-R1-6rP" secondAttribute="trailing" id="6la-4h-XmM"/>
+                    <constraint firstItem="1Mk-R1-6rP" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="7Gj-pr-hKI"/>
+                    <constraint firstAttribute="bottom" secondItem="1Mk-R1-6rP" secondAttribute="bottom" id="m4A-lh-E1c"/>
+                    <constraint firstItem="1Mk-R1-6rP" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="zmj-Tu-zmb"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="-74.5" y="307"/>
+        </window>
+    </objects>
+    <resources>
+        <namedColor name="KMWhiteColorDarkChanged03">
+            <color red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </namedColor>
+    </resources>
+</document>

+ 50 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionHeadView.swift

@@ -0,0 +1,50 @@
+//
+//  KMAdvertisementCollectionHeadView.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/28.
+//
+
+#if os(OSX)
+    import AppKit
+#elseif os(iOS)
+    import UIKit
+#endif
+class KMAdvertisementCollectionHeadView: NSView {
+
+    lazy var titleTextField: NSTextField? = {
+        for view in self.subviews {
+            if view is NSTextField {
+                return view as? NSTextField
+            }
+        }
+        return nil
+    }()
+    
+    var model: KMAdvertisementItem! {
+        didSet {
+            self.reloadData()
+        }
+    }
+    
+    func reloadData() {
+        self.isHidden = true
+        if model?.name != nil {
+            self.titleTextField?.stringValue = KMAdvertisementModelTransition.transitionLanguage(langeuage: (model?.name)!)
+        }
+        self.isHidden = false
+        
+        self.titleTextField?.textColor = KMAppearance.Layout.h1Color()
+        
+//        if model.sectionTitle?.color != nil {
+//            self.titleTextField?.textColor = KMAdvertisementModelTransition.transitionColor(color: (model.sectionTitle?.color)!, highlight: false)
+//        }
+    }
+    
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+}

+ 32 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionHeadView.xib

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMAdvertisementCollectionHeadView" customModule="PDF_Master" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="30"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="DuE-Mw-GiV">
+                    <rect key="frame" x="6" y="7" width="4" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" id="KZj-T6-HnW">
+                        <font key="font" usesAppearanceFont="YES"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+            </subviews>
+            <constraints>
+                <constraint firstItem="DuE-Mw-GiV" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="b12-fX-rby"/>
+                <constraint firstItem="DuE-Mw-GiV" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="8" id="rGK-BD-UB7"/>
+            </constraints>
+            <point key="canvasLocation" x="0.0" y="172"/>
+        </customView>
+    </objects>
+</document>

+ 87 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionViewItem.swift

@@ -0,0 +1,87 @@
+//
+//  KMAdvertisementCollectionViewItem.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/28.
+//
+
+import Cocoa
+class KMAdvertisementCollectionViewItem: NSCollectionViewItem {
+    @IBOutlet weak var iconImageView: NSImageView!
+    @IBOutlet weak var titleLabel: NSTextField!
+    
+    @IBOutlet weak var contentView: NSView!
+    var model: KMAdvertisementItemInfo? {
+        didSet {
+            self.reloadData()
+        }
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do view setup here.
+        self.view.addTrackingRect(self.view.bounds, owner: self, userData: nil, assumeInside: false)
+        self.contentView.wantsLayer = true
+        self.contentView.layer?.masksToBounds = true
+        self.updateColor(false)
+//        self.contentView.layer?.backgroundColor = NSColor.init(red: 38.0/255.0, green: 40/255.0, blue: 43/255.0, alpha: 1).cgColor
+    }
+    
+    func reloadData() {
+        self.titleLabel.stringValue = KMAdvertisementModelTransition.transitionLanguage(langeuage: model?.name)
+//        self.titleLabel.font = NSFont.init(name: model?.title?.font?.name ?? "AppleSystemUIFont", size: CGFloat(model?.title?.font?.size ?? 13))
+        self.contentView.toolTip = KMAdvertisementModelTransition.transitionLanguage(langeuage: model?.tooltip)
+        self.contentView.layer?.cornerRadius = 4
+        self.updateColor(false)
+    }
+    
+    func updateColor(_ highlight: Bool) {
+//        self.view.appearance = NSAppearance(named: .aqua)
+        if highlight {
+            if KMAdvertisementConfig.isDarkModel() {
+                self.titleLabel.textColor = NSColor.km_init(hex: "#4E7EDB")
+                self.contentView.backgroundColor(NSColor.km_init(hex: "#FFFFFF", alpha: 0.05))
+            } else {
+                self.titleLabel.textColor = NSColor.km_init(hex: "#273C62")
+                self.contentView.backgroundColor(NSColor.km_init(hex: "#000000", alpha: 0.05))
+            }
+        } else {
+            if KMAdvertisementConfig.isDarkModel() {
+                self.contentView.backgroundColor(NSColor.km_init(hex: "#26282B"))
+                self.titleLabel.textColor = NSColor.km_init(hex: "#C8C9CC")
+            } else {
+                self.contentView.backgroundColor(NSColor.km_init(hex: "#FCFDFF"))
+                self.titleLabel.textColor = NSColor.km_init(hex: "#42464D")
+            }
+        }
+        
+        let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: model?.image, highlight: highlight))
+        self.iconImageView.image = KMAdvertisementImage.imageWithURL(url: url, completion: { [weak self] image in
+            self?.iconImageView.image = image
+        })
+    }
+    
+//    func updateColor(_ highlight: Bool) {
+//        
+//        if highlight {
+//            self.titleLabel.textColor = KMAppearance.Layout.mColor()
+//            self.contentView.layer?.backgroundColor = KMAppearance.Status.hovColor().cgColor
+//        } else {
+//            self.titleLabel.textColor = KMAppearance.Layout.h1Color()
+//            self.contentView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
+//        }
+//        
+//        let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: model?.image, highlight: highlight))
+//        self.iconImageView.image = KMAdvertisementImage.imageWithURL(url: url, completion: { [weak self] image in
+//            self?.iconImageView.image = image
+//        })
+//    }
+    
+    override func mouseEntered(with event: NSEvent) {
+        self.updateColor(true)
+    }
+
+    override func mouseExited(with event: NSEvent) {
+        self.updateColor(false)
+    }
+}

+ 60 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/Cell/KMAdvertisementCollectionViewItem.xib

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMAdvertisementCollectionViewItem" customModule="PDF_Master" customModuleProvider="target">
+            <connections>
+                <outlet property="contentView" destination="LdM-b2-48C" id="hxf-ZH-gmW"/>
+                <outlet property="iconImageView" destination="EPJ-sc-6wa" id="qq0-MW-YTG"/>
+                <outlet property="titleLabel" destination="8KY-8V-DxN" id="tt2-Pa-lKm"/>
+                <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView clipsToBounds="YES" id="Hz6-mo-xeY">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="40"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="LdM-b2-48C">
+                    <rect key="frame" x="8" y="0.0" width="464" height="40"/>
+                    <subviews>
+                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="EPJ-sc-6wa">
+                            <rect key="frame" x="8" y="11" width="18" height="18"/>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="18" id="Ywl-Eq-mjQ"/>
+                                <constraint firstAttribute="height" constant="18" id="hZR-Bt-Rqf"/>
+                            </constraints>
+                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" id="3Et-Pz-ChQ"/>
+                        </imageView>
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8KY-8V-DxN">
+                            <rect key="frame" x="32" y="12" width="37" height="16"/>
+                            <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Ikm-0K-43v">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </textFieldCell>
+                        </textField>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="8KY-8V-DxN" firstAttribute="centerY" secondItem="LdM-b2-48C" secondAttribute="centerY" id="QhX-B6-0Gz"/>
+                        <constraint firstItem="EPJ-sc-6wa" firstAttribute="centerY" secondItem="LdM-b2-48C" secondAttribute="centerY" id="S3d-gc-JcD"/>
+                        <constraint firstItem="8KY-8V-DxN" firstAttribute="leading" secondItem="EPJ-sc-6wa" secondAttribute="trailing" constant="8" id="WvN-xe-2DQ"/>
+                        <constraint firstItem="EPJ-sc-6wa" firstAttribute="leading" secondItem="LdM-b2-48C" secondAttribute="leading" constant="8" id="ySs-Bg-GIy"/>
+                    </constraints>
+                </customView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="LdM-b2-48C" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="8" id="3Z0-5E-Ft2"/>
+                <constraint firstAttribute="trailing" secondItem="LdM-b2-48C" secondAttribute="trailing" constant="8" id="QxU-Q6-tXm"/>
+                <constraint firstAttribute="bottom" secondItem="LdM-b2-48C" secondAttribute="bottom" id="Yfe-zv-dSm"/>
+                <constraint firstItem="LdM-b2-48C" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="vKN-hS-h44"/>
+            </constraints>
+            <point key="canvasLocation" x="157" y="45"/>
+        </customView>
+    </objects>
+</document>

+ 188 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/KMAdvertisementTableView.swift

@@ -0,0 +1,188 @@
+//
+//  KMAdvertisementTableView.swift
+//  KMAdvertisement
+//
+//  Created by lizhe on 2022/11/28.
+//
+
+#if os(OSX)
+    import AppKit
+#elseif os(iOS)
+    import UIKit
+#endif
+
+typealias KMAdvertisementTableViewDidSelect = (_ view: KMAdvertisementTableView, _ item: KMAdvertisementItemInfo) -> Void
+@objcMembers open class KMAdvertisementTableView: NSView {
+
+    @IBOutlet var contentView: NSView!
+    
+    @IBOutlet weak var collectionView: NSCollectionView!
+
+    
+    var didSelect: KMAdvertisementTableViewDidSelect?
+    /**
+      @abstract 外部传入数据
+      @param inputData 文件路劲
+      */
+    open var inputData: KMAdvertisementContent? {
+        didSet {
+            self.reloadData()
+        }
+    }
+
+    //内部使用数据
+    fileprivate var data: [KMAdvertisementItem] = []
+
+    open override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+
+        // Drawing code here.
+    }
+    
+    convenience init (data: [KMAdvertisementItem], superView: NSView) {
+        self.init(frame: superView.bounds)
+        superView.addSubview(self)
+        self.autoresizingMask = [.height , .width]
+//        self.translatesAutoresizingMaskIntoConstraints = false
+//        NSLayoutConstraint.activate([
+//            self.topAnchor.constraint(equalTo: topAnchor),
+//            self.leftAnchor.constraint(equalTo: leftAnchor),
+//            self.rightAnchor.constraint(equalTo: rightAnchor),
+//            self.bottomAnchor.constraint(equalTo: bottomAnchor)])
+//        self.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    public override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: self.classForCoder.self),
+                             bundle: Bundle(for: self.classForCoder.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        //设置代理
+        self.collectionView.delegate = self
+        self.collectionView.dataSource = self
+        //是否可选中
+        self.collectionView.isSelectable = true
+        //注册cell
+        self.collectionView.register(KMAdvertisementCollectionViewItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMAdvertisementCollectionViewItem"))
+        
+//        self.backgroundColor(KMAppearance.Layout.l0Color())
+    }
+    
+    func reloadData() {
+        guard let inputData = inputData else { return }
+        
+        self.data.removeAll()
+        if inputData.recommondContentPDFPro != nil && inputData.recommondContentPDFPro?.content?.count != 0 {
+            self.data.append(inputData.recommondContentPDFPro!)
+        }
+        
+        if inputData.recommondContentOther != nil && inputData.recommondContentOther?.content?.count != 0 {
+            self.data.append(inputData.recommondContentOther!)
+        }
+        
+        self.collectionView.reloadData()
+    }
+}
+
+extension KMAdvertisementTableView: NSCollectionViewDelegate {
+    //当item被选中
+    public func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
+        print("点击")
+        let view = collectionView.item(at: indexPaths.first!) as! KMAdvertisementCollectionViewItem
+        
+        let content = view.model
+        
+        guard let callBack = didSelect else { return }
+        
+        content?.index = indexPaths.first!.item
+        callBack(self, content!)
+    }
+    
+   //当item取消选中
+    public func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
+        _ = collectionView.item(at: indexPaths.first!) as! KMAdvertisementCollectionViewItem
+    }
+}
+
+extension KMAdvertisementTableView: NSCollectionViewDataSource {
+    public func numberOfSections(in collectionView: NSCollectionView) -> Int {
+        return self.data.count
+    }
+    
+    public func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
+        let model: KMAdvertisementItem = (self.data[section])
+        return model.content!.count
+    }
+    
+    //返回对应的item自定义个体
+    public func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
+        let view = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMAdvertisementCollectionViewItem"), for: indexPath) as! KMAdvertisementCollectionViewItem
+        
+        let model = self.data[indexPath.section]
+        view.model = model.content![indexPath.item]
+        return view
+    }
+    
+    public func collectionView(_ collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: NSCollectionView.SupplementaryElementKind, at indexPath: IndexPath) -> NSView {
+        var nibName: String?
+        var view = NSView()
+        if kind == NSCollectionView.elementKindSectionHeader {
+            nibName = "KMAdvertisementCollectionHeadView"
+            
+            view = collectionView.makeSupplementaryView(ofKind: kind, withIdentifier: NSUserInterfaceItemIdentifier(rawValue: nibName!), for: indexPath)
+            if let view = view as? KMAdvertisementCollectionHeadView {
+                let model = self.data[indexPath.section]
+                view.model = model
+            }
+        } else if kind == NSCollectionView.elementKindSectionFooter {
+            nibName = "KMAdvertisementCollectionHeadView"
+            
+            view = collectionView.makeSupplementaryView(ofKind: kind, withIdentifier: NSUserInterfaceItemIdentifier(rawValue: nibName!), for: indexPath)
+        }
+        return view
+    }
+}
+
+extension KMAdvertisementTableView: NSCollectionViewDelegateFlowLayout {
+    
+    public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
+//        return NSSize(width: self.contentView.bounds.width, height: 32)
+        return NSSize(width: 238, height: 32)
+    }
+    
+    public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> NSSize {
+        return NSSize(width: 0, height: 30)
+    }
+    
+    public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, referenceSizeForFooterInSection section: Int) -> NSSize {
+        return NSSize(width: 0, height: 20)
+    }
+    
+    public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+        return 4
+    }
+}

+ 57 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/Tableview/KMAdvertisementTableView.xib

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMAdvertisementTableView" customModule="PDF_Master" customModuleProvider="target">
+            <connections>
+                <outlet property="collectionView" destination="DM1-E5-H8J" id="npq-W6-KFs"/>
+                <outlet property="contentView" destination="c22-O7-iKe" id="PMK-sn-xgD"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="246" height="431"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UFo-Fd-Vqk">
+                    <rect key="frame" x="0.0" y="0.0" width="246" height="431"/>
+                    <clipView key="contentView" drawsBackground="NO" id="M51-ZI-aP5">
+                        <rect key="frame" x="0.0" y="0.0" width="246" height="431"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <collectionView id="DM1-E5-H8J">
+                                <rect key="frame" x="0.0" y="0.0" width="246" height="431"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES"/>
+                                <collectionViewFlowLayout key="collectionViewLayout" id="QQ0-er-OSn">
+                                    <size key="itemSize" width="50" height="50"/>
+                                </collectionViewFlowLayout>
+                                <color key="primaryBackgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                            </collectionView>
+                        </subviews>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    </clipView>
+                    <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="PAQ-UO-Nz6">
+                        <rect key="frame" x="-100" y="-100" width="233" height="15"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </scroller>
+                    <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="BXa-fT-rRG">
+                        <rect key="frame" x="234" y="1" width="15" height="143"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                    </scroller>
+                </scrollView>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="UFo-Fd-Vqk" secondAttribute="bottom" id="KWL-Zf-KFW"/>
+                <constraint firstItem="UFo-Fd-Vqk" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="ShF-i8-p4g"/>
+                <constraint firstItem="UFo-Fd-Vqk" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="oVj-wf-0sg"/>
+                <constraint firstAttribute="trailing" secondItem="UFo-Fd-Vqk" secondAttribute="trailing" id="v5c-3v-n9k"/>
+            </constraints>
+            <point key="canvasLocation" x="27" y="170"/>
+        </customView>
+    </objects>
+</document>

+ 87 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/View/KMAdvertisementShowView.swift

@@ -0,0 +1,87 @@
+//
+//  KMAdvertisementShowView.swift
+//  PDF Reader Pro
+//
+//  Created by lizhe on 2023/10/26.
+//
+
+import Cocoa
+
+typealias KMAdvertisementShowViewDidSelect = (_ view: KMAdvertisementShowView, _ item: KMAdvertisementItemInfo) -> Void
+
+class KMAdvertisementShowView: NSView {
+    @IBOutlet var contentView: NSView!
+    @IBOutlet weak var iconImage: NSImageView!
+    @IBOutlet weak var closeButton: NSButton!
+    @IBOutlet weak var contentButton: NSButton!
+    
+    var didSelect: KMAdvertisementShowViewDidSelect?
+    
+    open var inputData: KMAdvertisementItem? {
+        didSet {
+            self.reloadData()
+        }
+    }
+    
+    convenience init (data: [KMAdvertisementItem], superView: NSView) {
+        self.init(frame: superView.bounds)
+        superView.addSubview(self)
+        self.autoresizingMask = [.height , .width]
+    }
+    
+    public override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        initContentView()
+        setup()
+    }
+    
+    // MARK: 初始化
+    public required init?(coder decoder: NSCoder) {
+        super.init(coder: decoder)
+        initContentView()
+        setup()
+    }
+
+    private func initContentView() {
+        //绑定xib
+        let resource = NSNib(nibNamed: String(describing: self.classForCoder.self),
+                             bundle: Bundle(for: self.classForCoder.self))!
+        resource.instantiate(withOwner: self, topLevelObjects: nil)
+        addSubview(contentView)
+        contentView.translatesAutoresizingMaskIntoConstraints = false
+        NSLayoutConstraint.activate([
+            contentView.topAnchor.constraint(equalTo: topAnchor),
+            contentView.leftAnchor.constraint(equalTo: leftAnchor),
+            contentView.rightAnchor.constraint(equalTo: rightAnchor),
+            contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
+        contentView.updateConstraintsForSubtreeIfNeeded()
+    }
+    
+    func setup() {
+        self.contentView.isHidden = true
+//        self.backgroundColor(NSColor.black)
+    }
+    
+    func reloadData() {
+        guard let model = inputData?.content?.first else { 
+            self.contentView.isHidden = true
+            return
+        }
+        self.contentView.isHidden = false
+        
+        let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: model.image, highlight: false))
+        self.iconImage.image = KMAdvertisementImage.imageWithURL(url: url, completion: { [weak self] image in
+            self?.iconImage.image = image
+        })
+    }
+    
+    @IBAction func contentButtonAction(_ sender: Any) {
+        guard let model = inputData?.content?.first else { return }
+        
+        self.didSelect?(self, model)
+    }
+    
+    @IBAction func closeButtonAction(_ sender: Any) {
+        self.removeFromSuperview()
+    }
+}

+ 78 - 0
PDF Office/PDF Master/Class/KMAdvertisement/View/View/KMAdvertisementShowView.xib

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22505"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMAdvertisementShowView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="closeButton" destination="Iay-VK-ICj" id="65i-qn-Dts"/>
+                <outlet property="contentView" destination="c22-O7-iKe" id="GO1-1D-DOk"/>
+                <outlet property="iconImage" destination="obQ-2R-s8Q" id="1En-Hz-bM1"/>
+            </connections>
+        </customObject>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe">
+            <rect key="frame" x="0.0" y="0.0" width="208" height="120"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <view translatesAutoresizingMaskIntoConstraints="NO" id="geo-Fe-wJO">
+                    <rect key="frame" x="0.0" y="0.0" width="208" height="120"/>
+                    <subviews>
+                        <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="obQ-2R-s8Q">
+                            <rect key="frame" x="0.0" y="0.0" width="208" height="120"/>
+                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" id="DKy-5d-0cT"/>
+                        </imageView>
+                        <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FlW-6z-t7c">
+                            <rect key="frame" x="0.0" y="0.0" width="208" height="120"/>
+                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" imagePosition="left" inset="2" id="RqG-IP-4V1">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="contentButtonAction:" target="-2" id="05B-1b-7ai"/>
+                            </connections>
+                        </button>
+                        <button translatesAutoresizingMaskIntoConstraints="NO" id="Iay-VK-ICj">
+                            <rect key="frame" x="178" y="90" width="30" height="30"/>
+                            <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ad_cancel_button00" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="8hF-TJ-Gz3">
+                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                <font key="font" metaFont="system"/>
+                            </buttonCell>
+                            <connections>
+                                <action selector="closeButtonAction:" target="-2" id="o5y-02-xWU"/>
+                            </connections>
+                        </button>
+                    </subviews>
+                    <constraints>
+                        <constraint firstItem="Iay-VK-ICj" firstAttribute="top" secondItem="geo-Fe-wJO" secondAttribute="top" id="1h9-Vm-BE3"/>
+                        <constraint firstItem="FlW-6z-t7c" firstAttribute="leading" secondItem="geo-Fe-wJO" secondAttribute="leading" id="2Uc-K3-gXy"/>
+                        <constraint firstAttribute="trailing" secondItem="FlW-6z-t7c" secondAttribute="trailing" id="2gJ-5U-099"/>
+                        <constraint firstAttribute="bottom" secondItem="FlW-6z-t7c" secondAttribute="bottom" id="4Z2-Tb-tB1"/>
+                        <constraint firstAttribute="trailing" secondItem="obQ-2R-s8Q" secondAttribute="trailing" id="GgU-22-lBM"/>
+                        <constraint firstAttribute="bottom" secondItem="obQ-2R-s8Q" secondAttribute="bottom" id="Pd3-qI-Nx8"/>
+                        <constraint firstItem="obQ-2R-s8Q" firstAttribute="top" secondItem="geo-Fe-wJO" secondAttribute="top" id="f86-yV-16W"/>
+                        <constraint firstAttribute="trailing" secondItem="Iay-VK-ICj" secondAttribute="trailing" id="fkb-Kj-0hp"/>
+                        <constraint firstAttribute="height" constant="120" id="kze-Mi-xh1"/>
+                        <constraint firstAttribute="width" constant="208" id="mJa-Ch-4S7"/>
+                        <constraint firstItem="FlW-6z-t7c" firstAttribute="top" secondItem="geo-Fe-wJO" secondAttribute="top" id="oah-aB-v14"/>
+                        <constraint firstItem="obQ-2R-s8Q" firstAttribute="leading" secondItem="geo-Fe-wJO" secondAttribute="leading" id="z7j-Ok-plA"/>
+                    </constraints>
+                </view>
+            </subviews>
+            <constraints>
+                <constraint firstItem="geo-Fe-wJO" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="Wsc-Zz-Jcg"/>
+                <constraint firstAttribute="bottom" secondItem="geo-Fe-wJO" secondAttribute="bottom" id="XVI-eH-kLb"/>
+                <constraint firstItem="geo-Fe-wJO" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="pTB-hd-9WZ"/>
+                <constraint firstAttribute="trailing" secondItem="geo-Fe-wJO" secondAttribute="trailing" id="zJf-kp-Q7m"/>
+            </constraints>
+            <point key="canvasLocation" x="40" y="83.5"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="ad_cancel_button00" width="30" height="30"/>
+    </resources>
+</document>

+ 250 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -3873,6 +3873,63 @@
 		BB8115FF2992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8115FE2992682F0008F536 /* KMSecureLimitAlertView.swift */; };
 		BB8116002992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8115FE2992682F0008F536 /* KMSecureLimitAlertView.swift */; };
 		BB8116012992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8115FE2992682F0008F536 /* KMSecureLimitAlertView.swift */; };
+		BB8252462C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252282C51E28D006D8904 /* KMAdvertisementCache.swift */; };
+		BB8252472C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252282C51E28D006D8904 /* KMAdvertisementCache.swift */; };
+		BB8252482C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252282C51E28D006D8904 /* KMAdvertisementCache.swift */; };
+		BB8252492C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522A2C51E28D006D8904 /* KMAdvertisementConfig.swift */; };
+		BB82524A2C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522A2C51E28D006D8904 /* KMAdvertisementConfig.swift */; };
+		BB82524B2C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522A2C51E28D006D8904 /* KMAdvertisementConfig.swift */; };
+		BB82524C2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB82522C2C51E28D006D8904 /* KMAdvertisement.xcassets */; };
+		BB82524D2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB82522C2C51E28D006D8904 /* KMAdvertisement.xcassets */; };
+		BB82524E2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB82522C2C51E28D006D8904 /* KMAdvertisement.xcassets */; };
+		BB82524F2C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522E2C51E28D006D8904 /* KMAdvertisementManager.swift */; };
+		BB8252502C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522E2C51E28D006D8904 /* KMAdvertisementManager.swift */; };
+		BB8252512C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82522E2C51E28D006D8904 /* KMAdvertisementManager.swift */; };
+		BB8252522C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252302C51E28D006D8904 /* KMAdvertisementModel.swift */; };
+		BB8252532C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252302C51E28D006D8904 /* KMAdvertisementModel.swift */; };
+		BB8252542C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252302C51E28D006D8904 /* KMAdvertisementModel.swift */; };
+		BB8252552C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252312C51E28D006D8904 /* KMAdvertisementImage.swift */; };
+		BB8252562C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252312C51E28D006D8904 /* KMAdvertisementImage.swift */; };
+		BB8252572C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252312C51E28D006D8904 /* KMAdvertisementImage.swift */; };
+		BB8252582C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252322C51E28D006D8904 /* KMAdvertisementModelTransition.swift */; };
+		BB8252592C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252322C51E28D006D8904 /* KMAdvertisementModelTransition.swift */; };
+		BB82525A2C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252322C51E28D006D8904 /* KMAdvertisementModelTransition.swift */; };
+		BB82525B2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252332C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift */; };
+		BB82525C2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252332C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift */; };
+		BB82525D2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252332C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift */; };
+		BB82525E2C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252372C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib */; };
+		BB82525F2C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252372C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib */; };
+		BB8252602C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252372C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib */; };
+		BB8252612C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252382C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib */; };
+		BB8252622C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252382C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib */; };
+		BB8252632C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252382C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib */; };
+		BB8252642C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252392C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift */; };
+		BB8252652C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252392C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift */; };
+		BB8252662C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252392C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift */; };
+		BB8252672C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523A2C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift */; };
+		BB8252682C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523A2C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift */; };
+		BB8252692C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523A2C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift */; };
+		BB82526A2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523B2C51E28D006D8904 /* KMAdvertisementTableView.xib */; };
+		BB82526B2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523B2C51E28D006D8904 /* KMAdvertisementTableView.xib */; };
+		BB82526C2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523B2C51E28D006D8904 /* KMAdvertisementTableView.xib */; };
+		BB82526D2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523C2C51E28D006D8904 /* KMAdvertisementTableView.swift */; };
+		BB82526E2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523C2C51E28D006D8904 /* KMAdvertisementTableView.swift */; };
+		BB82526F2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB82523C2C51E28D006D8904 /* KMAdvertisementTableView.swift */; };
+		BB8252702C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523E2C51E28D006D8904 /* KMRecommondPopWindow.xib */; };
+		BB8252712C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523E2C51E28D006D8904 /* KMRecommondPopWindow.xib */; };
+		BB8252722C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB82523E2C51E28D006D8904 /* KMRecommondPopWindow.xib */; };
+		BB8252732C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BB8252402C51E28D006D8904 /* KMRecommondPopWindow.m */; };
+		BB8252742C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BB8252402C51E28D006D8904 /* KMRecommondPopWindow.m */; };
+		BB8252752C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = BB8252402C51E28D006D8904 /* KMRecommondPopWindow.m */; };
+		BB8252762C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252422C51E28D006D8904 /* KMAdvertisementShowView.swift */; };
+		BB8252772C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252422C51E28D006D8904 /* KMAdvertisementShowView.swift */; };
+		BB8252782C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252422C51E28D006D8904 /* KMAdvertisementShowView.swift */; };
+		BB8252792C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252432C51E28D006D8904 /* KMAdvertisementShowView.xib */; };
+		BB82527A2C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252432C51E28D006D8904 /* KMAdvertisementShowView.xib */; };
+		BB82527B2C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB8252432C51E28D006D8904 /* KMAdvertisementShowView.xib */; };
+		BB82527C2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252452C51E28D006D8904 /* KMAdvertisementRequestServer.swift */; };
+		BB82527D2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252452C51E28D006D8904 /* KMAdvertisementRequestServer.swift */; };
+		BB82527E2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8252452C51E28D006D8904 /* KMAdvertisementRequestServer.swift */; };
 		BB83639A2C199C20002CE43A /* KMBotaModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8363992C199C20002CE43A /* KMBotaModel.swift */; };
 		BB83639B2C199C20002CE43A /* KMBotaModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8363992C199C20002CE43A /* KMBotaModel.swift */; };
 		BB83639C2C199C20002CE43A /* KMBotaModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8363992C199C20002CE43A /* KMBotaModel.swift */; };
@@ -6967,6 +7024,26 @@
 		BB7FF5062A60E84400901C2D /* KMEnumExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMEnumExtensions.swift; sourceTree = "<group>"; };
 		BB8115FA29924A5F0008F536 /* KMSecureEncryptCheckCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSecureEncryptCheckCellView.swift; sourceTree = "<group>"; };
 		BB8115FE2992682F0008F536 /* KMSecureLimitAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSecureLimitAlertView.swift; sourceTree = "<group>"; };
+		BB8252282C51E28D006D8904 /* KMAdvertisementCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementCache.swift; sourceTree = "<group>"; };
+		BB82522A2C51E28D006D8904 /* KMAdvertisementConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementConfig.swift; sourceTree = "<group>"; };
+		BB82522C2C51E28D006D8904 /* KMAdvertisement.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = KMAdvertisement.xcassets; sourceTree = "<group>"; };
+		BB82522E2C51E28D006D8904 /* KMAdvertisementManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementManager.swift; sourceTree = "<group>"; };
+		BB8252302C51E28D006D8904 /* KMAdvertisementModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementModel.swift; sourceTree = "<group>"; };
+		BB8252312C51E28D006D8904 /* KMAdvertisementImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementImage.swift; sourceTree = "<group>"; };
+		BB8252322C51E28D006D8904 /* KMAdvertisementModelTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementModelTransition.swift; sourceTree = "<group>"; };
+		BB8252332C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementTimeStampConversion.swift; sourceTree = "<group>"; };
+		BB8252372C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMAdvertisementCollectionViewItem.xib; sourceTree = "<group>"; };
+		BB8252382C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMAdvertisementCollectionHeadView.xib; sourceTree = "<group>"; };
+		BB8252392C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementCollectionViewItem.swift; sourceTree = "<group>"; };
+		BB82523A2C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementCollectionHeadView.swift; sourceTree = "<group>"; };
+		BB82523B2C51E28D006D8904 /* KMAdvertisementTableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMAdvertisementTableView.xib; sourceTree = "<group>"; };
+		BB82523C2C51E28D006D8904 /* KMAdvertisementTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementTableView.swift; sourceTree = "<group>"; };
+		BB82523E2C51E28D006D8904 /* KMRecommondPopWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMRecommondPopWindow.xib; sourceTree = "<group>"; };
+		BB82523F2C51E28D006D8904 /* KMRecommondPopWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMRecommondPopWindow.h; sourceTree = "<group>"; };
+		BB8252402C51E28D006D8904 /* KMRecommondPopWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMRecommondPopWindow.m; sourceTree = "<group>"; };
+		BB8252422C51E28D006D8904 /* KMAdvertisementShowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementShowView.swift; sourceTree = "<group>"; };
+		BB8252432C51E28D006D8904 /* KMAdvertisementShowView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMAdvertisementShowView.xib; sourceTree = "<group>"; };
+		BB8252452C51E28D006D8904 /* KMAdvertisementRequestServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMAdvertisementRequestServer.swift; sourceTree = "<group>"; };
 		BB8363992C199C20002CE43A /* KMBotaModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBotaModel.swift; sourceTree = "<group>"; };
 		BB83B8EB2BA8415900EFF584 /* KMPageEditExtractWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPageEditExtractWindowController.swift; sourceTree = "<group>"; };
 		BB853C622AF87425009C20C1 /* KMBatchOperateRemoveWatermarkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperateRemoveWatermarkViewController.swift; sourceTree = "<group>"; };
@@ -11473,6 +11550,7 @@
 		BB2C6A7128F2652500478A33 /* Class */ = {
 			isa = PBXGroup;
 			children = (
+				BB8252262C51E28D006D8904 /* KMAdvertisement */,
 				AD7D5C7F2B8ECC74006562CD /* Parsers */,
 				BB0FE01F2B734DD1001E0F88 /* AIInfo */,
 				ADFCEB2F2B4F77CC0001EBAF /* KMFileManager */,
@@ -12280,6 +12358,121 @@
 			path = images;
 			sourceTree = "<group>";
 		};
+		BB8252262C51E28D006D8904 /* KMAdvertisement */ = {
+			isa = PBXGroup;
+			children = (
+				BB82522B2C51E28D006D8904 /* Source */,
+				BB8252272C51E28D006D8904 /* Cache */,
+				BB8252292C51E28D006D8904 /* Config */,
+				BB82522D2C51E28D006D8904 /* Manager */,
+				BB82522F2C51E28D006D8904 /* Model */,
+				BB8252342C51E28D006D8904 /* View */,
+				BB8252442C51E28D006D8904 /* Request */,
+			);
+			path = KMAdvertisement;
+			sourceTree = "<group>";
+		};
+		BB8252272C51E28D006D8904 /* Cache */ = {
+			isa = PBXGroup;
+			children = (
+				BB8252282C51E28D006D8904 /* KMAdvertisementCache.swift */,
+			);
+			path = Cache;
+			sourceTree = "<group>";
+		};
+		BB8252292C51E28D006D8904 /* Config */ = {
+			isa = PBXGroup;
+			children = (
+				BB82522A2C51E28D006D8904 /* KMAdvertisementConfig.swift */,
+			);
+			path = Config;
+			sourceTree = "<group>";
+		};
+		BB82522B2C51E28D006D8904 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				BB82522C2C51E28D006D8904 /* KMAdvertisement.xcassets */,
+			);
+			path = Source;
+			sourceTree = "<group>";
+		};
+		BB82522D2C51E28D006D8904 /* Manager */ = {
+			isa = PBXGroup;
+			children = (
+				BB82522E2C51E28D006D8904 /* KMAdvertisementManager.swift */,
+			);
+			path = Manager;
+			sourceTree = "<group>";
+		};
+		BB82522F2C51E28D006D8904 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BB8252302C51E28D006D8904 /* KMAdvertisementModel.swift */,
+				BB8252312C51E28D006D8904 /* KMAdvertisementImage.swift */,
+				BB8252322C51E28D006D8904 /* KMAdvertisementModelTransition.swift */,
+				BB8252332C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BB8252342C51E28D006D8904 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BB82523D2C51E28D006D8904 /* KMRecommondPopWindow */,
+				BB8252352C51E28D006D8904 /* Tableview */,
+				BB8252412C51E28D006D8904 /* View */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BB8252352C51E28D006D8904 /* Tableview */ = {
+			isa = PBXGroup;
+			children = (
+				BB82523B2C51E28D006D8904 /* KMAdvertisementTableView.xib */,
+				BB82523C2C51E28D006D8904 /* KMAdvertisementTableView.swift */,
+				BB8252362C51E28D006D8904 /* Cell */,
+			);
+			path = Tableview;
+			sourceTree = "<group>";
+		};
+		BB8252362C51E28D006D8904 /* Cell */ = {
+			isa = PBXGroup;
+			children = (
+				BB8252372C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib */,
+				BB8252382C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib */,
+				BB8252392C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift */,
+				BB82523A2C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift */,
+			);
+			path = Cell;
+			sourceTree = "<group>";
+		};
+		BB82523D2C51E28D006D8904 /* KMRecommondPopWindow */ = {
+			isa = PBXGroup;
+			children = (
+				BB82523F2C51E28D006D8904 /* KMRecommondPopWindow.h */,
+				BB8252402C51E28D006D8904 /* KMRecommondPopWindow.m */,
+				BB82523E2C51E28D006D8904 /* KMRecommondPopWindow.xib */,
+			);
+			path = KMRecommondPopWindow;
+			sourceTree = "<group>";
+		};
+		BB8252412C51E28D006D8904 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BB8252422C51E28D006D8904 /* KMAdvertisementShowView.swift */,
+				BB8252432C51E28D006D8904 /* KMAdvertisementShowView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
+		BB8252442C51E28D006D8904 /* Request */ = {
+			isa = PBXGroup;
+			children = (
+				BB8252452C51E28D006D8904 /* KMAdvertisementRequestServer.swift */,
+			);
+			path = Request;
+			sourceTree = "<group>";
+		};
 		BB853C5F2AF87344009C20C1 /* RemoveWatermark */ = {
 			isa = PBXGroup;
 			children = (
@@ -14474,6 +14667,8 @@
 				BB3AAB9329878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.xib in Resources */,
 				ADD272D429B9CFE20032B5D6 /* KMLightNoNetworkView.xib in Resources */,
 				9F8539E7294712D600DF644E /* KMChromiumTabContents.xib in Resources */,
+				BB8252612C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */,
+				BB8252792C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */,
 				BB04FD102B206F4000D80F7B /* KMPlanViewController.xib in Resources */,
 				BBD9223A2B50D6D600DB9585 /* rate_pic_pro.pdf in Resources */,
 				ADBC376129CC637900D93208 /* KMReadModelView.xib in Resources */,
@@ -14522,6 +14717,7 @@
 				ADD1B6CB2942E85300C3FFF7 /* KMPrintBottomView.xib in Resources */,
 				89752DB02936F505003FF08E /* KMCustomButtonPopMenuViewController.xib in Resources */,
 				BB1B0B012B4FC6E900889528 /* KMConvertGuideView.xib in Resources */,
+				BB82526A2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */,
 				BBAC26A82AFE138800563A08 /* KMToolbarItemPopViewController.xib in Resources */,
 				F356720829AF184A00740FF3 /* CPDFListAnnotationNoteWindowController.xib in Resources */,
 				9F94747F29FA24200042F949 /* Credits.rtf in Resources */,
@@ -14537,6 +14733,7 @@
 				9FD0FA4E29D43D6800F2AB0D /* KMDeviceBrowserWindowController.xib in Resources */,
 				BB49ED09293F461500C82CA2 /* KMConvertCSVWindowController.xib in Resources */,
 				9F1F82D5292F6D510092C4B4 /* KMPDFInsertPreviewViewController.xib in Resources */,
+				BB8252702C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */,
 				BB9F8F532C251ABF00A855B7 /* CSTextPropertyView.xib in Resources */,
 				ADC63E4B2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */,
 				AD7D5C952B8F20FE006562CD /* synctex_parser_version.txt in Resources */,
@@ -14570,6 +14767,7 @@
 				BBF62C6C2B033B5B007B7E86 /* KMPDFEditExtractWindow.xib in Resources */,
 				BB69107C2C32349000C796B2 /* Circle2(yellow).pdf in Resources */,
 				BB88106A2B4F771D00AFA63E /* KMVerificationInfoViewController.xib in Resources */,
+				BB82524C2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */,
 				BB6DD80F29347F77001F0544 /* KMSecureEncryptWindowController.xib in Resources */,
 				ADE86AC32B034C7100414DFA /* KMBackgroundWindowController.xib in Resources */,
 				BB8F4A6F2C22A90500F972AB /* CustomStampLeftToolbar.xib in Resources */,
@@ -14632,6 +14830,7 @@
 				AD7D5C982B8F20FE006562CD /* synctex_parser_readme.txt in Resources */,
 				AD0FA4FE29A8DD8700EDEB50 /* KMRegisterSuccessView.xib in Resources */,
 				ADD56F5A2BB3F48300E87ED9 /* KMFreeTextStylesViewController.xib in Resources */,
+				BB82525E2C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */,
 				9F0CB49229683DEE00007028 /* KMPropertiesPanelLineSubVC.xib in Resources */,
 				BBE9D09B2AF0CEEB002E83CE /* KMBatchOperateCompressViewController.xib in Resources */,
 				BBF8478D2C3E187F008D8600 /* left_arrow(blue).png in Resources */,
@@ -14777,6 +14976,7 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				BB82527A2C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */,
 				9F8539F72947137500DF644E /* sadfavicon.png in Resources */,
 				BBA922292B4E96450061057A /* KMPurchaseCompareWindowController.xib in Resources */,
 				89E9B40A295D268E00AEFA61 /* KMEditImagePropertyViewController.xib in Resources */,
@@ -14815,6 +15015,7 @@
 				AD8810A429A8459000178CA1 /* KMComparativeTableViewController.xib in Resources */,
 				AD0FA4F629A8582C00EDEB50 /* KMComparativeTableView.xib in Resources */,
 				AD3AAD4A2B0B7B8900DE5FE7 /* KMCompareToolbar.xib in Resources */,
+				BB8252622C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */,
 				BB2F9AA72AFC8D5A00F9DD93 /* KMProfileInfoWindowController.xib in Resources */,
 				ADD1B6CC2942E85300C3FFF7 /* KMPrintBottomView.xib in Resources */,
 				9F0CB4732967E63100007028 /* KMPropertiesPanelNameSubVC.xib in Resources */,
@@ -14834,6 +15035,7 @@
 				ADF1569829A62D31001D1018 /* KMLoginLeftImageView.xib in Resources */,
 				89316856296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */,
 				9F02018A2A1DA28B00C9B673 /* KMAILanguagePopVC.xib in Resources */,
+				BB82525F2C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */,
 				9FA693AC2987C0590055488A /* KMStepperView.xib in Resources */,
 				BB1B0AFF2B4FC6E900889528 /* KMOpenFileFunctionView.xib in Resources */,
 				AD58F4132B1DAAB200299EE0 /* KMPrintDefaultView.xib in Resources */,
@@ -14872,6 +15074,7 @@
 				ADDF83632B391A5C00A81A4E /* DSignatureFromFileViewController.xib in Resources */,
 				ADDF83992B391A5D00A81A4E /* PDFCertExportAccessoryView.xib in Resources */,
 				ADBC372529CA923E00D93208 /* KMComparative.plist in Resources */,
+				BB82524D2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */,
 				BBD922342B50D61200DB9585 /* KMRateWindowController.xib in Resources */,
 				ADBC373829CA975B00D93208 /* KMCompatative.xcassets in Resources */,
 				BB6910712C32349000C796B2 /* Circle4(blue).pdf in Resources */,
@@ -15002,6 +15205,7 @@
 				9FD0FA3529CD947000F2AB0D /* KMOpacityPanel.xib in Resources */,
 				BB5DF1F52959C9F00025CDA1 /* KMHeaderFooterPropertyMainController.xib in Resources */,
 				9FBC48BC299B44C600CA39D7 /* KMSecondaryViewController.xib in Resources */,
+				BB8252712C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */,
 				9F69DBB62B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.xib in Resources */,
 				BBAC26A92AFE138800563A08 /* KMToolbarItemPopViewController.xib in Resources */,
 				9F94747C29FA22700042F949 /* InfoPlist.strings in Resources */,
@@ -15232,6 +15436,7 @@
 				9F1FE3F5293F4F0F00E952CA /* Info.plist in Resources */,
 				BB7648E929ECECBF00931039 /* Color.xcassets in Resources */,
 				BB5F8A1D29BB15AD00365ADB /* KMEmailSubWindowController.xib in Resources */,
+				BB82526B2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */,
 				BBC348062955403D008D2CD1 /* KMWatermarkFilePropertyInfoController.xib in Resources */,
 				BB89725A294C559F0045787C /* KMWatermarkPropertyCreateController.xib in Resources */,
 				AD88108829A719E500178CA1 /* KMRegisterView.xib in Resources */,
@@ -15611,6 +15816,8 @@
 				BBD9223C2B50D6D600DB9585 /* rate_pic_pro.pdf in Resources */,
 				AD58F41C2B1DAC1500299EE0 /* KMPrintSettingView.xib in Resources */,
 				BB1EC8032967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
+				BB8252632C51E28D006D8904 /* KMAdvertisementCollectionHeadView.xib in Resources */,
+				BB82527B2C51E28D006D8904 /* KMAdvertisementShowView.xib in Resources */,
 				ADDF83852B391A5D00A81A4E /* DSignatureSaveTypeViewController.xib in Resources */,
 				BBEDC2242B980A8400970C54 /* KMOutlineEditViewController.xib in Resources */,
 				BBD8EE9B2B8EC86A00EB05FE /* AutoSaveFileItem.xib in Resources */,
@@ -15659,6 +15866,7 @@
 				BBC348072955403D008D2CD1 /* KMWatermarkFilePropertyInfoController.xib in Resources */,
 				F3A9DC83294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */,
 				BB1B0B032B4FC6E900889528 /* KMConvertGuideView.xib in Resources */,
+				BB82526C2C51E28D006D8904 /* KMAdvertisementTableView.xib in Resources */,
 				9F0CB4C22977C06300007028 /* KMPropertiesPanelColorSubVC.xib in Resources */,
 				9F080B19298CFDB300FC27DA /* KMTextImageButtonVC.xib in Resources */,
 				AD3AAD202B0B5B4400DE5FE7 /* KMCompareCoveringWindowController.xib in Resources */,
@@ -15674,6 +15882,7 @@
 				BB1BFF772AEA0B38003EB179 /* KMBatchOperateLeftViewController.xib in Resources */,
 				BB04FD122B206F4000D80F7B /* KMPlanViewController.xib in Resources */,
 				AD199DE32B200FB000D56FEE /* KMPrintPosterView.xib in Resources */,
+				BB8252722C51E28D006D8904 /* KMRecommondPopWindow.xib in Resources */,
 				BB9F8F552C251ABF00A855B7 /* CSTextPropertyView.xib in Resources */,
 				9F8539DC294318D600DF644E /* TabsImage.xcassets in Resources */,
 				BBE66D0B2B55467C009343FA /* repeatTrialAlert_icon.png in Resources */,
@@ -15707,6 +15916,7 @@
 				BB88106C2B4F771D00AFA63E /* KMVerificationInfoViewController.xib in Resources */,
 				BB69107E2C32349000C796B2 /* Circle2(yellow).pdf in Resources */,
 				9F1F82C1292E01860092C4B4 /* KMCloudEmptyCollectionViewItem.xib in Resources */,
+				BB82524E2C51E28D006D8904 /* KMAdvertisement.xcassets in Resources */,
 				9F00CF562A38657400AC462E /* GoogleService-Info.plist in Resources */,
 				9FDD0F69294AB645000C4DAD /* KMMainViewController.xib in Resources */,
 				BB8F4A712C22A90500F972AB /* CustomStampLeftToolbar.xib in Resources */,
@@ -15769,6 +15979,7 @@
 				ADDF83492B391A5C00A81A4E /* DSignatureCreateInfoViewController.xib in Resources */,
 				AD7D5C9A2B8F20FE006562CD /* synctex_parser_readme.txt in Resources */,
 				BB4F7E872B0C4E820077EC8C /* KMNoteFilterCollevtionViewItem.xib in Resources */,
+				BB8252602C51E28D006D8904 /* KMAdvertisementCollectionViewItem.xib in Resources */,
 				BB5BE4F32B060EB500D51BF2 /* KMLanguageViewController.xib in Resources */,
 				BB8810902B4F7C4100AFA63E /* KMVerificationExpiredViewController.xib in Resources */,
 				BBF8478F2C3E187F008D8600 /* left_arrow(blue).png in Resources */,
@@ -15983,6 +16194,7 @@
 				BB14700B299DC0D100784A6A /* OIDAuthorizationRequest.m in Sources */,
 				ADE3C1DE29A5AA0B00793B13 /* KMRequestServer.swift in Sources */,
 				BB2C84752BAE71E400AF6142 /* KMThumbnailTableviewCell.swift in Sources */,
+				BB8252582C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */,
 				ADDF83772B391A5D00A81A4E /* CDSignatureCertificateCustomViewController.swift in Sources */,
 				BB7E59F62BBA427C0021E63D /* KMBrowserWindow.swift in Sources */,
 				BBC3484A2958222C008D2CD1 /* KMBackgroundOutsideView.swift in Sources */,
@@ -16226,6 +16438,7 @@
 				8997010628F4082C009AF911 /* KMFromViewController.swift in Sources */,
 				BBD1F78B296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */,
 				AD7D5CD32B957442006562CD /* KMBookmarkOutlineFileCellView.swift in Sources */,
+				BB82526D2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */,
 				BB8810762B4F785200AFA63E /* KMUnlockAlertViewController.m in Sources */,
 				ADBC375029CAE27900D93208 /* KMComparativeOutlineRowView.swift in Sources */,
 				BB2C846F2BAE716600AF6142 /* KMButtonLayer.swift in Sources */,
@@ -16254,6 +16467,7 @@
 				BB3A66902B07099F00575343 /* KMFindTableviewCell.swift in Sources */,
 				ADC63E482A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.swift in Sources */,
 				89752E1D2942CB03003FF08E /* KMSearchMode.swift in Sources */,
+				BB8252522C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */,
 				AD3A3587294C11ED00D72802 /* KMPrintPreviewPresenter.swift in Sources */,
 				BB1B0AC52B4FC6E900889528 /* KMGuideInfoWindow.swift in Sources */,
 				BB48F8712BE07DAA002DA996 /* KMMainModel.swift in Sources */,
@@ -16338,6 +16552,7 @@
 				BB147014299DC0D100784A6A /* OIDAuthState.m in Sources */,
 				BB3AAB9029878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.swift in Sources */,
 				BB147038299DC0D200784A6A /* OIDAuthorizationResponse.m in Sources */,
+				BB8252732C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */,
 				899700FE28F40710009AF911 /* KMBookMarkViewController.swift in Sources */,
 				BB2EDF6D296ECE17003BCF58 /* KMPageEditInsertDirectionItemView.swift in Sources */,
 				BB570ADF2B513A66005E7E4A /* KMLeftSideViewController+Snapshot.swift in Sources */,
@@ -16527,6 +16742,7 @@
 				ADCFFC0229C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */,
 				ADF6B86C2A480C5F0090CB78 /* KMComparativeView.swift in Sources */,
 				BB1B0AF52B4FC6E900889528 /* KMConvertGuideView.swift in Sources */,
+				BB82525B2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */,
 				9FAAA339290F72CC0046FFCE /* KMHistoryFileCollectionView.swift in Sources */,
 				BB8810852B4F7C2200AFA63E /* KMVerificationAlertViewController.m in Sources */,
 				BB93CDE92AE7B6E100B29C57 /* KMToolbarView.swift in Sources */,
@@ -16534,6 +16750,7 @@
 				BB99ACCA292DEE6E0048AFD9 /* KMMergeTitleBar.swift in Sources */,
 				ADBC174F2A2991F700959CEE /* KMPurchaseManager.swift in Sources */,
 				BB67EE262B54FFEF00573BF0 /* ASINetworkQueue.m in Sources */,
+				BB82527C2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */,
 				BB4DD043299B291A00E80DF6 /* KMCloudNoNetworkView.swift in Sources */,
 				BB49ECF6293F44DC00C82CA2 /* KMConvertExcelWindowController.swift in Sources */,
 				AD055E602B85E04C0035F824 /* KMTextWithIconCell.swift in Sources */,
@@ -16656,6 +16873,7 @@
 				ADE86AB62B0343E600414DFA /* KMWatermarkView.swift in Sources */,
 				BB03D68C2B01C782008C9976 /* KMPDFEditInsertBlankPageWindow.swift in Sources */,
 				9F1FE4E129406E4700E952CA /* GTMNSAnimation+Duration.m in Sources */,
+				BB8252762C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */,
 				AD3AAD882B10349600DE5FE7 /* KMHeaderFooterWindowController.swift in Sources */,
 				9F0CB51D2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
 				ADDF83292B391A5C00A81A4E /* CPDFSelection+PDFListView.m in Sources */,
@@ -16741,12 +16959,14 @@
 				AD1FE8412BD7C98300AA4A9B /* KMPosterPrintManager.m in Sources */,
 				ADB2D6E6294740F30029D2B3 /* KMPrintPaperSetWindowController.swift in Sources */,
 				BB9F8F572C251C5400A855B7 /* CSImagePropertyView.swift in Sources */,
+				BB8252642C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */,
 				BB897271294DB6BE0045787C /* KMWatermarkAdjectivePlainView.swift in Sources */,
 				ADBC2D37299F0A5A006280C8 /* KMPrintHelpViewController.swift in Sources */,
 				BBB9428B2BA2CB6A00542373 /* KMAdsInfo.swift in Sources */,
 				9FBC48BF299E23B100CA39D7 /* NSViewController+DesignToken.swift in Sources */,
 				BB6B4C0C292F62B20071CA06 /* KMPDFThumbnialPageView.swift in Sources */,
 				9FCFEC682AC2EAD500EAD2CB /* CPDFListViewColorMenuItemView.swift in Sources */,
+				BB8252672C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */,
 				BBB612A92AF48952000F3724 /* KMBackgroundObject.swift in Sources */,
 				BB2EDF46296E4618003BCF58 /* KMPageEditTools.swift in Sources */,
 				AD3AAD132B0B5B2700DE5FE7 /* KMCompareContentWindowController.swift in Sources */,
@@ -16906,6 +17126,7 @@
 				BB1A91732AFB8D95005E5FD8 /* KMBookletMaskView.swift in Sources */,
 				9F1FE4F629406E4700E952CA /* CTFloatingBarBackingView.m in Sources */,
 				9FE0BBE42B0EFBA300CD1CAC /* KMAnnotationFontWindowController.swift in Sources */,
+				BB8252492C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */,
 				BBFA1CE22B60DD970053AD4A /* KMScreenShotEditViewController.swift in Sources */,
 				9F53D5532AD683A700CCF9D8 /* KMAnnotationPropertyBaseController.swift in Sources */,
 				AD8810A029A8459000178CA1 /* KMComparativeTableViewController.swift in Sources */,
@@ -16941,6 +17162,7 @@
 				BBC4F9EA2AEB58290098A1A8 /* KMAlertWindowController.swift in Sources */,
 				BB147011299DC0D100784A6A /* OIDError.m in Sources */,
 				89752DEA293875FC003FF08E /* KMMainToolbarController.swift in Sources */,
+				BB8252462C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */,
 				BBA93D2D29BEBAA60044E0DD /* KMPreferenceEnum.swift in Sources */,
 				BB8F4A5F2C22A0F900F972AB /* CustomStampWindowController.swift in Sources */,
 				ADDDCE212B43A32A005B4AB5 /* AppSandboxFileAccessPersist.m in Sources */,
@@ -16997,6 +17219,7 @@
 				9F1FE4C929406E4700E952CA /* CTTabContents.m in Sources */,
 				9FCFEC882AD0EF9900EAD2CB /* KMPopMenuButton.swift in Sources */,
 				9F39B9442A661ED500930ACA /* KMHomeScrollView.swift in Sources */,
+				BB8252552C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */,
 				BB89725E294C5DDA0045787C /* KMWatermarkPropertyInfoController.swift in Sources */,
 				BB146FAB299DC0D000784A6A /* GTLRBatchQuery.m in Sources */,
 				BB897218294AED6C0045787C /* KMWatermarkAdjectivePreViewBaseController.swift in Sources */,
@@ -17092,6 +17315,7 @@
 				AD7D5C9B2B8F20FE006562CD /* synctex_parser.m in Sources */,
 				9F0CB49729683E1000007028 /* KMPropertiesPanelTextSubVC.swift in Sources */,
 				BB3D970A2B2FEAC8007094C8 /* KMPDFRedactViewController.swift in Sources */,
+				BB82524F2C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */,
 				BB1B0ACE2B4FC6E900889528 /* KMFunctionGuideMultiController.swift in Sources */,
 				BB853C6B2AF8782A009C20C1 /* KMRemoveWatermarkOperationQueue.swift in Sources */,
 				9F1FE49929406E4700E952CA /* NewTabButton.m in Sources */,
@@ -17280,6 +17504,7 @@
 				AD85D1B62AF0CCFC000F4D28 /* KMHomeHistoryListViewModel.swift in Sources */,
 				9F080B24298FCB0D00FC27DA /* KMDesignToken+Action.swift in Sources */,
 				BB1BFF932AEA6352003EB179 /* KMImageToPDFMethod.swift in Sources */,
+				BB82524A2C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */,
 				BB570ADC2B512C90005E7E4A /* KMLeftSideViewController+Thumbnail.swift in Sources */,
 				F37322F4292DF9410013862C /* CSelfSignAnnotationFreeText.m in Sources */,
 				899700E028F3A9F2009AF911 /* KMHomeWindowController.swift in Sources */,
@@ -17288,6 +17513,7 @@
 				AD7D5C9C2B8F20FE006562CD /* synctex_parser.m in Sources */,
 				9F53D5502AD677A000CCF9D8 /* CPDFListViewConfig.swift in Sources */,
 				BBF729B02B1962C900576AC5 /* KMRemoveHeaderFooterQueue.swift in Sources */,
+				BB8252562C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */,
 				BB8F4548295A9CDC0037EA22 /* KMHeaderFooterListController.swift in Sources */,
 				BBB612B22AF4C388000F3724 /* KMBatchOperateAddWatermarkViewController.swift in Sources */,
 				9F0CB5022986560D00007028 /* KMDesignToken+BorderTop.swift in Sources */,
@@ -17414,6 +17640,7 @@
 				BB853C702AF879C1009C20C1 /* KMBatchRemoveWatermarkOperation.swift in Sources */,
 				9FBC48B9299B44C600CA39D7 /* KMSecondaryViewController.m in Sources */,
 				ADDF832D2B391A5C00A81A4E /* NSEvent+PDFListView.m in Sources */,
+				BB82525C2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */,
 				BB8810CB2B4F97D000AFA63E /* VerificationManager.m in Sources */,
 				ADAFD9F42AE68A7400F084BC /* KMCreatPDFView.swift in Sources */,
 				BBFDFA9F2AF3814000E08AA2 /* KMTextHintWindowController.swift in Sources */,
@@ -17466,6 +17693,7 @@
 				BB8810A12B4F7D1000AFA63E /* KMVerificationActivateViewController.m in Sources */,
 				AD53AF902BF1BC9200DCFFFC /* KMLoadingView.swift in Sources */,
 				AD9527BF295294E20039D2BC /* KMPrintPageModel.swift in Sources */,
+				BB8252472C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */,
 				BB8F457B295AFB330037EA22 /* KMHeaderFooterFontInfoView.swift in Sources */,
 				BBB5C80829F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */,
 				ADAC0DE22AC273D600FD4F52 /* KMOCToolClass.swift in Sources */,
@@ -17648,6 +17876,7 @@
 				BB89724E294C1DCE0045787C /* KMWatermarkAdjectiveListTableCellView.swift in Sources */,
 				BB14700F299DC0D100784A6A /* OIDScopes.m in Sources */,
 				BB9EA1502B1ECD0400EAFD9B /* KMBatchOperateImageToPDFViewController.swift in Sources */,
+				BB8252742C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */,
 				9F0CB52E298656D900007028 /* KMDesignToken+BorderWidthRight.swift in Sources */,
 				ADD1B6E52946C00800C3FFF7 /* KMPrintChoosePageSizePosterView.swift in Sources */,
 				BBE01DC22BF60D9200304FA4 /* KMTabStripController.swift in Sources */,
@@ -17759,6 +17988,7 @@
 				AD3AAD822B0E004B00DE5FE7 /* KMPostionIndicateView.swift in Sources */,
 				BB4DD048299B294000E80DF6 /* KMCloudFileEmptyView.swift in Sources */,
 				ADD272D129B9CFD30032B5D6 /* KMLightNoNetworkView.swift in Sources */,
+				BB8252502C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */,
 				BB31DA5F2AFA1B03006D63CB /* KMFontWell.swift in Sources */,
 				BB49ECF7293F44DC00C82CA2 /* KMConvertExcelWindowController.swift in Sources */,
 				9F1FE4EB29406E4700E952CA /* NSBezierPath+MCAdditions.m in Sources */,
@@ -17810,6 +18040,7 @@
 				BB1331552AD7A6A1008F6791 /* KMFileAttribute.swift in Sources */,
 				BBD1F79D296FF7A600343885 /* KMPageEditSplitSettingModel.swift in Sources */,
 				AD199DE82B230A9300D56FEE /* KMPrintMultipageView.swift in Sources */,
+				BB8252772C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */,
 				BB1BFF8F2AEA547B003EB179 /* NSButton+CustomAppearance.swift in Sources */,
 				BB276A592B038D1100AB5578 /* KMOCRPDFWindowController.swift in Sources */,
 				ADDEEA632AD3A6E700EF675D /* KMPDFSignatureTextView.swift in Sources */,
@@ -17831,6 +18062,7 @@
 				BB147033299DC0D200784A6A /* OIDTokenResponse.m in Sources */,
 				BB146FF4299DC0D100784A6A /* OIDLoopbackHTTPServer.m in Sources */,
 				9F1FE49729406E4700E952CA /* common.c in Sources */,
+				BB82527D2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */,
 				BBB789C72BE8BF2400F7E09C /* AIRedoConfirmView.swift in Sources */,
 				899700E928F3E4D3009AF911 /* MainWindowController.swift in Sources */,
 				BBBE209C2B21E5F100509C4E /* KMAlertTool.swift in Sources */,
@@ -17929,6 +18161,7 @@
 				ADEC7A7F299397F8009A8256 /* NSFont+SFProText.swift in Sources */,
 				BBF729B82B19632C00576AC5 /* KMRemoveBatesOperationQueue.swift in Sources */,
 				9F221ED029A85D3700978A59 /* KMDesignBase.swift in Sources */,
+				BB8252652C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */,
 				BB74DA802AC42959006EDFE7 /* NSButton+KMExtension.swift in Sources */,
 				ADDF83392B391A5C00A81A4E /* CPDFSignatureAnnotation+PDFListView.m in Sources */,
 				BB8810AA2B4F7D7500AFA63E /* KMVerificationViewController.m in Sources */,
@@ -17970,6 +18203,7 @@
 				BB2EDF47296E4618003BCF58 /* KMPageEditTools.swift in Sources */,
 				BB853C6C2AF8782A009C20C1 /* KMRemoveWatermarkOperationQueue.swift in Sources */,
 				BBBC087F2B2A93DB009B237F /* KMToolbarMainItemView.swift in Sources */,
+				BB8252682C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */,
 				ADDF833C2B391A5C00A81A4E /* CPDFSignatureWidgetAnnotation+PDFListView.m in Sources */,
 				BB10FAEF2AFE233C00F18D65 /* KMLineInspector.swift in Sources */,
 				9FAAA32B290BD01D0046FFCE /* KMHomeHistoryFileViewController.swift in Sources */,
@@ -18114,6 +18348,7 @@
 				BBD7FE082A13241C00F96075 /* KMOutlineEditViewController.swift in Sources */,
 				BB1B0AF32B4FC6E900889528 /* KMFunctionGuideNameItemView.swift in Sources */,
 				AD055EC52B8846EB0035F824 /* SKOutlineView.m in Sources */,
+				BB8252532C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */,
 				BB0FE0592B734DD1001E0F88 /* KMAIRequestServerManager.swift in Sources */,
 				BB8F4558295AA1270037EA22 /* KMHeaderFooterPropertyInfoController.swift in Sources */,
 				AD88108E29A760D100178CA1 /* KMRegisterPresenter.swift in Sources */,
@@ -18188,6 +18423,7 @@
 				BB146FE5299DC0D100784A6A /* GTLRURITemplate.m in Sources */,
 				9F1FE4F129406E4700E952CA /* BackgroundGradientView.m in Sources */,
 				BBAC26A52AFE134300563A08 /* KMToolbarItemPopViewController.swift in Sources */,
+				BB82526E2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */,
 				9F0CB4BE2977C06300007028 /* KMPropertiesPanelColorSubVC.swift in Sources */,
 				9F94617E2BD643720076574B /* KMTableAnnotation.m in Sources */,
 				AD1CA41A2A061CE10070541F /* KMAnnotationScreenTypeViewItem.swift in Sources */,
@@ -18315,6 +18551,7 @@
 				9F1FE4AC29406E4700E952CA /* CTBrowserWindow.m in Sources */,
 				9FF816DE2AFA5B8E0087EFC5 /* KMAnnotationTableViewController.swift in Sources */,
 				BBFE14D02BFD7FC300176992 /* KMCouponDueWindowController.swift in Sources */,
+				BB8252592C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */,
 				AD0FA50329A8E36200EDEB50 /* KMLightMemberAlertView.swift in Sources */,
 				9F0CB53E2986571A00007028 /* KMDesignToken+Typography.swift in Sources */,
 				9FCFEC712AC40F9B00EAD2CB /* CStampSignatureObject.swift in Sources */,
@@ -18407,6 +18644,7 @@
 				ADDF83252B391A5C00A81A4E /* CDSDrawView.m in Sources */,
 				BBC28F502B0F58DD00D73206 /* KMImageToolTipWindow.swift in Sources */,
 				BB2C84772BAE71E400AF6142 /* KMThumbnailTableviewCell.swift in Sources */,
+				BB82525A2C51E28D006D8904 /* KMAdvertisementModelTransition.swift in Sources */,
 				BB7E59F82BBA427C0021E63D /* KMBrowserWindow.swift in Sources */,
 				AD015FB929AB484400A57062 /* KMLightMemberConfig.swift in Sources */,
 				ADBC2D13299CCD05006280C8 /* KMTextfieldButton.swift in Sources */,
@@ -18650,6 +18888,7 @@
 				AD58F4182B1DAC0900299EE0 /* KMPrintSettingView.swift in Sources */,
 				9FDD0F6D294AD12C000C4DAD /* KMMainViewController+UI.swift in Sources */,
 				BB1BFF902AEA547B003EB179 /* NSButton+CustomAppearance.swift in Sources */,
+				BB82526F2C51E28D006D8904 /* KMAdvertisementTableView.swift in Sources */,
 				9FD0D2B12AD51BCC00DA3FF8 /* CPDFListEditAnnotationViewController.swift in Sources */,
 				BB2C84712BAE716600AF6142 /* KMButtonLayer.swift in Sources */,
 				ADDF836D2B391A5C00A81A4E /* DSignatureSaveTypeViewController.swift in Sources */,
@@ -18678,6 +18917,7 @@
 				BB2F9AB12AFCAE1F00F9DD93 /* KMProfileTitleCellView.swift in Sources */,
 				BB2F615A2966B69D001CB369 /* KMWatermarkPropertyHomeController.swift in Sources */,
 				BB48F8732BE07DAA002DA996 /* KMMainModel.swift in Sources */,
+				BB8252542C51E28D006D8904 /* KMAdvertisementModel.swift in Sources */,
 				89752E1F2942CB04003FF08E /* KMSearchMode.swift in Sources */,
 				BB147049299DC0D200784A6A /* OIDServiceConfiguration.m in Sources */,
 				AD1FE84E2BD920C300AA4A9B /* TextFieldFormatter.m in Sources */,
@@ -18762,6 +19002,7 @@
 				BB2EDF6C296ECE17003BCF58 /* KMPageEditInsertTypeItemView.swift in Sources */,
 				BBD7FE052A1323A400F96075 /* KMEditImagePropertyViewController.swift in Sources */,
 				BBBB6CD02AD13E210035AA66 /* CPDFButtonWidgetAnnotation+PDFListView.swift in Sources */,
+				BB8252752C51E28D006D8904 /* KMRecommondPopWindow.m in Sources */,
 				ADF6B8802A485A8F0090CB78 /* KMComparativeViewCollectionItemItem.swift in Sources */,
 				BBB789AD2BE8BF2400F7E09C /* AIChatDefaultTIpItem.swift in Sources */,
 				9F1FE4D729406E4700E952CA /* NSPasteboard+Utils.m in Sources */,
@@ -18951,6 +19192,7 @@
 				ADDF83312B391A5C00A81A4E /* NSGeometry+PDFListView.m in Sources */,
 				9FAAA327290A69920046FFCE /* KMToolSetScroller.swift in Sources */,
 				BB0A823429C00400002C5C1B /* KMCommonEnum.swift in Sources */,
+				BB82525D2C51E28D006D8904 /* KMAdvertisementTimeStampConversion.swift in Sources */,
 				BB6013922AD3AFF000A76FB2 /* NSPopover+KMExtension.swift in Sources */,
 				BB2CC5642AF1239900D7A796 /* KMBatchBaseParameter.swift in Sources */,
 				BB183DE52B4EC0AF00F99C7E /* KMRepeatVerifyExpireController.m in Sources */,
@@ -18958,6 +19200,7 @@
 				BB5F8A1029BB04F000365ADB /* GBDeviceInfo_OSX.m in Sources */,
 				BBEDC2292B98205200970C54 /* Bundle+KMExtension.swift in Sources */,
 				AD02573C2A8601AA00EAD5D5 /* KMLoginManager.swift in Sources */,
+				BB82527E2C51E28D006D8904 /* KMAdvertisementRequestServer.swift in Sources */,
 				BBFE6E89293210AB00142C01 /* KMCompressCellView.swift in Sources */,
 				ADDEEA702AD3E16100EF675D /* KMSigntureViewItem.swift in Sources */,
 				9FF0D0552B6A3EE40018A732 /* CPDFListView+Form.swift in Sources */,
@@ -19080,6 +19323,7 @@
 				BB8F4588295B19AC0037EA22 /* KMHeaderFooterDateInfoView.swift in Sources */,
 				ADDF839D2B391A5D00A81A4E /* PDFCertExportAccessoryView.swift in Sources */,
 				89D2D2BF29486D2400BFF5FE /* KMSignatureCellView.swift in Sources */,
+				BB8252782C51E28D006D8904 /* KMAdvertisementShowView.swift in Sources */,
 				BB2EDF56296E815E003BCF58 /* KMPageEditBaseItemView.swift in Sources */,
 				BBA922372B4E97540061057A /* KMPurchaseFirstTrialWindowController.swift in Sources */,
 				AD1D483C2AFB81ED007AC1F0 /* KMMergeBlankView.swift in Sources */,
@@ -19165,12 +19409,14 @@
 				9F0CB4712967E63100007028 /* KMPropertiesPanelNameSubVC.swift in Sources */,
 				9F1FE4CE29406E4700E952CA /* CTTabContentsController.m in Sources */,
 				BB9F8F592C251C5400A855B7 /* CSImagePropertyView.swift in Sources */,
+				BB8252662C51E28D006D8904 /* KMAdvertisementCollectionViewItem.swift in Sources */,
 				9F0CB4EF298655A800007028 /* KMDesignToken+PaddingLeft.swift in Sources */,
 				AD1FE8432BD7C98300AA4A9B /* KMPosterPrintManager.m in Sources */,
 				BB9695B429BDA46500FD68D3 /* SKLocalization.m in Sources */,
 				9FF0D05A2B6A43750018A732 /* KMPDFAnnotationButtonWidgetSub.swift in Sources */,
 				9F3D819029A22AD90087B5AD /* Date+KMExtensions.swift in Sources */,
 				BB897222294AF9080045787C /* KMWatermarkAdjectiveTopBarView.swift in Sources */,
+				BB8252692C51E28D006D8904 /* KMAdvertisementCollectionHeadView.swift in Sources */,
 				9F8DDF362924DA6B006CDC73 /* KMPDFToolsCollectionView.swift in Sources */,
 				ADF9ED3129A8507400C4A943 /* KMAccountInfoView.swift in Sources */,
 				ADB2D6FB294882AE0029D2B3 /* KMTextFieldStepperView.swift in Sources */,
@@ -19330,6 +19576,7 @@
 				BB49ED00293F459500C82CA2 /* KMConvertPPTsWindowController.swift in Sources */,
 				BB0542172965705D00F2665C /* KMCropTipView.swift in Sources */,
 				BB89726F294DB67D0045787C /* KMWatermarkAdjectiveBaseView.swift in Sources */,
+				BB82524B2C51E28D006D8904 /* KMAdvertisementConfig.swift in Sources */,
 				BB67EE222B54FFEF00573BF0 /* ASIDataDecompressor.m in Sources */,
 				BB31981C2AC567B600107371 /* CPDFSelection+PDFListView.swift in Sources */,
 				BBBBB4A12B6F743700C7205E /* SKAttachmentEmailer.m in Sources */,
@@ -19365,6 +19612,7 @@
 				ADE86AF92B0AF59A00414DFA /* KMCompareContentSettingView.swift in Sources */,
 				BBF729A92B19627500576AC5 /* KMRemoveBackgroundOperationQueue.swift in Sources */,
 				BB1BFF832AEA139F003EB179 /* KMLongerButton.swift in Sources */,
+				BB8252482C51E28D006D8904 /* KMAdvertisementCache.swift in Sources */,
 				AD9527BC295291F20039D2BC /* KMPrintPage.swift in Sources */,
 				BB8F4A612C22A0F900F972AB /* CustomStampWindowController.swift in Sources */,
 				AD3AAD552B0D87E500DE5FE7 /* KMCompareThumbItem.swift in Sources */,
@@ -19421,6 +19669,7 @@
 				BB183DDF2B4EBE1B00F99C7E /* KMTrialSuccessController.swift in Sources */,
 				AD0E8ABB2A31BDDD00DBFD3C /* KMProduct.swift in Sources */,
 				BBC2BCC8295DA8F30036B983 /* KMCropPreviewController.swift in Sources */,
+				BB8252572C51E28D006D8904 /* KMAdvertisementImage.swift in Sources */,
 				9F1FE50F29407B2B00E952CA /* KMUploadFilePanel.swift in Sources */,
 				9FD0D2AD2AD5143D00DA3FF8 /* KMTableRowView.swift in Sources */,
 				BB1331562AD7A6A1008F6791 /* KMFileAttribute.swift in Sources */,
@@ -19516,6 +19765,7 @@
 				9FBC48C1299E23B100CA39D7 /* NSViewController+DesignToken.swift in Sources */,
 				89752DF429389F82003FF08E /* KMToolbarItem.m in Sources */,
 				ADDEEA742AD3EFE200EF675D /* KMButton.swift in Sources */,
+				BB8252512C51E28D006D8904 /* KMAdvertisementManager.swift in Sources */,
 				AD1D481B2AFB6B96007AC1F0 /* KMMergeWindowController.swift in Sources */,
 				ADBC374329CAB1C300D93208 /* KMComparativeOutlineCell.swift in Sources */,
 				ADBC372B29CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,

+ 183 - 10
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -890,28 +890,28 @@
             filePath = "PDF Master/Class/Home/ViewController/KMHomeViewController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "660"
-            endingLineNumber = "660"
+            startingLineNumber = "681"
+            endingLineNumber = "681"
             landmarkName = "openPDFAction(_:)"
             landmarkType = "7">
             <Locations>
                <Location
-                  uuid = "88A2A8F0-1ABC-47CE-A197-92F538CDC9A0 - 9d4cc2b012746bad"
+                  uuid = "88A2A8F0-1ABC-47CE-A197-92F538CDC9A0 - b8739a65f0bd1b5f"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
-                  symbolName = "LynxPDF_Editor.KMHomeViewController.openPDFAction(LynxPDF_Editor.KMBox) -&gt; ()"
+                  symbolName = "closure #1 (Swift.Bool) -&gt; () in LynxPDF_Editor.KMHomeViewController.showTabbingHintWindow() -&gt; ()"
                   moduleName = "LynxPDF Editor"
                   usesParentBreakpointCondition = "Yes"
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/ViewController/KMHomeViewController.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "660"
-                  endingLineNumber = "660"
-                  offsetFromSymbolStart = "824">
+                  startingLineNumber = "682"
+                  endingLineNumber = "682"
+                  offsetFromSymbolStart = "576">
                </Location>
                <Location
-                  uuid = "88A2A8F0-1ABC-47CE-A197-92F538CDC9A0 - bf4d7107c778d634"
+                  uuid = "88A2A8F0-1ABC-47CE-A197-92F538CDC9A0 - bf4d7107c7782b61"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -921,8 +921,8 @@
                   urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/ViewController/KMHomeViewController.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "660"
-                  endingLineNumber = "660"
+                  startingLineNumber = "681"
+                  endingLineNumber = "681"
                   offsetFromSymbolStart = "2396">
                </Location>
             </Locations>
@@ -3004,6 +3004,38 @@
             endingLineNumber = "252"
             landmarkName = "insertMenuAction(sender:)"
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "417C3EA4-1646-4896-9B5A-D5BF93C9190C - ac9eb4d5c8e3e9aa"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (Swift.Bool, Swift.String) -&gt; () in PDF_Reader_Pro.KMPDFEditToolbar.insertMenuAction(sender: PDF_Reader_Pro.KMToolbarClickButton) -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/PDFTools/PageEdit/View/KMPDFEditToolbar.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "252"
+                  endingLineNumber = "252"
+                  offsetFromSymbolStart = "880">
+               </Location>
+               <Location
+                  uuid = "417C3EA4-1646-4896-9B5A-D5BF93C9190C - a16fcd616dc54a0"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (Swift.Bool, Swift.String) -&gt; () in LynxPDF_Editor.KMPDFEditToolbar.insertMenuAction(sender: LynxPDF_Editor.KMToolbarClickButton) -&gt; ()"
+                  moduleName = "LynxPDF Editor"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/PDFTools/PageEdit/View/KMPDFEditToolbar.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "252"
+                  endingLineNumber = "252"
+                  offsetFromSymbolStart = "880">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -3066,6 +3098,21 @@
                   endingLineNumber = "116"
                   offsetFromSymbolStart = "72">
                </Location>
+               <Location
+                  uuid = "DE540297-109C-4FF3-A5F8-A1B14561B3E1 - 51ff767e837dc9cd"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #2 (PDF_Reader_Pro.KMQucikToolCollectionViewItem, PDF_Reader_Pro.KMQucikToolsModel) -&gt; () in PDF_Reader_Pro.KMQucikToolsView.collectionView(_: __C.NSCollectionView, itemForRepresentedObjectAt: Foundation.IndexPath) -&gt; __C.NSCollectionViewItem"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/View/HomeContentView/QucikTools/KMQucikToolsView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "116"
+                  endingLineNumber = "116"
+                  offsetFromSymbolStart = "72">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -3083,6 +3130,38 @@
             endingLineNumber = "31"
             landmarkName = "HomeLynxGuide"
             landmarkType = "3">
+            <Locations>
+               <Location
+                  uuid = "66AC62AE-8FCA-4A65-8C7D-75F3C2C9C887 - 239cccad0b76cd30"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.HomeLynxGuide.__deallocating_deinit"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/View/HomeContentView/HomeLynxGuide/HomeLynxGuide.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "31"
+                  endingLineNumber = "31"
+                  offsetFromSymbolStart = "44">
+               </Location>
+               <Location
+                  uuid = "66AC62AE-8FCA-4A65-8C7D-75F3C2C9C887 - 4c714ed42ef26fb7"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "LynxPDF_Editor.HomeLynxGuide.__deallocating_deinit"
+                  moduleName = "LynxPDF Editor"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/View/HomeContentView/HomeLynxGuide/HomeLynxGuide.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "31"
+                  endingLineNumber = "31"
+                  offsetFromSymbolStart = "44">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -3130,6 +3209,21 @@
                   endingLineNumber = "70"
                   offsetFromSymbolStart = "96">
                </Location>
+               <Location
+                  uuid = "E5B40596-2C6D-4CC7-A5FF-90E4BD6ACD72 - 90a07584ff43da87"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMHomeContentView.__deallocating_deinit"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/View/HomeContentView/KMHomeContentView.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "70"
+                  endingLineNumber = "70"
+                  offsetFromSymbolStart = "96">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -3193,6 +3287,21 @@
                   endingLineNumber = "110"
                   offsetFromSymbolStart = "44">
                </Location>
+               <Location
+                  uuid = "32A45556-B674-4EFE-98B1-CBD88E05C565 - 5dd3c8fbd07224b2"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMHomeViewController.__deallocating_deinit"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/ViewController/KMHomeViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "110"
+                  endingLineNumber = "110"
+                  offsetFromSymbolStart = "44">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -3210,6 +3319,38 @@
             endingLineNumber = "23"
             landmarkName = "windowDidLoad()"
             landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "CDFB0575-BEDC-468F-B22C-A1046C18A667 - e9baf4253a810ee0"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMHomeWindowController.windowDidLoad() -&gt; ()"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/WindowController/KMHomeWindowController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "23"
+                  endingLineNumber = "23"
+                  offsetFromSymbolStart = "1504">
+               </Location>
+               <Location
+                  uuid = "CDFB0575-BEDC-468F-B22C-A1046C18A667 - 5bfcd3e1c5d704a5"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "LynxPDF_Editor.KMHomeWindowController.windowDidLoad() -&gt; ()"
+                  moduleName = "LynxPDF Editor"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/Home/WindowController/KMHomeWindowController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "23"
+                  endingLineNumber = "23"
+                  offsetFromSymbolStart = "1504">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
@@ -3226,6 +3367,38 @@
             endingLineNumber = "30"
             landmarkName = "KMBrowserWindowController"
             landmarkType = "3">
+            <Locations>
+               <Location
+                  uuid = "C75CCF5D-A3CD-44BB-9F1C-5AEE3729217A - dbc035dcaebba9b6"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Reader_Pro.KMBrowserWindowController.__deallocating_deinit"
+                  moduleName = "PDF Reader Pro"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/ChromiumTabs/KMBrowserWindowController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "30"
+                  endingLineNumber = "30"
+                  offsetFromSymbolStart = "96">
+               </Location>
+               <Location
+                  uuid = "C75CCF5D-A3CD-44BB-9F1C-5AEE3729217A - c08800c90b7bdf31"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "LynxPDF_Editor.KMBrowserWindowController.__deallocating_deinit"
+                  moduleName = "LynxPDF Editor"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/kdanmobile/Documents/Git/PDF_Office/PDF%20Office/PDF%20Master/Class/ChromiumTabs/KMBrowserWindowController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "30"
+                  endingLineNumber = "30"
+                  offsetFromSymbolStart = "96">
+               </Location>
+            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>