From 22e7e44220f24fe41086c5dd00f0aa4643d6ab90 Mon Sep 17 00:00:00 2001 From: shenlei Date: Fri, 26 Jun 2026 18:50:07 +0900 Subject: [PATCH] feat: chapter runtime refactoring and related updates - Refactor chapter runtime: replace window coordinator/snapshot with warmup orchestrator - Update EPUB core: parser, reading session, JS bridge, navigator layout - Update reader controller: data source, location resolution, persistence - Update chapter runtime: data cache, loader, runtime store, disk cache, warmup orchestrator - Remove deprecated navigation state machine and pagination state - Update text rendering: book cache, HTML normalizer - Update UI: text content view, dark image adjuster, text selection controller - Update settings and reader configuration - Add CODE_REVIEW.md and AUDIT_FINAL.md documentation - Update pod dependencies (remove SSAlertSwift, SnapKit) - Update podspec and pod configuration files Co-Authored-By: Claude --- CODE_REVIEW.md | 151 + Doc/ARCHITECTURE.md | 4 +- Doc/AUDIT_FINAL.md | 411 ++ RDReaderView.podspec | 6 +- ReadViewDemo/Podfile.lock | 12 +- .../Local Podspecs/RDReaderView.podspec.json | 10 +- ReadViewDemo/Pods/Manifest.lock | 12 +- .../Pods/Pods.xcodeproj/project.pbxproj | 4898 +++++++---------- ReadViewDemo/Pods/SSAlertSwift/README.md | 110 - .../SSAlertSwift/SSAlertAnimation.swift | 24 - .../SSAlertAnimationController.swift | 46 - .../SSAlertSwift/SSAlertCommonView.swift | 335 -- .../SSAlertSwift/SSAlertDefaultAnmation.swift | 223 - .../SSAlertPresentAnimation.swift | 222 - .../Sources/SSAlertSwift/SSAlertView.swift | 312 -- .../SSAlertSwift/SSAlertViewExtention.swift | 127 - .../SSAlertSwift/UIViewFrameExtension.swift | 132 - ReadViewDemo/Pods/SnapKit/LICENSE | 19 - ReadViewDemo/Pods/SnapKit/README.md | 155 - .../Pods/SnapKit/Sources/Constraint.swift | 341 -- .../Sources/ConstraintAttributes.swift | 203 - .../SnapKit/Sources/ConstraintConfig.swift | 37 - .../Sources/ConstraintConstantTarget.swift | 213 - .../Pods/SnapKit/Sources/ConstraintDSL.swift | 209 - .../Sources/ConstraintDescription.swift | 69 - .../ConstraintDirectionalInsetTarget.swift | 49 - .../Sources/ConstraintDirectionalInsets.swift | 34 - .../Sources/ConstraintInsetTarget.swift | 72 - .../SnapKit/Sources/ConstraintInsets.swift | 35 - .../Pods/SnapKit/Sources/ConstraintItem.swift | 61 - .../ConstraintLayoutGuide+Extensions.swift | 36 - .../Sources/ConstraintLayoutGuide.swift | 37 - .../Sources/ConstraintLayoutGuideDSL.swift | 66 - .../Sources/ConstraintLayoutSupport.swift | 36 - .../Sources/ConstraintLayoutSupportDSL.swift | 56 - .../SnapKit/Sources/ConstraintMaker.swift | 224 - .../Sources/ConstraintMakerEditable.swift | 64 - .../Sources/ConstraintMakerExtendable.swift | 195 - .../Sources/ConstraintMakerFinalizable.swift | 49 - .../ConstraintMakerPrioritizable.swift | 70 - .../ConstraintMakerRelatable+Extensions.swift | 57 - .../Sources/ConstraintMakerRelatable.swift | 115 - .../Sources/ConstraintMultiplierTarget.swift | 75 - .../Sources/ConstraintOffsetTarget.swift | 69 - .../SnapKit/Sources/ConstraintPriority.swift | 77 - .../Sources/ConstraintPriorityTarget.swift | 85 - .../Sources/ConstraintRelatableTarget.swift | 72 - .../SnapKit/Sources/ConstraintRelation.swift | 48 - .../Sources/ConstraintView+Extensions.swift | 152 - .../Pods/SnapKit/Sources/ConstraintView.swift | 35 - .../SnapKit/Sources/ConstraintViewDSL.swift | 101 - .../Pods/SnapKit/Sources/Debugging.swift | 169 - .../SnapKit/Sources/LayoutConstraint.swift | 61 - .../Sources/LayoutConstraintItem.swift | 93 - .../SnapKit/Sources/PrivacyInfo.xcprivacy | 14 - .../Pods/SnapKit/Sources/Typealiases.swift | 42 - .../Sources/UILayoutSupport+Extensions.swift | 36 - ...ods-ReadViewDemo-acknowledgements.markdown | 23 - .../Pods-ReadViewDemo-acknowledgements.plist | 29 - ...mo-frameworks-Debug-input-files.xcfilelist | 2 - ...o-frameworks-Debug-output-files.xcfilelist | 2 - ...-frameworks-Release-input-files.xcfilelist | 2 - ...frameworks-Release-output-files.xcfilelist | 2 - .../Pods-ReadViewDemo-frameworks.sh | 4 - .../Pods-ReadViewDemo.debug.xcconfig | 10 +- .../Pods-ReadViewDemo.release.xcconfig | 10 +- .../RDReaderView/RDReaderView.debug.xcconfig | 4 +- .../RDReaderView.release.xcconfig | 4 +- .../SSAlertSwift/SSAlertSwift-Info.plist | 26 - .../SSAlertSwift/SSAlertSwift-dummy.m | 5 - .../SSAlertSwift/SSAlertSwift-prefix.pch | 12 - .../SSAlertSwift/SSAlertSwift-umbrella.h | 16 - .../SSAlertSwift/SSAlertSwift.debug.xcconfig | 14 - .../SSAlertSwift/SSAlertSwift.modulemap | 6 - .../SSAlertSwift.release.xcconfig | 14 - ...eBundle-SnapKit_Privacy-SnapKit-Info.plist | 24 - .../SnapKit/SnapKit-Info.plist | 26 - .../SnapKit/SnapKit-dummy.m | 5 - .../SnapKit/SnapKit-prefix.pch | 12 - .../SnapKit/SnapKit-umbrella.h | 16 - .../SnapKit/SnapKit.debug.xcconfig | 15 - .../SnapKit/SnapKit.modulemap | 6 - .../SnapKit/SnapKit.release.xcconfig | 15 - .../EPUBCore/RDEPUBJavaScriptBridge.swift | 19 +- .../RDEPUBNavigatorLayoutContext.swift | 16 +- .../EPUBCore/RDEPUBNavigatorState.swift | 21 - .../EPUBCore/RDEPUBParser+Archive.swift | 56 +- .../RDReaderView/EPUBCore/RDEPUBParser.swift | 78 + .../EPUBCore/RDEPUBReadingSession.swift | 48 - .../RDEPUBResourceURLSchemeHandler.swift | 189 +- .../RDEPUBWebView+Configuration.swift | 21 +- .../RDReaderView/EPUBCore/RDEPUBWebView.swift | 32 + .../BuildPipeline/RDEPUBTextBookCache.swift | 2 +- .../Typesetter/RDEPUBHTMLNormalizer.swift | 59 + .../RDEPUBReaderController+DataSource.swift | 8 +- ...BReaderController+LocationResolution.swift | 1 - .../EPUBUI/RDEPUBReaderController.swift | 14 +- .../EPUBUI/RDEPUBReaderPersistence.swift | 82 +- .../EPUBUI/RDURLReaderController.swift | 9 +- .../RDEPUBChapterDataCache.swift | 42 +- .../ChapterRuntime/RDEPUBChapterLoader.swift | 90 +- .../RDEPUBChapterRuntimeStore.swift | 5 + .../RDEPUBChapterSummaryDiskCache.swift | 2 +- .../RDEPUBChapterWarmupOrchestrator.swift | 4 - .../RDEPUBChapterWindowCoordinator.swift | 246 - .../RDEPUBChapterWindowSnapshot.swift | 58 - .../RDEPUBBackgroundPriorityPolicy.swift | 21 +- .../RDEPUBMetadataParseWorker.swift | 25 +- .../RDEPUBNavigationStateMachine.swift | 76 - .../RDEPUBPaginationState.swift | 22 - .../RDEPUBPresentationRuntime.swift | 43 +- .../RDEPUBReaderContext.swift | 87 +- .../RDEPUBReaderEnvironment.swift | 5 +- .../RDEPUBReaderLoadCoordinator.swift | 29 +- .../RDEPUBReaderLocationCoordinator.swift | 2 - .../RDEPUBReaderPaginationCoordinator.swift | 33 +- .../RDEPUBReaderRuntime.swift | 2 +- .../RDEPUBReaderSearchCoordinator.swift | 194 +- .../ReaderController/RDEPUBReaderState.swift | 6 +- .../Settings/RDEPUBReaderConfiguration.swift | 14 +- .../TextPage/RDEPUBDarkImageAdjuster.swift | 17 +- .../TextPage/RDEPUBTextContentView.swift | 170 +- .../RDEPUBTextSelectionController.swift | 1 - 123 files changed, 3701 insertions(+), 9118 deletions(-) create mode 100644 CODE_REVIEW.md create mode 100644 Doc/AUDIT_FINAL.md delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/README.md delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimation.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimationController.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertCommonView.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertDefaultAnmation.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertPresentAnimation.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertView.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertViewExtention.swift delete mode 100644 ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/UIViewFrameExtension.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/LICENSE delete mode 100644 ReadViewDemo/Pods/SnapKit/README.md delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/Constraint.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintAttributes.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintConfig.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintConstantTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintDSL.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintDescription.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsetTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsets.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintItem.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMaker.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerEditable.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriority.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelation.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintView+Extensions.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintView.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/ConstraintViewDSL.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/Debugging.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraint.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraintItem.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/Typealiases.swift delete mode 100644 ReadViewDemo/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-dummy.m delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-umbrella.h delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.debug.xcconfig delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.modulemap delete mode 100644 ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.release.xcconfig delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-Info.plist delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-dummy.m delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.modulemap delete mode 100644 ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig delete mode 100644 Sources/RDReaderView/EPUBCore/RDEPUBNavigatorState.swift delete mode 100644 Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowCoordinator.swift delete mode 100644 Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowSnapshot.swift delete mode 100644 Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBNavigationStateMachine.swift delete mode 100644 Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPaginationState.swift diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md new file mode 100644 index 0000000..b273585 --- /dev/null +++ b/CODE_REVIEW.md @@ -0,0 +1,151 @@ +# ReadViewSDK 代码审查报告 + +> 审查日期:2026-06-26 +> 审查范围:Sources/RDReaderView 全部源码 +> 审查方法:逐文件阅读 + 交叉验证 + 线程模型分析 + +--- + +## ✅ 确认成立的问题 + +### P1-1 WKURLSchemeHandler 同步文件 I/O 阻塞调用线程 + +**文件**: `EPUBCore/RDEPUBResourceURLSchemeHandler.swift:51-174` + +**现象**: `webView(_:start:)` 回调中,所有文件读取均同步执行: + +- `respondWithInMemoryData`(第119行)使用 `Data(contentsOf:)` 全量读入 ≤512KB 的文件 +- `respondWithStreaming`(第143行)在 `while true` 循环中同步读 64KB 块并逐块回调 `urlSchemeTask.didReceive(data)` + +Apple 未保证 WKURLSchemeHandler 回调线程为主线程,实际在 WKWebView 内部队列上执行。同步阻塞该线程会: + +- 若在主线程:直接造成 UI 卡顿/ANR +- 若在 WKWebView 内部队列:阻塞资源加载管线,影响渲染时序 + +**建议**: 将文件读取移至后台队列,通过 `DispatchQueue.main.async` 或回调队列回传 `didReceive`/`didFinish`。流式场景可改为分批异步读取。 + +--- + +### P1-2 EPUB 解压缓存目录无清理策略 + +**文件**: `EPUBCore/RDEPUBParser+Archive.swift:79-90` + +**现象**: `temporaryExtractionDirectory(for:)` 按 `(slug)-(fileSize)-(modificationTimestamp)` 生成缓存目录,存放在 `Caches/ssreaderview-epub/`。全局搜索确认不存在任何清理逻辑——无 LRU 淘汰、无总量上限、无 `removeItem` 调用指向该目录。 + +一本 50MB 的 EPUB 解压后约 100-200MB,用户打开多本书后缓存目录无限增长。 + +**建议**: 添加缓存清理策略: +1. 提供 `clearCache()` 公开方法供宿主 App 在低存储时调用 +2. 每次打开新书时按访问时间淘汰超出上限的旧缓存 +3. 或采用 `FileManager.default.urls(for: .cachesDirectory:)` 依赖系统自动清理 + +--- + +### P1-3 搜索在主线程同步执行 + +**文件**: `EPUBUI/ReaderController/RDEPUBReaderSearchCoordinator.swift:15-36` + +**现象**: `search(keyword:)` 直接调用 `resolvedSearchMatches(for:)`,该方法遍历整本书的所有 spine 条目执行 HTML→文本转换或章节同步加载 + NSRange 搜索,全程在主线程完成。 + +对于大型 EPUB(数百章): +- UI 完全冻结直到搜索完成 +- 用户无法取消或看到进度 +- 可能触发 iOS 看门狗终止(0x8badf00d) + +`resolvedOnDemandSearchMatches(for:)`(第125行)更严重:它同步加载每个章节(`loadChapterSynchronouslyForMigration`),整本书搜索意味着逐章同步加载。 + +**建议**: 将搜索逻辑移至后台队列,对大型书籍实施分批搜索 + 渐进结果回调,并在 UI 层添加搜索进度指示和取消能力。 + +--- + +### P2-1 ZIP 无效条目导致整本 EPUB 打开失败 + +**文件**: `EPUBCore/RDEPUBParser+Archive.swift:41-44` + +**现象**: 解压循环中,若 `validatedExtractionDestination` 返回 `nil`(条目路径验证失败),直接 `throw` 终止整本书的解析。实际 EPUB 中常包含无害条目(macOS `__MACOSX/` 目录、`.DS_Store`、Thumbs.db 等),这些不应阻止打开。 + +```swift +for entry in archive { + guard let destinationURL = validatedExtractionDestination(for: entry.path, ...) else { + throw RDEPUBParserError.invalidArchiveEntryPath(entry.path) // 应改为 continue + } +``` + +**建议**: 将验证失败的条目改为 `continue` + 日志警告,并增加对已知无害条目路径的跳过逻辑。 + +--- + +### P2-2 javaScriptStringLiteral 实现依赖隐式假设 + +**文件**: `EPUBCore/RDEPUBJavaScriptBridge.swift:169-174` + +**现象**: `javaScriptStringLiteral` 将值包装进单元素数组做 JSON 编码,再暴力去掉 `[` 和 `]`: + +```swift +private static func javaScriptStringLiteral(_ value: String?) -> String { + guard let value else { return "null" } + return jsonString(from: [value], fallback: "[null]") + .replacingOccurrences(of: "[", with: "") + .replacingOccurrences(of: "]", with: "") +} +``` + +这不是 XSS/注入问题(`JSONSerialization` 已正确转义引号/反斜杠等危险字符),但该方法依赖"值不含 `[` 或 `]`"的隐式假设。当前调用场景传入的是 CSS 颜色值(如 `#FFFFFF`、`rgba(...)`),不含方括号,所以实际安全。但未来如果有人将包含方括号的值传入,输出会被静默破坏。 + +**建议**: 改为更直观的安全编码方式,如直接对单值做 `JSONSerialization` 后去掉两端引号,或添加文档注释明确标注此方法的约束前提。 + +--- + +### P3-1 后台线程同步 hop 主线程获取布局信息 + +**文件**: `EPUBUI/ReaderController/RDEPUBReaderContext.swift:160-186` + +**现象**: `currentTextPageSize()` 在非主线程且缓存不可用时,通过 `DispatchQueue.main.sync` 回到主线程获取布局信息。调用方包括 `RDEPUBMetadataParseWorker`(后台初始化,第72行)和 `RDEPUBChapterLoader`(`chapterLoadQueue.async`,第298行)。 + +```swift +func currentTextPageSize() -> CGSize { + if Thread.isMainThread { + // 主线程路径 — 安全 + ... + } else if let lastTextPaginationPageSize, ... { + // 缓存路径 — 无需 hop + return lastTextPaginationPageSize + } else { + let mainThreadSize = DispatchQueue.main.sync { [weak self] in + self?.currentTextPageSize() ?? .zero + } +``` + +`Thread.isMainThread` 保护使得从主线程调用不会死锁。实际风险是**时序耦合**:后台任务阻塞等待主线程布局信息,如果主线程正在忙于 UI 操作(如翻页动画),后台线程会被卡住直到主线程空闲。这是一个线程模型/可维护性问题,而非可直接触发的死锁。 + +**建议**: 将布局参数作为初始化参数传入后台任务,而非在后台线程通过 `DispatchQueue.main.sync` 获取。这样后台线程完全自主,不依赖主线程时序。 + +--- + +## ✅ 已撤回的原始误判 + +以下条目经逐条代码验证后确认不成立或定级过高: + +| 原始编号 | 原始结论 | 修正结论 | +|---------|---------|---------| +| ~~P0 引用循环~~ | Runtime/Coordinator 强引用 context 形成循环 | **不成立**。全量搜索确认所有 Coordinator/Runtime 均使用 `unowned let context` 或 `weak var context` | +| ~~P0 XSS 注入~~ | `javaScriptStringLiteral` 的 `]` 替换导致注入 | **不成立**。`JSONSerialization` 编码已处理引号/反斜杠等危险字符。实际是健壮性问题,非安全问题(已调整为 P2-2) | +| ~~P1 Publication 暴露 parser~~ | 外部可直接修改 parser 内部状态 | **不成立**。`RDEPUBParser` 关键属性均为 `public internal(set)`,外部模块无法修改 | +| ~~P2 NSRange 越界~~ | UTF-16 和 Swift String 混用导致偏移 | **不成立**。搜索代码全程在 `NSString` + `NSRange` 域内操作,未混合 Swift String 索引 | +| ~~P2 后台 deinit 崩溃~~ | teardownWebView 可能在后台线程执行 | **证据不足**。`RDEPUBWebView` 是 UIView 子类,正常在主线程释放,无证据表明会后台释放 | +| ~~P0 ZIP 路径遍历绕过~~ | `%2e%2e` 可绕过路径校验 | **论证过头**。当前实现有组件级 `..` 检查 + `standardizedFileURL` 前缀校验,双层防护有效 | + +--- + +## 📊 问题汇总 + +| 严重度 | 编号 | 问题 | 类型 | +|--------|------|------|------| +| 🟠 P1 | P1-1 | WKURLSchemeHandler 同步文件 I/O 阻塞调用线程 | 性能 | +| 🟠 P1 | P1-2 | EPUB 解压缓存目录无清理策略 | 存储 | +| 🟠 P1 | P1-3 | 搜索在主线程同步执行,大书可致 ANR | 性能 | +| 🟡 P2 | P2-1 | ZIP 无效条目导致整本打开失败 | 鲁棒性 | +| 🟡 P2 | P2-2 | javaScriptStringLiteral 实现依赖隐式假设 | 可维护性 | +| 🔵 P3 | P3-1 | 后台线程同步 hop 主线程获取布局信息 | 线程模型 | + +**整体评价**: SDK 架构设计良好,模块分层清晰,引用管理(unowned/weak)使用正确,分页取消机制有 `paginationToken` + `cancellationController` 兜底。主要值得修复的是三个性能类 P1 问题(主线程阻塞搜索、资源加载阻塞、缓存无清理),两个 P2 鲁棒性/可维护性问题,以及一个 P3 线程模型优化建议。 \ No newline at end of file diff --git a/Doc/ARCHITECTURE.md b/Doc/ARCHITECTURE.md index 4f15be4..776cca8 100644 --- a/Doc/ARCHITECTURE.md +++ b/Doc/ARCHITECTURE.md @@ -251,8 +251,7 @@ RDEPUBReaderController ├─ RDEPUBPresentationRuntime // 分页状态与窗口替换 │ ├─ applyBookPageMap() │ ├─ refreshBookPageMapInPlace() - │ ├─ applyPendingFullPageMapIfNeeded() - │ └─ RDEPUBNavigationStateMachine + │ └─ applyPendingFullPageMapIfNeeded() │ ├─ RDEPUBChapterWarmupOrchestrator // 按需章节预热与边界预取 │ ├─ prepareOnDemandChapter() @@ -495,7 +494,6 @@ Sources/RDReaderView/ | **Builder** | `RDEPUBBookPageMap.Builder` 增量构建页码映射 | | **Strategy** | `RDEPUBTextRenderer` 协议,可替换渲染器实现 | | **Pipeline** | `RDEPUBTextTypesetterPipeline` 排版管线(8 个逻辑阶段,封装为 5-6 个顶层调用) | -| **State Machine** | `RDEPUBNavigatorState` 管理阅读器状态转换 | | **Adapter** | `RDReaderLegacyDataSourceAdapter` 适配旧数据源协议 | | **三级缓存** | 内存 → 磁盘摘要 → 全书分页,逐级降级 | | **Token 取消** | `paginationToken` 确保过期异步任务不干扰新任务 | diff --git a/Doc/AUDIT_FINAL.md b/Doc/AUDIT_FINAL.md new file mode 100644 index 0000000..5f338a7 --- /dev/null +++ b/Doc/AUDIT_FINAL.md @@ -0,0 +1,411 @@ +# ReadViewSDK 代码审查报告 + +> 审查范围:`Sources/RDReaderView/` 全部 184 个 Swift 文件(约 32,300 行) +> 审查维度:并发安全、内存管理、API 正确性、Swift/iOS 平台特定、架构与依赖 +> 审查日期:2026-06-26 + +--- + +## 严重程度定义 + +| 标记 | 含义 | +|------|------| +| 🔴 高 | 有明确代码路径可导致崩溃、数据丢失或严重功能缺陷 | +| 🟡 中 | 方向正确但风险程度取决于运行时条件;或当前安全但架构上脆弱 | +| 🟢 低 | 代码异味、可维护性问题或未来风险 | + +--- + +## 🔴 高优先级问题 + +### H-01 · 内存警告未连接章节缓存清理 + +`RDEPUBChapterRuntimeStore.handleMemoryWarning()` 已实现(清空除当前章节外的缓存 + 清除图片缓存),但从未被调用。 + +- `RDEPUBReaderRuntime.handleMemoryWarning()` 只清理了 `backgroundCoverageStore`,未调用 `chapterRuntimeStore.handleMemoryWarning()` +- `RDEPUBReaderController` 未重写 `didReceiveMemoryWarning` + +**影响:** 系统内存压力下,`RDEPUBChapterDataCache`(无上限字典)和 `imageCache`(仅 countLimit=50,无 totalCostLimit)不会主动释放内存。 + +**位置:** +- `RDEPUBChapterRuntimeStore.swift:103` — `handleMemoryWarning()` 方法存在 +- `RDEPUBReaderRuntime.swift:606-620` — 只清理 backgroundCoverageStore + +--- + +### H-02 · 主线程信号量等待 + +`RDEPUBChapterLoader.loadChapterSynchronouslyForMigration()` 使用 `DispatchSemaphore.wait()` 阻塞调用线程。当从 `RDEPUBPresentationRuntime.rebindVisibleLocation()` 以 `allowSynchronousLoad: true` 调用时,会在主线程等待。 + +**影响:** 如果章节数据未缓存,主线程被阻塞直到章节构建完成,可能导致 ANR 或死锁(如果构建过程需要主线程资源)。 + +**位置:** +- `RDEPUBChapterLoader.swift:206-268` — `semaphore.wait()` +- `RDEPUBPresentationRuntime.swift:282-286` — `allowSynchronousLoad: true` + +--- + +### H-03 · asyncAfter 闭包中的强制解包 + +`RDEPUBReaderController+DataSource.swift:425-436` 在 0.3 秒延迟闭包中强制解包 `lastTextPaginationPageSize!`。方法入口的 `guard let lastTextPaginationPageSize` 不保护延迟闭包——0.3 秒后该值可能已变为 `nil`。 + +**位置:** +```swift +// line 432-433 +let stillChanged = abs(currentSize.width - self.lastTextPaginationPageSize!.width) > 0.5 + || abs(currentSize.height - self.lastTextPaginationPageSize!.height) > 0.5 +``` + +--- + +### H-04 · `unowned context` 在后台操作中的崩溃路径 + +以下两个类在后台操作中访问 `unowned let context: RDEPUBReaderContext`,若 controller 在操作期间释放则会崩溃: + +**RDEPUBMetadataParseWorker:** +- Line 117: `let context = self.context` 在 `[weak self]` guard 之前将 unowned 引用捕获为局部变量 +- Lines 197-324: `BlockOperation` 闭包直接使用该局部变量(unowned),无 `[weak self]` 保护 +- Lines 296-301, 372-376: `DispatchQueue.main.async` 闭包捕获 unowned 局部变量 + +**RDEPUBReaderLoadCoordinator:** +- Line 28: 闭包只捕获 `[weak controller]`,未捕获 `[weak self]` +- Line 30: `self.context.makeParser()` 在后台队列访问 unowned 引用 +- Lines 41-42, 53-54: `DispatchQueue.main.async` 闭包直接访问 `self.context` + +**影响:** 若 `RDEPUBReaderController` 在后台操作期间释放(如用户快速退出阅读器),`unowned` 引用悬挂导致 EXC_BAD_ACCESS。 + +**位置:** +- `RDEPUBMetadataParseWorker.swift:117, 197-324, 296-301, 372-376` +- `RDEPUBReaderLoadCoordinator.swift:28-57` + +--- + +### H-05 · 章节数据缓存无容量限制 + +`RDEPUBChapterDataCache` 是无上限的 `[Int: RDEPUBRuntimeChapter]` 字典,仅通过显式 `remove(spineIndex:)` 或 `removeAll()` 逐出。每章持有完整的 `typesetAttributedString`(50-200KB+),50 章可达 5-10MB+。 + +**位置:** `RDEPUBChapterDataCache.swift:5` — `private var storage: [Int: RDEPUBRuntimeChapter] = [:]` + +--- + +### H-06 · 暗色图片静态 NSCache 无 totalCostLimit + +`RDEPUBDarkImageAdjuster.imageCache` 是 static `NSCache()`,无 `totalCostLimit`,跨越整个 App 生命周期累积调整后的图片。 + +**位置:** `RDEPUBDarkImageAdjuster.swift:9` + +--- + +### H-07 · 持久化操作静默丢弃错误 + +`RDEPUBReaderPersistence` 中所有编解码操作均使用 `try?`,失败时: +- **保存**:静默返回,数据丢失无任何反馈(lines 84, 98, 112, 131) +- **加载**:返回 `nil` 或空数组,损坏/版本不匹配的数据无法恢复(lines 80, 94, 108, 127) + +**影响:** 用户书签和阅读位置可能在无声中丢失。 + +**位置:** `RDEPUBReaderPersistence.swift:76-131` + +--- + +### H-08 · WKURLSchemeHandler 线程违规与取消回调缺失 + +两个确定 bug: + +**(a) 不同队列回调:** `webView(_:start:)` 在某个串行队列(由 WebKit 调度)上被调用,但 `respondWithInMemoryData` 和 `respondWithStreaming` 将 `didReceive`/`didFinish`/`didFailWithError` 显式切到了 `ioQueue`(line 121, 151)。这至少违反了"回调应与 `start` 使用同一串行队列"的要求。 + +**(b) 取消时不调用完成回调:** 任务被 `stop` 后,`isTaskActive` 返回 false 时: +- streaming 路径(line 178):`guard self.isTaskActive(taskID) else { return }` — 仅 return,不调用 `didFinish` 或 `didFailWithError` +- in-memory 路径(line 128, 141):同理 + +这违反了"每个 started task 必须收到完成回调"的协议要求。 + +**位置:** `RDEPUBResourceURLSchemeHandler.swift:121-187` + +--- + +### H-09 · 搜索在后台线程同步加载所有章节 + +`RDEPUBReaderSearchCoordinator` 在 `searchQueue` 上遍历所有 buildable spine 索引,逐个同步加载章节。每章持有完整 `typesetAttributedString`,大型书籍搜索时内存峰值显著。 + +**位置:** `RDEPUBReaderSearchCoordinator.swift:47, 173-236` + +--- + +### H-10 · 依赖版本未锁定 + +`RDReaderView.podspec` 中 DTCoreText、SnapKit、SSAlertSwift 无版本约束: + +```ruby +s.dependency 'ZIPFoundation', '~> 0.9' # ✅ 已锁定 +s.dependency 'DTCoreText' # ❌ 无约束 +s.dependency 'SnapKit' # ❌ 无约束 +s.dependency 'SSAlertSwift' # ❌ 无约束 +``` + +**位置:** `RDReaderView.podspec:17-20` + +--- + +### H-11 · SnapKit 和 SSAlertSwift 疑似死依赖 + +全仓库搜索未找到任何 `snp.` 或 `SSAlert` 的使用点。这两个依赖可能增加了不必要的二进制体积和潜在冲突。 + +--- + +## 🟡 中优先级问题 + +### M-01 · `RDEPUBReaderState` 无同步保护(隐性风险) + +所有属性(`parser`, `publication`, `activeBookmarks`, `pendingPageMapUpdates` 等)均为 `var`,无锁、无 `@MainActor`、无 `dispatchPrecondition`。当前所有访问确实在主线程(经追踪 16 个 `pendingPageMapUpdates` 访问点确认),但缺少形式化保障——未来开发者可能无意从后台线程访问而不自知。 + +**位置:** `RDEPUBReaderState.swift:1-71` + +--- + +### M-02 · `currentSpineIndex` / `windowSpineIndices` 无锁但当前安全 + +这两个字段无锁保护,但追踪全部读写路径后确认当前均在主线程。风险是隐性的:store 对象被传入 `chapterLoadQueue` 上下文,未来开发者可能在该队列中访问这些属性而不自知。同文件的其他字段(`navigationLock`, `prefetchLock`, `buildingLock`, `cfiMapLock`)有锁保护,形成不一致的模式。 + +**位置:** `RDEPUBChapterRuntimeStore.swift:15-17` + +--- + +### M-03 · `warmAnchors` 跨线程访问无同步 + +`RDEPUBBackgroundPriorityManager.warmAnchors` 在主线程写入(`addWarmAnchor`),在 `MetadataParseWorker` 的后台线程读取(`makeMetadataPriorityOrder`),无锁保护。 + +**位置:** `RDEPUBBackgroundPriorityPolicy.swift:65` + +--- + +### M-04 · `assert(Thread.isMainThread)` 在 Release 中被移除 + +`RDEPUBReaderContext` 的 `makeLayoutSnapshot()`、`currentTextPageSize()` 等方法使用 `assert(Thread.isMainThread)` 检查。`assert` 在 `-O` 构建中被移除,生产环境中后台线程调用将静默访问 UIKit 属性,造成数据竞争且无诊断。 + +**应使用:** `dispatchPrecondition(condition: .onQueue(.main))` 或 `@MainActor` 标注。 + +**位置:** `RDEPUBReaderContext.swift:172, 188, 210, 215` + +--- + +### M-05 · 磁盘缓存无自动淘汰策略 + +`RDEPUBChapterSummaryDiskCache` 和 `RDEPUBTextBookCache` 只有全量清除操作(`removeAll()`、`invalidateAll()`),无 LRU/大小/年龄驱逐策略。每次设置变更(字体、行距、主题)产生新缓存键,旧文件无限累积。写操作使用原子替换(tmp + replace),交错不会损坏数据,但可能读到旧值或看到不一致的目录状态。 + +**位置:** +- `RDEPUBChapterSummaryDiskCache.swift:89` — `removeAll()` 全清 +- `RDEPUBTextBookCache.swift:191` — `invalidateAll()` 全清 + +--- + +### M-06 · CFI 范围分隔符可能与内容冲突 + +`RDEPUBCFICompatibility` 按 `".."` 和 `"-"` 分割 CFI 范围字符串,但这些字符可能出现在 CFI 文本断言内部(如 `[foo..bar]`)。代码先匹配 `".."` 再匹配 `"-"`,无歧义消解逻辑。 + +**位置:** `RDEPUBCFICompatibility.swift:18-21` + +--- + +### M-07 · CFI 步索引对奇数输入容错不严谨 + +`RDEPUBCFIResolver` 中 `steps[1].index / 2 - 1` 对奇数索引做整除截断,可能映射到错误章节。`max(..., 0)` 仅防负索引,不防错误映射。属于 EPUB CFI 规范的输入验证问题。 + +**位置:** `RDEPUBCFIResolver.swift:38` + +--- + +### M-08 · WKWebView 保留环需主动管理 + +`RDEPUBWebView` → `webView` → `configuration.userContentController` → `RDEPUBWebView`(作为 `WKScriptMessageHandler`)形成保留环。 + +主要解环路径是 `reset()` 和 `configureWebViewIfNeeded` 中主动调用 `teardownWebView()`。**注意:** `deinit` 虽也调用 `teardownWebView()`,但不能作为环会被打破的保证——保留环的存在意味着 `deinit` 可能永远不会触发。风险在于:若某条代码路径跳过了 `teardownWebView()`,环将持续且对象永远不会释放。 + +**位置:** +- `RDEPUBWebView.swift:129` — `deinit` 调用 `teardownWebView()`(不可靠兜底) +- `RDEPUBWebView.swift:138-160` — `reset()` 调用 `teardownWebView()`(主要解环路径) + +--- + +### M-09 · `configuration` didSet 在 `isViewLoaded` 之前持久化 + +`RDEPUBReaderController.configuration` 的 `didSet` 在 `guard isViewLoaded` 之前执行了 `readerContext.configuration = configuration`、`applyWebViewDebugPolicy()` 和 `persistReaderSettingsIfNeeded()`。若在 view 加载前设置 configuration,这些副作用会在 UI 未就绪时触发。 + +**位置:** `RDEPUBReaderController.swift:8-20` + +--- + +### M-10 · empty catch 吞掉章节加载错误 + +`RDEPUBReaderPaginationCoordinator` 中 `loadInitialInteractiveRuntimeChapters` 的 `catch {}` 为空,章节加载失败被静默忽略,无日志、无恢复。 + +**位置:** `RDEPUBReaderPaginationCoordinator.swift:283` + +--- + +### M-11 · `RDEPUBReaderFontChoice.displayName` 始终返回中文 + +枚举的 `displayName` 计算属性硬编码中文字符串("系统"、"宋体"、"圆体"、"等宽"),无本地化基础设施。 + +**位置:** `RDEPUBReaderConfiguration.swift:18-28` + +--- + +### M-12 · 大量硬编码中文字符串,本地化覆盖不完整 + +覆盖文件:`RDEPUBReaderSettingsViewController`、`RDEPUBReaderSearchBarView`、`RDEPUBReaderHighlightsViewController`、`RDEPUBReaderBookmarksViewController`、`RDEPUBReaderTopToolView`、`RDEPUBReaderBottomToolView`、`RDEPUBTextContentView`、`RDEPUBWebView+Configuration`、`RDEPUBChapterLoader`(错误信息)等。 + +项目中存在约 88 个硬编码中文字符串(如"拷贝"、"高亮"、"批注"、"目录"、"搜索"等),但同时也有使用 `NSLocalizedString` 的地方(如 `RDEPUBImageViewController.swift:126`)。本地化基础设施存在但覆盖不完整——新添加的 UI 文本大多直接硬编码中文而未走本地化流程。 + +--- + +### M-13 · DTCoreText 类型泄漏到 EPUBUI 层 + +5 个 EPUBUI 文件直接使用 `DTCoreTextLayoutFrame`、`DTCoreTextLayoutLine`、`DTCoreTextGlyphRun` 等 DTCoreText 类型(虽有 `#if canImport(DTCoreText)` 保护),意味着替换渲染引擎需修改 UI 层文件。 + +**位置:** +- `RDEPUBPageInteractionController.swift` +- `RDEPUBPageLayoutSnapshot.swift` +- `RDEPUBTextPageRenderView.swift` +- `RDEPUBTextContentView.swift` +- `RDEPUBDarkImageAdjuster.swift` + +--- + +### M-14 · `imageCache` 有 countLimit 但无 totalCostLimit + +`RDEPUBChapterRuntimeStore.imageCache` 设有 `countLimit = 50`,但无 `totalCostLimit`。50 张大尺寸书籍插图可达 150-250MB。 + +**位置:** `RDEPUBChapterRuntimeStore.swift:41` + +--- + +### M-15 · `UIMenuController` 已废弃 + +`RDEPUBWebView+Configuration.swift:39` 和 `RDEPUBTextContentView.swift:747-758` 使用 `UIMenuController`,该 API 从 iOS 16 起废弃。应迁移至 `UIEditMenuInteraction`(iOS 16+),并为 iOS 15 保留 fallback。当前代码在 iOS 17+ 上仍可工作但随时可能失效。 + +--- + +### M-16 · Dynamic Type 未支持 + +UI 中所有字体使用硬编码大小(`UIFont.systemFont(ofSize: 13/14/16/18/19)`),未使用 `UIFontMetrics` 或 `preferredFont(forTextStyle:)`。启用 Dynamic Type 的用户看不到文字大小变化。 + +--- + +### M-17 · URL Scheme Handler 取消时 `clearTask` 可能被跳过 + +`respondWithInMemoryData` line 128 的 `guard self.isTaskActive(taskID) else { return }` 在取消时直接返回,跳过了 line 146 的 `self.clearTask(taskID)`。当前因 `stop` 已调用 `clearTask` 而无害,但结构上脆弱。 + +**位置:** `RDEPUBResourceURLSchemeHandler.swift:128` + +--- + +### M-18 · 硬编码颜色值未集成到主题系统 + +`RDEPUBReaderSearchBarView` 含 18 个硬编码颜色字面量,默认高亮颜色 `"#F8E16C"` 硬编码在 `RDEPUBReaderController+PublicAPI.swift:65,75`。这些应属于 `RDEPUBReaderTheme`。 + +--- + +### M-19 · 硬编码时间常量 + +多个 `DispatchQueue.main.asyncAfter(deadline:)` 和 `Thread.sleep` 使用硬编码延迟值(0.08s、0.1s、0.15s、0.2s、0.25s、0.3s、1.0s、3.5s),无命名常量或可配置选项。 + +--- + +## 🟢 低优先级问题 + +### L-01 · `RDEPUBChapterLoader` 中 `[self]` 强捕获 + +Line 103 的 `store.chapterLoadQueue.async { [self] in` 强捕获 self,阻止 loader 在队列任务完成前释放。应改为 `[weak self]`。 + +**位置:** `RDEPUBChapterLoader.swift:103` + +--- + +### L-02 · MetadataParseWorker Thread.sleep 忙等待 + +`waitForReadingInteractionToSettle()` 使用 `Thread.sleep(forTimeInterval: 0.08)` 轮询,无上限等待。应考虑 `DispatchSource` 或条件变量。 + +**位置:** `RDEPUBMetadataParseWorker.swift:385-390` + +--- + +### L-03 · `RDEPUBTextBookCache.queue.sync` 潜在死锁 + +`load()` 和 `save()` 均使用 `queue.sync`。若从 queue 内部调用则会死锁。当前未发现此调用路径,但模式脆弱。 + +**位置:** `RDEPUBTextBookCache.swift:136-189` + +--- + +### L-04 · `pendingLoads` 字典无超时清理 + +`RDEPUBChapterLoader.pendingLoads` 的完成闭包数组在章节加载失败且 `resolvePendingLoad` 未被调用时可能累积。当前所有路径均调用 `resolvePendingLoad`,但无防御性超时。 + +**位置:** `RDEPUBChapterLoader.swift:7-10` + +--- + +### L-05 · `RDEPUBChapterWindowCoordinator` 是死代码 + +该类定义了但未被任何代码实例化或引用。其中对 `currentSpineIndex`/`windowSpineIndices` 的7个访问点均为死代码。 + +--- + +### L-06 · 平台版本不一致 + +- `podspec`: `s.platform = :ios, "15.0"` +- `Podfile`(根和 demo): `platform :ios, '15.6'` + +--- + +### L-07 · `RDEPUBMetadataCancellationController` 微小竞争 + +`attach()` 方法在 `lock.unlock()` 和 `queue.cancelAllOperations()` 之间存在窄窗口,新操作可能被添加到队列但不会被取消。实际影响极小。 + +**位置:** `RDEPUBMetadataParseCancellationController.swift:attach()` + +--- + +### L-08 · 页码标签硬编码偏移 + +`RDEPUBWebContentView` 和 `RDEPUBTextContentView` 的页码标签使用硬编码偏移(24pt, 20pt),在刘海屏设备上可能与安全区域重叠。 + +--- + +## 已排除项 + +以下原报告条目经核实后排除或合并: + +| 原编号 | 原描述 | 排除原因 | +|--------|--------|----------| +| #6 | compactMap 结果越界 | 入口有 `childViewControllers.count == expectedCount` 检查,compactMap 后不会少于预期数量 | +| #7 | `result!` 强解包崩溃 | 信号量等待的真实风险是无限等待/卡住,不是 result 为 nil;signal 前必定赋值 | +| #21 | 搜索协调器 fallback 空 store | `?? RDEPUBChapterRuntimeStore()` 前的可选链若为 nil 则整个调用返回 nil,fallback 不会生效 | +| #23 | init 时加载所有 HTML 到内存 | 逐章取 HTML 算哈希后只保存 digest,HTML 字符串不长期保留 | +| #35 | `.nonPersistent()` 阻止 cookie/localStorage | 不持久化是有意设计,不是 bug;原始报告将"不持久化"误述为"不能用" | +| #48 | `didMoveToSuperview` 每次重复 makeUI | 有 `didBuildUI` 防重入保护 | +| 原L-04 | `activeTasks` 字典 `clearTask` 设 nil 不删键 | Swift 中 `dict[key] = nil` 等同于 `removeValue(forKey:)`,不保留空洞 | +| 原M-18 | MetadataParseWorker OperationQueue 未在 deinit 取消 | 外层 `[weak self]` guard 确保 self 存活才执行 queue 操作;`cancellationController` 提供显式取消路径 | +| 原L-08 | `ss_superViewController` 前缀暗示外部来源 | 命名风格猜测,非可验证缺陷 | + +--- + +## 建议优先级排序 + +| 优先级 | 编号 | 修复复杂度 | 说明 | +|--------|------|-----------|------| +| P0 | H-01 | 低 | 在 `handleMemoryWarning` 中加一行 `chapterRuntimeStore.handleMemoryWarning()`,并在 controller 中转发 `didReceiveMemoryWarning` | +| P0 | H-04 | 中 | MetadataParseWorker 和 LoadCoordinator 中 `unowned context` 改为 `weak`,闭包加 `guard` | +| P0 | H-03 | 低 | `lastTextPaginationPageSize!` 改为 `guard let` 安全解包 | +| P1 | H-08 | 中 | URLSchemeHandler 回调改到与 start 相同队列,取消路径加 `didFailWithError` | +| P1 | H-02 | 中 | 主线程同步加载改为异步回调或确保不从主线程调用 | +| P1 | H-07 | 低 | 关键持久化操作加日志,至少记录失败原因 | +| P1 | H-10 | 低 | 给三个依赖加版本约束;移除 SnapKit 和 SSAlertSwift | +| P2 | H-05 | 中 | 为 ChapterDataCache 加 LRU 逐出策略或最大条目数限制 | +| P2 | H-06 | 低 | 为 DarkImageAdjuster.imageCache 设置 `totalCostLimit` | +| P2 | H-09 | 中 | 搜索改为流式/分批加载,避免一次性持有所有章节 | +| P2 | M-01/02 | 中 | 为 State 和 Store 关键属性加 `@MainActor` 或 `dispatchPrecondition` | +| P2 | M-04 | 低 | `assert` 改为 `dispatchPrecondition` 或 `precondition` | +| P2 | M-08 | 低 | 保留环加注释说明必须通过 `reset()` 打破 | +| P2 | M-15 | 中 | 迁移至 `UIEditMenuInteraction` | diff --git a/RDReaderView.podspec b/RDReaderView.podspec index 7993042..b778e8f 100644 --- a/RDReaderView.podspec +++ b/RDReaderView.podspec @@ -4,7 +4,7 @@ Pod::Spec.new do |s| s.name = "RDReaderView" s.version = "0.0.1" s.summary = "A reader view for novel" - s.platform = :ios, "15.0" + s.platform = :ios, "15.6" s.swift_versions = ["5.10"] s.homepage = "https://github.com/namesubai/RDReaderView.git" s.author = { "subai" => "804663401@qq.com" } @@ -15,9 +15,7 @@ Pod::Spec.new do |s| 'RDReaderViewAssets' => ['Sources/RDReaderView/EPUBCore/Resources/**/*'] } s.dependency 'ZIPFoundation', '~> 0.9' - s.dependency 'DTCoreText' - s.dependency 'SnapKit' - s.dependency 'SSAlertSwift' + s.dependency 'DTCoreText', '~> 1.6' s.requires_arc = true end diff --git a/ReadViewDemo/Podfile.lock b/ReadViewDemo/Podfile.lock index b90ca91..3806923 100644 --- a/ReadViewDemo/Podfile.lock +++ b/ReadViewDemo/Podfile.lock @@ -17,12 +17,8 @@ PODS: - DTFoundation/UIKit (1.7.19): - DTFoundation/Core - RDReaderView (0.0.1): - - DTCoreText - - SnapKit - - SSAlertSwift + - DTCoreText (~> 1.6) - ZIPFoundation (~> 0.9) - - SnapKit (5.7.1) - - SSAlertSwift (0.0.15) - ZIPFoundation (0.9.20) DEPENDENCIES: @@ -32,8 +28,6 @@ SPEC REPOS: trunk: - DTCoreText - DTFoundation - - SnapKit - - SSAlertSwift - ZIPFoundation EXTERNAL SOURCES: @@ -43,9 +37,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: DTCoreText: 11b7fe2104f476f82e75a4e3dbdde74d7186cecb DTFoundation: 76b624967cf5bcaae6bb057d622c536c36ef36d0 - RDReaderView: 617ec758a5db3c10024acf83b110465ea8343b5b - SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a - SSAlertSwift: aad8dc0c20b36fcffe700b81d7be89d60c7ba4f1 + RDReaderView: 2e0eeeff4bcfe8bbc09642344d326440af280ed5 ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 PODFILE CHECKSUM: 775f5c8c488024e24d494aad6331e9fef8f9e2e5 diff --git a/ReadViewDemo/Pods/Local Podspecs/RDReaderView.podspec.json b/ReadViewDemo/Pods/Local Podspecs/RDReaderView.podspec.json index a095b92..dae5975 100644 --- a/ReadViewDemo/Pods/Local Podspecs/RDReaderView.podspec.json +++ b/ReadViewDemo/Pods/Local Podspecs/RDReaderView.podspec.json @@ -3,7 +3,7 @@ "version": "0.0.1", "summary": "A reader view for novel", "platforms": { - "ios": "15.0" + "ios": "15.6" }, "swift_versions": [ "5.10" @@ -28,13 +28,7 @@ "~> 0.9" ], "DTCoreText": [ - - ], - "SnapKit": [ - - ], - "SSAlertSwift": [ - + "~> 1.6" ] }, "requires_arc": true, diff --git a/ReadViewDemo/Pods/Manifest.lock b/ReadViewDemo/Pods/Manifest.lock index b90ca91..3806923 100644 --- a/ReadViewDemo/Pods/Manifest.lock +++ b/ReadViewDemo/Pods/Manifest.lock @@ -17,12 +17,8 @@ PODS: - DTFoundation/UIKit (1.7.19): - DTFoundation/Core - RDReaderView (0.0.1): - - DTCoreText - - SnapKit - - SSAlertSwift + - DTCoreText (~> 1.6) - ZIPFoundation (~> 0.9) - - SnapKit (5.7.1) - - SSAlertSwift (0.0.15) - ZIPFoundation (0.9.20) DEPENDENCIES: @@ -32,8 +28,6 @@ SPEC REPOS: trunk: - DTCoreText - DTFoundation - - SnapKit - - SSAlertSwift - ZIPFoundation EXTERNAL SOURCES: @@ -43,9 +37,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: DTCoreText: 11b7fe2104f476f82e75a4e3dbdde74d7186cecb DTFoundation: 76b624967cf5bcaae6bb057d622c536c36ef36d0 - RDReaderView: 617ec758a5db3c10024acf83b110465ea8343b5b - SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a - SSAlertSwift: aad8dc0c20b36fcffe700b81d7be89d60c7ba4f1 + RDReaderView: 2e0eeeff4bcfe8bbc09642344d326440af280ed5 ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 PODFILE CHECKSUM: 775f5c8c488024e24d494aad6331e9fef8f9e2e5 diff --git a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj index df30df1..6f38716 100644 --- a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj +++ b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,1173 +7,996 @@ objects = { /* Begin PBXBuildFile section */ - 00012FDC4E0B6E7D2912581B460A8992 /* RDEPUBAnnotationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43B3221062F7881536685FE3C927CC7D /* RDEPUBAnnotationModels.swift */; }; - 002685407B9C4D548571DA24AFD6E8F1 /* NSString+Paragraphs.m in Sources */ = {isa = PBXBuildFile; fileRef = F53CCB60DE5D06A43E4A52EDB274E7D2 /* NSString+Paragraphs.m */; }; - 014449AE560FFF3C628FAE639D043004 /* DTAnchorHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D63AE1801C7AB149219317BE7529B26 /* DTAnchorHTMLElement.m */; }; - 03D90C831397E8636A33CE557024A136 /* NSMutableAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = A2C299CFB47AA6ECF86F7348E1EB751F /* NSMutableAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 055EF156631EA5706DCECFC0F49D9392 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */; }; - 0561DF6793C8516F469D9813F5CE3211 /* DTCoreTextLayouter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D6DA580F40DF113709E15CF6542A35C /* DTCoreTextLayouter.m */; }; - 058883809CB161BCD5DFB310221A5C9E /* RDPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2739EAD69AB2F5F6FA80E254D294440D /* RDPlainTextBookBuilder.swift */; }; - 064481778FF8671650240A03A9371744 /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */; }; - 06BD685726847318A09C9590891CD7ED /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */; }; - 0787448DED429142330009FBEEFA6C20 /* RDEPUBPageBreakPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE10A5C6934704218EB16F8966AA0814 /* RDEPUBPageBreakPolicy.swift */; }; - 090F57E692EEA5A8B0FF67920032C543 /* SSAlertCommonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE4EE750340347ED584C5A2C1164331A /* SSAlertCommonView.swift */; }; - 09BD533E8A50F83694A170194678AE8E /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */; }; - 0AA3A80E4DD1062BA4641DF71F00F773 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */; }; - 0AAA5BB1DBF584102B15CF8738F1815E /* NSScanner+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = CA538A48DD3691701EC6B5021D7B7381 /* NSScanner+HTML.m */; }; - 0AAC638E0C699A21D53F86B82546D9B5 /* RDReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4682C38E0A66C0E9760FC62C00A327 /* RDReaderView+CollectionView.swift */; }; - 0AB5DF1362C7A7A1798E6E453EE48E52 /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0ABC4D62588EABAA636441FD9A82C940 /* CTLineUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DD58A1908F3C532210EA65ACE410A44D /* CTLineUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0ABC5070A4608ADE7CEEA759C9B5EC82 /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */; }; - 0AC506D604FCC73E73FEABDB9F62984F /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DE1D663A9451374F0417DAC8CDAE2BF /* RDEPUBParser+Archive.swift */; }; - 0B6FA1F22150D7F8B1865F41FF70C922 /* DTImage+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB9016408894675D11069CDAACEDE94 /* DTImage+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B7603CC7E4C2D7A63E2BB4D1EB1BA71 /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */; }; - 0BECE54788017FB1138CAF0006752F85 /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */; }; - 0E7C316F098CD51BAF6DF9337F4D4FF3 /* RDEPUBPageResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C2C1DE970403173708119093BE0108 /* RDEPUBPageResolver.swift */; }; - 0E9FF4ED55C539850AA4023C7EF7FC4A /* wxread-replace.css in Resources */ = {isa = PBXBuildFile; fileRef = F81B70DF51F9CD64A7DC5AAF3941F72C /* wxread-replace.css */; }; - 0F0C6DAF9F3854B998337C3A06546C7D /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0FCBC8C64D8862F2A0E8794EDADDECBD /* UIFont+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 647FB0C5AAF84C71A7784DD277E48910 /* UIFont+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 100BFFBD24F234C095EDB001B8088DB1 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = D1599698B5A62671C488F13E07272B09 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */; }; - 1081E871F8472C4F6FA1190EFC80109D /* RDReaderTapRegionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C1B2F1D8E3F93A60375AA8853FF1842 /* RDReaderTapRegionHandler.swift */; }; - 109458F9D48FD4F381F0E40E2DB3D91C /* DTLazyImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5F69A1E1260BAD7737BEB533F643A15 /* DTLazyImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 10FF832A1AF85DA716C94D9E10A85BF3 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */; }; - 11949D3539DAA668EF241BFCA2817B99 /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 766C440DABE7721B3D2CE226D8189551 /* RDEPUBPaginator.swift */; }; - 11AB1902A68385851FB81E870991F9A0 /* DTImageTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = FEEB15F87BA6575BBFE1C5FD19B17CD7 /* DTImageTextAttachment.m */; }; + 00113125175BA26D70BE12F27CCEAB65 /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = D9A812C3E577A3ADC36BAE3FF7AA4D9C /* NSFileWrapper+DTCopying.m */; }; + 002685407B9C4D548571DA24AFD6E8F1 /* NSString+Paragraphs.m in Sources */ = {isa = PBXBuildFile; fileRef = B4A7F7402FAEE3A277A8716DDA115C95 /* NSString+Paragraphs.m */; }; + 014449AE560FFF3C628FAE639D043004 /* DTAnchorHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 148B993AB228816D19FCB7CD13874C83 /* DTAnchorHTMLElement.m */; }; + 02A298783B59EBF1DA7E6734E86384BC /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A16F8F582626936AC8B388F57B74A6F5 /* RDEPUBReaderSettings.swift */; }; + 02E00A11A960FFC1CF719FF107A97A56 /* RDEPUBReaderController+PublicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB578C52D04A71D85CCA25340333F2C2 /* RDEPUBReaderController+PublicAPI.swift */; }; + 03D90C831397E8636A33CE557024A136 /* NSMutableAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 044BEA679671E16EA9BA9AD627750742 /* NSMutableAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 045ECA6DF954F21A52A3A318CB0A959A /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5193541848D2D1BF115A45D8A730611C /* Archive+ReadingDeprecated.swift */; }; + 04A447AC67CE557F0D6535CCAA7E672A /* UIColor+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = A416E2F4584E41C30A3352FFD3824BE2 /* UIColor+RDEPUB.swift */; }; + 0561DF6793C8516F469D9813F5CE3211 /* DTCoreTextLayouter.m in Sources */ = {isa = PBXBuildFile; fileRef = D80A72D8B7941D30246858D840EE1EF5 /* DTCoreTextLayouter.m */; }; + 06B91127429E64FE098A50E0549E9B62 /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C706B8C5A519EE55EC9D545AB3302AD9 /* RDEPUBReaderChapterListController.swift */; }; + 08711CEABB218DF984EA628D9B08BA47 /* RDEPUBReadingLocationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D220183932DB13D0AF20EF12C44A29D /* RDEPUBReadingLocationModels.swift */; }; + 088E349DD58B48DC5A3F210B3AA2B08E /* RDEPUBStyleCompatibilityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBAABB0F2B6957E455D803F386B55761 /* RDEPUBStyleCompatibilityModels.swift */; }; + 08C9C48A7BD681F075086F7E53660F69 /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C3F8DF48C6EB28BFD05F5BB49793DDA /* FileManager+ZIP.swift */; }; + 08EC0B2843F92A4C922EB790C33B077F /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D963091969DCF978D7A36BF2747D33 /* RDEPUBTextAnchor.swift */; }; + 0A5BECD47E7FF9EA5C92717197F50DD0 /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECE876A9792A03EF4CBCFD3DF6188D46 /* RDEPUBReaderTableOfContentsItem.swift */; }; + 0AAA5BB1DBF584102B15CF8738F1815E /* NSScanner+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 057DBFBFC99448A0B77A3C0DBB13B4A9 /* NSScanner+HTML.m */; }; + 0ABC4D62588EABAA636441FD9A82C940 /* CTLineUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6CE93FAA68605C6B90FF844A98E440 /* CTLineUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B287B2D40A4B263DA9529292BEF9F33 /* RDEPUBFontFallbackResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE294326627812338FB0A4C644CD32A6 /* RDEPUBFontFallbackResolver.swift */; }; + 0B6FA1F22150D7F8B1865F41FF70C922 /* DTImage+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = E3CAAC46883B74B071843E5D38B5BF85 /* DTImage+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0C1FE3FEF711D728FDFF14CF277B2E4E /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C9CA544EBF55130625F6C3AD2ABFB4 /* Archive+Deprecated.swift */; }; + 0C73693788D2965F6E5D255519E050B9 /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0F1230C085573028B4BC891EA8040C3 /* UIColor+RDEPUBHex.swift */; }; + 0C7FEDFB0E8C8C55F63378C60C4208FA /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D93C2002AAECD29B3ED5A14026D3DFE /* Entry.swift */; }; + 0D077883D7EAB6E86CCB45D8B3FA637A /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 05838D65DEC339C51AADB17346B7E287 /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0FA9D733C9545D185352CAD655930C82 /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 29DEA4D201BB179BB6E228E9F688CD4C /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0FCBC8C64D8862F2A0E8794EDADDECBD /* UIFont+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 398DC798680E2CA64D46B9E19B380356 /* UIFont+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 100BFFBD24F234C095EDB001B8088DB1 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4476B58B93EE7476A4762FE0E26E8178 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */; }; + 109458F9D48FD4F381F0E40E2DB3D91C /* DTLazyImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D5DD4142DF33E1BE0B5A057101E851C5 /* DTLazyImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10B31BECFD9AE02D5B3D4FC2CCAB3B3F /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 21CCCCAAF832BE9C859BEDDC79B4E9E2 /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10EDE543DD6FB84E7F83398813B62AD9 /* wxread-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = D97740E10289031B888FFAE803AE441E /* wxread-dark.css */; }; + 10FA9DC27DAC6DA7724D6C6EB28FE0A0 /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = C5005A9E8F746647585CCAB26853E922 /* NSString+DTFormatNumbers.m */; }; + 11AB1902A68385851FB81E870991F9A0 /* DTImageTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 57642B518C047A428FE1266A09E0513F /* DTImageTextAttachment.m */; }; 12B4A35B8E40C112E18A7C5511F023E9 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4472755F83C121DE5E1E505D145F6DBE /* CoreText.framework */; }; - 1303874CF4BC7EDF7BAA430702202C9D /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 130C3A85D9F9F445222C2E31EC245B0A /* NSScanner+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = A0927A875CA1F11DBCE60DFC6F0CA0B6 /* NSScanner+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1389F2DE24EAF82D9003C16996BB9255 /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */; }; - 14B212F03E50D9F5D5C9CB9AC1AEB06F /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89755690B804A64EE69FE2D7321CA9B6 /* RDEPUBTextIndexTable.swift */; }; - 14BDD9FB7A7AC5C8ABFF8D24C381F3DA /* NSAttributedString+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = DBC9280BA00935565E9658775DD7404D /* NSAttributedString+DTCoreText.m */; }; - 1501ABBDADA4CFC28913368EEA52B109 /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */; }; - 1510A538CB762F72F7990C17EC617299 /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */; }; - 15A7ED15DA03DD3B9F26A017D270D1C2 /* DTCSSListStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = FDD333B409D528E5006FA48F4D70A6F5 /* DTCSSListStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1616B926586677612AEF659A23ECCD0D /* wxread-replace-latin.css in Resources */ = {isa = PBXBuildFile; fileRef = 6E7E8438D5E5533B7BE96AC6FA8FD8BD /* wxread-replace-latin.css */; }; - 18798C14A4AF8ACA5A0FDED17DDAF370 /* RDEPUBSemanticMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE0BE26FBA95F74B6173965BEC302EB /* RDEPUBSemanticMarkerInjector.swift */; }; - 1898FECC9A67C5227BF5346B043B1A4C /* RDEPUBReaderSearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6879143052D4942E4FEA0F92504804 /* RDEPUBReaderSearchBarView.swift */; }; + 130C3A85D9F9F445222C2E31EC245B0A /* NSScanner+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = DD0A5FF70CDBE87597264762EC20EF43 /* NSScanner+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13D28951E31D694F91F1D7AAC21D42BF /* RDEPUBStyleSheetComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D5F0FE11BFC4DA5A60FF82CD8D83E4 /* RDEPUBStyleSheetComposer.swift */; }; + 13E0E60D1E91FE73DA3C19EFA23EF59D /* RDEPUBReaderAnnotationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA110E3D360292AAFB29F380653D9CE /* RDEPUBReaderAnnotationCoordinator.swift */; }; + 14BDD9FB7A7AC5C8ABFF8D24C381F3DA /* NSAttributedString+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 978449466D53EA6F5D40FCF0F353DDCA /* NSAttributedString+DTCoreText.m */; }; + 15A7ED15DA03DD3B9F26A017D270D1C2 /* DTCSSListStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C24F592C4F38F15DC8C46BE0442B59C /* DTCSSListStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15F821001C70BC0400B5E85BC445A048 /* RDEPUBRuntimePageCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C574CD3AE9D1DCCA02A5270BB1130B6 /* RDEPUBRuntimePageCount.swift */; }; + 164D6A138BDB59AC18E7B37ED730966B /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7437E451EF2A6AAE750F4983FF9BA5F /* RDEPUBStyleSheetBuilder.swift */; }; + 16C913C28603A60216C6206E13FDD696 /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B41F7D27C2336F89BB0185ACB0B19EA9 /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 18F313579FBADD73801F5169F87A6A30 /* RDEPUBCFIMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 462A73405A3D510CF9A7F4B5D63BF2B1 /* RDEPUBCFIMarkerInjector.swift */; }; 191824B2B1E1B0A7DD3B6298100B4B8A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE4821B98DDE6C71411EC139EC6D2762 /* CoreGraphics.framework */; }; - 19310CB1E02EB814225E353079EF6DBD /* RDReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE1D4A863768FC78F6B76B6A181267C /* RDReaderView.swift */; }; - 194664799DF7F4D9E2D1F16EADCA0823 /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */; }; - 19649ED312D92A6F5D2D6AF4E540CE75 /* DTHorizontalRuleHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = E28CA95D89DBAB2FE56BC8513D5838D7 /* DTHorizontalRuleHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1A3FDFA1A68A13644CB7D7E28066EAA1 /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */; }; - 1BE5D635C9CA65847543497C535CDDD7 /* SSAlertSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1C90896663D69FFC15D8EE09ED2789DA /* RDEPUBAttachmentTooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D3CFCA211B02F4FB8BEE828C37A318B /* RDEPUBAttachmentTooltipView.swift */; }; - 1D128324740E7CCDDBBA92208805578D /* RDEPUBChapterRuntimeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BCCEDB0636CEB528ED4786686A5767F /* RDEPUBChapterRuntimeStore.swift */; }; - 1D1C0972DCB88C93667236180986F7DA /* RDEPUBCFITextAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 414962A3F7230445216E714935F3C22F /* RDEPUBCFITextAssertion.swift */; }; - 1D460603DCA4A4E5ECFE8FF1F1CACC10 /* DTColorFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC4C9F69BF2D0CAEBAA83896C139D2C /* DTColorFunctions.m */; }; - 1DA904F591DD5587E18A3958EF462EC9 /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1DCBB39D25EBEDB3B18C44EBD601AFA9 /* RDEPUBReaderContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2D39C06DF04E8847916639D58650315 /* RDEPUBReaderContext.swift */; }; - 1DE4CF0A937A4535FAD88245B7B0B577 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */; }; - 1E130859A8AB1AE05E4593D519C219A9 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = C241AD9CEC9D6732CFBA6A55B49E64C9 /* ConstraintInsets.swift */; }; - 1F01823286B1441AD4B9465B923FA9FC /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 212D840F1F1FFA819A65E20B1B3CF7DF /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F270A5E6ACC194137AB15688F6F4C759 /* RDEPUBReaderToolView.swift */; }; - 2203356EEA94A9172BC7902923E43CBE /* DTCoreTextFontCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B7771FDE9AB1688166584C0AA03F12A /* DTCoreTextFontCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 221B7E4A6D3AACF716E2830AA77F4163 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3593ADF561D422F73C8EABAD4A4F440 /* ConstraintRelation.swift */; }; - 2336E3B7C72AB1702DEAA87786A98284 /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */; }; - 23E6664A8F705A42969CC4456211DC37 /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4EDAF459D89DEFB5A597F8278CE222F /* RDEPUBWebViewDebug.swift */; }; - 24395BEB3C360D9DA5180BFB955B04A0 /* DTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 21BAA93E67D8CBC5297302D798FB4F7A /* DTAttributedLabel.m */; }; - 2445709667CB3820E51CD4AA915E6943 /* DTHTMLParserTextNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C30D143134EEC5D4BA99459104B76A2E /* DTHTMLParserTextNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 24C5B52FD2AA9C49731DC6859ABA7CDE /* NSDictionary+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C50CAB4241C141EF6EC9ED22AB3A7E8 /* NSDictionary+DTCoreText.m */; }; - 255C0D1CD0B98AF28752B5477E33E56C /* SSAlertAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */; }; - 26918ED45C33C4A0887D6BB4529F7A9E /* RDReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4C4605A9B7326DBE0CED7EB66A7416F /* RDReaderFlowLayout.swift */; }; - 270C5C10028F0BC5A62548326CCB379B /* DTColor+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = E196F56E68578181D5BDE787DE5C0F3A /* DTColor+Compatibility.m */; }; - 2814E48108DD3E83904D5C9318EE89D9 /* RDEPUBFontFallbackResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F9FE9924520900BBDF724D9903C5309 /* RDEPUBFontFallbackResolver.swift */; }; - 28A5B812ECDE6E94D5346EF33AB4908D /* RDEPUBSelectionLoupeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C518633651B8B05BFB5292862EB4B642 /* RDEPUBSelectionLoupeView.swift */; }; - 29D9B32DFFC59A157EDEF005DB92A5AC /* DTCoreTextLayoutLine.m in Sources */ = {isa = PBXBuildFile; fileRef = C71D83D6AEF198FA680B8A80BF2D9605 /* DTCoreTextLayoutLine.m */; }; - 2A58CC63B5184D7047EF8794F5FCC014 /* RDEPUBChapterOffsetMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4E89D45F05E7E9797A973AC12579973 /* RDEPUBChapterOffsetMap.swift */; }; - 2AAF9361720FC2D8FFCA93B5FAE42019 /* NSMutableString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 31F3F91D5624C451E5D44D85B1DDE7C5 /* NSMutableString+HTML.m */; }; - 2ADC21293994C745E3534DCF850B5994 /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8421441F10DCB0EDBCF03EAC1018BAD2 /* RDEPUBModels.swift */; }; - 2B4A9056AEC7A8D350EE3CD248F08DE8 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */; }; - 2B749B511B49409D51CB106A6592D32A /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34551B808D265BCB3443EE33D6C1EF4 /* RDEPUBWebView+Reflowable.swift */; }; - 2C1372BF284AB062A1B6B8C026073E73 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0C3C872488B6341E22BF47B6F9BBD6 /* RDEPUBBuildDiagnosticsReporter.swift */; }; - 2D34BC78BEF8168B26C829D4A4CB0DEE /* RDEPUBStyleCompatibilityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5077339D9632D68EDAB64BBEF622E154 /* RDEPUBStyleCompatibilityModels.swift */; }; - 2E9A526389D5AED82CEECF4A40CAD66A /* SSAlertPresentAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */; }; - 2FD7360250C2255A80583D4CF518FBFA /* DTTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = F35039A8D0AA1F7BAFC4E5E016057E15 /* DTTextAttachment.m */; }; - 2FE74F960A0ACAC1C71ACDC89972E183 /* RDEPUBImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F20E15B3473E29738F2A09C625A687BB /* RDEPUBImageViewController.swift */; }; - 309724DCA5F394FC0187A8EF5094647E /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A027614C026728AE2CA282D837F97936 /* RDEPUBPageMapReconciliationCoordinator.swift */; }; - 30C01FE491C26314F776AD8B2AF136FA /* NSAttributedStringRunDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F2E79CC33E0823C4E719ECDDFBBE08 /* NSAttributedStringRunDelegates.m */; }; - 31656AC7A50C1938C94131120B77B277 /* RDReaderView-RDReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */; }; - 316654F1450305B61B2FE4F3CEA4543F /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */; }; - 31A151A1FC37F975CB9B1880C5816546 /* RDEPUBChapterLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60BBDE3C78317A1DF3E2FF97B966899 /* RDEPUBChapterLoader.swift */; }; - 31B805C50E0E187E6242B0C878C4D30D /* DTCoreTextMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5D34047BAA894BEF1DFA23E6A9DAB1 /* DTCoreTextMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 31ECE641ED1AC3888D6C9BB35DFCC7A0 /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */; }; - 3258B5B23366506DD494C46AFB1C84B8 /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 32BE965A17859BA8C63263A2674BD0C6 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA89AE50DEA94816C5333CC1325DDA8 /* RDEPUBReaderTopToolView.swift */; }; - 33BF364D51A0EC9CC944BBDDF2AC4065 /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD0BB5D8B2ADEBDD25F740A7185B516E /* RDEPUBSearchEngine.swift */; }; - 343E794F88AA503F5139C2244DC1A2B1 /* DTTextAttachmentHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = C298199F5DC5390E8B6666F638B34C10 /* DTTextAttachmentHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 350C0168585FC1AD0C216F769FBF709A /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FC4B1718DDF94A99192ABD5C1B24DAC /* RDEPUBReaderSettingsViewController.swift */; }; - 3534F4FAFC0636E50CB8D9200515E974 /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1AF2749008FE67A3281B83EE327E41D /* RDEPUBChapterData.swift */; }; - 35C5BE59CA712CCDF93D6E7010D93883 /* DTAttributedTextContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = C123C127CC539ACCB510F665DB774899 /* DTAttributedTextContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 36DEB3A282F5A6B8CD1CA2F085B805F5 /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF99F8C8ED42F614BB051509F8E065B /* RDEPUBReaderController.swift */; }; - 372E907DF08263D0E1AF904F1FCD66EB /* DTTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D36ED8209C907E3E9B074DDB399F54FF /* DTTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 382D4752DB1D51511A713736629A120B /* RDEPUBCFIMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD2CC39C57A942917B961FC8E73D80F7 /* RDEPUBCFIMap.swift */; }; - 389F7C8400F9223C019F2D7825CD2369 /* NSCharacterSet+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 713C9FD0354D16AFCCFA630A97F2DA68 /* NSCharacterSet+HTML.m */; }; - 395F5B39BB0D706C1C461E3C7D6117A6 /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736A135E9B22B812EE7A51484408FDE1 /* RDEPUBReadingSession.swift */; }; - 3A5CC932C1E41AB85D67620EEA2D0BA8 /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */; }; - 3B60579AE4F0DAF5C15349148708AEF3 /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3C37CBADF5A9D153099D9DD26851B012 /* cssInjector.js in Resources */ = {isa = PBXBuildFile; fileRef = ECBE8305E343FF00B5DDF4F8F9D18623 /* cssInjector.js */; }; - 3D8657B60B919094A50D9CE9A5F454A4 /* RDEPUBReaderAnnotationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 174A6B5E9BDD0636D95688D70EEEF226 /* RDEPUBReaderAnnotationCoordinator.swift */; }; - 3DC8F9474FC6A0BB7E81A703CE958966 /* NSAttributedString+DTDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E2D85A099C99CD82FD1842EE7C52D2 /* NSAttributedString+DTDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DFAACFD146FD0704B2D180361A1885F /* RDEPUBReaderController+RuntimeBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80F37ED477F71A78A2658E146A2A5CB3 /* RDEPUBReaderController+RuntimeBridge.swift */; }; - 404A17D320743603ED7F97AEBB655C1A /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C97EDF23543CE63904C4D8A066A7A1 /* RDEPUBTextPaginationSupport.swift */; }; - 406988E005ADB31DF5140AA2018B3C7C /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41461DCE168703F25B2447BCA1B4AF2F /* RDEPUBSelectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66EEA7DA60C7DCD504C673D6CF9B74FC /* RDEPUBSelectionState.swift */; }; - 4216E83BBAC1EDC764B64A7959687531 /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 538572A5C098252D629F2185F1B1C9E8 /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 432C14A294814368D5984610B27E43C4 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FADF7F2A0784AA8BE178F33CACE42C9 /* RDEPUBReaderPersistence.swift */; }; - 4340432D9A9490D9CF9BC31F6B50B2F2 /* wxread-default.css in Resources */ = {isa = PBXBuildFile; fileRef = 0D253DF65322509913DE34899979C30B /* wxread-default.css */; }; - 437298A17902FD1B6BCD2E4FE084DDC2 /* RDEPUBNavigationStateMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3CE87842A4B39DB8691712AEC0E5FD /* RDEPUBNavigationStateMachine.swift */; }; - 43C4F3118715BCDB6941E2FDD47536AE /* RDEPUBTextBookModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F34FF3B7E71CCE4E9C73115AA710B1C /* RDEPUBTextBookModels.swift */; }; - 44199BE5D667C171C4A97EF5D7908D3C /* RDEPUBTextPageDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C89744F4424D96B176330404D1D82C7 /* RDEPUBTextPageDecorationView.swift */; }; - 446FDD2DE47E045F80C995422F12224C /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4479AD171E4AD6640B04604493ED0A3C /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */; }; - 44B1FBF893C06F314F8C9BD1405897D8 /* DTCoreTextGlyphRun.m in Sources */ = {isa = PBXBuildFile; fileRef = 36FCB869246FE45FD1C9609A34EB4E74 /* DTCoreTextGlyphRun.m */; }; - 45133E47CC5FBCF78BFCD38981BA027F /* DTDictationPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 982391EC8620A617B8788C8A6101C96A /* DTDictationPlaceholderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 455DDDB5ED14B07E3E178FCD46B6D6B8 /* RDReaderViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1058DD74F97F43193DBA11E135ACFF22 /* RDReaderViewProtocols.swift */; }; - 45F90B98546FDBA03AB112DFE859A185 /* DTCSSStylesheet.m in Sources */ = {isa = PBXBuildFile; fileRef = E0D90EB06FC37D534934542F9CAB1D74 /* DTCSSStylesheet.m */; }; - 4617A3DACB97ECC22D8F2989294DB7CF /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = D2BA6D5DBD4C6A9285C4592721790A26 /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 468A2F854012BBA18B8CC0458FC89B3F /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */; }; - 46BC83888CC2216F28287B7FA1E81136 /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0595FF1B5274FDF6F9143B6F7FA18D61 /* RDEPUBReaderController+AttachmentTooltip.swift */; }; + 19649ED312D92A6F5D2D6AF4E540CE75 /* DTHorizontalRuleHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 89268DC8F1FBDE4F3167647B6A4F9216 /* DTHorizontalRuleHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1AB9937A5882EC596522387625E02C72 /* RDEPUBChapterCacheKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05B6FB8AE3D884ED289049A7E125D668 /* RDEPUBChapterCacheKey.swift */; }; + 1B2F48EC9DE304484E8DD123EC028E9D /* RDReaderView+PageCurl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB30DFD1013A322C32A3848B1D6602DA /* RDReaderView+PageCurl.swift */; }; + 1B7C6AEE9BE9547FDA5301683625CC1D /* RDReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A957A416473B3393454FF640ACD97E8 /* RDReaderView+CollectionView.swift */; }; + 1B9DD076A7AD549EAE75540AE2741CA1 /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C9575F05D72C239E7E6F079BACDF4C7 /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BE1C10942015A97018CA403574B5F97 /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89AB081C4A259D931A865EA5A797CAFF /* RDEPUBWebView+FixedLayout.swift */; }; + 1C0567C88DCAE3D057F1F75D7AEDFC5F /* RDReaderView-RDReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */; }; + 1C2E78B721E91C8CA0427004A6B5CADF /* RDURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D70402AAC82BB390480E18E45DCF11A /* RDURLReaderController.swift */; }; + 1D460603DCA4A4E5ECFE8FF1F1CACC10 /* DTColorFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4544C4444DCA90E700611D1281969883 /* DTColorFunctions.m */; }; + 1E9D03D8CDA354903C048CBCBF73FB31 /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = DBFE242CACE9410D681C091D4BB7237D /* epub-bridge.js */; }; + 1F2EA31B0B1121ED145A815C6116F9B7 /* RDEPUBViewportTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047D134F34D6BDEFF3403095EA60155C /* RDEPUBViewportTypes.swift */; }; + 2136CAFEBA602E1F1D9AE43D901686B6 /* RDEPUBTextPageRenderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61228D2169407CE48F19589A5145557B /* RDEPUBTextPageRenderView.swift */; }; + 2203356EEA94A9172BC7902923E43CBE /* DTCoreTextFontCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 25DDD76CA572F0C7AB5A8178CF80169D /* DTCoreTextFontCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 221B98812070AB1112E255528B64EDBA /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18519BCA8FAA9B01A704A0F0B9FFC78 /* Archive+ZIP64.swift */; }; + 23E20AD6C625950FDEE2B4C5966C0405 /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC633BF76C79E0B4A6750337D5DCDB8 /* DTVersion.m */; }; + 24395BEB3C360D9DA5180BFB955B04A0 /* DTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EFAE8DFDDEA1E6047289C86D66381C0 /* DTAttributedLabel.m */; }; + 2445709667CB3820E51CD4AA915E6943 /* DTHTMLParserTextNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 558FCD3F7E481B782EBFA127486ED15D /* DTHTMLParserTextNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24B8A2876EFBF98BE592BA30F243E027 /* RDEPUBCFIPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66BF9E68AC68E641A2F40FB7DE03BA5B /* RDEPUBCFIPath.swift */; }; + 24C5169AB172176FCBF41CD84724782C /* RDEPUBPageResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7F60831A79D296EEABAD2AEB8A8C774 /* RDEPUBPageResolver.swift */; }; + 24C5B52FD2AA9C49731DC6859ABA7CDE /* NSDictionary+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 78887827FF15DE20865DF3A00660993B /* NSDictionary+DTCoreText.m */; }; + 26073F7564244C7DDBD20B7A99849F21 /* RDEPUBRuntimeChapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3E72DC0C036C0F8808A44B73C4A5EA /* RDEPUBRuntimeChapter.swift */; }; + 262232E65FD8CA26C37C33D8B1FB9B3F /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = D30DBDF1EDB20CF83690AC6619AA0C48 /* NSString+DTPaths.m */; }; + 270C5C10028F0BC5A62548326CCB379B /* DTColor+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FAAF640165FC1B4B47C546F80D98B1E /* DTColor+Compatibility.m */; }; + 27CAE671400980165BF5E3FD824F08A2 /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FF1C41D226C0957F715EFF3F23893386 /* DTFoundation-dummy.m */; }; + 28030B304C060583055AD4BB94B57E73 /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F75437CE9F9324D315E417014797C1D /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2925F96E721F741F60C0D2B5AECDBED3 /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16D8899DF97FEA1975D2D134DA77804 /* RDEPUBReaderSettingsViewController.swift */; }; + 29D9B32DFFC59A157EDEF005DB92A5AC /* DTCoreTextLayoutLine.m in Sources */ = {isa = PBXBuildFile; fileRef = EB850927957E35DB8CE0F109188C99A9 /* DTCoreTextLayoutLine.m */; }; + 2AAF9361720FC2D8FFCA93B5FAE42019 /* NSMutableString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 126E6ACAC7C0427806B58DA8E10BDD78 /* NSMutableString+HTML.m */; }; + 2B5D0753E9B3BFF6F7C695CAF9916DA3 /* RDEPUBSelectionLoupeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE23D3D8B6CDEC776313C06D5CB44FE2 /* RDEPUBSelectionLoupeView.swift */; }; + 2BDEC97E2DDF4218FDD5DFF1F1DC16F2 /* RDEPUBNotePopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC145C21118E90789E7954C445DE047E /* RDEPUBNotePopupViewController.swift */; }; + 2CE58BC822323243DA3DB3FD583F7E31 /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F49FC82A04EE9B3B49CBA6CB88ACBC67 /* FileManager+ZIPDeprecated.swift */; }; + 2D1270A235659EAB7D0CDF39B8327963 /* RDEPUBChapterOffsetMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DDB8FAB80CF0B8039A3DCF2D1CE6F5 /* RDEPUBChapterOffsetMap.swift */; }; + 2DF9FD4220363B628D1C492D280B21F7 /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68CF28E1B8594F100BEAC89F7B9CA20F /* RDEPUBTextIndexTable.swift */; }; + 2FD40BB5079CB1F7FDED414B9F0CD770 /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3545BDB1B440A560114071D125EA94C7 /* RDEPUBReaderHighlightsViewController.swift */; }; + 2FD7360250C2255A80583D4CF518FBFA /* DTTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 4944FE0BE3205F2EC91A6A0550D30B75 /* DTTextAttachment.m */; }; + 3034A9A7C9993A9ACEAE079DB7C159E4 /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C60AB9DEFB015F6E3A40DECE78AC69B /* RDEPUBChapterData.swift */; }; + 303DAA818CDDA98AF92E4FBF2A732B8A /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EC2AEE3E653B0E8731C706FF3768F46 /* RDEPUBTextBookBuilder.swift */; }; + 30C01FE491C26314F776AD8B2AF136FA /* NSAttributedStringRunDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = C69C7A531B5E021499D8FBF1DBE0E3BB /* NSAttributedStringRunDelegates.m */; }; + 30D40C2BD0CA2DB6C95A66EB01535DA7 /* RDEPUBSemanticMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CF3A3E5A1F6B321F72FD2FF3C0AC1E1 /* RDEPUBSemanticMarkerInjector.swift */; }; + 31B805C50E0E187E6242B0C878C4D30D /* DTCoreTextMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = C495C74844982FAA1B846A2A89023D12 /* DTCoreTextMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32003AEED9194998E4CE19D8655A1CA9 /* RDEPUBTextPageDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51282F5AE6E4F8FCD61A8B05638937D2 /* RDEPUBTextPageDecorationView.swift */; }; + 334A13941CD393644146CF756B266584 /* RDEPUBTextSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94AC74FD0844C7054C87B2A9D27D847D /* RDEPUBTextSelectionController.swift */; }; + 343E794F88AA503F5139C2244DC1A2B1 /* DTTextAttachmentHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B8FDAF9E8370366F7FA8524CB0D80B3 /* DTTextAttachmentHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35C5BE59CA712CCDF93D6E7010D93883 /* DTAttributedTextContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = E96C0EEB2032D3CC18F4B37A7C34C84C /* DTAttributedTextContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 360DDB3135C7FD47D373DB988C539CCB /* RDEPUBImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF799848B6E5545BD3003001D3F6518 /* RDEPUBImageViewController.swift */; }; + 36FD94BC47225F46F04D40DD4D97514B /* RDEPUBChapterLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8097E74036B5D6E168E9714A580060A8 /* RDEPUBChapterLoader.swift */; }; + 372E907DF08263D0E1AF904F1FCD66EB /* DTTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = E853AAB3B09E0662567752431CEF1D33 /* DTTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 373C0713BB83948F70327BA339F4E64B /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = A3F7613E99CAA29881A015D0ED969B86 /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3799DDD203E5B4ACD6DC478CC0153CF0 /* RDEPUBJumpSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = E744A9171DA8D779C942360378D2EE4F /* RDEPUBJumpSession.swift */; }; + 37DD0E5A1E4470E7DC30934C28EFBC65 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAE090F5D5825DF3A26C12BB14E21739 /* RDEPUBRenderDiagnosticsCollector.swift */; }; + 37FF1ADF896F2D0BB383972330F86992 /* RDEPUBBackgroundCoverageStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8FE55941A5CBC989B1F8C3E2D5A49AA /* RDEPUBBackgroundCoverageStore.swift */; }; + 389F7C8400F9223C019F2D7825CD2369 /* NSCharacterSet+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F242FC1357DD90FA4FD67E1DB90A837 /* NSCharacterSet+HTML.m */; }; + 38D45D8BED0B49F0E0FD6667D86805DE /* RDEPUBCFIUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEB527B9C4921752C6B00B0D032F379D /* RDEPUBCFIUtilities.swift */; }; + 39FDF70808F3A3476068FFE7DB45341C /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = 3046397381A83C2F6BAF344B86AD176E /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B49170468F853F1664D619454E612F4 /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC237752DE21AB8ADA263DE4977AC0F /* RDEPUBWebDecorationOverlayView.swift */; }; + 3BDB9F7C8367124B362836E4A8BF5341 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 47DC174612C98B2CFB4E7D158169139E /* default.css */; }; + 3C298E214C6A6859593A68461E673E33 /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = C7E09A6C247D465CA0EF71B939B2A040 /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D54BF064199B24E96A4E00D7A654106 /* RDEPUBChapterWarmupOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 270645F585F13D520FFA031C447E19F1 /* RDEPUBChapterWarmupOrchestrator.swift */; }; + 3DA2135F0842C596563E610AC1B162B3 /* RDEPUBReaderController+RuntimeBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3BEE5F799C47EEACB7E29C611B8201 /* RDEPUBReaderController+RuntimeBridge.swift */; }; + 3DC8F9474FC6A0BB7E81A703CE958966 /* NSAttributedString+DTDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A086525BF509F4581693115438B82B /* NSAttributedString+DTDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F4489815030D85B098664869FD06D00 /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70E0378F7CBD5A6DA253CC326036A9B /* RDEPUBPageMapReconciliationCoordinator.swift */; }; + 416916BBDD8A2F9D3FB0E05F07B6B9EF /* RDEPUBPresentationRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44A1AD3BAAAF051B1AB7CE90E0F92BE7 /* RDEPUBPresentationRuntime.swift */; }; + 418BA261DBB5B3CBCEA84B21192BE5EA /* RDEPUBNoteModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E305762ECD5788B045AFC816767444 /* RDEPUBNoteModels.swift */; }; + 4243E07D3DE0A37254A56F24C60139A3 /* RDReaderView+ContentAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E19C361904199E2E63EDFFBD64A90C /* RDReaderView+ContentAccess.swift */; }; + 43DE22E881166971EA01518084D03267 /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = F3E93C4AC73A09DE1EAE805B0ADE3306 /* NSString+DTUtilities.m */; }; + 4419BDA1F006E749CA40A99C1E6CEDFF /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34595E922A09667901C926A8EBBC5E1A /* RDEPUBReaderTheme.swift */; }; + 4475F0D70E29629D04CB64C82FA5CEBF /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 56E8939081946D090FD77A04F879754C /* DTExtendedFileAttributes.m */; }; + 44B1FBF893C06F314F8C9BD1405897D8 /* DTCoreTextGlyphRun.m in Sources */ = {isa = PBXBuildFile; fileRef = ED049C791713944233EE10C7A111C691 /* DTCoreTextGlyphRun.m */; }; + 44B6E32953282F781A5D5ECC8BF8EC1C /* RDEPUBCFIResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E697E9F69226A6A803098BFD3D202842 /* RDEPUBCFIResolver.swift */; }; + 45133E47CC5FBCF78BFCD38981BA027F /* DTDictationPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C12A4A5BB42D0F68DABBD3BDF103BC5 /* DTDictationPlaceholderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 451E2C056209E939AB8C7F2F6F83B908 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1300CC5794E609DB8FBA6FFF90A09408 /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 45AEBF466DD0EA1130E3D64A8FC80612 /* RDEPUBCFIRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29701CE248CAAA87698BD90F74F6295B /* RDEPUBCFIRange.swift */; }; + 45B59D63934EC6A1131DC2270A71DA24 /* RDEPUBImageViewerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA0A09CCD48B28C7C98016F5B7DCB94A /* RDEPUBImageViewerCoordinator.swift */; }; + 45F90B98546FDBA03AB112DFE859A185 /* DTCSSStylesheet.m in Sources */ = {isa = PBXBuildFile; fileRef = B37118B8D16847B0F82E06A5B33898AB /* DTCSSStylesheet.m */; }; + 46AD9CE8A6300737D0DE3750BE12E55D /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DB230C0E9A18C8B1C5581CD2D3D0F2F /* RDEPUBReaderDelegate.swift */; }; + 46D92965B81BEDB4DBD7FA6050448D0A /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B46EF6F055A721AF370D705D026E9E /* Data+CompressionDeprecated.swift */; }; 46EF32D586FF590CE2C60C66364B9357 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; - 475A20655711B38721CA7D0F558DB434 /* RDEPUBReaderLoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F058E473114A5A8FE875FD5ABBE02F5E /* RDEPUBReaderLoadCoordinator.swift */; }; - 491EFCE38A3F50F71087473BE0421212 /* RDEPUBChapterLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41EB07D58D668A3EE943B8A619CF70E7 /* RDEPUBChapterLocation.swift */; }; - 49493EF208D8B0FD2F8D7FE4B0605F59 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8D349DB593AF848B64723FBF1DF717 /* RDEPUBSelectionOverlayView.swift */; }; - 4975956E880208083B5F22F8B5BB2BB3 /* RDEPUBNoteResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8C6B44716EC22054F92F4ED84DA6A85 /* RDEPUBNoteResolver.swift */; }; - 4A09AA29561E2A2483171BE5F449E451 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 4A13B4E5EA8616A8F09D90BC6EAEEA64 /* CTLineUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = D24FE8634A7AD2562DB8ADB9D4BBB36A /* CTLineUtils.m */; }; - 4A891B04317BB3931238875910CE7772 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; - 4AAD976AEFCB0BCC55B8585323321885 /* RDEPUBChapterDataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9FD96F86CD108FB55F99EDCC82B3771 /* RDEPUBChapterDataCache.swift */; }; - 4ACCCA93DA06B2666E192996213E0B0B /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */; }; - 4B5274DA733FBDE60596AEF43A61320E /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */; }; - 4C17BB41AB2B816631F9477DCA0AAB7E /* RDReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D28F67E16027AF4FA4F9D501C4D0712 /* RDReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4DA6EC46F8968265B96C6D7B2260C4E5 /* DTTextBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = ADC5AC8FD4EC45E9BA5654A38715BB93 /* DTTextBlock.m */; }; - 4E4939F6592B06D2CA764DCACFB47871 /* NSString+Paragraphs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83E37DC74BB53F90A5AD54842858A62F /* NSString+Paragraphs.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4E66B9A8089866D932E7127403C0DC52 /* RDEPUBChapterCacheKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = B84FD477EF687A49F011E7FA557C1791 /* RDEPUBChapterCacheKey.swift */; }; - 4F50C703427747B88405080B221349A1 /* DTLinkButton.h in Headers */ = {isa = PBXBuildFile; fileRef = D7B5E61166782ED8D585D4FCEE2074DB /* DTLinkButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 502C53D46B40E13673AB6F26044BE287 /* RDEPUBCFIResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24AB4F9BE6993854E38FD95A30B9845 /* RDEPUBCFIResolver.swift */; }; - 5065D99E1588E8CC60677E74916A5C03 /* DTAttributedTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E1F63A854BBF28E93AC1D3F71CD48CBE /* DTAttributedTextCell.m */; }; - 50FBFEC57DA9CC749DA0D1E8B2B75F7C /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */; }; - 51287FBF548A17A568489D31DA8947FD /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5152CE03325B9F978C9C5326A45A9DA6 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 51A1B5800D23C355B1712E8D1103780C /* DTTextBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = D497C3CA364E37DAAFF2C3B90CC7DBE8 /* DTTextBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 51EA2808E014EFABCFD4AF05C3CC153F /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9551DE4A9087AF37320340372B24F7CA /* RDEPUBWebDecorationOverlayView.swift */; }; - 526BC0691731F81C69DB9755158CB9EF /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */; }; - 528DBAC7FCEFC7D6575C1F6CB4399AEA /* DTStylesheetHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 96FA99AA7D4AD0D4246C8DAC1CC0C24E /* DTStylesheetHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 537A4BFAF3D622FCB0C3A31B71F0D8C0 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */; }; - 53E23429B7E072BE1D580C47944785A3 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; - 5462A8578E68D9DA6636976F732133F8 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */; }; - 5476A8BC3143ABF3716F21AF18C67ECB /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */; }; - 54A90EEE707DC23289088EDEF91F543C /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 731C0C61E3AD227D691FBA1C2C17BF7B /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 552386640F85BA29D72638B3652F87EE /* RDURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEA02BC05A988384DC4551B451ED1E7E /* RDURLReaderController.swift */; }; - 5582735073EBB9F5078E6E8AEEFB646A /* DTCoreTextLayoutLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 64AB89EAB10148C39B726B26BE04F4F8 /* DTCoreTextLayoutLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 55E455C9B7A3ED583443CDE8E668163B /* RDEPUBReaderState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A3654E9B076CBACAB460CDD311C9B6 /* RDEPUBReaderState.swift */; }; - 55F4D3C5BE4D81A6A193E0799AF0834E /* RDEPUBMetadataParseCancellationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F3F0149FB61996B3FFFD4771F697189 /* RDEPUBMetadataParseCancellationController.swift */; }; - 56D49829FADCD7075A95452CD3D193B2 /* RDEPUBTextPositionConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A971ECCC1DDFDE6D5417E949E3B1FD2 /* RDEPUBTextPositionConverter.swift */; }; - 57429646273801FBDE2E8306B96D9415 /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85AC8A746E7DE5FC77159ABF4085CAC7 /* RDEPUBPublication.swift */; }; - 57D5228C8A85628772D4D78E7FBEAF3C /* DTDictationPlaceholderTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 477A0FC2A1F0B7F7CCF72D201ECEBAB0 /* DTDictationPlaceholderTextAttachment.m */; }; - 57DD3A0EBB0E32B4D804E8D49FE99001 /* RDEPUBDarkImageAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1AE55A8C17840C96761BE01A89653E /* RDEPUBDarkImageAdjuster.swift */; }; - 58445DE0477FD63B598AD8785C45DD1F /* RDEPUBCFICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9688BB6F63743F17F842CE97BCF847C /* RDEPUBCFICompatibility.swift */; }; - 587D6FEA096B959DB159958EA85DE7AA /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */; }; - 58DF82D5893CEB68C83816F91A3587AA /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 597DE4CDF5C674E269F03F6AA0AFFCC1 /* NSAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 92460D196C5300656C9649784EBD3C58 /* NSAttributedString+HTML.m */; }; - 5AB50C364F62809013394E49588190C8 /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E160FF00EF4B6DB318FEDCD72A026F3 /* RDEPUBDTCoreTextRenderer.swift */; }; - 5BC03D1F8B6ED13FB6EE44A06D5B56F8 /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */; }; - 5C5E3146F1526E09C1F510BD514D8A65 /* RDEPUBCFIGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0524B881754B1D6EBC90981B8760C6B7 /* RDEPUBCFIGenerator.swift */; }; - 5CCD132DD04800227A43A475DAE36FEF /* RDEPUBReadingLocationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5077CB33FD2EA6584AF290C95617DC0 /* RDEPUBReadingLocationModels.swift */; }; - 5D03A5B9DC067875CFEC9D4EA7B059E8 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D863AE4F659A0F71B22DC9FF334DDF4E /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5D8D65121E87E419D8D2F23F8AF43673 /* DTColor+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 80B3D15ED0D19D020663EF055386291A /* DTColor+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5E1420A9BFA59300AAA3F5ADC85B651A /* SSAlertDefaultAnmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */; }; - 5E58335E84B16D33094CBE684E8065FC /* RDEPUBPageCountCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D58FC9E6A5173BAA575CE45D07134D0 /* RDEPUBPageCountCache.swift */; }; - 5E90EBD876ED4E50AB890FB56C4BFA57 /* DTHTMLParserNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C8343CDCF82729A8EBCCA37A6650E34F /* DTHTMLParserNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5EE0E6A4CE24D4F834E95A41DEE57121 /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */; }; - 5EF61759B9D9C035F921104933AEE7B5 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81211446372A6A55789AA7E7152E7084 /* RDEPUBCoreTextPageFrameFactory.swift */; }; - 5FA01E9E77A69E8AB98EAD70E51A0FCC /* RDEPUBCSSCompatibilityLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EE98BBC2688DFF0B50F9C417007886 /* RDEPUBCSSCompatibilityLayer.swift */; }; - 60532A2E06CCFF814933D2FAE6793AE9 /* DTCoreTextLayouter.h in Headers */ = {isa = PBXBuildFile; fileRef = C26DBE1150BC9A30B69839783E000358 /* DTCoreTextLayouter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 60DEFF3031960C170BD930117DDBFDE7 /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E71F44D9FE962AA1D19EB945E7E657 /* RDEPUBParser+TOC.swift */; }; - 60E8ADC216658A673DEF71C298CAE616 /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61BE3607EABD2657BC71AF8ACB1C25D4 /* DTHTMLAttributedStringBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B59C9A1B265393E4BA8383B308A5917 /* DTHTMLAttributedStringBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6321BE6DE0C6F2AC7D53FE5BEABD4F83 /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA89765B94A26A186DC7829FF979DBC3 /* RDEPUBParser+Package.swift */; }; - 63ABC14E426657DEAF0A5309CDC81A48 /* RDEPUBPaginationState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DBB472BDBF872F8A5C3A7460B17A31 /* RDEPUBPaginationState.swift */; }; - 63B386907330D3174C4354A68F5BB911 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAA55250015C69FA24DCF3808A74ACA5 /* RDEPUBTextContentInteractionCoordinator.swift */; }; - 63BD507DCFB9657844C5822E2BD7C72E /* RDEPUBReaderLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A138DB38231B185E189787D33D3B4950 /* RDEPUBReaderLocationCoordinator.swift */; }; - 63E3F3AA068ADE79B61FA2B9682F03ED /* RDEPUBChapterTailNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68A8597AE94ED09E9828E2EEA0D8FFFA /* RDEPUBChapterTailNormalizer.swift */; }; - 643C97526CC9533DCA363EB5704559FB /* RDEPUBReaderServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F07C9C63CCAC0DAFE81B6A625199293 /* RDEPUBReaderServices.swift */; }; - 64EA4D70BFC27B08051A38CFD34E9EEB /* rangy-serializer.js in Resources */ = {isa = PBXBuildFile; fileRef = 25E8E62C9DC0A4AE49F168F04CF8B9D3 /* rangy-serializer.js */; }; - 65AA4E5DD815EA54256EB4F859B2CBE1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 65C27A19D68F8932FDDC9DEE58D392FF /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6634D568E49F5610242E1454680E5885 /* NSAttributedString+SmallCaps.h in Headers */ = {isa = PBXBuildFile; fileRef = DD189DA6054AAE2242F6644A2623B50E /* NSAttributedString+SmallCaps.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6795652F3E65BD7FB9B422F192768372 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */; }; - 67AE2AC8D9B961D45871077774E11FD3 /* DTObjectTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 073A7F9DF1A554BD1B324EA9E0090E91 /* DTObjectTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6840A456B0498FA5A20F9F1713E21479 /* RDEPUBNoteModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2A285973A8C8A81A03D472845DA414 /* RDEPUBNoteModels.swift */; }; - 68C89390714FFBFDFCFD1248A346E8E8 /* RDEPUBNoteDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D0C0A9C17CB99D2B116A2E6450CE89D /* RDEPUBNoteDetector.swift */; }; - 69674FEA70899F07BE6098AAEC849978 /* DTAccessibilityViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CFADE0F46014990052AD67F17C86FF /* DTAccessibilityViewProxy.m */; }; - 6B574191C6DBFD6A34B1F5850E599DBB /* RDEPUBReaderController+TableOfContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E01ED3AA3B7599EB648D7BD507B4D92 /* RDEPUBReaderController+TableOfContents.swift */; }; - 6BADF8A33B372ECD3F1A335EA4A22C07 /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3207A69E5A8BC344BDC277A8BEA51979 /* RDEPUBSearchModels.swift */; }; - 6C5BB6C686AF9EAAA7934C9F45648A4F /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46B85AED3D53815F95E435FA3529141C /* RDEPUBRenderRequest.swift */; }; - 6C762AFC299FFD839633723E95F3524D /* rangy-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 8F9C05A5DE7C804D6531F4BBF31A3045 /* rangy-core.js */; }; + 49DBA3BF291BE1AA349C439DE6E74ED7 /* RDEPUBReaderChromeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01B6F1C44AED0554A533AF8573303A47 /* RDEPUBReaderChromeCoordinator.swift */; }; + 4A13B4E5EA8616A8F09D90BC6EAEEA64 /* CTLineUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FF4A2A7F2C7CFB5DD757BE1A6E59C7B /* CTLineUtils.m */; }; + 4B01D192E9BA7876FE04643D9B59BB7D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + 4B3799CED66DE4CF5358AAC35D27F212 /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 736492CB9D329AD8CB8401330973FBCD /* RDEPUBSearchModels.swift */; }; + 4BC10B95FF401CE4B81EB29E08A14C85 /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53D1FE67166E6B0675584BCB425A05 /* RDEPUBWebView+Search.swift */; }; + 4BEF7F1D48D5407BA2CCADEDBD0933BA /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = E865600EE9117A9153716299FFA7912D /* Archive+Reading.swift */; }; + 4C2062F59D9CE0D280C035D83667CFAE /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 131C1D8C96DF2D44A2D4F50C5AEFFF11 /* NSString+DTURLEncoding.m */; }; + 4DA6EC46F8968265B96C6D7B2260C4E5 /* DTTextBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = C508E49F6BF9F50B05918C230B033069 /* DTTextBlock.m */; }; + 4E4939F6592B06D2CA764DCACFB47871 /* NSString+Paragraphs.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8321AB80CFE0B94537AEA63E9A79F5 /* NSString+Paragraphs.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E8F3FE99F2F7CE831ACB4244ADF381C /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 210601B1509A4301617C853C5022AA99 /* RDEPUBReaderController.swift */; }; + 4EF862E8A01AC4423C7A684BADFEECBB /* RDPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D30190E9913BB7FF775D8602E753BA47 /* RDPlainTextBookBuilder.swift */; }; + 4F0E298474D056888D4B8337193755AE /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = AF1516035C269F7A41EE064AAB14D562 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F363B073676BB21128E5BAF85D05EE8 /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18D23D8D10719754D93032F66EB98536 /* Date+ZIP.swift */; }; + 4F50C703427747B88405080B221349A1 /* DTLinkButton.h in Headers */ = {isa = PBXBuildFile; fileRef = B12CE4962CDC324FB47FB92D6706D149 /* DTLinkButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4FDA4ACF3A9676F39F239791127E4651 /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 23006DBAC610AEB0A4B3EAFEA4FB0567 /* DTTiledLayerWithoutFade.m */; }; + 501F8AD8F97F43A5D7008BE031C7934A /* wxread-replace.css in Resources */ = {isa = PBXBuildFile; fileRef = 3CD5E5ED855BD807441CC55E7046DC18 /* wxread-replace.css */; }; + 5065D99E1588E8CC60677E74916A5C03 /* DTAttributedTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 814315319ED50AF916C3C8A68C0A47A0 /* DTAttributedTextCell.m */; }; + 51A1B5800D23C355B1712E8D1103780C /* DTTextBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = EA2BF1D7535B036E1356E8DF42A04954 /* DTTextBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52465038F8651BB09BC9F445EFE64FD3 /* RDEPUBCFITextAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9998A80A1B633EB1C2C1EBB107866B40 /* RDEPUBCFITextAssertion.swift */; }; + 527BD4D564B72BED5FF27088B1078D9D /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10FC9FC44C8A038A286BF6DCD1891DA0 /* RDEPUBWebView+Reflowable.swift */; }; + 528DBAC7FCEFC7D6575C1F6CB4399AEA /* DTStylesheetHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A88AA04D7B29A217B432C19AC48AB6B /* DTStylesheetHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53D8722E9B869009D27AC6E0ACBAB6BA /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 765A94769106D14615FFB30EE1BD5E65 /* Archive+BackingConfiguration.swift */; }; + 54AE224FF7E59A32A75151324762B076 /* RDEPUBChapterTailNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03574AB570F840F4A14B53F85023DBAA /* RDEPUBChapterTailNormalizer.swift */; }; + 5582735073EBB9F5078E6E8AEEFB646A /* DTCoreTextLayoutLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 37327141DC73DE2D5742BE6F989094CE /* DTCoreTextLayoutLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 568A0B72299CDAF86374403711F57669 /* RDEPUBReaderController+ContentDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA68A96FA91F03F747A3D85A2DB0B45E /* RDEPUBReaderController+ContentDelegates.swift */; }; + 57D5228C8A85628772D4D78E7FBEAF3C /* DTDictationPlaceholderTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DA0F94C0870C1F0DFADE5E9045E5E6E /* DTDictationPlaceholderTextAttachment.m */; }; + 58A1F591244259E81CAEAD8AA6AEDD32 /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = 467CC59CEC3B3BC7ACDCA776FDCBDC1D /* NSURL+DTComparing.m */; }; + 5935C35EB75A5FD5C0B8D288B7ED2418 /* RDEPUBReaderServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = F98CD641441793095A6228F264D13025 /* RDEPUBReaderServices.swift */; }; + 595F78047873532A4208F40405262684 /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = A3DE08AC23FE36A6C3F33A04700FDE57 /* DTAnimatedGIF.m */; }; + 597DE4CDF5C674E269F03F6AA0AFFCC1 /* NSAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 71EE0B4D4D1B3D0A55E903E7E0CA44E7 /* NSAttributedString+HTML.m */; }; + 597FB44F34F00977BA886DDAF246D33F /* RDEPUBAnnotationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E66D8D0604A6C89AA9DD222FE61F0E2 /* RDEPUBAnnotationModels.swift */; }; + 5A041AAE66088AD15755C6C5BA152E2F /* RDReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7941BAA5BADB40ACC8FBC080977F6B51 /* RDReaderFlowLayout.swift */; }; + 5ABBCC3416B1FCBFAB56261F283693CA /* WeReadApi.js in Resources */ = {isa = PBXBuildFile; fileRef = A511C95B0250D33F33026861C48BF655 /* WeReadApi.js */; }; + 5AE0C11BD819CF2A3C11CFC802DE0C06 /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6430501430329643C8280B3985C48711 /* URL+ZIP.swift */; }; + 5C17AB24452486F4AB7BA2DE5EFFB961 /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A9D1AD928E701623173D31FC8B35F7 /* RDEPUBAssetRepository.swift */; }; + 5CE8BD1A9C7FE28802CD9409E4282D5F /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08EB5C6310B7F9040732D6E905650432 /* RDEPUBReaderToolView.swift */; }; + 5D03A5B9DC067875CFEC9D4EA7B059E8 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 671C2429406FDB36B677F4B6EC85B52F /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5D8D65121E87E419D8D2F23F8AF43673 /* DTColor+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 68D81DF1BB2A14F9C186F75BBA5CF50D /* DTColor+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E6091E20FD3C08AC4BB3DE2C3A299DF /* RDEPUBFragmentMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91C1D68B23A3D8DAF1C0934F17A09917 /* RDEPUBFragmentMarkerInjector.swift */; }; + 5E7ED02087D9553656C56D64CF23291D /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32B07FB6279468CAC8C8496B97B2B543 /* RDEPUBPageLayoutSnapshot.swift */; }; + 5E7F1CB5132C8FB02EA6B1DD947F914D /* wxread-replace-latin.css in Resources */ = {isa = PBXBuildFile; fileRef = E7E49A0BE37FE8EEBBC94E752B95C59C /* wxread-replace-latin.css */; }; + 5E90EBD876ED4E50AB890FB56C4BFA57 /* DTHTMLParserNode.h in Headers */ = {isa = PBXBuildFile; fileRef = D28A3E79D83EA4B807E2D3A5EE086B8B /* DTHTMLParserNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5EDC7E764198A5BD8E4F93662E72B40C /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15C005A2A5E6A8263DE1F99AC5D372C0 /* RDEPUBParser+ReadingProfile.swift */; }; + 5F9F2080B7F3468C9E9BC2EC43A036D3 /* RDEPUBPaginationCacheCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 817CF1C7E3DF9EA0272F660987E896AA /* RDEPUBPaginationCacheCoordinator.swift */; }; + 5FAE9F6E6EE4A8A8C8547059FC5EC13A /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39E73DF030C0B322474D5986AD2D2FE /* RDEPUBReaderController+AttachmentTooltip.swift */; }; + 60532A2E06CCFF814933D2FAE6793AE9 /* DTCoreTextLayouter.h in Headers */ = {isa = PBXBuildFile; fileRef = 72225FB74594FCF18DA8064E7DB3947E /* DTCoreTextLayouter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6090E5E9EDF9213F6AAE38EFAD608B89 /* RDEPUBReaderSearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6205EFACA691F3EC37951F5A30B9590 /* RDEPUBReaderSearchCoordinator.swift */; }; + 60AE4530CADCF5D851EFB088FD1CC32B /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B9309F0BDDDE2C3EE13C97BF2C0F1E /* Archive+Helpers.swift */; }; + 6115A9FA0A489CE1476B2F524028E0E5 /* RDEPUBCFIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 184CDDD009D8F4384A9E02F953B6D8B6 /* RDEPUBCFIParser.swift */; }; + 61563CE4742FACF31146E47D46A558D0 /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0D068226C4B5E614B90482A3B4AFC0 /* RDEPUBPreferences.swift */; }; + 61BE3607EABD2657BC71AF8ACB1C25D4 /* DTHTMLAttributedStringBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E1066A8FE63AD2C818E26DDCE62DF58 /* DTHTMLAttributedStringBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6300355A098AC58B01C10D28C5BBFB41 /* RDEPUBCFI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B4BDE6AF43475513D28D232AB7D0B9 /* RDEPUBCFI.swift */; }; + 635EA3B1D45012F199D6ED4AB783D5E8 /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 67DA49B61A249C2B8241D8FE166608C9 /* UIView+DTFoundation.m */; }; + 6387DFB2BFA51419C2B108337303C3BF /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AD2B1FCE8C4B62FBC8B751F17EC474 /* RDEPUBWebView+Configuration.swift */; }; + 63BF2C30A8B633ED2DFB5C9AA4DF5DD0 /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BA617294E6371DD7FAC32B61E0873F2 /* DTPieProgressIndicator.m */; }; + 63C748495E15AFA55CFECE60EA39DE3A /* RDReaderTapRegionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F850938C9F348E6ED5216809EE43689D /* RDReaderTapRegionHandler.swift */; }; + 640909B07D40D27700CCAE2ACD0ACF4E /* RDEPUBCFISerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EADA99F8B48CDCB82A6D2D3507EC32C /* RDEPUBCFISerializer.swift */; }; + 6423A9D67FD431A53878A2DE0AF72DF9 /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35417EC94F2D58CB80C991F875CE15C2 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 64B9E0A8AD351336BCFAEEE49A596BC5 /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22B69C9433F2FBE5CE8409BD4266DFE8 /* Data+Compression.swift */; }; + 6634D568E49F5610242E1454680E5885 /* NSAttributedString+SmallCaps.h in Headers */ = {isa = PBXBuildFile; fileRef = CACF20969583778CAC1BC92BB96F27FD /* NSAttributedString+SmallCaps.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66ABF5306138D4C39A4B521ECD2B1386 /* RDEPUBPageCountCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC235E4971E5D0ED37AF923AD247D3C /* RDEPUBPageCountCache.swift */; }; + 66BECA8D265426E7C9B47833EBA79D55 /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE83527CFFC7FC1E222F5634198C03CD /* RDEPUBSearchEngine.swift */; }; + 67AE2AC8D9B961D45871077774E11FD3 /* DTObjectTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 13597E7190F2C08C5906D7D128E43E99 /* DTObjectTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69674FEA70899F07BE6098AAEC849978 /* DTAccessibilityViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AC1E707308CDBC9FFC09CECE3117A9A /* DTAccessibilityViewProxy.m */; }; + 69AA93849D36C090BD310B6F0CADD0C5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 006D002D86B43AA52E0AFD2E18459107 /* PrivacyInfo.xcprivacy */; }; + 69BF25DA82C771108676AB97973A545E /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFCD5EFD6EDDC69776A50362DB16409 /* RDEPUBParser+Package.swift */; }; + 6A9D50C84AE349AF8E4D6E27DF651FE2 /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FBE83F7B3B8689CC23FD1657E2A270E /* RDEPUBReadingSession.swift */; }; + 6B577F035D0593AA9E0BF092E752E7D9 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4FD083436655F07AFCFB5B5492EF0F1 /* RDEPUBTextContentInteractionCoordinator.swift */; }; + 6BA40E6FA6DC4701D8156456EB5CF0ED /* RDEPUBTextAnnotationOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9EB24D09C2239F4C77E17F54D248B80 /* RDEPUBTextAnnotationOverlay.swift */; }; + 6CD9816C0995369B167186FF189B7575 /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCD11C7BF5FACCD5B5A3D2C4991EF047 /* RDEPUBTextBookCache.swift */; }; + 6D0848863B29EC8AF0BCD7D30013C8AA /* RDReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E62277B737F95B1DFDBC287DC795CB6 /* RDReaderView.swift */; }; + 6E3160EE1463E3D3C42F6D352278D0C6 /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = E5D4D6E12779C54F17AE98A1E6C9B699 /* DTBase64Coding.m */; }; 6E3D0FDD78ECC20F4B3697ED21D64224 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C2B218B5EAA5831A036BBF7E1EFC1B9 /* MediaPlayer.framework */; }; - 6E7463B2C7BE39639F53BF3B9171750E /* RDEPUBReaderController+ExternalLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EBAE1E92B0DEECFFA57D82DC828AB30 /* RDEPUBReaderController+ExternalLinks.swift */; }; - 6FA0125F16DDEDAD341DB75DEB084F4B /* DTHTMLWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = E16D20FA492E085BD0871B107B3077B7 /* DTHTMLWriter.m */; }; - 7027EF8D77D4082C1BB9B80FF61FCADC /* DTCoreTextLayoutFrame+Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 28043173CA3B3787DC401ACEB5398108 /* DTCoreTextLayoutFrame+Cursor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7061077F19BD8B9339FD53134B0E6652 /* RDEPUBReaderController+LocationResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F003AB5BAC52B6BF426F57E7C500BA8 /* RDEPUBReaderController+LocationResolution.swift */; }; - 707175A0385225FCA5CE079773062EE7 /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96331868591D020B267B45CA8EF65355 /* RDEPUBReaderSettings.swift */; }; - 71EEBB949DF9F1894B271C4268B1A907 /* RDEPUBTypesettingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3424A6DFBC2AC519C7C599F18DCDC89D /* RDEPUBTypesettingPipeline.swift */; }; - 72E212C2DAC151323027585C8DD020B5 /* SSAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */; }; - 730ACB99580C5982DC08D50FC5084D41 /* DTAttributedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = A276DE925253460239BFAEC7663F60D3 /* DTAttributedTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7459A1656EDC29D685073B83561B783E /* NSNumber+RomanNumerals.h in Headers */ = {isa = PBXBuildFile; fileRef = 8552BE1A1F6A6D2879763DE3B2B8A2DD /* NSNumber+RomanNumerals.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74B266A15F5B1DFA3B1D005C7CDBFF0D /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */; }; - 753E3BDEDB52F0D6B6ACEDC7EA577DA8 /* RDReaderPreloadController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5D2C72E80EF71ECCFDFE5C476ADADE /* RDReaderPreloadController.swift */; }; - 75442F59FAA9FD0FBB4F803BB9BB35CD /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4081F4EC77470F1257F11DB2A4B55D /* RDEPUBTextRenderer.swift */; }; - 75668A2C0006C07A19D8D7752400689C /* RDEPUBHTMLNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0F6036722A2FEED169B57120EB274D1 /* RDEPUBHTMLNormalizer.swift */; }; - 75A45AE93B151C5A396F302394426A4F /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67EA3C4114F424563E73EE3FB42D7CD7 /* RDEPUBWebView.swift */; }; - 75DD13197B3A50B7DB6E8C0D453194B3 /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */; }; - 76025C51C72D8110BD74286B4EEFD793 /* RDEPUBTextPageRenderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F9E2282A0A515A241F80997B2F28767 /* RDEPUBTextPageRenderView.swift */; }; - 76470054E16EAA6B2E465088A40E2287 /* RDReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A61F5753AE7B5122FE65CF07CF1AD5FD /* RDReaderView-dummy.m */; }; - 76B6DF0A60F3BB8E9B53581AA2B89ECA /* RDEPUBCFIRecoveryEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078D30B87BEEB64D27E0BDB8EB562475 /* RDEPUBCFIRecoveryEngine.swift */; }; - 777AD7CB7399E49BF110AAA8C9036583 /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */; }; - 780837EAC09D97BF7EB4CC1415EEF0AE /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 033D935836CD653A79E9152E2D84CEEF /* RDEPUBFixedLayoutTemplate.swift */; }; - 7821105EF320619993B3BF7FB90C7ADA /* DTCSSStylesheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B610E558C4917C4257DC198EAFEE2F6 /* DTCSSStylesheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 789B886DB594DC9497BB011790BBF7E8 /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE150E8FBF2AC59607D94086EF644B6 /* RDEPUBPreferences.swift */; }; - 78D24D82D98D77E744FF73C9040618A8 /* DTHTMLParserNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 11B604FC3B0D5C91FEA763DCC0BE4DC5 /* DTHTMLParserNode.m */; }; - 78E85BE5ACA8B34F0F0875795AA5227B /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A0BD48DAF5AE9DB087F2552E99069709 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7A48CDFB40202EFD09A2A9AB0EE0770D /* DTCoreTextFontDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 56489D9BA834497E48438A4B4E1CCCFF /* DTCoreTextFontDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7ABAC9BAA6E1F4DC0792041AA718DB32 /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F8C64CB3F3D0B7D4AA66798C740CB20 /* RDEPUBTextLayouter.swift */; }; - 7B83FABA52CF86EF8529E566EAC9367B /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */; }; - 7BF35387E788616E1A159B0229909E94 /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72BE58BB9BF4DCDFDC6D5430AA2E82E9 /* RDEPUBTextBookBuilder.swift */; }; - 7BFDB986A8372D1D292F341704ADF419 /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3E5029439FC2CDA4E874FBB500F3FE0 /* RDEPUBResourceURLSchemeHandler.swift */; }; - 7C05F56B62B15EFF344C5CDE4A52B8FB /* DTHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D4C9B7ED5E04C216AB28E3A4065C1C5 /* DTHTMLElement.m */; }; - 7C40890FF94AE3B5E3A73AEF73FD0701 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0EBAC7714A5F73B75AAB47D24B08B71 /* Constraint.swift */; }; - 7C43EAC7CB850A7675D2A6D61C8FBF01 /* RDEPUBCFIUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = E992F389B960CB699FDDEA5FBD8F31C8 /* RDEPUBCFIUtilities.swift */; }; - 7C88864F32B503C4E54A5A9B1C332981 /* RDEPUBPaginationCacheCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3008F6944BA740CD6E6F5CA33733C911 /* RDEPUBPaginationCacheCoordinator.swift */; }; - 7D29C0A53AB1B4C1B257D46EBBDC9DA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 7D588676C1FAEE3023C55FD8B37EED1B /* RDEPUBTextAnnotationOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = A988B95153188D52B4BF9F4083BB18E9 /* RDEPUBTextAnnotationOverlay.swift */; }; - 7DBEB16F3A755F919B8AA710F5593C1A /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */; }; - 7DDFB8CE7FA04A4304D5A44026DE1BC0 /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F9CC306B17D409DB903DF850FEDA64C /* DTListItemHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F7B0087DE7C394A677F5883541AB4FB7 /* DTListItemHTMLElement.m */; }; - 7FA38108813D4CB4C8ED33502E91BB5D /* RDEPUBChapterPageCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62755E9A395FF22E7405C3FE192D5F3 /* RDEPUBChapterPageCounter.swift */; }; - 7FF0C80B19CF042F6ADF4A7954DF69AF /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */; }; - 8099F1E613A15275EF5FC59ED3C73579 /* NSAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3D7C8444F58D9B3FCB4F3006D2CFBA /* NSAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 80A95AF17AF71F69504BF2B6639E2AF4 /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */; }; - 811D7CBCD710AE45FF80A4B05BFE444C /* UIFont+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E1548FC42118F1A4164739DE6BE4E9 /* UIFont+DTCoreText.m */; }; - 814D0D63E5FD4AB7231E63064FE9EB5C /* NSAttributedString+DTDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = BF4F3EC137168B92A5DA85AF50CD239F /* NSAttributedString+DTDebug.m */; }; + 6ED0817E085ECE6F0F3A0C33D3E64125 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B4EE257C537D6F72ADDBBE7747BBE2 /* RDEPUBBuildDiagnosticsReporter.swift */; }; + 6F50693BC10B3C72DDD1130DDCDB234F /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = E510EFB4CE45829A8CAB4E2BE47C0041 /* epub-fixed-layout.html */; }; + 6FA0125F16DDEDAD341DB75DEB084F4B /* DTHTMLWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = B23C5F038DAC52B75213C0760C431F2B /* DTHTMLWriter.m */; }; + 7027EF8D77D4082C1BB9B80FF61FCADC /* DTCoreTextLayoutFrame+Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 214F0FC87DE99D3FCE69D98B357F3FFC /* DTCoreTextLayoutFrame+Cursor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 709C4BA2B6C35035434CD7A41C050A9A /* RDEPUBReaderRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692FB048CB12876AA971EF21B3F71A27 /* RDEPUBReaderRuntime.swift */; }; + 70AF1621102FFF12F7DA88DDD8254054 /* RDReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E246B080707A0DA836FC0890AE96D529 /* RDReaderPagingController.swift */; }; + 72E1E0B3B3A46A92E75CA522B9FCB7B6 /* RDEPUBBackgroundTrace.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCB06D5D93327CF4E70EB026DFEFE8BE /* RDEPUBBackgroundTrace.swift */; }; + 730ACB99580C5982DC08D50FC5084D41 /* DTAttributedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = B4D20A2B33F9F4DD8499FB462DE2731F /* DTAttributedTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7408D293C24C3BD9CBBCBB530B50938B /* Pods-ReadViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */; }; + 7459A1656EDC29D685073B83561B783E /* NSNumber+RomanNumerals.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CFFB65C5D340A4B5C627B3EF02CD127 /* NSNumber+RomanNumerals.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75F99FA499756ED1A681052EC2445DC6 /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = C81E5EB72407C54EF8CC882A23759916 /* RDEPUBPublication.swift */; }; + 7821105EF320619993B3BF7FB90C7ADA /* DTCSSStylesheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 796EF27FF6AA4B62367B6BD9CEBD85A8 /* DTCSSStylesheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78AF9AA3502FD29F501DDF8986B67578 /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF51E56E09E095C92CB5B9F21384027 /* Archive+MemoryFile.swift */; }; + 78D24D82D98D77E744FF73C9040618A8 /* DTHTMLParserNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 5001C74FB9506AEC71E458047698A4AB /* DTHTMLParserNode.m */; }; + 7A2DDB5D730FCA75152369EFCEE390B1 /* RDEPUBTextPositionConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77121A149AA3464C8E6A171329293BD2 /* RDEPUBTextPositionConverter.swift */; }; + 7A48CDFB40202EFD09A2A9AB0EE0770D /* DTCoreTextFontDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EF19AD0EF4889156D46061FB43E0F5D /* DTCoreTextFontDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BF9A741CB88300E294CB5974EC1471D /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = ACA6D26B26D2653D6E1C871A482BD6DF /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C05F56B62B15EFF344C5CDE4A52B8FB /* DTHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A4E9E54E556A72BC885CCC08B3791C1 /* DTHTMLElement.m */; }; + 7C34DD458035EC0B9413A83E4C363624 /* RDEPUBMetadataParseCancellationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720B9BA37AAD0EA225492B8341E5B7A3 /* RDEPUBMetadataParseCancellationController.swift */; }; + 7C4E7BA25D1BCA720B26518D940B86C4 /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = F9D9BEF72311AF9E3239F9B92A9D2842 /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7CA5624AA51A18C916104986509C592C /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A19BDED17612309ACF1752937514F77 /* RDEPUBTextPerformanceSampler.swift */; }; + 7D5436BE12850ACBF45A53BB2A6BA466 /* RDEPUBCFIGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02DDA7AD723C7FEB0B80B0C573EAE679 /* RDEPUBCFIGenerator.swift */; }; + 7E5503757330B3AAEDD0BF3A966B9A0E /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11246502ABEC1999B60B3FA41B764E7D /* RDEPUBParser+Resources.swift */; }; + 7F9CC306B17D409DB903DF850FEDA64C /* DTListItemHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B18088896D291E0CE7718DFE82FAC1 /* DTListItemHTMLElement.m */; }; + 807780DB924306E4C1B28784712E45D9 /* RDEPUBChapterSummaryDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14826541B96FDC7B652AA313B700DABA /* RDEPUBChapterSummaryDiskCache.swift */; }; + 8099F1E613A15275EF5FC59ED3C73579 /* NSAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 7805DFC2CB71F5B6BBF7891876360EFB /* NSAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80A5F47A61B2CE58811FBA9EA4EEAE6E /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E40C17B95F3BFCE6E70D0591DA6F7F /* RDEPUBNavigatorLayoutContext.swift */; }; + 811D7CBCD710AE45FF80A4B05BFE444C /* UIFont+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = CEBA01360577AAD3FD089B6B17C24260 /* UIFont+DTCoreText.m */; }; + 814D0D63E5FD4AB7231E63064FE9EB5C /* NSAttributedString+DTDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = 5096458D9BD2818F786BC3B61B91EAC7 /* NSAttributedString+DTDebug.m */; }; + 816A870DED6E7EBCA32D4E8C7863D2CE /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 94705DADD1F09F4162F7D733318238F4 /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; 81905A7717925A17E6B98E934A75B8BA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; - 81EDF2465ACC1ECD6EC9ED3FDBCFAA8B /* RDEPUBTextPaginationInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4721E12B4121C46B8368D085D91EC2B /* RDEPUBTextPaginationInterfaces.swift */; }; - 82119A0DC4981CC2AF389C7C4CC08186 /* DTListItemHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 98658510AA525496EBF5792E5D9884ED /* DTListItemHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 821AC919160B6FCE4FEC3F37F99FEA22 /* RDEPUBReaderEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FE773F7655B2174F160FE1621181BB /* RDEPUBReaderEnvironment.swift */; }; - 83A0424762C166BEC92729C7897D70B6 /* RDEPUBReaderUIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F0FDEEC9D85F08CD97F555356F985C /* RDEPUBReaderUIState.swift */; }; - 83A4BC9FE4765C9B848DD4925D99F362 /* DTAccessibilityElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 99299A9FD6EF739D18352AC5B9325CB0 /* DTAccessibilityElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 84148D57904E24318934EE3997698D38 /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8593CD0CD62E27B97579259D350ECD85 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 859E8344D0307DD5FDA218AC68F9743A /* RDReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB3DF251DDD78EDAEE82FBEBDF9CE79B /* RDReaderPageChildViewController.swift */; }; - 85FBBBEDAD699D4749D2FC02F79CC369 /* RDEPUBRuntimeChapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEC2659F6ADAB5F211964D1A8CA88C26 /* RDEPUBRuntimeChapter.swift */; }; - 86001EE984D0EB14AADF337C5C1BA05B /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 864317F17E7247F95AE8763CDC571AC7 /* RDEPUBImageViewerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47B749BBD9F9ECB3CB4876AFB35FA577 /* RDEPUBImageViewerCoordinator.swift */; }; - 87466854F854640618D9ECC4DD87732C /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; }; - 87B07B9129E0E431CAF116B4EE4C0A5D /* RDEPUBChapterWarmupOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92AD29D1A051D00F5525A240E49B00A2 /* RDEPUBChapterWarmupOrchestrator.swift */; }; - 87E6B7A76709BC55FD95D822811D521E /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4BC2CE5C3B20971FF99A9C8EC487481 /* RDEPUBNavigatorLayoutContext.swift */; }; - 88670A69EF411C639C3AAC8B39848340 /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */; }; - 88D5FBA8614CC1A84A6B1288627CB93C /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */; }; - 896026287F9D8443581759A53020022C /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A0A0FB23DB0021ADC9AD0D90631883A /* NSMutableString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6293E97E128E98559FB74D9A342EAD /* NSMutableString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A2EE040670C6715A4F913614E5CC40B /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A35CC67F0AA6B26397C10D756EA34E8 /* DTTextHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = FB2ABB1D297442D91AA42F1407DB4A58 /* DTTextHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8AC90941E71199090BCED76DE89EFB60 /* DTAttributedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77A613841EB90827AF321DD50B21DB5D /* DTAttributedTextView.m */; }; - 8B405CE13E7D718A9340A82B52766AB2 /* NSCharacterSet+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 75FA8E843D9225BD65EB9D17825EC0F4 /* NSCharacterSet+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8BDD1C103484829B9DDD106A067C5C02 /* RDEPUBPaginationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 711A407CD08421E62F3C143957DD10DA /* RDEPUBPaginationModels.swift */; }; - 8C37B65B5FF8C31744B80DAF99CEF0E9 /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */; }; - 8CAC2DBDC2672B8F227875C2D05D7555 /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */; }; - 8D8786B29D0ADDC25829805E11BBDA08 /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */; }; - 8E5F3603B41FE2CF3FBEC4C9D1337F3C /* RDEPUBReaderChromeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84EB75472DB29B600C9185A097D117B7 /* RDEPUBReaderChromeCoordinator.swift */; }; - 8E8726381CBCFB1EDB350183456D4EF7 /* DTHTMLParserTextNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 13AB6A32A293E3DC21A7047C6DB958CA /* DTHTMLParserTextNode.m */; }; - 8F756349AF82AC16C8B2675AFC2C2578 /* RDEPUBViewportTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520E0A63146D08FBEFF05CA61FA4B8B6 /* RDEPUBViewportTypes.swift */; }; - 8F95D356B3818234A49F50063C4AA46C /* RDEPUBReaderRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEC9D27C90F465491EF9BA9CC8CDA1E1 /* RDEPUBReaderRuntime.swift */; }; - 8FD8FE08A1F383BD78DFEC51D7EE5DF8 /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */; }; - 9010223E727BEFED1915B2BB2A35ECFD /* RDEPUBReaderDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214727C456892B390492D84CDD20BB88 /* RDEPUBReaderDependencies.swift */; }; - 9032E6A1A4F1FA89178E3DCF9E76843F /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = E97368D346BF315D1080DBA98C0788AA /* RDEPUBJavaScriptBridge.swift */; }; - 913F50C87F33408387D2FABFB364FEF1 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */; }; - 91D8F6C54391A9D3E37F08CC4315AE99 /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E53AFDDED09CAFF8EFC5BC809DB5855 /* RDEPUBReaderConfiguration.swift */; }; - 91FDA47810CE5CE2C48AED9205AE89B5 /* DTStylesheetHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = DA25968B7C9A40031DA45BB328EA8A2E /* DTStylesheetHTMLElement.m */; }; - 9272A0B4C967A5616574EAA5802FA096 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 9295ACA6C5CEA110E02F9A8E7A55D08A /* WeReadApi.js in Resources */ = {isa = PBXBuildFile; fileRef = F46977FAF9F0EAEDF840BDA49288CC99 /* WeReadApi.js */; }; - 92C59F96D443525E8833676479FA60C5 /* DTVideoTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 73A99927E52B24583A6A2CF7E6F23848 /* DTVideoTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 92F6111C95FCD2F3E9A181E4D943A1EE /* RDEPUBCFIDOMPathBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 575B2D957760E0B9F1480FCB092B6B78 /* RDEPUBCFIDOMPathBuilder.swift */; }; - 931695433DC077003590F79665E0622A /* RDEPUBCFIRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB48BF4B843D518C890BDD2AC749E640 /* RDEPUBCFIRange.swift */; }; - 945A77521BE95FB18A3D1577A50B7F24 /* RDEPUBReaderController+RenderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DB2B4B89706EFDAB413FC86A6C29C0 /* RDEPUBReaderController+RenderSupport.swift */; }; - 94F5846979DBC90E2B646E975F5ECBA8 /* DTHTMLWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B96B0998B49D8E149C995474DA5FE5F /* DTHTMLWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 956D4311C0980B3A1C848EF22C8AEE7F /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5B003AC0B46623423334F97FEE379B8 /* RDEPUBTextPerformanceSampler.swift */; }; - 96507B8910C8C9DE0B221CFF0E8518D0 /* Pods-ReadViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9854DC3F1763B6272C2EA3FC6EC40B95 /* NSAttributedStringRunDelegates.h in Headers */ = {isa = PBXBuildFile; fileRef = E20272295EC253826AEE1F83A15D47C5 /* NSAttributedStringRunDelegates.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 987538B07E11741899878EA8BC947F51 /* NSCoder+DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 354C5DD0ACC742762200A640ADA859C6 /* NSCoder+DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9917E9B804CD33AF3BE2A992A3510C97 /* NSNumber+RomanNumerals.m in Sources */ = {isa = PBXBuildFile; fileRef = B7672A26922DBD934FA1AC60D49EB322 /* NSNumber+RomanNumerals.m */; }; - 992B7C8C824B5EA190EF1DB096064DB7 /* DTDictationPlaceholderTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = F9A2565B302334B662AB51DCF8E65EEE /* DTDictationPlaceholderTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9A0376FF1CA9B7ED0356E0354DE826E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - 9B199D71D2F48B2055A7FDF9BD7051CC /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = E27C503C8128BC3CE109FFE077AEF325 /* NSString+CSS.m */; }; - 9B30CF6B565D4828956508A42E01F44E /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B582B59618B5F7674FD433A97389BDF /* RDReaderView+PageCurl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E281F0688B1D356CF1654C6063AE77D /* RDReaderView+PageCurl.swift */; }; - 9B9B71183A91A2257C7563C345E664CC /* RDReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648D6AC5A8FA53918EDB418D8A36710E /* RDReaderView+ToolView.swift */; }; - 9B9FE1C8A205EFB1EA6081CB2885DF5F /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */; }; - 9BC6FB16B5F8448E55D8A5A5FCA15CF1 /* RDEPUBReaderSearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92E7747B6F898FB12DFE1CE4ABDC3531 /* RDEPUBReaderSearchCoordinator.swift */; }; - 9BD146F72B29C703798001F138B069C2 /* NSCoder+DTCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9129D37C7F89AD8FD530663BB4503FC0 /* NSCoder+DTCompatibility.m */; }; - 9DE04C83A68C7512C0A860FFF5CEC113 /* DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F98F0F060B066CAFBCD3C85C26B2B4 /* DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9E4AB71DE8B3E7218B53B2C8EF6B843A /* DTAttributedTextContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D72C5680EBE6CA716EE77281AA4436 /* DTAttributedTextContentView.m */; }; - A0086BC42F0345BCC2FD3B88E3440613 /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */; }; - A0BDB089F8F7C3478AAC3756C3FED67C /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */; }; - A0EFD4BB76E51AF257290001AF4944D2 /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */; }; - A132A0C9EB13B65FB886B11AA2E6304C /* NSDictionary+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 27205D159B39090908CA0E9C3997B784 /* NSDictionary+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A2CA9C27EB2B77637A12723F8CFE7AAB /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4428633C8EC3F6289CCF376F588CE0C4 /* NSString+HTML.m */; }; - A2CF42E4C725A1969A6211211C82138A /* RDEPUBBookPageMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEE1B7CF6E54E7876BBF28948CD65B9E /* RDEPUBBookPageMap.swift */; }; - A30D5C1E413A3D319A83D3410A8A549F /* DTCoreTextParagraphStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F760D62F6C6F083374702146337F2CB /* DTCoreTextParagraphStyle.m */; }; - A6306344331E00A5BE222BF52F4D5129 /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */; }; - A72E9F983E5BBFA7485EFB482B80E89E /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 5155CCDD61E030184249A020FE5D74B0 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A77E807D439F105930DF42E053013624 /* RDEPUBCFISerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A8B5491FF7E8AB9CD6015AE4E1C0D2 /* RDEPUBCFISerializer.swift */; }; - A7D665BBDADBE3D64023FF52E218FCFA /* DTCoreTextConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B3D0CB47B0A8E9EC5AF48B7F2DD6B0 /* DTCoreTextConstants.m */; }; - A8DC6885FE405B71BCF13D91D9CFFF71 /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */; }; - A8FC7A36DEF3E31E296CD4D26A815B3D /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */; }; - AA3722CC8B4992EDA8A9F5E9116835B7 /* DTCoreText-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 015F3EE69253C66E11B931E3360BA5FE /* DTCoreText-dummy.m */; }; - AA6C9B258173656A1241F1CF0E80D7D4 /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */; }; - AC7000465258822B466855B12F1F97A3 /* DTCoreTextGlyphRun.h in Headers */ = {isa = PBXBuildFile; fileRef = 49A21AE1A0AB5383F895B34EA7D6973D /* DTCoreTextGlyphRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC957DB48302A58F9CA91D3735ADF86A /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */; }; - ACA56466FFD614410CCB31E0A2931D56 /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */; }; - AD1EC7ACCECE8F6EEEA2A26C980135BC /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AE43D161B808037299043EC4C7E02B7A /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEAE1CB7D6F5BB8E33C9562663C93A51 /* RDEPUBPageInteractionController.swift */; }; - AE861D884A8004EF8F7CFADCE86D8411 /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEEDD6EDB66B0EECC515EDCDB618914 /* RDEPUBParser.swift */; }; - AEF180508B84AAB5A0712C04958E0AF0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - AF7A1DC953992A149CB0815C90769529 /* DTIframeTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B931AB189BDDE2CCE8578B50BD60AF0 /* DTIframeTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0060F62ADE3A4E081F443F6C46333C8 /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B07FDC47F5F68E14BED9EC6512D5817F /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = 5E958924060294CE9417399BB02AB344 /* epub-fixed-layout.html */; }; - B08BB5940DA74FF036FFC44380C7848B /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07C08997AE3D75194E400010A0AE4820 /* RDEPUBTextLayoutFrame.swift */; }; - B113395265911C8296BC5FAABD0D3667 /* RDEPUBReaderController+PublicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E1485847E9CA847239AB24742D72ABB /* RDEPUBReaderController+PublicAPI.swift */; }; - B1C2E803A0F46195770A6E288270C00B /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7036B7E2D1B623419E1EB950E58865CC /* RDEPUBReaderDelegate.swift */; }; - B24FAD34A7915FC4B90FE9038E814FF2 /* DTLazyImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = A4E43DCDE0C8751557E7E65FEEB1C865 /* DTLazyImageView.m */; }; - B2D82D043AA2A89BA9000314FE7A45AC /* RDEPUBNavigatorState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AD15109A0B89D836EFB914732706228 /* RDEPUBNavigatorState.swift */; }; - B4267497AB5BF50898ECA9B77E75EA14 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */; }; - B51DAE85A896F9709CD80CA9D33102D1 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F752E31955268C74AB0B05584B9CA9D /* RDEPUBWebView+JavaScriptBridge.swift */; }; - B532D38C5A7FC5AE5F0968DC9C9DBCF8 /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = E808E517A1FE8666CB17EA9D94B4747A /* RDEPUBParser+Resources.swift */; }; - B634BD7CC872DEA5B558A56F0E737005 /* RDReaderSpreadResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0786D6430A29C2F90E4832048559BE21 /* RDReaderSpreadResolver.swift */; }; - B6DC5982F88F75B77C49C0DCBF412A14 /* String+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E78795FD43E657B2F567418E0A7EB30 /* String+RDEPUB.swift */; }; - B72FCEF30FCF820E9434CAB06B502027 /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */; }; - B7BDD79FC06A1E4E0E17592860844108 /* NSAttributedString+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = FF3F7BA20A1213804048557D946CEEA9 /* NSAttributedString+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B8332F36582F7A001FE85A8D54B27C9E /* DTCoreTextParagraphStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D62C5531667F364F14DB67D33FFA554 /* DTCoreTextParagraphStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B838F1859B7D755B45253F6D3F8A29DA /* UIViewFrameExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */; }; - B86493B996A888D1DA7814ECB6028E22 /* DTHorizontalRuleHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = A68D72764140BC3DF67A2B9E52CEC7A4 /* DTHorizontalRuleHTMLElement.m */; }; - B933F0519580CB0C2441B4E30743887D /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B94CD41727DFCA8791EED8FB2CA397DD /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 2702E05AA7A266B7D8D0F881FD4E09DA /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BA92ADE493399D9EF1855FC2ECEF4C85 /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA80D2B3DB04B3530C801B06AC694048 /* RDEPUBReaderHighlightsViewController.swift */; }; - BABB631D3E75C2401B0186D33D45F028 /* RDEPUBJumpSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8B29AA7038EA68CF6B91D18CC87E743 /* RDEPUBJumpSession.swift */; }; - BC034149400280A8BB07C18A027494CF /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */; }; - BC81EFE1BD216C5B18F013ADD05FC416 /* RDEPUBCFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D2063CE799735F3C4AE37FE11567CBC /* RDEPUBCFIError.swift */; }; - BCCA1BD09411BFFD19A14D48D087C1C5 /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */; }; - BCF71935893826A0C7E4D94AE9690198 /* RDEPUBMetadataParseWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 447E4906FE72C6E3E2AE1CC89D208CAE /* RDEPUBMetadataParseWorker.swift */; }; - BD6F470C950D397B0ADB9C78E460C445 /* RDReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76919E99E9F16C30FA06F643643AA997 /* RDReaderContentCell.swift */; }; - BDFB313B8C690747D6B8C974338A1B03 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */; }; - BE0ECECF6F3D871AFE88627E8042FA4D /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */; }; - BE12CD112F82AD9050D7FB29395F27F9 /* DTVideoTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 63A6EDF10DA5A051C6CDCBE5D97AF11E /* DTVideoTextAttachment.m */; }; - BEAF0452878110B598B76B6AD4F46518 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D029F1D415730DFA1FD010AD485185 /* RDEPUBReaderAssemblyCoordinator.swift */; }; - C09A25A26F0214CC046A27560A5C4254 /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C2BCA92E8E4BB077023BA1AC445962B3 /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF988440049800DB7824A94B81D20254 /* Archive+Writing.swift */; }; - C2C21878B6B70BC91A9A54894A546250 /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8052EE9D31E2F5253234D9A7C6A8218 /* RDEPUBStyleSheetBuilder.swift */; }; - C3D195BDEB02E070383985241CCD749B /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */; }; - C5EE8E7373FBD24E66C678356393D871 /* DTCoreTextFontCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E791886E59DC0FAB02C6BBAB5BE5B6B /* DTCoreTextFontCollection.m */; }; - C6308C05D9FEBC66D46E90617BA932FC /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */; }; - C6A49A308880D341DDE7D6D90A579684 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */; }; - C6B65C0EA759DF426FBBBB113BA3C3E8 /* DTBreakHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = F734214E067BDBDB581911E1A5CDAADB /* DTBreakHTMLElement.m */; }; - C72CE4B974DFAE2C3037D425EB559314 /* DTCoreTextLayoutFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = CE6907AC04870132CCE3177E894607DD /* DTCoreTextLayoutFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C8F753B56A6C4D2A938B6EA68CF522F8 /* DTColorFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 86A0361390AA0C29BC1A5487083A12A7 /* DTColorFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9A5F7678CAA29D2360F5E9664326A84 /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 091E53DC8215AED45D88A2ABA24A2140 /* epub-bridge.js */; }; - C9DD05EF2D27FFEBFA7BF6F437168501 /* DTCoreTextConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = C8C20D9A71E6605DEE80342E7122B683 /* DTCoreTextConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9F845A486E47895A25C9C6885C606B6 /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */; }; - CA1210C0EBDE84C367D23D69B4470853 /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7D80430EE63D6EA20B3BBA26A89B34 /* RDEPUBReaderBottomToolView.swift */; }; - CBEF43E74744676839326C2D833FC6FF /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */; }; - CC8B8F3D758E98B51F69EDFAA69663A4 /* NSString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 8ABDEFEA94DC6408D92AC66DA3625DE5 /* NSString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CD423A7A8D8F156279C62233AA4DAF1D /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */; }; - CD5204849FC7E2964D7B81BAA7F77264 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 05D57D16346FAF830F1F82067307EA9F /* default.css */; }; - CD9B02582D2A74BF9508F0509696B271 /* RDEPUBReaderViewportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539807EBDC1A071F4E7C8C3DA8F4121 /* RDEPUBReaderViewportMonitor.swift */; }; - CE452E92A6D250A7CEC5FCA1DB3F2559 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */; }; - CE4F13F2F2812EB7B3919F0A91F2E858 /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */; }; - CE62D88B2B0EC135F19EF16E1EE898FB /* RDEPUBCFI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930D75A53D2FD874346BF17C0A2CB1BC /* RDEPUBCFI.swift */; }; - CF2D91AB9CCA3E706A39D5126BA04C3B /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */; }; - CF9676D97EB35D85E8982BA0B31922CC /* SSAlertAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */; }; - CFC49467FE75BFABC22A1CE2FFA26570 /* DTImage+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 12A5EA26EE7539EDDA90649D22FB675D /* DTImage+HTML.m */; }; - D02C303FBC1B11C826C8202F4CA02A09 /* RDEPUBReaderPaginationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EC91512D3BEFEDF5FCCF2E267E48B32 /* RDEPUBReaderPaginationCoordinator.swift */; }; - D0871D1ABC6B5B4B121BD9D1F77ED113 /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */; }; - D10EF7F047A9E5F6E96D92BE4A567C82 /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D1173237922081A644444BC00B51B8B8 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC41111F7B2BF68994C924BC0C5794C /* RDEPUBAttachmentTooltipOverlayView.swift */; }; - D1A93B2D7F1B312755C48790338D7712 /* DTIframeTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = AA3CFD777AD76F97EBA05B3920F5786A /* DTIframeTextAttachment.m */; }; - D22006C17391103A0D2F496D05F012B3 /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */; }; - D3D2648D63A8BED58114E8456BD73229 /* RDEPUBReaderController+ContentDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD0189649153ACCA56C4C8AD0BEF1E0D /* RDEPUBReaderController+ContentDelegates.swift */; }; - D526E03C098DA6CF8F01C1BC126C9BBA /* DTCoreText-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE7768E097F8BDE9FBE3752B98CD0101 /* DTCoreText-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D5D469DD6B6F98BCF293C5B83B693459 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */; }; - D5FC94BE4999365112D0537777CA2FAB /* RDEPUBChapterSummaryDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7DD486B95807F803EF1DD2976017779 /* RDEPUBChapterSummaryDiskCache.swift */; }; - D65E3E389E974CA5EC85C14F8AAC2197 /* RDEPUBStyleSheetComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 361565CCC385512EA14A6A2C9CFAF08B /* RDEPUBStyleSheetComposer.swift */; }; - D76431C60233FF62242A2BD1AE3C826A /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */; }; - D769636C7B23A599034D81095789FB99 /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D7C1729E34F5F2CBF878385EABB0F78A /* RDEPUBBackgroundTrace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67580684B7C70423FB1C82CD1F685012 /* RDEPUBBackgroundTrace.swift */; }; - D7C8270984BB0CAC469E055BF18385FC /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D82DDA4C1E5C4D5378A9E5EA3F8E9DFE /* DTBreakHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 533CFFF04BE7BC4BDEAE11DF675A84CA /* DTBreakHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D97D7DD788C4D18A1F59DBAE61D4B5D5 /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D9C976EBF3720A5029D15AAD3EC15E59 /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48325761E589FE657E084982A81D5DA6 /* RDEPUBWebContentView.swift */; }; - DA5B51E5D80C161D2902B6FC60DA5EC8 /* DTImageTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 426D442C01742E4361F5BC34D43152A6 /* DTImageTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAD16D3E6EBB32FF96C63BFE6037065F /* DTLinkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A1B75050E71BDD96FC19EC6BA129E6A /* DTLinkButton.m */; }; - DB0F934EA8172F157992E1909D319C41 /* RDEPUBPresentationRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C28DE5D3FBC9B7F9C1477C95F14725 /* RDEPUBPresentationRuntime.swift */; }; - DB241AE043EAA24F7BF4EED186988C66 /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFE6D8828F2634226CDA2F79A19625E3 /* UIColor+RDEPUBHex.swift */; }; - DBCA42F7E1697F4EC82E0E7C9657851D /* DTAttributedTextCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D4093D30B372960168C1349100DF7DE0 /* DTAttributedTextCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC3E2932A82AD5D88D8B1EFBF004BEC8 /* DTCSSListStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = B509CD4B498635D4536245E43D802ED9 /* DTCSSListStyle.m */; }; - DC7462EE3634E61D37537277E0D1C173 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8F910B6B575B689194F9E306239FD5 /* RDEPUBBackgroundPriorityPolicy.swift */; }; - DD304690E329A997954FD30B7E101746 /* RDEPUBFontNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 545DD46BEAB1D1F7E0530E787095FCB2 /* RDEPUBFontNormalizer.swift */; }; - DD73CD0E5148961D1ABD80E050122314 /* DTCoreTextFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1B031E2B903C2F177195C1C3D1D1EDB /* DTCoreTextFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DD75D0287B74630B9D2E4CC87ECA5D63 /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DD909F2C768FC2BE36DA19EB9A2E9630 /* SSAlertSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */; }; - DDF0419BFB80D9D1E36AEE87218FC1F6 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = B55E6E99C6F879CFD19D3674CE20075C /* RDEPUBTextRendererSupport.swift */; }; - DE68AD2F426FD462BC70F968E5AF5553 /* DTTextAttachmentHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ABC2F552388CD08EC1EFDEF606AE222 /* DTTextAttachmentHTMLElement.m */; }; - DF1DCBB316F5B9BCF4A51CC20108CDE1 /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953EF1E3CA69D8F4BF3E4D41B1BEAE2C /* RDEPUBReaderTheme.swift */; }; - DFB5A1C64C7908FD05BEFF7C7B571353 /* DTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 5679D281C282896E6FC352C48E0AF439 /* DTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E14170A54A9726BECBB355762C685602 /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */; }; - E1DA58105A72D6C0B77A8A9F7822BD68 /* DTCoreTextLayoutFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 029130886CE8E422D16ADF97468CB1B0 /* DTCoreTextLayoutFrame.m */; }; + 82119A0DC4981CC2AF389C7C4CC08186 /* DTListItemHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DB480D0B78911DBF96986E64A714907 /* DTListItemHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83A4BC9FE4765C9B848DD4925D99F362 /* DTAccessibilityElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D146C3F4B7878B5CE8EFF38765580C2 /* DTAccessibilityElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83DF18691BCACC408ABEEC12F0B1AB3E /* RDEPUBSelectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE6C7E2CF696021A9922C1BB675AB1C /* RDEPUBSelectionState.swift */; }; + 8413070AC439CC5F8EEB0E56D762B968 /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2373DCA0FC45287BFC063BEA661B8367 /* Archive+WritingDeprecated.swift */; }; + 84A49180E4E633858662A7B72A501BB6 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 425D9BA744DFC5E49D875D81AA8761F8 /* RDEPUBTextRendererSupport.swift */; }; + 855D697E9DC5C605D6178EA976B05E97 /* RDEPUBTypesettingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD5C20289C05F4C1BAD1B1DEEF2485C1 /* RDEPUBTypesettingPipeline.swift */; }; + 85CAB9A77555702AFF3AD8D0842585F7 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D423B0BF37041F8E07C6EFD476F511A4 /* RDEPUBReaderAssemblyCoordinator.swift */; }; + 86130B323946B0228B860A4302D18B41 /* RDEPUBReaderViewportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D1DCAA8AAE79FCBD5248D641D583DE /* RDEPUBReaderViewportMonitor.swift */; }; + 8777BFC6890E10C885F3D5CB9779B6C3 /* RDReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 506A3F4E93699E821176158B4E1A74ED /* RDReaderView-dummy.m */; }; + 89AAC0AAA4ED7247C740BA2B8E14A430 /* RDEPUBCFIMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE8601B1192179DC899A1156CB46369E /* RDEPUBCFIMap.swift */; }; + 8A0A0FB23DB0021ADC9AD0D90631883A /* NSMutableString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 52053ABC9CD3D4A72CD8A22173428AEB /* NSMutableString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A35CC67F0AA6B26397C10D756EA34E8 /* DTTextHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9A1EBDA0FD72671C7F6FE15F37B906 /* DTTextHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A9311DAF16BE5D746333DF2543918FF /* wxread-default.css in Resources */ = {isa = PBXBuildFile; fileRef = 8C51FE03884113569904AAA4CAA3AEB6 /* wxread-default.css */; }; + 8AC90941E71199090BCED76DE89EFB60 /* DTAttributedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = F46010C3A0C82AE5ABEC814D7EC6351B /* DTAttributedTextView.m */; }; + 8B405CE13E7D718A9340A82B52766AB2 /* NSCharacterSet+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E167717A18E0C858C6FD95804249E4 /* NSCharacterSet+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C254EFFDAFA3432B57B4317B306F448 /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = A20F6F0463A998DC3BD53DE9E63B63DE /* DTSmartPagingScrollView.m */; }; + 8C9C493D4B8725B3BC2DF6F7E2AE2960 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 71BBE6384315D7F00F5ECFFF67A85AF9 /* DTHTMLParser.m */; }; + 8D4499E5E0E1C3E85EB14B5A6603900A /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C1831768CE55090EADD902B29B6CD1 /* Entry+Serialization.swift */; }; + 8D9119050495487B8722EEFE0296700B /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1F7BFB63DE15D627EB8F64829B8AAD /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E2679367E3A543EDEC5A518D23EB92E /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57CB038980ADA439CEC82E0EBBD3FC9E /* RDEPUBTextContentView.swift */; }; + 8E8726381CBCFB1EDB350183456D4EF7 /* DTHTMLParserTextNode.m in Sources */ = {isa = PBXBuildFile; fileRef = E5377786E80195587BF3E8A7589E5925 /* DTHTMLParserTextNode.m */; }; + 8EBDD8FF39B5DF1B9ECCEEBD333F374C /* RDEPUBDarkImageAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4BE66AE0A6BCE91929B24BAA34DA151 /* RDEPUBDarkImageAdjuster.swift */; }; + 90C8F1B2156343A41987386589DA591C /* RDEPUBNoteResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761AE6FC1A75A238945BD6F186EAA5E3 /* RDEPUBNoteResolver.swift */; }; + 90ED936CB8FF110B74E170B127FCA816 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE811B58EF82E20354C3DABE712313F /* RDEPUBBackgroundPriorityPolicy.swift */; }; + 918384360781B784B0A347C5213C7166 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A47D7B73C87872B9B05E80A4254D4C /* RDEPUBReaderTopToolView.swift */; }; + 91FDA47810CE5CE2C48AED9205AE89B5 /* DTStylesheetHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 354C1C3A74DB75C8B8608D538212A963 /* DTStylesheetHTMLElement.m */; }; + 92C59F96D443525E8833676479FA60C5 /* DTVideoTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 50C2868064310B16D2B5FD9901C846DC /* DTVideoTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9364C9C3F930C82880F73AB4377A2C48 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 173194D38C897D8E38AD8A194E47DB5C /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9492443553B7CD522F54CAC8167D8058 /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = E67E858259A9264CC8FD433B51487676 /* RDEPUBModels.swift */; }; + 94F5846979DBC90E2B646E975F5ECBA8 /* DTHTMLWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 14E63A0D35D4A07BD0123021EA161C99 /* DTHTMLWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 951272D64B0B7B5A0CF5B04D0C70020F /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 23588B63FC4026A371F5C683744A664C /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 96F613CFCEA008628E950E6844EAFCE6 /* RDReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E5D959B869D6FFCAE67ACA572FF1C2 /* RDReaderView+ToolView.swift */; }; + 9714230EA35DBAC275C9C8B030D4004E /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E9D8AB18960B56A997408E3235751624 /* ZIPFoundation-dummy.m */; }; + 97551B39A196031743612486D44CC480 /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A6A858B976D032A3C61540AFF19DEE4 /* NSURL+DTUnshorten.m */; }; + 983285394453A8129F8E3E2E231B12E5 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64798D230A6F5C1C52C7353EF9773BB7 /* RDEPUBCoreTextPageFrameFactory.swift */; }; + 9854DC3F1763B6272C2EA3FC6EC40B95 /* NSAttributedStringRunDelegates.h in Headers */ = {isa = PBXBuildFile; fileRef = 30EB4CF4AD4114DE53786C318621EB19 /* NSAttributedStringRunDelegates.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 987538B07E11741899878EA8BC947F51 /* NSCoder+DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = A592A34CA2EA792DDFAFAEB516FE8A10 /* NSCoder+DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9917E9B804CD33AF3BE2A992A3510C97 /* NSNumber+RomanNumerals.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E21B10EE150F00F245D297EAB7F2BA2 /* NSNumber+RomanNumerals.m */; }; + 992B7C8C824B5EA190EF1DB096064DB7 /* DTDictationPlaceholderTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D0856C3894240A673B5AB7C2704E9144 /* DTDictationPlaceholderTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9948C2140652AD1AEBB485FAF262531A /* RDEPUBCFICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DCD270CD8C5A0C917FB01A8B3116DF8 /* RDEPUBCFICompatibility.swift */; }; + 994C4AF7960B95E37A468C364C1C83C1 /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = E4C5EB3F8F005C65005C101A9DBE488A /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 99AD3357E90AD801A7BA603B32B5DF90 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = F63EBF2BF3000B3391F6E693581EA129 /* NSData+DTCrypto.m */; }; + 9A1B43DFB3162F43E83DD398EE07D031 /* RDEPUBReaderLoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33E143A90F5075BA576F52111FFCCB0 /* RDEPUBReaderLoadCoordinator.swift */; }; + 9B199D71D2F48B2055A7FDF9BD7051CC /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 8718F2DB8F0DC085CB012D9996596F3F /* NSString+CSS.m */; }; + 9BD146F72B29C703798001F138B069C2 /* NSCoder+DTCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 753994141ACB981C898B36B761321C23 /* NSCoder+DTCompatibility.m */; }; + 9D381AA072A4C03E3B554FA7925940FF /* RDEPUBReaderSearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBA95BB1C6D5F042AFE2454D582DFC55 /* RDEPUBReaderSearchBarView.swift */; }; + 9DCB6AFEED62901AFF45F911F9AAA89C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; + 9DE04C83A68C7512C0A860FFF5CEC113 /* DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CF7CEB31BED0554F3EF3D3442A89B47 /* DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E4AB71DE8B3E7218B53B2C8EF6B843A /* DTAttributedTextContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7203B4D9D997037E0F9D154A3B049738 /* DTAttributedTextContentView.m */; }; + A0198E2E7AF64E564200EA40E2AAD22B /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = BAE45673EE2875DB23FA7BDD61FDE1EF /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A08A4B4424A089A268AAF2313E0EC40F /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD5B2F66FCCFB58393314E7B9FE4384 /* NSMutableArray+DTMoving.m */; }; + A132A0C9EB13B65FB886B11AA2E6304C /* NSDictionary+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C891B983F0CC956CAE3978A15875819 /* NSDictionary+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1BD7803BE40F71EF65DC8FE3C1487CB /* RDEPUBReaderLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ADEC782AE1E07C94B6F01A8AE1CE2C8 /* RDEPUBReaderLocationCoordinator.swift */; }; + A2CA9C27EB2B77637A12723F8CFE7AAB /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = FA107BE47514D01B94B7A2670A9F83E5 /* NSString+HTML.m */; }; + A30D5C1E413A3D319A83D3410A8A549F /* DTCoreTextParagraphStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = B7C4233DF4FA80BF4A9E6FA5082D49E5 /* DTCoreTextParagraphStyle.m */; }; + A3A9D6374488C6608ADF437FFECDB17B /* RDEPUBNoteDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2DF1EE547C972C1BF12018AFFC5142 /* RDEPUBNoteDetector.swift */; }; + A4696A40DFBA4A943DBC243A7C907888 /* RDEPUBAttachmentNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EBB71B95928ABA41A3B33A9DB8E75DD /* RDEPUBAttachmentNormalizer.swift */; }; + A5DE70F19A97D8C9445781764D944031 /* RDEPUBReaderUIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F5CBFE8EF3307F3C9B0E25A5F70E70 /* RDEPUBReaderUIState.swift */; }; + A68D4A2382460F426465EDDAF8EBB1F8 /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8485FAD7356F83F96C2CF8F2171C1DFB /* RDEPUBParser+TOC.swift */; }; + A72E9F983E5BBFA7485EFB482B80E89E /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = E687628EF2FE92D093E3005D21B578E5 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A7D665BBDADBE3D64023FF52E218FCFA /* DTCoreTextConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = E89F199ECDE796B15CAF8E0C1775FAA6 /* DTCoreTextConstants.m */; }; + A949841C2F45DE9F8FB59DDADA087852 /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = BEA46E51E3616ECEAF0ACCEA9B8C67EF /* DTFolderMonitor.m */; }; + AA3722CC8B4992EDA8A9F5E9116835B7 /* DTCoreText-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B6CA8CC4525EF64AA5CEE4A722737F1C /* DTCoreText-dummy.m */; }; + AB700CDBB85072A2E9F40018E1ECDB00 /* RDReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A7E0C51CE893B8040C6A49E9E973226 /* RDReaderContentCell.swift */; }; + AB96076F48CD56721F47B5D8CD68B870 /* RDEPUBReaderController+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE0841869BD329D156D73D0CFB24542C /* RDEPUBReaderController+DataSource.swift */; }; + AC4426FAED5C421324BB8940BD528EE8 /* RDEPUBReaderController+TableOfContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D88A921856D9EF12C78D05D927BF334B /* RDEPUBReaderController+TableOfContents.swift */; }; + AC51EB535FBB37484F8A3BA23CBD41DD /* RDEPUBReaderController+LocationResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29809A2BF0AD11378C7FDE3406150B1 /* RDEPUBReaderController+LocationResolution.swift */; }; + AC7000465258822B466855B12F1F97A3 /* DTCoreTextGlyphRun.h in Headers */ = {isa = PBXBuildFile; fileRef = 771E0D5CBCBC013BF5780FEE5BBA81FF /* DTCoreTextGlyphRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ACC9E4A469E961237E551759D7DBBE10 /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E5297E7F5769C61C1838962BA76D4F5 /* NSArray+DTError.m */; }; + AD328CC506B6184BE8C4E9FA7914E039 /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893DFE6F010A222A98E905EA778740A0 /* RDEPUBPaginator.swift */; }; + AE7E76D8301E55488BFA1CF40D0B1990 /* RDEPUBCFIRecoveryEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8993D56BA3E8692108E3C53CD52806 /* RDEPUBCFIRecoveryEngine.swift */; }; + AF2C993F79DBF1586E55F70A9F105C6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + AF6AC3DDB170B49DC3F06E9914DCCED8 /* RDEPUBTextPaginationInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = B08FB1ED81E67058DC00376CA1DFC963 /* RDEPUBTextPaginationInterfaces.swift */; }; + AF7A1DC953992A149CB0815C90769529 /* DTIframeTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D4C731AA2088D7E873D8E3D21B95D215 /* DTIframeTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B03155EC46B90C179E546A3356E5E364 /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 207CC0EEB74CECEB43A870FF80560E0F /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1E427DA5C06EFB8D33AAE782C8439C4 /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = 519087D9CD0F5E440E6D2C3B1AA1DFA2 /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B24FAD34A7915FC4B90FE9038E814FF2 /* DTLazyImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = CA5630DC0E663F38A9EC713323697EE1 /* DTLazyImageView.m */; }; + B3B9497580D0189374A08C3A349F5230 /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1967314246DE47771D6C6F0D8B5BB22A /* RDEPUBTextPaginationSupport.swift */; }; + B3EA920CB255EE8B43C5A51D68F00869 /* RDEPUBPaginationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43DB30ED1E8B12F6CEC548FBF1290668 /* RDEPUBPaginationModels.swift */; }; + B494EB2836A86D7127501F43DC0CAAEA /* RDEPUBFontNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF108973184A89F47F1A44F491BC7453 /* RDEPUBFontNormalizer.swift */; }; + B5CE97B23B3C54DD7BF5B08002A60B71 /* RDEPUBNotePopupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC2FC937F877AAF34D20099B548F79F4 /* RDEPUBNotePopupCoordinator.swift */; }; + B62C7195C031CD59BF3BFCAB531791C2 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E162E0261A5B0850158D3403191E62 /* Archive.swift */; }; + B64B2F42273B15382F3E5A97B55148EA /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2BD942CCE411EF3AB9DCDC8215B180 /* RDEPUBParser+Archive.swift */; }; + B76DE23D085C8DFE63FA9FC05387E02D /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */; }; + B7BDD79FC06A1E4E0E17592860844108 /* NSAttributedString+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 3985FED7BD8EC49191663BEF73FB2C79 /* NSAttributedString+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B82276ED843A24848B1F0AE805583492 /* String+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B33EB0B69C4A347B3F466B751289C5 /* String+RDEPUB.swift */; }; + B8332F36582F7A001FE85A8D54B27C9E /* DTCoreTextParagraphStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = BD65B936E2A6FEB74718EA86D9AC1899 /* DTCoreTextParagraphStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B85D036F0AAB424992C26B037799148A /* RDEPUBPageBreakPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B465B0AB9FB857FB2C95097E1C4D46 /* RDEPUBPageBreakPolicy.swift */; }; + B86493B996A888D1DA7814ECB6028E22 /* DTHorizontalRuleHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = DD7A2DE5BDF72ABC066484CE554BDEF0 /* DTHorizontalRuleHTMLElement.m */; }; + B86A7C6918313E26127F7A7DFEF71D6F /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C1A7359A45BB880877A672C57F522FE /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B94CD41727DFCA8791EED8FB2CA397DD /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C3D91FFA65414A2787FEB95576E0097 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BA7A1E4027881F2B50F8301696865452 /* RDEPUBChapterDataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88EFF88D4E3001A8D2D0E50EF9B94BBA /* RDEPUBChapterDataCache.swift */; }; + BAA8AEE4DC5F22A9BB2D5DFC13F5D489 /* RDReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C2E354232C09ED53034E389E0A70A0C2 /* RDReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BB2A7A05D4D4017BD37A1EB4528182EF /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE7F6623805E2DA3B053A0066ADA7E68 /* RDEPUBResourceResolver.swift */; }; + BB81FE0BBBCEFAF8A7631E7E34874035 /* RDEPUBCSSCompatibilityLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8563248DA3F6A02F5A355DBD1D57E80D /* RDEPUBCSSCompatibilityLayer.swift */; }; + BBBCEF6E869779226014E3FB48CD21AB /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E0F52BED56AC7A04854F459B246AB18 /* RDEPUBAttachmentTooltipOverlayView.swift */; }; + BE12CD112F82AD9050D7FB29395F27F9 /* DTVideoTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = B83D7A73677A2C3141EDEF56B9CE6584 /* DTVideoTextAttachment.m */; }; + BE7298B71BD3A291423F7E5B9B1BF52A /* RDEPUBHTMLNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C384342E6BCF839582F9467109AC924A /* RDEPUBHTMLNormalizer.swift */; }; + BEDDC71E25290A889B7780DFC3825B21 /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = B76B1E836C34CB755AEE1FBF7DC26BDD /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF2C1AC7B6C32ED307AD651A46AA6C9C /* rangy-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 445D06D06F2D5CB42E95A6292AFA6D42 /* rangy-core.js */; }; + C01D5DBB466B51C42C269491BFA65838 /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DD5649E99D72A74F8F2C3B3E5D3A729 /* RDEPUBJavaScriptBridge.swift */; }; + C0DFE2AA259BE82AA47339B21CDFC958 /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0218A7B243387C79E099CA947CF243D /* Archive+Writing.swift */; }; + C14064F24F09598DE124FF06E9C928E0 /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C80941DE172AF972D2247659684D93A /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1EC1F4D33F9FA969CB9513D933443E2 /* RDReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DFD3ED6CD42E6EA971DDDD51EDB8CA5 /* RDReaderPageChildViewController.swift */; }; + C263E5368A76EC4E43AF7EE9E067D725 /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42A82DADD6CBBE3627BE13B2E0FC8B34 /* RDEPUBWebViewDebug.swift */; }; + C2C4D280D6D73F7CFC734CED2A00282D /* RDEPUBCFIDOMPathBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A26FAE3FB6F9DBBC672161B173177A5C /* RDEPUBCFIDOMPathBuilder.swift */; }; + C37966071017032F0C1FC81FF8244972 /* RDEPUBChapterPageCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68705BE557E6C1C112D38D056CD4E8FA /* RDEPUBChapterPageCounter.swift */; }; + C3FE7E6D008BF43BC6111D39C2C4C861 /* RDEPUBChapterRuntimeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3BFAD599CFD612530D8B30DDB9F5D4A /* RDEPUBChapterRuntimeStore.swift */; }; + C4766E69557D560A763EC5BB6A4C2A41 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB446503EBB22EE22C51939A562C457 /* RDEPUBTextBuildPipelineInterfaces.swift */; }; + C49D28C5B0E48128D9068C38B5EC8605 /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F80AC45FB1DBF50E0E3AA4F26BFA676 /* DTFoundationConstants.m */; }; + C4E1E40043DA623751AF64C5CD396CCC /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D2316F422A6C97F95F9CF43E6F8E94F /* DTBlockFunctions.m */; }; + C52E92F3360BF420615A59DE950DEE16 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13D725843764880816F43281F2363FC /* RDEPUBSelectionOverlayView.swift */; }; + C5563F583B537E0B2BFDE7779B27AE74 /* RDEPUBCFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA1200B7F3541159D13204D0C860076B /* RDEPUBCFIError.swift */; }; + C5EE8E7373FBD24E66C678356393D871 /* DTCoreTextFontCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = 722AF38F5106ADDE6F98D282F886A769 /* DTCoreTextFontCollection.m */; }; + C652D268D07948ED1E150C632CC60AF9 /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 0372FD1824BC43F7BD6B337430201420 /* DTCoreGraphicsUtils.m */; }; + C6B65C0EA759DF426FBBBB113BA3C3E8 /* DTBreakHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D8AE4BEBD1998839BA83AD05CA6CAC5 /* DTBreakHTMLElement.m */; }; + C72CE4B974DFAE2C3037D425EB559314 /* DTCoreTextLayoutFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = C46FCF109DBCB37595D2A3366CF1D765 /* DTCoreTextLayoutFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7F3140CE021BAD613B8F941F859A64E /* RDReaderPreloadController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9EFF22EDE800175B01DE546C97862D /* RDReaderPreloadController.swift */; }; + C883511DEB54DA7D80409A7C3B60896D /* RDEPUBMetadataParseWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C88B7F1F7145821C2F65514186AE335 /* RDEPUBMetadataParseWorker.swift */; }; + C8F753B56A6C4D2A938B6EA68CF522F8 /* DTColorFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 720396ED306E768BAD28007D5E96B757 /* DTColorFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9366A21A153894FCC5898ABAA1BC673 /* RDReaderViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = C248323DF03FE7E607F69BF5576B3F41 /* RDReaderViewProtocols.swift */; }; + C93C8998F0A29B91C91C7E5C43C564BF /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61BD3F3828530F0B2500FA1C4367C50 /* RDEPUBTextRenderer.swift */; }; + C9D94F33F92551C36226E924C6FF8E18 /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 45A67761829BBB3974CE24FE50E459EA /* NSDictionary+DTError.m */; }; + C9DD05EF2D27FFEBFA7BF6F437168501 /* DTCoreTextConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = A61C8F1BDD76EA59082F65269083BD08 /* DTCoreTextConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC24C5C5E758475B1A32E952B508824B /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C3615C94C147AEA92F022E119810E9F /* Data+Serialization.swift */; }; + CC8B8F3D758E98B51F69EDFAA69663A4 /* NSString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = DC7D3AB85C954DA41E1500936C166C0E /* NSString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CCC0BA8885804092995A8C2F0A719E36 /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288589D0B52F73505B43C743D9837578 /* Entry+ZIP64.swift */; }; + CCDC8842EA30D3F77DD6F88CE1A1849D /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8184024038D8B93BD22ECAAB863B41D9 /* RDEPUBFixedLayoutTemplate.swift */; }; + CD98679C55356A6F98EFE3ABD712C514 /* RDEPUBReaderEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9204AAD895ABE21EE8841D0A495C916 /* RDEPUBReaderEnvironment.swift */; }; + CDD7242E39535B3C2E99C29FBC132189 /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = CB2BD1F8CFECB82D427DF046439E68D6 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFC49467FE75BFABC22A1CE2FFA26570 /* DTImage+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = CF1CED3ED65443999913BC0D96ACA151 /* DTImage+HTML.m */; }; + D0500D64054753A876D60373E284FD28 /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F50EBEDFE92D5373F3FD62727F74BDE /* RDEPUBTextLayoutFrame.swift */; }; + D063317214AFF5143D9C958E5FAFBB38 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + D1A93B2D7F1B312755C48790338D7712 /* DTIframeTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = BA8A527A4CCB2AF1C1E26744B301F6B8 /* DTIframeTextAttachment.m */; }; + D526E03C098DA6CF8F01C1BC126C9BBA /* DTCoreText-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 13F8FC8B51AD434F5D4B0CF5150D7563 /* DTCoreText-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D60B799B41BE4B575A3C4CCEB4FAB0FF /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B38D5053661772BF3BDE06F5357B5A96 /* RDEPUBParser.swift */; }; + D62F0FFD57165636F2C5E74D2550604E /* RDEPUBReaderPaginationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60ACBD9B441413B14468B1BFA1F7C6F /* RDEPUBReaderPaginationCoordinator.swift */; }; + D650EC467B29EB175C9588C57079205A /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56EA8C75C7045AF8F04F2D56ACA2A18B /* RDEPUBWebView.swift */; }; + D7CB1C23334ED2DD8CFC33FBE80D2C92 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; + D82DDA4C1E5C4D5378A9E5EA3F8E9DFE /* DTBreakHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 14283024FA4A0231B32CA22AA907FEFA /* DTBreakHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D87E35AEA840419649DB90B3A656E758 /* RDReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B8072609EF1BA68F2BF57A0E3A915FB /* RDReaderGestureController.swift */; }; + DA24A683019CA05950C1966B20AD3B15 /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C5E29D728B8CD4EABC0B3DD9CD9DE99 /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA2B1C25CEFDE2A9962BBC9F853D7E34 /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FC3BE6BBB4EBD99FF9124BA8E599520 /* RDEPUBPageInteractionController.swift */; }; + DA4D0BF0FDEBBCF68DC7D6C554951F46 /* RDEPUBChapterLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78739A559E3A2EA9FA4A1C17B16746DC /* RDEPUBChapterLocation.swift */; }; + DA5B51E5D80C161D2902B6FC60DA5EC8 /* DTImageTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 27372A23AA4B051867E7D2C749D1DE81 /* DTImageTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAD16D3E6EBB32FF96C63BFE6037065F /* DTLinkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = CE761A55BD57C0BFD6336CD073F85C31 /* DTLinkButton.m */; }; + DB121A63241654223079E203F3539ACE /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = AF436E76C893E223A4F0BE86C1276054 /* UIScreen+DTFoundation.m */; }; + DBCA42F7E1697F4EC82E0E7C9657851D /* DTAttributedTextCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 068885F1B54CFD5DBBE6E2DC253F7819 /* DTAttributedTextCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC3E2932A82AD5D88D8B1EFBF004BEC8 /* DTCSSListStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 40FD7C9E2E05FB4A73F4C4C70A3AFAF0 /* DTCSSListStyle.m */; }; + DC43DD003EAA9A027363E201898A4C54 /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE83356F8FBC1801D29CA93C1A190D81 /* Archive+Progress.swift */; }; + DC5237C283BD4408F2E478D6C4FEA6B2 /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F25D7766B9F7B666C309052CA726A7B /* RDEPUBRenderRequest.swift */; }; + DD73CD0E5148961D1ABD80E050122314 /* DTCoreTextFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2ED17D0DDF5F1C5606BFFD9A512DE4 /* DTCoreTextFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE3267C28E5F163C748DF648D172EE2C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; + DE3BF24CA186AAA2CC673A2BADE2AFA1 /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6DCF8FFFAD317C3CA1AEFF60080707 /* RDEPUBTextLayouter.swift */; }; + DE68AD2F426FD462BC70F968E5AF5553 /* DTTextAttachmentHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = AC0A4ED7E936923A29A5EEB1D95D6B55 /* DTTextAttachmentHTMLElement.m */; }; + DFB5A1C64C7908FD05BEFF7C7B571353 /* DTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 09FF858DC29B73E9B67B32B03CFF4084 /* DTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DFDD4F5DEA73A0F97F9B8CEE84973A14 /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = A8CC38EFEF171FFEE008C32A6319BE6A /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E075024A8D760FB1935ACBD81E84F329 /* RDEPUBBookPageMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6801C4BFA1DBBC56523D5D3F427E8DB /* RDEPUBBookPageMap.swift */; }; + E187AB7F2733DF034CE8668C1AE062F6 /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 662D30C1E74D1D5122921475F4024F73 /* DTActivityTitleView.m */; }; + E1DA58105A72D6C0B77A8A9F7822BD68 /* DTCoreTextLayoutFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 4641C3C93CE32054665ACF80457A7A94 /* DTCoreTextLayoutFrame.m */; }; + E211604C7EBF2A9552938DE714DCEB4F /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 730B56BC97DFF2B1E04DD2608055D9E0 /* UIApplication+DTNetworkActivity.m */; }; + E2A039DEE00E19644C9723F195BF80EC /* RDReaderSpreadResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BDECCF30428456DD69F6D870693248C /* RDReaderSpreadResolver.swift */; }; E38FC7829B5BDD1588FA487E0FBAC208 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */; }; - E4B55D3DA872FD60436501A4880E8559 /* RDEPUBNotePopupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AD7F70FD18BED0C429A85E579ABF569 /* RDEPUBNotePopupCoordinator.swift */; }; - E4B6BEF132A110AB19F8244537562719 /* RDEPUBBackgroundCoverageStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A19E1D6BC8D283B9BC4BA0EBECBF172 /* RDEPUBBackgroundCoverageStore.swift */; }; - E6480EA3947A2C71A3096CCAEBFA9131 /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49291029E1AB55E3D96DCB4484849F65 /* RDEPUBAssetRepository.swift */; }; - E72EC8AFFB5D6940C67E93D7D8BF8AA4 /* RDReaderView+ContentAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D170B1455CB3C94EFC34D7B67EDC001 /* RDReaderView+ContentAccess.swift */; }; - E8AB5CE26A5224EF09E9E363D70C7775 /* DTDictationPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = AFE0B56638AFB77F4455784A7ED59876 /* DTDictationPlaceholderView.m */; }; - E8B4718E98F761D7BD63E98A96D79354 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */; }; - E92E331262CD68DBE05495F8EA560548 /* wxread-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = 8AE69217E6A738AC11FEB58F2603B17F /* wxread-dark.css */; }; - E95694741292C43023C955DDE54CC86C /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A47E648062E9BDBB9E46BD3DC4E12801 /* RDEPUBWebView+FixedLayout.swift */; }; - EA0040823CCF8E97363DB5891F5DA6D0 /* DTCoreTextFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D44B82815CA3397BE2C9F64819B88 /* DTCoreTextFunctions.m */; }; - EA9136B1358F8EFA993DE6CFEEBEACF1 /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */; }; - EBB6868C2AA00A71178273EA633FC2E5 /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42B212FB3162CFF37D51BB3E93F765F5 /* RDEPUBResourceResolver.swift */; }; - EBB7E4D4DB253B5F1267CF9B4DDB4E93 /* DTCoreTextFontDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = BCCA590DB72AA93275262A414F16578A /* DTCoreTextFontDescriptor.m */; }; - ECFA20CFAACA1435FC6E6458F774FE56 /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF164505A477C6ED40FE8EF0CB2E6693 /* RDEPUBTextBookCache.swift */; }; - ECFB291BFD3228FABB8D7CE994E44B61 /* RDEPUBChapterWindowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8428598288FB3C84E993319B4E11B03 /* RDEPUBChapterWindowCoordinator.swift */; }; - ED1258ECC58FC5AC544DDE1883E42034 /* RDEPUBAttachmentNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5847BF261408B9B82FB3BF7A9390AB3 /* RDEPUBAttachmentNormalizer.swift */; }; - ED3BD7326F33BCB93CD0B8643A4F1BAB /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AD77A6558F2424BFBBB829F7651AAC /* RDEPUBReaderChapterListController.swift */; }; - ED95A429520E9CFB6C09FF1DC88AEF00 /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B4D7B26E7ADBB6053AB3D0ECFDBF379 /* RDEPUBParser+ReadingProfile.swift */; }; - EDA269B595D70EC2B9D81DC890157D63 /* DTAccessibilityViewProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = F37563A56C180CE18EEFADE56FA3C17F /* DTAccessibilityViewProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE4F0992A0F597320FF7BDE4691D0FD4 /* NSString+CSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D6C48939A8498A09DCFC7F41ECB8A25 /* NSString+CSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE719709C9E809F3CA56B801792C1CF8 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */; }; - EF4307848004954110D2EBDA5399C02F /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */; }; - EF8FD9D42EB2AC4A434E6FEA3E84B47D /* UIColor+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB8FBD335486F255F42811FC49E5657C /* UIColor+RDEPUB.swift */; }; - EFAE66F7F5876B3C3F2357E5D52DF341 /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */; }; - F000848FB2DEADE8E5FBA17C3F6756CF /* RDEPUBNotePopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7FB9FD3FFFF0D8E3D9D354EC7AF35E1 /* RDEPUBNotePopupViewController.swift */; }; - F006F73F17F2E3CC0E7852E9357BA946 /* DTAnchorHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 424F12BEB0EDAAF1C719B5103D30C653 /* DTAnchorHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F038DE4614358844588617D12CB7C530 /* RDEPUBTextSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFA3CC091FA3A16CC09C9C66D1BC0E50 /* RDEPUBTextSelectionController.swift */; }; - F09125B0FFA7F64C4682813E3B607E2D /* RDEPUBRenderDiagnosticsCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B898A07D2E7D8E62F64BD28BAFA3DEFA /* RDEPUBRenderDiagnosticsCollector.swift */; }; - F0DCEA4158B69D4D7F327C580EB8CDE5 /* RDEPUBFragmentMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E8C914D69561C6C9736FCB3C6698CCC /* RDEPUBFragmentMarkerInjector.swift */; }; - F0F631056BADA32253528247DF493272 /* DTHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9D4A455723797A27F04A15C4E47823 /* DTHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F12E325A7ED834D878D4DA821D57594A /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */; }; - F1E9B6D0728711AE4D7154616DBC17EC /* Pods-ReadViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */; }; - F2B594C44772081247BCDBCBC43625D7 /* RDEPUBReaderController+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B99FF5D96CD045BCC53A9F6F8493C379 /* RDEPUBReaderController+DataSource.swift */; }; - F4422D0EBA217138896E901214ABB8E2 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59036F71583DAE2641D9DAA567DBD208 /* RDEPUBTextBuildPipelineInterfaces.swift */; }; - F4A2E3C4237B8931F61B72FF0BDD6D69 /* DTObjectTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = F038FB491B9A4A53447EF0DC333301AE /* DTObjectTextAttachment.m */; }; - F4E1C9E1686B902C7D26BF68B034AFEE /* RDEPUBCFIMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05ECE185AAFC5A857734DF5495F8E7C2 /* RDEPUBCFIMarkerInjector.swift */; }; - F51FF3BE649DB4F45C1CEDBE5B9992AB /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */; }; - F58ABA106C6200175DF574DF05A75BA8 /* DTAccessibilityElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F0486D3B46DC92AB254D6EE9CC233BF /* DTAccessibilityElement.m */; }; + E3DFC2B50D4914F6FE69A6A770A8A837 /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 55423549E54A01F039B5F379B264C73F /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E42412F34F904022FAD5ED27F09BC3D2 /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477676C456F623C8A33D40A533FA960D /* RDEPUBTextSearchEngine.swift */; }; + E450259DBA3997365A02AE5501CCC6FF /* RDEPUBAttachmentTooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B2B1356107877296E9D282AE94CB05 /* RDEPUBAttachmentTooltipView.swift */; }; + E575E69F9286412E8ED2D26A367C5993 /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5629838A35BA6A3F2895CFDE6A5FE0B /* RDEPUBReaderBottomToolView.swift */; }; + E7160A3E14A6F4EF789C499852B0EC6A /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A317B397274A6DAD784080981649FAC /* RDEPUBResourceURLSchemeHandler.swift */; }; + E73B999DB940594604D5FF8ADEC0EBBC /* rangy-serializer.js in Resources */ = {isa = PBXBuildFile; fileRef = 9DF9B7EF7992895E4AA2E398522498BC /* rangy-serializer.js */; }; + E74119D71F7BA53C6ED117180A9B7C76 /* RDEPUBReaderContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4931FAB1E86E9A03A8ACEB033B58F5E3 /* RDEPUBReaderContext.swift */; }; + E7BF39112456E5806CBFA1D998740944 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1BAC41A213B19789028A9648DD5BD6 /* RDEPUBReaderPersistence.swift */; }; + E7ECCDF9AA9BF1B385231D19C7167CA3 /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = 9542AFE3A82C8AE56576254CE196E71A /* DTCustomColoredAccessory.m */; }; + E8AB5CE26A5224EF09E9E363D70C7775 /* DTDictationPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FA88D00B7B2B2F0BA98BB92DF035906 /* DTDictationPlaceholderView.m */; }; + E9ACCCDF0303E912403C573C32CCC86B /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5457E010B7ABAB0EA8F28377908D1F23 /* RDEPUBWebContentView.swift */; }; + EA0040823CCF8E97363DB5891F5DA6D0 /* DTCoreTextFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4917E08E6E59460594AC443EDDAB7E77 /* DTCoreTextFunctions.m */; }; + EAD57CBB41E96A1BF02C7BAF39845FD0 /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A601AB41E9B4878B34FC3380355F8DD9 /* RDEPUBDTCoreTextRenderer.swift */; }; + EBB7E4D4DB253B5F1267CF9B4DDB4E93 /* DTCoreTextFontDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 88464D2E3579F1A5B25DCCA128528938 /* DTCoreTextFontDescriptor.m */; }; + EC3AAE6DEC73415B7A749A9D7ED1D1A2 /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 199E2ECC77BDAC03F644C20040F042D4 /* DTLog.m */; }; + EC832377DBB2E3443B37165DDDD9F9D6 /* RDEPUBReaderState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D74C449E9554743E9908B79188DB9BC /* RDEPUBReaderState.swift */; }; + EC88499170030571BD9326F9EB05204C /* RDEPUBTextBookModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B33491F27938C7846CEB7246FC4B96C /* RDEPUBTextBookModels.swift */; }; + EDA269B595D70EC2B9D81DC890157D63 /* DTAccessibilityViewProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 399AED6BF151EC39BE4450784795A832 /* DTAccessibilityViewProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE4F0992A0F597320FF7BDE4691D0FD4 /* NSString+CSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 3578B97A85BCDC60888FDF87B8F2600C /* NSString+CSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F006F73F17F2E3CC0E7852E9357BA946 /* DTAnchorHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 599172147A32B6978EB5AAE1BE55FF7A /* DTAnchorHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0A3BF24E4999B7D909E632B19150FB2 /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = CEEC8715398E89B42F9B04E290E8E4FE /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0F631056BADA32253528247DF493272 /* DTHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F7C508BE899A1397560A767CAEADB7B9 /* DTHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F19DCC1F1A6D50AAAE2CDB35DC9328BF /* RDEPUBReaderController+ExternalLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = F788C862D0C386B17128DB735921333C /* RDEPUBReaderController+ExternalLinks.swift */; }; + F1C2AEADA00E8EB7EBFE3AE1B3D75CC1 /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E58E922721839C1D9E53D2DFA357A8 /* RDEPUBReaderConfiguration.swift */; }; + F35B12C3787F02C121BEF6ED16B69605 /* cssInjector.js in Resources */ = {isa = PBXBuildFile; fileRef = 5BE399D4DCDB9643D809264D6D5319B2 /* cssInjector.js */; }; + F388DEF5AC1D6F6267025046B37645A7 /* RDEPUBReaderController+RenderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 338AA349594E53D0CF40F957CAC5D6BC /* RDEPUBReaderController+RenderSupport.swift */; }; + F4A2E3C4237B8931F61B72FF0BDD6D69 /* DTObjectTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EDA1618562CC224690CF6FC03AFED38 /* DTObjectTextAttachment.m */; }; + F54455C0ECA25680B1A0D16909BA0907 /* RDEPUBReaderDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51852C93D034EBE5B7907AA4E69848A1 /* RDEPUBReaderDependencies.swift */; }; + F58ABA106C6200175DF574DF05A75BA8 /* DTAccessibilityElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F842408AB76A580B80255453F2FDF6 /* DTAccessibilityElement.m */; }; F5A424E67F41C4F7B830CE2F7E71570D /* DTCoreText-Resources in Resources */ = {isa = PBXBuildFile; fileRef = F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */; }; - F5CF4159843CE7E2E3C023B1E326B7EE /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F6036BBDFE7484F5A453F6876C97C098 /* NSAttributedString+SmallCaps.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F99C8130EE83A22CD223C7F5E6E66E /* NSAttributedString+SmallCaps.m */; }; - F61102C9BF3D6296CB6C6B754ABF98C5 /* DTTextHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CFEE298DD52246B46E6FA62B16B38DF /* DTTextHTMLElement.m */; }; - F61F52F9C7061BEBF0F04FE32C57963F /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3BFB23BF28CE5120D1FFBD76664087B /* RDEPUBWebView+Configuration.swift */; }; - F630BEC2086983146AD26D9396323AF1 /* RDEPUBCFIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE28C0B33B3E44975093B0F177FDD67F /* RDEPUBCFIParser.swift */; }; - F65BAED40531ADE85C230A2D779A5182 /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */; }; - F6D6059B11756279D4DDC1C6550091E6 /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA142E0FB9C9440BA93BE7BF027F095F /* RDEPUBReaderTableOfContentsItem.swift */; }; - F7198C456F52C6ADFDC43B4B111EBB4B /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50319253F9CADECC2B97F1734E0C834A /* RDEPUBWebView+Search.swift */; }; - F8054331081E9008FFBB542F83B40AAA /* RDReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10617286346E2E6D7BB30203A65302CA /* RDReaderGestureController.swift */; }; - F894C4D1E75C1E9D24AE2CCCC8FFF519 /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06733E30802CA08ACF312C763BD37795 /* RDEPUBTextSearchEngine.swift */; }; - F8D8F88FF462C764E9B8B3D86DC90837 /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C7F146589FBD04B46D846AE1ECBD10A /* RDEPUBTextContentView.swift */; }; - F94303E469C66C27A25A2596C357318E /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */; }; - FA3F2F0647033F749B690F1F43F1FF9E /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */; }; - FA58AAD5F76A38FA6D32BF44408811E4 /* RDEPUBCFIPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11CD06780A381427FE5EDE9D07D4D970 /* RDEPUBCFIPath.swift */; }; - FB01A47EE1D09C33FE942CE56D3A874E /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FC2546E55A86C4D94D5F8B809FB5C897 /* RDEPUBChapterWindowSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D09A34060F1B615AA1CA4089B37AC2 /* RDEPUBChapterWindowSnapshot.swift */; }; - FC2603B7B764AACD1C0BFA66BFC597B2 /* SSAlertViewExtention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */; }; - FC261482E0571EF1D2C176DCC1416271 /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */; }; - FC372F89CBD06240B936AB0B8C4AC67D /* RDReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F40EAB66363D681DA68981B17FB492 /* RDReaderPagingController.swift */; }; - FC5F52919451A15639442B46B38E4C67 /* DTCoreTextLayoutFrame+Cursor.m in Sources */ = {isa = PBXBuildFile; fileRef = E62C5E593037EF8A45E7FAA847D0277C /* DTCoreTextLayoutFrame+Cursor.m */; }; - FC9E9F7AC93678A4D81A3F0D28D198E9 /* RDEPUBRuntimePageCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80DE4FAC18642D5E8D148D8A1E5A566 /* RDEPUBRuntimePageCount.swift */; }; - FCD1FF6DA0BBED5100CEA56D71B2EB04 /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47889215B9D350817A491970E6AED97C /* RDEPUBPageLayoutSnapshot.swift */; }; - FD5D68887297CFA94F543C49DC68A156 /* DTHTMLAttributedStringBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C496AB6A73C2D0BD0FF340A6A2960D5 /* DTHTMLAttributedStringBuilder.m */; }; - FD6C4803D3BD6697D01780015FAA1458 /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80D9ED51333D0F99752A8408020C77AF /* RDEPUBTextAnchor.swift */; }; - FE33334602C29ADE729F7AAE4C686668 /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */; }; - FEB00C614DCB6A8A7BDF8DEE11260984 /* NSMutableAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = B0500CA69405E23B09291359EB28331E /* NSMutableAttributedString+HTML.m */; }; - FEE25EB95A909D28146B01F50AB9C904 /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */; }; - FFCD89F746514E86CC9E99A60E64D61B /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */; }; + F6036BBDFE7484F5A453F6876C97C098 /* NSAttributedString+SmallCaps.m in Sources */ = {isa = PBXBuildFile; fileRef = 98CF9C5D504838741E399811F4D5A0B7 /* NSAttributedString+SmallCaps.m */; }; + F61102C9BF3D6296CB6C6B754ABF98C5 /* DTTextHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 69076FC9D4201719C319547346DA3E21 /* DTTextHTMLElement.m */; }; + F6259670F9185E3EEF80D68DB4B19D64 /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = 0764D155F69503AACFA7AD976825E986 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F642FBE5D97AA4DFBBAC2AF5CBD0780A /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = B43D7603C0D66635268842EC0A2655AC /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F702422D9C4B27174535764C70C04D70 /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F653EFBBEDAAC96A34BC93B4211E792 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FA5621BECD8E9EF46C9C812FAEE37D60 /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = FF63F5E8902D6F3F5E845A924EBBC6D3 /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FA898C80CF990AAD44D03448E7664729 /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 499E135F1FEB31C26EB0EF793A90086C /* UIImage+DTFoundation.m */; }; + FBACC93C50F20F2E8F2EC12D2D107DFA /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 3453CFB9BDBF6F9D0937EDF5FB2BD07B /* NSURL+DTAppLinks.m */; }; + FC5F52919451A15639442B46B38E4C67 /* DTCoreTextLayoutFrame+Cursor.m in Sources */ = {isa = PBXBuildFile; fileRef = EF625CF6A790938F5CE0F0C7DC36E340 /* DTCoreTextLayoutFrame+Cursor.m */; }; + FD5D68887297CFA94F543C49DC68A156 /* DTHTMLAttributedStringBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = E0192469A486DA7CECFECEA37518B6B9 /* DTHTMLAttributedStringBuilder.m */; }; + FE4A1F4E3837E84BC4CB37947AB56283 /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = A3BD3ED7913130D32E14D5572CBCC921 /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FEB00C614DCB6A8A7BDF8DEE11260984 /* NSMutableAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CA72FA9A4F2F42A75C58325738A44AC /* NSMutableAttributedString+HTML.m */; }; + FF2AF67ED01DD3C78822AF567FC64051 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEB9B65684CB76F24E68191D6A5844D0 /* RDEPUBWebView+JavaScriptBridge.swift */; }; + FFEB74D61E54DC46EFE0DBE2E76EFAA1 /* Pods-ReadViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 04FFC401B252E7BCD021482951CB6BF1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; - remoteInfo = SnapKit; - }; - 22BB1F120B8BE2CDBECB11ED2A9C4EFB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8619D5ADECF2B26CFD9A9826D61D289A; - remoteInfo = SSAlertSwift; - }; - 29E236F5FC2EAE3DC8E25AE4B11C749B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; - remoteInfo = ZIPFoundation; - }; - 3E6D8EDF5498446099B387DD9BB81D95 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8A8DB685241263AFDF5E6B20FE67B93A; - remoteInfo = "SnapKit-SnapKit_Privacy"; - }; - 417F80B067DF93DCD6E6ED0DCC7BDE0B /* PBXContainerItemProxy */ = { + 077B82F75DD704BB3F3D60FB9454BDD5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; remoteInfo = DTFoundation; }; - 544B5AD60561B80F8F55BB1203814841 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; - remoteInfo = DTFoundation; - }; - 6642083DC898BC7F864CCCA3293ECEE0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; - remoteInfo = ZIPFoundation; - }; - 672E86FACF832D60405977714EFBB3A4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = C7A8D82E407CD3FDC3BA55CEE519B252; - remoteInfo = "ZIPFoundation-ZIPFoundation_Privacy"; - }; - 6A1037ABDFA57F93BA3EEA2239EF8BD4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; - remoteInfo = DTCoreText; - }; - 834DE8DAF657C6E3C86813C528C3AF5A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AE7F393FB7805DE2664AB4111873F907; - remoteInfo = "RDReaderView-RDReaderViewAssets"; - }; - B8B574023C6A5A8EB40C86AC78E6E104 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA2E57587AA8EECA63C4BE08EA3CB6D2; - remoteInfo = RDReaderView; - }; - CBC99AD96DBA1A12A5A3D7EBD99EA30B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; - remoteInfo = SnapKit; - }; - CE2FD9FBF5539D25AFA1E7A15E4C86E4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; - remoteInfo = DTCoreText; - }; - D3E98DD4790BB372C0E5F91F8321F7DE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8619D5ADECF2B26CFD9A9826D61D289A; - remoteInfo = SSAlertSwift; - }; - FED8F0022C504C26192D989340E637E7 /* PBXContainerItemProxy */ = { + 0D040B1696E237AC90129FBF5F045668 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0C24CB0E87A728A11AA1124CB360D6A1; remoteInfo = "DTCoreText-Resources"; }; + 4C44EA9D067E5F15FC4C82C5DCEFF85E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AE7F393FB7805DE2664AB4111873F907; + remoteInfo = "RDReaderView-RDReaderViewAssets"; + }; + 618E065085B263D2E1799C600289EB6E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA2E57587AA8EECA63C4BE08EA3CB6D2; + remoteInfo = RDReaderView; + }; + 782CA4FFE40915340FFE27E8241A14BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; + remoteInfo = DTCoreText; + }; + 7E334ACAA496278856830A5E289D889E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; + remoteInfo = DTCoreText; + }; + 95D435994BF2E09ED48E93B3EA046E5D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; + remoteInfo = ZIPFoundation; + }; + 9FCD52B645EFFA5837720169D29D5E80 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C7A8D82E407CD3FDC3BA55CEE519B252; + remoteInfo = "ZIPFoundation-ZIPFoundation_Privacy"; + }; + A392AC630ADF96D856B6EEBAAD3FFB9D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; + remoteInfo = DTFoundation; + }; + A5D83DA5C53D3731426918AC75105BE3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; + remoteInfo = ZIPFoundation; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 015F3EE69253C66E11B931E3360BA5FE /* DTCoreText-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTCoreText-dummy.m"; sourceTree = ""; }; - 029130886CE8E422D16ADF97468CB1B0 /* DTCoreTextLayoutFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrame.m; path = Core/Source/DTCoreTextLayoutFrame.m; sourceTree = ""; }; - 02946CDDA8033AFAA82187D50800FEA8 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; sourceTree = ""; }; - 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Sources/ConstraintDSL.swift; sourceTree = ""; }; - 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+DTCrypto.h"; path = "Core/Source/NSData+DTCrypto.h"; sourceTree = ""; }; - 02FE773F7655B2174F160FE1621181BB /* RDEPUBReaderEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderEnvironment.swift; sourceTree = ""; }; - 033D935836CD653A79E9152E2D84CEEF /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; + 006D002D86B43AA52E0AFD2E18459107 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/ZIPFoundation/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 00D963091969DCF978D7A36BF2747D33 /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; + 01B6F1C44AED0554A533AF8573303A47 /* RDEPUBReaderChromeCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChromeCoordinator.swift; sourceTree = ""; }; + 02B465B0AB9FB857FB2C95097E1C4D46 /* RDEPUBPageBreakPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageBreakPolicy.swift; sourceTree = ""; }; + 02DDA7AD723C7FEB0B80B0C573EAE679 /* RDEPUBCFIGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIGenerator.swift; sourceTree = ""; }; + 03574AB570F840F4A14B53F85023DBAA /* RDEPUBChapterTailNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterTailNormalizer.swift; sourceTree = ""; }; + 0372FD1824BC43F7BD6B337430201420 /* DTCoreGraphicsUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreGraphicsUtils.m; path = Core/Source/DTCoreGraphicsUtils.m; sourceTree = ""; }; + 044BEA679671E16EA9BA9AD627750742 /* NSMutableAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableAttributedString+HTML.h"; path = "Core/Source/NSMutableAttributedString+HTML.h"; sourceTree = ""; }; 045ADBF2087ADD914A9CA0B62EBF2A9F /* Pods-ReadViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ReadViewDemo.modulemap"; sourceTree = ""; }; - 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIPDeprecated.swift"; path = "Sources/ZIPFoundation/FileManager+ZIPDeprecated.swift"; sourceTree = ""; }; - 0524B881754B1D6EBC90981B8760C6B7 /* RDEPUBCFIGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIGenerator.swift; sourceTree = ""; }; - 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTUnshorten.h"; path = "Core/Source/NSURL+DTUnshorten.h"; sourceTree = ""; }; - 0595FF1B5274FDF6F9143B6F7FA18D61 /* RDEPUBReaderController+AttachmentTooltip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+AttachmentTooltip.swift"; sourceTree = ""; }; - 05D57D16346FAF830F1F82067307EA9F /* default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = default.css; path = Core/Source/default.css; sourceTree = ""; }; - 05ECE185AAFC5A857734DF5495F8E7C2 /* RDEPUBCFIMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMarkerInjector.swift; sourceTree = ""; }; - 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Reading.swift"; path = "Sources/ZIPFoundation/Archive+Reading.swift"; sourceTree = ""; }; - 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBase64Coding.m; path = Core/Source/DTBase64Coding.m; sourceTree = ""; }; - 06733E30802CA08ACF312C763BD37795 /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; - 073A7F9DF1A554BD1B324EA9E0090E91 /* DTObjectTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTObjectTextAttachment.h; path = Core/Source/DTObjectTextAttachment.h; sourceTree = ""; }; - 0786D6430A29C2F90E4832048559BE21 /* RDReaderSpreadResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderSpreadResolver.swift; sourceTree = ""; }; - 078D30B87BEEB64D27E0BDB8EB562475 /* RDEPUBCFIRecoveryEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRecoveryEngine.swift; sourceTree = ""; }; - 07C08997AE3D75194E400010A0AE4820 /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; + 047D134F34D6BDEFF3403095EA60155C /* RDEPUBViewportTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBViewportTypes.swift; sourceTree = ""; }; + 057DBFBFC99448A0B77A3C0DBB13B4A9 /* NSScanner+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSScanner+HTML.m"; path = "Core/Source/NSScanner+HTML.m"; sourceTree = ""; }; + 05838D65DEC339C51AADB17346B7E287 /* NSDictionary+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTError.h"; path = "Core/Source/NSDictionary+DTError.h"; sourceTree = ""; }; + 05B6FB8AE3D884ED289049A7E125D668 /* RDEPUBChapterCacheKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterCacheKey.swift; sourceTree = ""; }; + 068885F1B54CFD5DBBE6E2DC253F7819 /* DTAttributedTextCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextCell.h; path = Core/Source/DTAttributedTextCell.h; sourceTree = ""; }; + 06D709090C07C72DEEF74D75E06AD845 /* RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDReaderView-Info.plist"; sourceTree = ""; }; + 0764D155F69503AACFA7AD976825E986 /* DTTiledLayerWithoutFade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTiledLayerWithoutFade.h; path = Core/Source/iOS/DTTiledLayerWithoutFade.h; sourceTree = ""; }; 0834E84632886CDD9911CAB76183F1CE /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 091E53DC8215AED45D88A2ABA24A2140 /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; - 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Sources/ConstraintMultiplierTarget.swift; sourceTree = ""; }; - 09C2D4A3D4F602D125FF38B56C91CF84 /* ZIPFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ZIPFoundation.modulemap; sourceTree = ""; }; - 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileWrapper+DTCopying.h"; path = "Core/Source/NSFileWrapper+DTCopying.h"; sourceTree = ""; }; - 0AE0BE26FBA95F74B6173965BEC302EB /* RDEPUBSemanticMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSemanticMarkerInjector.swift; sourceTree = ""; }; - 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = ""; }; - 0B7771FDE9AB1688166584C0AA03F12A /* DTCoreTextFontCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontCollection.h; path = Core/Source/DTCoreTextFontCollection.h; sourceTree = ""; }; - 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCustomColoredAccessory.m; path = Core/Source/iOS/DTCustomColoredAccessory.m; sourceTree = ""; }; - 0D170B1455CB3C94EFC34D7B67EDC001 /* RDReaderView+ContentAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+ContentAccess.swift"; sourceTree = ""; }; - 0D253DF65322509913DE34899979C30B /* wxread-default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-default.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-default.css"; sourceTree = ""; }; - 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParser.h; path = Core/Source/DTHTMLParser/DTHTMLParser.h; sourceTree = ""; }; - 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPrioritizable.swift; path = Sources/ConstraintMakerPrioritizable.swift; sourceTree = ""; }; - 0E160FF00EF4B6DB318FEDCD72A026F3 /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; - 0E5D2C72E80EF71ECCFDFE5C476ADADE /* RDReaderPreloadController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPreloadController.swift; sourceTree = ""; }; - 0E78795FD43E657B2F567418E0A7EB30 /* String+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+RDEPUB.swift"; sourceTree = ""; }; - 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Sources/LayoutConstraintItem.swift; sourceTree = ""; }; - 0F3F0149FB61996B3FFFD4771F697189 /* RDEPUBMetadataParseCancellationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseCancellationController.swift; sourceTree = ""; }; - 0F5D34047BAA894BEF1DFA23E6A9DAB1 /* DTCoreTextMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextMacros.h; path = Core/Source/DTCoreTextMacros.h; sourceTree = ""; }; - 0F9E2282A0A515A241F80997B2F28767 /* RDEPUBTextPageRenderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageRenderView.swift; sourceTree = ""; }; - 0FADF7F2A0784AA8BE178F33CACE42C9 /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; - 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTError.h"; path = "Core/Source/NSDictionary+DTError.h"; sourceTree = ""; }; - 1058DD74F97F43193DBA11E135ACFF22 /* RDReaderViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderViewProtocols.swift; sourceTree = ""; }; - 10617286346E2E6D7BB30203A65302CA /* RDReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderGestureController.swift; sourceTree = ""; }; - 11B604FC3B0D5C91FEA763DCC0BE4DC5 /* DTHTMLParserNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserNode.m; path = Core/Source/DTHTMLParserNode.m; sourceTree = ""; }; - 11CD06780A381427FE5EDE9D07D4D970 /* RDEPUBCFIPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIPath.swift; sourceTree = ""; }; - 12A5EA26EE7539EDDA90649D22FB675D /* DTImage+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTImage+HTML.m"; path = "Core/Source/DTImage+HTML.m"; sourceTree = ""; }; - 13AB6A32A293E3DC21A7047C6DB958CA /* DTHTMLParserTextNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserTextNode.m; path = Core/Source/DTHTMLParserTextNode.m; sourceTree = ""; }; - 13E1548FC42118F1A4164739DE6BE4E9 /* UIFont+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+DTCoreText.m"; path = "Core/Source/UIFont+DTCoreText.m"; sourceTree = ""; }; - 14DBB472BDBF872F8A5C3A7460B17A31 /* RDEPUBPaginationState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationState.swift; sourceTree = ""; }; - 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+DTFoundation.h"; path = "Core/Source/iOS/UIImage+DTFoundation.h"; sourceTree = ""; }; - 15DB2B4B89706EFDAB413FC86A6C29C0 /* RDEPUBReaderController+RenderSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RenderSupport.swift"; sourceTree = ""; }; - 16A3654E9B076CBACAB460CDD311C9B6 /* RDEPUBReaderState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderState.swift; sourceTree = ""; }; - 174A6B5E9BDD0636D95688D70EEEF226 /* RDEPUBReaderAnnotationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAnnotationCoordinator.swift; sourceTree = ""; }; - 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+MemoryFile.swift"; path = "Sources/ZIPFoundation/Archive+MemoryFile.swift"; sourceTree = ""; }; - 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileWrapper+DTCopying.m"; path = "Core/Source/NSFileWrapper+DTCopying.m"; sourceTree = ""; }; - 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+DTCrypto.m"; path = "Core/Source/NSData+DTCrypto.m"; sourceTree = ""; }; - 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSAlertSwift.debug.xcconfig; sourceTree = ""; }; - 1A7D80430EE63D6EA20B3BBA26A89B34 /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; - 1ABC2F552388CD08EC1EFDEF606AE222 /* DTTextAttachmentHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachmentHTMLElement.m; path = Core/Source/DTTextAttachmentHTMLElement.m; sourceTree = ""; }; - 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTFormatNumbers.m"; path = "Core/Source/NSString+DTFormatNumbers.m"; sourceTree = ""; }; + 08EB5C6310B7F9040732D6E905650432 /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; + 08F54C3D9B4AECA08A47309615DC2715 /* DTFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-prefix.pch"; sourceTree = ""; }; + 09FF858DC29B73E9B67B32B03CFF4084 /* DTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedLabel.h; path = Core/Source/DTAttributedLabel.h; sourceTree = ""; }; + 0A317B397274A6DAD784080981649FAC /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; + 0B33491F27938C7846CEB7246FC4B96C /* RDEPUBTextBookModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookModels.swift; sourceTree = ""; }; + 0B8321AB80CFE0B94537AEA63E9A79F5 /* NSString+Paragraphs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Paragraphs.h"; path = "Core/Source/NSString+Paragraphs.h"; sourceTree = ""; }; + 0C24F592C4F38F15DC8C46BE0442B59C /* DTCSSListStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSListStyle.h; path = Core/Source/DTCSSListStyle.h; sourceTree = ""; }; + 0C88B7F1F7145821C2F65514186AE335 /* RDEPUBMetadataParseWorker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseWorker.swift; sourceTree = ""; }; + 0CF3A3E5A1F6B321F72FD2FF3C0AC1E1 /* RDEPUBSemanticMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSemanticMarkerInjector.swift; sourceTree = ""; }; + 0D93C2002AAECD29B3ED5A14026D3DFE /* Entry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Entry.swift; path = Sources/ZIPFoundation/Entry.swift; sourceTree = ""; }; + 0E0D068226C4B5E614B90482A3B4AFC0 /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; + 0F80AC45FB1DBF50E0E3AA4F26BFA676 /* DTFoundationConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFoundationConstants.m; path = Core/Source/DTFoundationConstants.m; sourceTree = ""; }; + 10FC9FC44C8A038A286BF6DCD1891DA0 /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; + 11246502ABEC1999B60B3FA41B764E7D /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; + 126E6ACAC7C0427806B58DA8E10BDD78 /* NSMutableString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableString+HTML.m"; path = "Core/Source/NSMutableString+HTML.m"; sourceTree = ""; }; + 1300CC5794E609DB8FBA6FFF90A09408 /* UIImage+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+DTFoundation.h"; path = "Core/Source/iOS/UIImage+DTFoundation.h"; sourceTree = ""; }; + 131C1D8C96DF2D44A2D4F50C5AEFFF11 /* NSString+DTURLEncoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTURLEncoding.m"; path = "Core/Source/NSString+DTURLEncoding.m"; sourceTree = ""; }; + 13597E7190F2C08C5906D7D128E43E99 /* DTObjectTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTObjectTextAttachment.h; path = Core/Source/DTObjectTextAttachment.h; sourceTree = ""; }; + 13F8FC8B51AD434F5D4B0CF5150D7563 /* DTCoreText-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-umbrella.h"; sourceTree = ""; }; + 14283024FA4A0231B32CA22AA907FEFA /* DTBreakHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBreakHTMLElement.h; path = Core/Source/DTBreakHTMLElement.h; sourceTree = ""; }; + 14826541B96FDC7B652AA313B700DABA /* RDEPUBChapterSummaryDiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterSummaryDiskCache.swift; sourceTree = ""; }; + 148B993AB228816D19FCB7CD13874C83 /* DTAnchorHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnchorHTMLElement.m; path = Core/Source/DTAnchorHTMLElement.m; sourceTree = ""; }; + 14E63A0D35D4A07BD0123021EA161C99 /* DTHTMLWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLWriter.h; path = Core/Source/DTHTMLWriter.h; sourceTree = ""; }; + 15C005A2A5E6A8263DE1F99AC5D372C0 /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; + 15DDB8FAB80CF0B8039A3DCF2D1CE6F5 /* RDEPUBChapterOffsetMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterOffsetMap.swift; sourceTree = ""; }; + 173194D38C897D8E38AD8A194E47DB5C /* DTPieProgressIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTPieProgressIndicator.h; path = Core/Source/iOS/DTPieProgressIndicator.h; sourceTree = ""; }; + 184CDDD009D8F4384A9E02F953B6D8B6 /* RDEPUBCFIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIParser.swift; sourceTree = ""; }; + 18D23D8D10719754D93032F66EB98536 /* Date+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+ZIP.swift"; path = "Sources/ZIPFoundation/Date+ZIP.swift"; sourceTree = ""; }; + 18F842408AB76A580B80255453F2FDF6 /* DTAccessibilityElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityElement.m; path = Core/Source/DTAccessibilityElement.m; sourceTree = ""; }; + 1967314246DE47771D6C6F0D8B5BB22A /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; + 199E2ECC77BDAC03F644C20040F042D4 /* DTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLog.m; path = Core/Source/DTLog.m; sourceTree = ""; }; + 1A88AA04D7B29A217B432C19AC48AB6B /* DTStylesheetHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTStylesheetHTMLElement.h; path = Core/Source/DTStylesheetHTMLElement.h; sourceTree = ""; }; 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.release.xcconfig"; sourceTree = ""; }; - 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTPieProgressIndicator.h; path = Core/Source/iOS/DTPieProgressIndicator.h; sourceTree = ""; }; - 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Archive.swift; path = Sources/ZIPFoundation/Archive.swift; sourceTree = ""; }; - 1D4C9B7ED5E04C216AB28E3A4065C1C5 /* DTHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLElement.m; path = Core/Source/DTHTMLElement.m; sourceTree = ""; }; - 1D6DA580F40DF113709E15CF6542A35C /* DTCoreTextLayouter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayouter.m; path = Core/Source/DTCoreTextLayouter.m; sourceTree = ""; }; - 1DE1D663A9451374F0417DAC8CDAE2BF /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; - 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/ZIPFoundation/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 1EBAE1E92B0DEECFFA57D82DC828AB30 /* RDEPUBReaderController+ExternalLinks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ExternalLinks.swift"; sourceTree = ""; }; - 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Sources/ConstraintConstantTarget.swift; sourceTree = ""; }; - 1FE1D4A863768FC78F6B76B6A181267C /* RDReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderView.swift; sourceTree = ""; }; + 1BDECCF30428456DD69F6D870693248C /* RDReaderSpreadResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderSpreadResolver.swift; sourceTree = ""; }; + 1C2BD942CCE411EF3AB9DCDC8215B180 /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; + 1D220183932DB13D0AF20EF12C44A29D /* RDEPUBReadingLocationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingLocationModels.swift; sourceTree = ""; }; + 1DB230C0E9A18C8B1C5581CD2D3D0F2F /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; + 1DD5649E99D72A74F8F2C3B3E5D3A729 /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; + 1E0F52BED56AC7A04854F459B246AB18 /* RDEPUBAttachmentTooltipOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipOverlayView.swift; sourceTree = ""; }; + 1EF19AD0EF4889156D46061FB43E0F5D /* DTCoreTextFontDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontDescriptor.h; path = Core/Source/DTCoreTextFontDescriptor.h; sourceTree = ""; }; + 1F1F7BFB63DE15D627EB8F64829B8AAD /* NSURL+DTComparing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTComparing.h"; path = "Core/Source/NSURL+DTComparing.h"; sourceTree = ""; }; + 1F3BEE5F799C47EEACB7E29C611B8201 /* RDEPUBReaderController+RuntimeBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RuntimeBridge.swift"; sourceTree = ""; }; + 1FA88D00B7B2B2F0BA98BB92DF035906 /* DTDictationPlaceholderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderView.m; path = Core/Source/DTDictationPlaceholderView.m; sourceTree = ""; }; + 1FC3BE6BBB4EBD99FF9124BA8E599520 /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; 2047430DF5C84E0A8FC8874A2B915FC3 /* Pods-ReadViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ReadViewDemo-acknowledgements.markdown"; sourceTree = ""; }; - 20D029F1D415730DFA1FD010AD485185 /* RDEPUBReaderAssemblyCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAssemblyCoordinator.swift; sourceTree = ""; }; - 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFolderMonitor.h; path = Core/Source/DTFolderMonitor.h; sourceTree = ""; }; - 214727C456892B390492D84CDD20BB88 /* RDEPUBReaderDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDependencies.swift; sourceTree = ""; }; - 21BAA93E67D8CBC5297302D798FB4F7A /* DTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedLabel.m; path = Core/Source/DTAttributedLabel.m; sourceTree = ""; }; - 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertViewExtention.swift; path = Sources/SSAlertSwift/SSAlertViewExtention.swift; sourceTree = ""; }; + 207CC0EEB74CECEB43A870FF80560E0F /* DTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLog.h; path = Core/Source/DTLog.h; sourceTree = ""; }; + 210601B1509A4301617C853C5022AA99 /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; + 214F0FC87DE99D3FCE69D98B357F3FFC /* DTCoreTextLayoutFrame+Cursor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTCoreTextLayoutFrame+Cursor.h"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.h"; sourceTree = ""; }; + 21CCCCAAF832BE9C859BEDDC79B4E9E2 /* DTSmartPagingScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTSmartPagingScrollView.h; path = Core/Source/iOS/DTSmartPagingScrollView.h; sourceTree = ""; }; + 22B69C9433F2FBE5CE8409BD4266DFE8 /* Data+Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Compression.swift"; path = "Sources/ZIPFoundation/Data+Compression.swift"; sourceTree = ""; }; + 23006DBAC610AEB0A4B3EAFEA4FB0567 /* DTTiledLayerWithoutFade.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTiledLayerWithoutFade.m; path = Core/Source/iOS/DTTiledLayerWithoutFade.m; sourceTree = ""; }; + 23588B63FC4026A371F5C683744A664C /* DTFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-umbrella.h"; sourceTree = ""; }; + 2361BC151481D2717ED43C5659725945 /* ZIPFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ZIPFoundation.modulemap; sourceTree = ""; }; + 2373DCA0FC45287BFC063BEA661B8367 /* Archive+WritingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+WritingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+WritingDeprecated.swift"; sourceTree = ""; }; 238893C9CBD95CB9BDF069EB5A303E17 /* RDReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDReaderView; path = RDReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 23D09A34060F1B615AA1CA4089B37AC2 /* RDEPUBChapterWindowSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWindowSnapshot.swift; sourceTree = ""; }; - 249747495DE8349E480E4789B12D366D /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = ""; }; - 25E8E62C9DC0A4AE49F168F04CF8B9D3 /* rangy-serializer.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-serializer.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js"; sourceTree = ""; }; - 25F52D9C765ED2FA87834D4310203E0B /* DTFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-prefix.pch"; sourceTree = ""; }; - 2702E05AA7A266B7D8D0F881FD4E09DA /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; - 27205D159B39090908CA0E9C3997B784 /* NSDictionary+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTCoreText.h"; path = "Core/Source/NSDictionary+DTCoreText.h"; sourceTree = ""; }; - 2739EAD69AB2F5F6FA80E254D294440D /* RDPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPlainTextBookBuilder.swift; sourceTree = ""; }; - 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIP.swift"; path = "Sources/ZIPFoundation/FileManager+ZIP.swift"; sourceTree = ""; }; - 28043173CA3B3787DC401ACEB5398108 /* DTCoreTextLayoutFrame+Cursor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTCoreTextLayoutFrame+Cursor.h"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.h"; sourceTree = ""; }; - 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Sources/ConstraintItem.swift; sourceTree = ""; }; - 2BA19BD582C1BD54AF673014C04848B6 /* DTFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTFoundation-Info.plist"; sourceTree = ""; }; - 2C50CAB4241C141EF6EC9ED22AB3A7E8 /* NSDictionary+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTCoreText.m"; path = "Core/Source/NSDictionary+DTCoreText.m"; sourceTree = ""; }; - 2CD63BBDA1CB02B15A54D2CDD8A3ACD7 /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = ""; }; - 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTAppLinks.m"; path = "Core/Source/iOS/NSURL+DTAppLinks.m"; sourceTree = ""; }; - 2D3D7C8444F58D9B3FCB4F3006D2CFBA /* NSAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+HTML.h"; path = "Core/Source/NSAttributedString+HTML.h"; sourceTree = ""; }; - 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SSAlertSwift-dummy.m"; sourceTree = ""; }; - 2E281F0688B1D356CF1654C6063AE77D /* RDReaderView+PageCurl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+PageCurl.swift"; sourceTree = ""; }; - 2E53AFDDED09CAFF8EFC5BC809DB5855 /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; - 2F07C9C63CCAC0DAFE81B6A625199293 /* RDEPUBReaderServices.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderServices.swift; sourceTree = ""; }; - 2F34FF3B7E71CCE4E9C73115AA710B1C /* RDEPUBTextBookModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookModels.swift; sourceTree = ""; }; - 2F752E31955268C74AB0B05584B9CA9D /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; - 2F8D349DB593AF848B64723FBF1DF717 /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; - 3008F6944BA740CD6E6F5CA33733C911 /* RDEPUBPaginationCacheCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationCacheCoordinator.swift; sourceTree = ""; }; + 24B4BDE6AF43475513D28D232AB7D0B9 /* RDEPUBCFI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFI.swift; sourceTree = ""; }; + 25DDD76CA572F0C7AB5A8178CF80169D /* DTCoreTextFontCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontCollection.h; path = Core/Source/DTCoreTextFontCollection.h; sourceTree = ""; }; + 26E305762ECD5788B045AFC816767444 /* RDEPUBNoteModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteModels.swift; sourceTree = ""; }; + 270645F585F13D520FFA031C447E19F1 /* RDEPUBChapterWarmupOrchestrator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWarmupOrchestrator.swift; sourceTree = ""; }; + 27372A23AA4B051867E7D2C749D1DE81 /* DTImageTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTImageTextAttachment.h; path = Core/Source/DTImageTextAttachment.h; sourceTree = ""; }; + 288589D0B52F73505B43C743D9837578 /* Entry+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+ZIP64.swift"; path = "Sources/ZIPFoundation/Entry+ZIP64.swift"; sourceTree = ""; }; + 29701CE248CAAA87698BD90F74F6295B /* RDEPUBCFIRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRange.swift; sourceTree = ""; }; + 29DEA4D201BB179BB6E228E9F688CD4C /* UIView+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+DTFoundation.h"; path = "Core/Source/iOS/UIView+DTFoundation.h"; sourceTree = ""; }; + 2A3E72DC0C036C0F8808A44B73C4A5EA /* RDEPUBRuntimeChapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimeChapter.swift; sourceTree = ""; }; + 2B8072609EF1BA68F2BF57A0E3A915FB /* RDReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderGestureController.swift; sourceTree = ""; }; + 2C1A7359A45BB880877A672C57F522FE /* DTCoreGraphicsUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreGraphicsUtils.h; path = Core/Source/DTCoreGraphicsUtils.h; sourceTree = ""; }; + 2F242FC1357DD90FA4FD67E1DB90A837 /* NSCharacterSet+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCharacterSet+HTML.m"; path = "Core/Source/NSCharacterSet+HTML.m"; sourceTree = ""; }; + 2F75437CE9F9324D315E417014797C1D /* DTExtendedFileAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTExtendedFileAttributes.h; path = Core/Source/DTExtendedFileAttributes.h; sourceTree = ""; }; + 3046397381A83C2F6BAF344B86AD176E /* NSMutableArray+DTMoving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+DTMoving.h"; path = "Core/Source/NSMutableArray+DTMoving.h"; sourceTree = ""; }; 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.debug.xcconfig"; sourceTree = ""; }; - 30EE98BBC2688DFF0B50F9C417007886 /* RDEPUBCSSCompatibilityLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCSSCompatibilityLayer.swift; sourceTree = ""; }; - 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTURLEncoding.h"; path = "Core/Source/NSString+DTURLEncoding.h"; sourceTree = ""; }; - 31F3F91D5624C451E5D44D85B1DDE7C5 /* NSMutableString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableString+HTML.m"; path = "Core/Source/NSMutableString+HTML.m"; sourceTree = ""; }; - 3207A69E5A8BC344BDC277A8BEA51979 /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; - 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Sources/ConstraintInsetTarget.swift; sourceTree = ""; }; - 32A8BED62113FF47E3925378065FA3BE /* SSAlertSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSAlertSwift-prefix.pch"; sourceTree = ""; }; - 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParser.m; path = Core/Source/DTHTMLParser/DTHTMLParser.m; sourceTree = ""; }; - 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCustomColoredAccessory.h; path = Core/Source/iOS/DTCustomColoredAccessory.h; sourceTree = ""; }; - 3424A6DFBC2AC519C7C599F18DCDC89D /* RDEPUBTypesettingPipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTypesettingPipeline.swift; sourceTree = ""; }; - 354C5DD0ACC742762200A640ADA859C6 /* NSCoder+DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCoder+DTCompatibility.h"; path = "Core/Source/NSCoder+DTCompatibility.h"; sourceTree = ""; }; - 361565CCC385512EA14A6A2C9CFAF08B /* RDEPUBStyleSheetComposer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetComposer.swift; sourceTree = ""; }; - 365FB4C3E0FF364C076EE4E9E47C32EA /* DTCoreText.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTCoreText.modulemap; sourceTree = ""; }; - 36FCB869246FE45FD1C9609A34EB4E74 /* DTCoreTextGlyphRun.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextGlyphRun.m; path = Core/Source/DTCoreTextGlyphRun.m; sourceTree = ""; }; - 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBlockFunctions.m; path = Core/Source/DTBlockFunctions.m; sourceTree = ""; }; - 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Sources/ConstraintMakerEditable.swift; sourceTree = ""; }; - 3B610E558C4917C4257DC198EAFEE2F6 /* DTCSSStylesheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSStylesheet.h; path = Core/Source/DTCSSStylesheet.h; sourceTree = ""; }; - 3B931AB189BDDE2CCE8578B50BD60AF0 /* DTIframeTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTIframeTextAttachment.h; path = Core/Source/DTIframeTextAttachment.h; sourceTree = ""; }; - 3BEEDD6EDB66B0EECC515EDCDB618914 /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; - 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Serialization.swift"; path = "Sources/ZIPFoundation/Data+Serialization.swift"; sourceTree = ""; }; - 3E01ED3AA3B7599EB648D7BD507B4D92 /* RDEPUBReaderController+TableOfContents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+TableOfContents.swift"; sourceTree = ""; }; - 3E1485847E9CA847239AB24742D72ABB /* RDEPUBReaderController+PublicAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+PublicAPI.swift"; sourceTree = ""; }; - 414962A3F7230445216E714935F3C22F /* RDEPUBCFITextAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFITextAssertion.swift; sourceTree = ""; }; - 41EB07D58D668A3EE943B8A619CF70E7 /* RDEPUBChapterLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLocation.swift; sourceTree = ""; }; - 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+DTFoundation.m"; path = "Core/Source/iOS/UIView+DTFoundation.m"; sourceTree = ""; }; - 424F12BEB0EDAAF1C719B5103D30C653 /* DTAnchorHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnchorHTMLElement.h; path = Core/Source/DTAnchorHTMLElement.h; sourceTree = ""; }; - 426D442C01742E4361F5BC34D43152A6 /* DTImageTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTImageTextAttachment.h; path = Core/Source/DTImageTextAttachment.h; sourceTree = ""; }; - 42B212FB3162CFF37D51BB3E93F765F5 /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; - 43B3221062F7881536685FE3C927CC7D /* RDEPUBAnnotationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationModels.swift; sourceTree = ""; }; - 43CFADE0F46014990052AD67F17C86FF /* DTAccessibilityViewProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityViewProxy.m; path = Core/Source/DTAccessibilityViewProxy.m; sourceTree = ""; }; - 4428633C8EC3F6289CCF376F588CE0C4 /* NSString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+HTML.m"; path = "Core/Source/NSString+HTML.m"; sourceTree = ""; }; + 30EB4CF4AD4114DE53786C318621EB19 /* NSAttributedStringRunDelegates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NSAttributedStringRunDelegates.h; path = Core/Source/NSAttributedStringRunDelegates.h; sourceTree = ""; }; + 32B07FB6279468CAC8C8496B97B2B543 /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; + 338AA349594E53D0CF40F957CAC5D6BC /* RDEPUBReaderController+RenderSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RenderSupport.swift"; sourceTree = ""; }; + 3453CFB9BDBF6F9D0937EDF5FB2BD07B /* NSURL+DTAppLinks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTAppLinks.m"; path = "Core/Source/iOS/NSURL+DTAppLinks.m"; sourceTree = ""; }; + 34595E922A09667901C926A8EBBC5E1A /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; + 35417EC94F2D58CB80C991F875CE15C2 /* DTBlockFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBlockFunctions.h; path = Core/Source/DTBlockFunctions.h; sourceTree = ""; }; + 3545BDB1B440A560114071D125EA94C7 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; + 354C1C3A74DB75C8B8608D538212A963 /* DTStylesheetHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTStylesheetHTMLElement.m; path = Core/Source/DTStylesheetHTMLElement.m; sourceTree = ""; }; + 3578B97A85BCDC60888FDF87B8F2600C /* NSString+CSS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+CSS.h"; path = "Core/Source/NSString+CSS.h"; sourceTree = ""; }; + 36D5F0FE11BFC4DA5A60FF82CD8D83E4 /* RDEPUBStyleSheetComposer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetComposer.swift; sourceTree = ""; }; + 36E5D959B869D6FFCAE67ACA572FF1C2 /* RDReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+ToolView.swift"; sourceTree = ""; }; + 37327141DC73DE2D5742BE6F989094CE /* DTCoreTextLayoutLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutLine.h; path = Core/Source/DTCoreTextLayoutLine.h; sourceTree = ""; }; + 37AD2B1FCE8C4B62FBC8B751F17EC474 /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; + 38EFC4374585F70CA0057C2B93243BDB /* RDReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.debug.xcconfig; sourceTree = ""; }; + 3985FED7BD8EC49191663BEF73FB2C79 /* NSAttributedString+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTCoreText.h"; path = "Core/Source/NSAttributedString+DTCoreText.h"; sourceTree = ""; }; + 398DC798680E2CA64D46B9E19B380356 /* UIFont+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+DTCoreText.h"; path = "Core/Source/UIFont+DTCoreText.h"; sourceTree = ""; }; + 399AED6BF151EC39BE4450784795A832 /* DTAccessibilityViewProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityViewProxy.h; path = Core/Source/DTAccessibilityViewProxy.h; sourceTree = ""; }; + 3A6A858B976D032A3C61540AFF19DEE4 /* NSURL+DTUnshorten.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTUnshorten.m"; path = "Core/Source/NSURL+DTUnshorten.m"; sourceTree = ""; }; + 3BE6C7E2CF696021A9922C1BB675AB1C /* RDEPUBSelectionState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionState.swift; sourceTree = ""; }; + 3C574CD3AE9D1DCCA02A5270BB1130B6 /* RDEPUBRuntimePageCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimePageCount.swift; sourceTree = ""; }; + 3CD5E5ED855BD807441CC55E7046DC18 /* wxread-replace.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace.css"; sourceTree = ""; }; + 3DAC9D3802A9F165B2F6B09C2DCF0EB7 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; sourceTree = ""; }; + 3E66D8D0604A6C89AA9DD222FE61F0E2 /* RDEPUBAnnotationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationModels.swift; sourceTree = ""; }; + 3EFAE8DFDDEA1E6047289C86D66381C0 /* DTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedLabel.m; path = Core/Source/DTAttributedLabel.m; sourceTree = ""; }; + 40FD7C9E2E05FB4A73F4C4C70A3AFAF0 /* DTCSSListStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSListStyle.m; path = Core/Source/DTCSSListStyle.m; sourceTree = ""; }; + 425D9BA744DFC5E49D875D81AA8761F8 /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; + 42A82DADD6CBBE3627BE13B2E0FC8B34 /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; + 43DB30ED1E8B12F6CEC548FBF1290668 /* RDEPUBPaginationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationModels.swift; sourceTree = ""; }; + 44133205D7FD87B481BF89EA607CA7A4 /* ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ZIPFoundation-Info.plist"; sourceTree = ""; }; + 445D06D06F2D5CB42E95A6292AFA6D42 /* rangy-core.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-core.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-core.js"; sourceTree = ""; }; 4472755F83C121DE5E1E505D145F6DBE /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; - 447E4906FE72C6E3E2AE1CC89D208CAE /* RDEPUBMetadataParseWorker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseWorker.swift; sourceTree = ""; }; - 45C2C1DE970403173708119093BE0108 /* RDEPUBPageResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageResolver.swift; sourceTree = ""; }; - 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Sources/ConstraintPriority.swift; sourceTree = ""; }; - 4600E9C0EF3B23864C9D7E5E90155F9D /* SSAlertSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SSAlertSwift.modulemap; sourceTree = ""; }; - 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Sources/ConstraintLayoutGuideDSL.swift; sourceTree = ""; }; - 46B85AED3D53815F95E435FA3529141C /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; - 477A0FC2A1F0B7F7CCF72D201ECEBAB0 /* DTDictationPlaceholderTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderTextAttachment.m; path = Core/Source/DTDictationPlaceholderTextAttachment.m; sourceTree = ""; }; - 47889215B9D350817A491970E6AED97C /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; - 47B749BBD9F9ECB3CB4876AFB35FA577 /* RDEPUBImageViewerCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewerCoordinator.swift; sourceTree = ""; }; - 48325761E589FE657E084982A81D5DA6 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; + 4476B58B93EE7476A4762FE0E26E8178 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.m; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.m; sourceTree = ""; }; + 44A1AD3BAAAF051B1AB7CE90E0F92BE7 /* RDEPUBPresentationRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPresentationRuntime.swift; sourceTree = ""; }; + 4544C4444DCA90E700611D1281969883 /* DTColorFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTColorFunctions.m; path = Core/Source/DTColorFunctions.m; sourceTree = ""; }; + 45A67761829BBB3974CE24FE50E459EA /* NSDictionary+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTError.m"; path = "Core/Source/NSDictionary+DTError.m"; sourceTree = ""; }; + 462A73405A3D510CF9A7F4B5D63BF2B1 /* RDEPUBCFIMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMarkerInjector.swift; sourceTree = ""; }; + 4641C3C93CE32054665ACF80457A7A94 /* DTCoreTextLayoutFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrame.m; path = Core/Source/DTCoreTextLayoutFrame.m; sourceTree = ""; }; + 467CC59CEC3B3BC7ACDCA776FDCBDC1D /* NSURL+DTComparing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTComparing.m"; path = "Core/Source/NSURL+DTComparing.m"; sourceTree = ""; }; + 477676C456F623C8A33D40A533FA960D /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; + 47DC174612C98B2CFB4E7D158169139E /* default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = default.css; path = Core/Source/default.css; sourceTree = ""; }; 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ZIPFoundation; path = ZIPFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 49291029E1AB55E3D96DCB4484849F65 /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; - 49A21AE1A0AB5383F895B34EA7D6973D /* DTCoreTextGlyphRun.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextGlyphRun.h; path = Core/Source/DTCoreTextGlyphRun.h; sourceTree = ""; }; - 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ZIPFoundation-dummy.m"; sourceTree = ""; }; - 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Helpers.swift"; path = "Sources/ZIPFoundation/Archive+Helpers.swift"; sourceTree = ""; }; - 4AD15109A0B89D836EFB914732706228 /* RDEPUBNavigatorState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorState.swift; sourceTree = ""; }; - 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVersion.m; path = Core/Source/DTVersion.m; sourceTree = ""; }; - 4BCCEDB0636CEB528ED4786686A5767F /* RDEPUBChapterRuntimeStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterRuntimeStore.swift; sourceTree = ""; }; - 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.debug.xcconfig; sourceTree = ""; }; + 4917E08E6E59460594AC443EDDAB7E77 /* DTCoreTextFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFunctions.m; path = Core/Source/DTCoreTextFunctions.m; sourceTree = ""; }; + 4931FAB1E86E9A03A8ACEB033B58F5E3 /* RDEPUBReaderContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderContext.swift; sourceTree = ""; }; + 4944FE0BE3205F2EC91A6A0550D30B75 /* DTTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachment.m; path = Core/Source/DTTextAttachment.m; sourceTree = ""; }; + 499E135F1FEB31C26EB0EF793A90086C /* UIImage+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+DTFoundation.m"; path = "Core/Source/iOS/UIImage+DTFoundation.m"; sourceTree = ""; }; + 4ADEC782AE1E07C94B6F01A8AE1CE2C8 /* RDEPUBReaderLocationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLocationCoordinator.swift; sourceTree = ""; }; + 4B50A66BAEFD8F677924803465049443 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; sourceTree = ""; }; 4C2B218B5EAA5831A036BBF7E1EFC1B9 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; }; - 4C4682C38E0A66C0E9760FC62C00A327 /* RDReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+CollectionView.swift"; sourceTree = ""; }; - 4D2063CE799735F3C4AE37FE11567CBC /* RDEPUBCFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIError.swift; sourceTree = ""; }; - 4D58FC9E6A5173BAA575CE45D07134D0 /* RDEPUBPageCountCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageCountCache.swift; sourceTree = ""; }; - 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+CompressionDeprecated.swift"; path = "Sources/ZIPFoundation/Data+CompressionDeprecated.swift"; sourceTree = ""; }; - 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTActivityTitleView.m; path = Core/Source/iOS/DTActivityTitleView.m; sourceTree = ""; }; - 4F0486D3B46DC92AB254D6EE9CC233BF /* DTAccessibilityElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityElement.m; path = Core/Source/DTAccessibilityElement.m; sourceTree = ""; }; - 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Sources/ConstraintLayoutSupport.swift; sourceTree = ""; }; - 50319253F9CADECC2B97F1734E0C834A /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; - 5077339D9632D68EDAB64BBEF622E154 /* RDEPUBStyleCompatibilityModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleCompatibilityModels.swift; sourceTree = ""; }; - 5155CCDD61E030184249A020FE5D74B0 /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; - 520E0A63146D08FBEFF05CA61FA4B8B6 /* RDEPUBViewportTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBViewportTypes.swift; sourceTree = ""; }; - 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Sources/ConstraintMakerExtendable.swift; sourceTree = ""; }; - 533CFFF04BE7BC4BDEAE11DF675A84CA /* DTBreakHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBreakHTMLElement.h; path = Core/Source/DTBreakHTMLElement.h; sourceTree = ""; }; - 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+DTMoving.m"; path = "Core/Source/NSMutableArray+DTMoving.m"; sourceTree = ""; }; - 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+ZIP.swift"; path = "Sources/ZIPFoundation/URL+ZIP.swift"; sourceTree = ""; }; - 538572A5C098252D629F2185F1B1C9E8 /* DTExtendedFileAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTExtendedFileAttributes.h; path = Core/Source/DTExtendedFileAttributes.h; sourceTree = ""; }; - 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = ""; }; - 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 53F98F0F060B066CAFBCD3C85C26B2B4 /* DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreText.h; path = Core/Source/DTCoreText.h; sourceTree = ""; }; - 545DD46BEAB1D1F7E0530E787095FCB2 /* RDEPUBFontNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontNormalizer.swift; sourceTree = ""; }; - 5539807EBDC1A071F4E7C8C3DA8F4121 /* RDEPUBReaderViewportMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderViewportMonitor.swift; sourceTree = ""; }; - 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTAppLinks.h"; path = "Core/Source/iOS/NSURL+DTAppLinks.h"; sourceTree = ""; }; - 55CA6158EBEFCD459EB481660A12EB86 /* RDReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.release.xcconfig; sourceTree = ""; }; - 56489D9BA834497E48438A4B4E1CCCFF /* DTCoreTextFontDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontDescriptor.h; path = Core/Source/DTCoreTextFontDescriptor.h; sourceTree = ""; }; - 5679D281C282896E6FC352C48E0AF439 /* DTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedLabel.h; path = Core/Source/DTAttributedLabel.h; sourceTree = ""; }; - 575B2D957760E0B9F1480FCB092B6B78 /* RDEPUBCFIDOMPathBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIDOMPathBuilder.swift; sourceTree = ""; }; - 58AD77A6558F2424BFBBB829F7651AAC /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; - 59036F71583DAE2641D9DAA567DBD208 /* RDEPUBTextBuildPipelineInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBuildPipelineInterfaces.swift; sourceTree = ""; }; - 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Compression.swift"; path = "Sources/ZIPFoundation/Data+Compression.swift"; sourceTree = ""; }; + 4CFCD5EFD6EDDC69776A50362DB16409 /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; + 4E1066A8FE63AD2C818E26DDCE62DF58 /* DTHTMLAttributedStringBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLAttributedStringBuilder.h; path = Core/Source/DTHTMLAttributedStringBuilder.h; sourceTree = ""; }; + 4FF4A2A7F2C7CFB5DD757BE1A6E59C7B /* CTLineUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLineUtils.m; path = Core/Source/CTLineUtils.m; sourceTree = ""; }; + 5001C74FB9506AEC71E458047698A4AB /* DTHTMLParserNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserNode.m; path = Core/Source/DTHTMLParserNode.m; sourceTree = ""; }; + 506A3F4E93699E821176158B4E1A74ED /* RDReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDReaderView-dummy.m"; sourceTree = ""; }; + 5096458D9BD2818F786BC3B61B91EAC7 /* NSAttributedString+DTDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTDebug.m"; path = "Core/Source/NSAttributedString+DTDebug.m"; sourceTree = ""; }; + 50C2868064310B16D2B5FD9901C846DC /* DTVideoTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVideoTextAttachment.h; path = Core/Source/DTVideoTextAttachment.h; sourceTree = ""; }; + 51282F5AE6E4F8FCD61A8B05638937D2 /* RDEPUBTextPageDecorationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageDecorationView.swift; sourceTree = ""; }; + 51852C93D034EBE5B7907AA4E69848A1 /* RDEPUBReaderDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDependencies.swift; sourceTree = ""; }; + 519087D9CD0F5E440E6D2C3B1AA1DFA2 /* DTBase64Coding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBase64Coding.h; path = Core/Source/DTBase64Coding.h; sourceTree = ""; }; + 5193541848D2D1BF115A45D8A730611C /* Archive+ReadingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ReadingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+ReadingDeprecated.swift"; sourceTree = ""; }; + 52053ABC9CD3D4A72CD8A22173428AEB /* NSMutableString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableString+HTML.h"; path = "Core/Source/NSMutableString+HTML.h"; sourceTree = ""; }; + 5457E010B7ABAB0EA8F28377908D1F23 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; + 55423549E54A01F039B5F379B264C73F /* UIApplication+DTNetworkActivity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+DTNetworkActivity.h"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.h"; sourceTree = ""; }; + 558FCD3F7E481B782EBFA127486ED15D /* DTHTMLParserTextNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserTextNode.h; path = Core/Source/DTHTMLParserTextNode.h; sourceTree = ""; }; + 55B9309F0BDDDE2C3EE13C97BF2C0F1E /* Archive+Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Helpers.swift"; path = "Sources/ZIPFoundation/Archive+Helpers.swift"; sourceTree = ""; }; + 56E8939081946D090FD77A04F879754C /* DTExtendedFileAttributes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTExtendedFileAttributes.m; path = Core/Source/DTExtendedFileAttributes.m; sourceTree = ""; }; + 56EA8C75C7045AF8F04F2D56ACA2A18B /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; + 57642B518C047A428FE1266A09E0513F /* DTImageTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTImageTextAttachment.m; path = Core/Source/DTImageTextAttachment.m; sourceTree = ""; }; + 57CB038980ADA439CEC82E0EBBD3FC9E /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; 5977986EDFE76D5EF96A6D95483B12F7 /* Pods-ReadViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ReadViewDemo-frameworks.sh"; sourceTree = ""; }; - 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Sources/ConstraintLayoutGuide+Extensions.swift"; sourceTree = ""; }; - 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLog.m; path = Core/Source/DTLog.m; sourceTree = ""; }; - 5B4081F4EC77470F1257F11DB2A4B55D /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; - 5B4D7B26E7ADBB6053AB3D0ECFDBF379 /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; - 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Deprecated.swift"; path = "Sources/ZIPFoundation/Archive+Deprecated.swift"; sourceTree = ""; }; - 5D3CFCA211B02F4FB8BEE828C37A318B /* RDEPUBAttachmentTooltipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipView.swift; sourceTree = ""; }; - 5D62C5531667F364F14DB67D33FFA554 /* DTCoreTextParagraphStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextParagraphStyle.h; path = Core/Source/DTCoreTextParagraphStyle.h; sourceTree = ""; }; - 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTPieProgressIndicator.m; path = Core/Source/iOS/DTPieProgressIndicator.m; sourceTree = ""; }; - 5E791886E59DC0FAB02C6BBAB5BE5B6B /* DTCoreTextFontCollection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontCollection.m; path = Core/Source/DTCoreTextFontCollection.m; sourceTree = ""; }; - 5E8C914D69561C6C9736FCB3C6698CCC /* RDEPUBFragmentMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFragmentMarkerInjector.swift; sourceTree = ""; }; - 5E958924060294CE9417399BB02AB344 /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; - 5F003AB5BAC52B6BF426F57E7C500BA8 /* RDEPUBReaderController+LocationResolution.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+LocationResolution.swift"; sourceTree = ""; }; - 5F760D62F6C6F083374702146337F2CB /* DTCoreTextParagraphStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextParagraphStyle.m; path = Core/Source/DTCoreTextParagraphStyle.m; sourceTree = ""; }; - 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+Serialization.swift"; path = "Sources/ZIPFoundation/Entry+Serialization.swift"; sourceTree = ""; }; - 5F9FE9924520900BBDF724D9903C5309 /* RDEPUBFontFallbackResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontFallbackResolver.swift; sourceTree = ""; }; - 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-umbrella.h"; sourceTree = ""; }; - 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.debug.xcconfig; sourceTree = ""; }; - 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Sources/ConstraintMaker.swift; sourceTree = ""; }; - 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+BackingConfiguration.swift"; path = "Sources/ZIPFoundation/Archive+BackingConfiguration.swift"; sourceTree = ""; }; - 63A6EDF10DA5A051C6CDCBE5D97AF11E /* DTVideoTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVideoTextAttachment.m; path = Core/Source/DTVideoTextAttachment.m; sourceTree = ""; }; - 647FB0C5AAF84C71A7784DD277E48910 /* UIFont+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+DTCoreText.h"; path = "Core/Source/UIFont+DTCoreText.h"; sourceTree = ""; }; - 64868ADD0419A5D112863F638932DA34 /* ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ZIPFoundation-Info.plist"; sourceTree = ""; }; - 648D6AC5A8FA53918EDB418D8A36710E /* RDReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+ToolView.swift"; sourceTree = ""; }; - 64AB89EAB10148C39B726B26BE04F4F8 /* DTCoreTextLayoutLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutLine.h; path = Core/Source/DTCoreTextLayoutLine.h; sourceTree = ""; }; - 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Sources/ConstraintDescription.swift; sourceTree = ""; }; - 66EEA7DA60C7DCD504C673D6CF9B74FC /* RDEPUBSelectionState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionState.swift; sourceTree = ""; }; - 67580684B7C70423FB1C82CD1F685012 /* RDEPUBBackgroundTrace.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundTrace.swift; sourceTree = ""; }; - 67E71F44D9FE962AA1D19EB945E7E657 /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; - 67EA3C4114F424563E73EE3FB42D7CD7 /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; - 68A8597AE94ED09E9828E2EEA0D8FFFA /* RDEPUBChapterTailNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterTailNormalizer.swift; sourceTree = ""; }; - 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLog.h; path = Core/Source/DTLog.h; sourceTree = ""; }; - 6B96B0998B49D8E149C995474DA5FE5F /* DTHTMLWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLWriter.h; path = Core/Source/DTHTMLWriter.h; sourceTree = ""; }; - 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Sources/UILayoutSupport+Extensions.swift"; sourceTree = ""; }; - 6CF99F8C8ED42F614BB051509F8E065B /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; - 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertAnimation.swift; path = Sources/SSAlertSwift/SSAlertAnimation.swift; sourceTree = ""; }; - 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTFormatNumbers.h"; path = "Core/Source/NSString+DTFormatNumbers.h"; sourceTree = ""; }; - 6E7E8438D5E5533B7BE96AC6FA8FD8BD /* wxread-replace-latin.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace-latin.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace-latin.css"; sourceTree = ""; }; - 7036B7E2D1B623419E1EB950E58865CC /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; - 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTiledLayerWithoutFade.m; path = Core/Source/iOS/DTTiledLayerWithoutFade.m; sourceTree = ""; }; - 711A407CD08421E62F3C143957DD10DA /* RDEPUBPaginationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationModels.swift; sourceTree = ""; }; - 713C9FD0354D16AFCCFA630A97F2DA68 /* NSCharacterSet+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCharacterSet+HTML.m"; path = "Core/Source/NSCharacterSet+HTML.m"; sourceTree = ""; }; - 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Sources/ConstraintConfig.swift; sourceTree = ""; }; - 71E2D85A099C99CD82FD1842EE7C52D2 /* NSAttributedString+DTDebug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTDebug.h"; path = "Core/Source/NSAttributedString+DTDebug.h"; sourceTree = ""; }; - 72BE58BB9BF4DCDFDC6D5430AA2E82E9 /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; - 731C0C61E3AD227D691FBA1C2C17BF7B /* NSURL+DTComparing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTComparing.h"; path = "Core/Source/NSURL+DTComparing.h"; sourceTree = ""; }; - 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+ZIP64.swift"; path = "Sources/ZIPFoundation/Entry+ZIP64.swift"; sourceTree = ""; }; - 736A135E9B22B812EE7A51484408FDE1 /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; - 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+DTError.m"; path = "Core/Source/NSArray+DTError.m"; sourceTree = ""; }; - 73A99927E52B24583A6A2CF7E6F23848 /* DTVideoTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVideoTextAttachment.h; path = Core/Source/DTVideoTextAttachment.h; sourceTree = ""; }; - 75C5986EF2D63801A8A30B9D77A7FDD0 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; sourceTree = ""; }; - 75FA8E843D9225BD65EB9D17825EC0F4 /* NSCharacterSet+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCharacterSet+HTML.h"; path = "Core/Source/NSCharacterSet+HTML.h"; sourceTree = ""; }; - 766C440DABE7721B3D2CE226D8189551 /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; - 76919E99E9F16C30FA06F643643AA997 /* RDReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderContentCell.swift; sourceTree = ""; }; - 76C28DE5D3FBC9B7F9C1477C95F14725 /* RDEPUBPresentationRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPresentationRuntime.swift; sourceTree = ""; }; - 76F99C8130EE83A22CD223C7F5E6E66E /* NSAttributedString+SmallCaps.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+SmallCaps.m"; path = "Core/Source/NSAttributedString+SmallCaps.m"; sourceTree = ""; }; - 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+DTNetworkActivity.m"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.m"; sourceTree = ""; }; - 77A613841EB90827AF321DD50B21DB5D /* DTAttributedTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextView.m; path = Core/Source/DTAttributedTextView.m; sourceTree = ""; }; - 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.debug.xcconfig; sourceTree = ""; }; - 78C97EDF23543CE63904C4D8A066A7A1 /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; + 599172147A32B6978EB5AAE1BE55FF7A /* DTAnchorHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnchorHTMLElement.h; path = Core/Source/DTAnchorHTMLElement.h; sourceTree = ""; }; + 59B2B1356107877296E9D282AE94CB05 /* RDEPUBAttachmentTooltipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipView.swift; sourceTree = ""; }; + 5BE399D4DCDB9643D809264D6D5319B2 /* cssInjector.js */ = {isa = PBXFileReference; includeInIndex = 1; name = cssInjector.js; path = Sources/RDReaderView/EPUBCore/Resources/cssInjector.js; sourceTree = ""; }; + 5C3D91FFA65414A2787FEB95576E0097 /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; + 5C891B983F0CC956CAE3978A15875819 /* NSDictionary+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTCoreText.h"; path = "Core/Source/NSDictionary+DTCoreText.h"; sourceTree = ""; }; + 5D146C3F4B7878B5CE8EFF38765580C2 /* DTAccessibilityElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityElement.h; path = Core/Source/DTAccessibilityElement.h; sourceTree = ""; }; + 5D74C449E9554743E9908B79188DB9BC /* RDEPUBReaderState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderState.swift; sourceTree = ""; }; + 5DB480D0B78911DBF96986E64A714907 /* DTListItemHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTListItemHTMLElement.h; path = Core/Source/DTListItemHTMLElement.h; sourceTree = ""; }; + 5DFD3ED6CD42E6EA971DDDD51EDB8CA5 /* RDReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPageChildViewController.swift; sourceTree = ""; }; + 5E62277B737F95B1DFDBC287DC795CB6 /* RDReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderView.swift; sourceTree = ""; }; + 5E8993D56BA3E8692108E3C53CD52806 /* RDEPUBCFIRecoveryEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRecoveryEngine.swift; sourceTree = ""; }; + 5EB446503EBB22EE22C51939A562C457 /* RDEPUBTextBuildPipelineInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBuildPipelineInterfaces.swift; sourceTree = ""; }; + 5EC2AEE3E653B0E8731C706FF3768F46 /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; + 5F50EBEDFE92D5373F3FD62727F74BDE /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; + 5FBE83F7B3B8689CC23FD1657E2A270E /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; + 61228D2169407CE48F19589A5145557B /* RDEPUBTextPageRenderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageRenderView.swift; sourceTree = ""; }; + 61B18088896D291E0CE7718DFE82FAC1 /* DTListItemHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTListItemHTMLElement.m; path = Core/Source/DTListItemHTMLElement.m; sourceTree = ""; }; + 6430501430329643C8280B3985C48711 /* URL+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+ZIP.swift"; path = "Sources/ZIPFoundation/URL+ZIP.swift"; sourceTree = ""; }; + 64798D230A6F5C1C52C7353EF9773BB7 /* RDEPUBCoreTextPageFrameFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCoreTextPageFrameFactory.swift; sourceTree = ""; }; + 662D30C1E74D1D5122921475F4024F73 /* DTActivityTitleView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTActivityTitleView.m; path = Core/Source/iOS/DTActivityTitleView.m; sourceTree = ""; }; + 66BF9E68AC68E641A2F40FB7DE03BA5B /* RDEPUBCFIPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIPath.swift; sourceTree = ""; }; + 671C2429406FDB36B677F4B6EC85B52F /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.h; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.h; sourceTree = ""; }; + 67B4EE257C537D6F72ADDBBE7747BBE2 /* RDEPUBBuildDiagnosticsReporter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBuildDiagnosticsReporter.swift; sourceTree = ""; }; + 67DA49B61A249C2B8241D8FE166608C9 /* UIView+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+DTFoundation.m"; path = "Core/Source/iOS/UIView+DTFoundation.m"; sourceTree = ""; }; + 68705BE557E6C1C112D38D056CD4E8FA /* RDEPUBChapterPageCounter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterPageCounter.swift; sourceTree = ""; }; + 68CF28E1B8594F100BEAC89F7B9CA20F /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; + 68D81DF1BB2A14F9C186F75BBA5CF50D /* DTColor+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTColor+Compatibility.h"; path = "Core/Source/DTColor+Compatibility.h"; sourceTree = ""; }; + 69076FC9D4201719C319547346DA3E21 /* DTTextHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextHTMLElement.m; path = Core/Source/DTTextHTMLElement.m; sourceTree = ""; }; + 692FB048CB12876AA971EF21B3F71A27 /* RDEPUBReaderRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderRuntime.swift; sourceTree = ""; }; + 6AC1E707308CDBC9FFC09CECE3117A9A /* DTAccessibilityViewProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityViewProxy.m; path = Core/Source/DTAccessibilityViewProxy.m; sourceTree = ""; }; + 6C3F8DF48C6EB28BFD05F5BB49793DDA /* FileManager+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIP.swift"; path = "Sources/ZIPFoundation/FileManager+ZIP.swift"; sourceTree = ""; }; + 6C6DCF8FFFAD317C3CA1AEFF60080707 /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; + 6D2316F422A6C97F95F9CF43E6F8E94F /* DTBlockFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBlockFunctions.m; path = Core/Source/DTBlockFunctions.m; sourceTree = ""; }; + 6DCD270CD8C5A0C917FB01A8B3116DF8 /* RDEPUBCFICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFICompatibility.swift; sourceTree = ""; }; + 6E21B10EE150F00F245D297EAB7F2BA2 /* NSNumber+RomanNumerals.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+RomanNumerals.m"; path = "Core/Source/NSNumber+RomanNumerals.m"; sourceTree = ""; }; + 6EADA99F8B48CDCB82A6D2D3507EC32C /* RDEPUBCFISerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFISerializer.swift; sourceTree = ""; }; + 6EBB71B95928ABA41A3B33A9DB8E75DD /* RDEPUBAttachmentNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentNormalizer.swift; sourceTree = ""; }; + 71BBE6384315D7F00F5ECFFF67A85AF9 /* DTHTMLParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParser.m; path = Core/Source/DTHTMLParser/DTHTMLParser.m; sourceTree = ""; }; + 71EE0B4D4D1B3D0A55E903E7E0CA44E7 /* NSAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+HTML.m"; path = "Core/Source/NSAttributedString+HTML.m"; sourceTree = ""; }; + 720396ED306E768BAD28007D5E96B757 /* DTColorFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTColorFunctions.h; path = Core/Source/DTColorFunctions.h; sourceTree = ""; }; + 7203B4D9D997037E0F9D154A3B049738 /* DTAttributedTextContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextContentView.m; path = Core/Source/DTAttributedTextContentView.m; sourceTree = ""; }; + 720B9BA37AAD0EA225492B8341E5B7A3 /* RDEPUBMetadataParseCancellationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseCancellationController.swift; sourceTree = ""; }; + 72225FB74594FCF18DA8064E7DB3947E /* DTCoreTextLayouter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayouter.h; path = Core/Source/DTCoreTextLayouter.h; sourceTree = ""; }; + 722AF38F5106ADDE6F98D282F886A769 /* DTCoreTextFontCollection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontCollection.m; path = Core/Source/DTCoreTextFontCollection.m; sourceTree = ""; }; + 730B56BC97DFF2B1E04DD2608055D9E0 /* UIApplication+DTNetworkActivity.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+DTNetworkActivity.m"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.m"; sourceTree = ""; }; + 736492CB9D329AD8CB8401330973FBCD /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; + 741D74BC489AF6715191F2A88E50B016 /* DTCoreText.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTCoreText.modulemap; sourceTree = ""; }; + 74B33EB0B69C4A347B3F466B751289C5 /* String+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+RDEPUB.swift"; sourceTree = ""; }; + 7503926237A4785CCB864B2BCD1F4C2B /* DTFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.release.xcconfig; sourceTree = ""; }; + 753994141ACB981C898B36B761321C23 /* NSCoder+DTCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCoder+DTCompatibility.m"; path = "Core/Source/NSCoder+DTCompatibility.m"; sourceTree = ""; }; + 761AE6FC1A75A238945BD6F186EAA5E3 /* RDEPUBNoteResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteResolver.swift; sourceTree = ""; }; + 765A94769106D14615FFB30EE1BD5E65 /* Archive+BackingConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+BackingConfiguration.swift"; path = "Sources/ZIPFoundation/Archive+BackingConfiguration.swift"; sourceTree = ""; }; + 766227355308600EFC048F797274454A /* ZIPFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.release.xcconfig; sourceTree = ""; }; + 76C1831768CE55090EADD902B29B6CD1 /* Entry+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+Serialization.swift"; path = "Sources/ZIPFoundation/Entry+Serialization.swift"; sourceTree = ""; }; + 77121A149AA3464C8E6A171329293BD2 /* RDEPUBTextPositionConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPositionConverter.swift; sourceTree = ""; }; + 771E0D5CBCBC013BF5780FEE5BBA81FF /* DTCoreTextGlyphRun.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextGlyphRun.h; path = Core/Source/DTCoreTextGlyphRun.h; sourceTree = ""; }; + 7805DFC2CB71F5B6BBF7891876360EFB /* NSAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+HTML.h"; path = "Core/Source/NSAttributedString+HTML.h"; sourceTree = ""; }; + 78739A559E3A2EA9FA4A1C17B16746DC /* RDEPUBChapterLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLocation.swift; sourceTree = ""; }; + 78887827FF15DE20865DF3A00660993B /* NSDictionary+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTCoreText.m"; path = "Core/Source/NSDictionary+DTCoreText.m"; sourceTree = ""; }; 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ReadViewDemo"; path = Pods_ReadViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+DTFoundation.h"; path = "Core/Source/iOS/UIView+DTFoundation.h"; sourceTree = ""; }; - 7A971ECCC1DDFDE6D5417E949E3B1FD2 /* RDEPUBTextPositionConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPositionConverter.swift; sourceTree = ""; }; - 7AB9016408894675D11069CDAACEDE94 /* DTImage+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTImage+HTML.h"; path = "Core/Source/DTImage+HTML.h"; sourceTree = ""; }; - 7C496AB6A73C2D0BD0FF340A6A2960D5 /* DTHTMLAttributedStringBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLAttributedStringBuilder.m; path = Core/Source/DTHTMLAttributedStringBuilder.m; sourceTree = ""; }; - 7D0C0A9C17CB99D2B116A2E6450CE89D /* RDEPUBNoteDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteDetector.swift; sourceTree = ""; }; - 7D63AE1801C7AB149219317BE7529B26 /* DTAnchorHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnchorHTMLElement.m; path = Core/Source/DTAnchorHTMLElement.m; sourceTree = ""; }; - 7EC91512D3BEFEDF5FCCF2E267E48B32 /* RDEPUBReaderPaginationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPaginationCoordinator.swift; sourceTree = ""; }; - 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+DTFoundation.m"; path = "Core/Source/iOS/UIScreen+DTFoundation.m"; sourceTree = ""; }; - 7F8C64CB3F3D0B7D4AA66798C740CB20 /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; - 7FC4B1718DDF94A99192ABD5C1B24DAC /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; - 80A3A50AC272F9C52395F4818E87EA19 /* RDReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 80B3D15ED0D19D020663EF055386291A /* DTColor+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTColor+Compatibility.h"; path = "Core/Source/DTColor+Compatibility.h"; sourceTree = ""; }; - 80D9ED51333D0F99752A8408020C77AF /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; - 80F37ED477F71A78A2658E146A2A5CB3 /* RDEPUBReaderController+RuntimeBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RuntimeBridge.swift"; sourceTree = ""; }; - 81211446372A6A55789AA7E7152E7084 /* RDEPUBCoreTextPageFrameFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCoreTextPageFrameFactory.swift; sourceTree = ""; }; - 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertDefaultAnmation.swift; path = Sources/SSAlertSwift/SSAlertDefaultAnmation.swift; sourceTree = ""; }; - 81F0FDEEC9D85F08CD97F555356F985C /* RDEPUBReaderUIState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderUIState.swift; sourceTree = ""; }; - 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTActivityTitleView.h; path = Core/Source/iOS/DTActivityTitleView.h; sourceTree = ""; }; + 78EB9889508A20E866AC37B22D441FC4 /* RDReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.release.xcconfig; sourceTree = ""; }; + 7941BAA5BADB40ACC8FBC080977F6B51 /* RDReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderFlowLayout.swift; sourceTree = ""; }; + 796EF27FF6AA4B62367B6BD9CEBD85A8 /* DTCSSStylesheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSStylesheet.h; path = Core/Source/DTCSSStylesheet.h; sourceTree = ""; }; + 79D13938A04579CD1E9E042A39CC4D86 /* ZIPFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.debug.xcconfig; sourceTree = ""; }; + 7A13F9221A300A89F9F8D0A2AB1794BF /* DTCoreText.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.release.xcconfig; sourceTree = ""; }; + 7A4E9E54E556A72BC885CCC08B3791C1 /* DTHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLElement.m; path = Core/Source/DTHTMLElement.m; sourceTree = ""; }; + 7C60AB9DEFB015F6E3A40DECE78AC69B /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; + 7C80941DE172AF972D2247659684D93A /* NSString+DTUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTUtilities.h"; path = "Core/Source/NSString+DTUtilities.h"; sourceTree = ""; }; + 7CA72FA9A4F2F42A75C58325738A44AC /* NSMutableAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableAttributedString+HTML.m"; path = "Core/Source/NSMutableAttributedString+HTML.m"; sourceTree = ""; }; + 7CFFB65C5D340A4B5C627B3EF02CD127 /* NSNumber+RomanNumerals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+RomanNumerals.h"; path = "Core/Source/NSNumber+RomanNumerals.h"; sourceTree = ""; }; + 7D4062C36BA5FFBAE9122CAD0DCEC6B6 /* DTCoreText-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-prefix.pch"; sourceTree = ""; }; + 7D8AE4BEBD1998839BA83AD05CA6CAC5 /* DTBreakHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBreakHTMLElement.m; path = Core/Source/DTBreakHTMLElement.m; sourceTree = ""; }; + 8097E74036B5D6E168E9714A580060A8 /* RDEPUBChapterLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLoader.swift; sourceTree = ""; }; + 814315319ED50AF916C3C8A68C0A47A0 /* DTAttributedTextCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextCell.m; path = Core/Source/DTAttributedTextCell.m; sourceTree = ""; }; + 817CF1C7E3DF9EA0272F660987E896AA /* RDEPUBPaginationCacheCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationCacheCoordinator.swift; sourceTree = ""; }; + 8184024038D8B93BD22ECAAB863B41D9 /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "RDReaderView-RDReaderViewAssets"; path = RDReaderViewAssets.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 83E37DC74BB53F90A5AD54842858A62F /* NSString+Paragraphs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Paragraphs.h"; path = "Core/Source/NSString+Paragraphs.h"; sourceTree = ""; }; - 8421441F10DCB0EDBCF03EAC1018BAD2 /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; - 84EB75472DB29B600C9185A097D117B7 /* RDEPUBReaderChromeCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChromeCoordinator.swift; sourceTree = ""; }; - 8552BE1A1F6A6D2879763DE3B2B8A2DD /* NSNumber+RomanNumerals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+RomanNumerals.h"; path = "Core/Source/NSNumber+RomanNumerals.h"; sourceTree = ""; }; - 85AC8A746E7DE5FC77159ABF4085CAC7 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; - 86A0361390AA0C29BC1A5487083A12A7 /* DTColorFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTColorFunctions.h; path = Core/Source/DTColorFunctions.h; sourceTree = ""; }; - 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Sources/ConstraintPriorityTarget.swift; sourceTree = ""; }; - 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Sources/ConstraintRelatableTarget.swift; sourceTree = ""; }; - 89755690B804A64EE69FE2D7321CA9B6 /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; - 8A19E1D6BC8D283B9BC4BA0EBECBF172 /* RDEPUBBackgroundCoverageStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundCoverageStore.swift; sourceTree = ""; }; - 8A1D29D22B94FD4B310B5A419E79057B /* RDReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDReaderView-Info.plist"; sourceTree = ""; }; - 8ABDEFEA94DC6408D92AC66DA3625DE5 /* NSString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+HTML.h"; path = "Core/Source/NSString+HTML.h"; sourceTree = ""; }; - 8AE69217E6A738AC11FEB58F2603B17F /* wxread-dark.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-dark.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-dark.css"; sourceTree = ""; }; + 8485FAD7356F83F96C2CF8F2171C1DFB /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; + 8563248DA3F6A02F5A355DBD1D57E80D /* RDEPUBCSSCompatibilityLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCSSCompatibilityLayer.swift; sourceTree = ""; }; + 85E8DA9DE1F796F12171763D20CBAF27 /* DTFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.debug.xcconfig; sourceTree = ""; }; + 8718F2DB8F0DC085CB012D9996596F3F /* NSString+CSS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+CSS.m"; path = "Core/Source/NSString+CSS.m"; sourceTree = ""; }; + 88464D2E3579F1A5B25DCCA128528938 /* DTCoreTextFontDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontDescriptor.m; path = Core/Source/DTCoreTextFontDescriptor.m; sourceTree = ""; }; + 88EFF88D4E3001A8D2D0E50EF9B94BBA /* RDEPUBChapterDataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDataCache.swift; sourceTree = ""; }; + 89268DC8F1FBDE4F3167647B6A4F9216 /* DTHorizontalRuleHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHorizontalRuleHTMLElement.h; path = Core/Source/DTHorizontalRuleHTMLElement.h; sourceTree = ""; }; + 893DFE6F010A222A98E905EA778740A0 /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; + 89AB081C4A259D931A865EA5A797CAFF /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; + 8A7E0C51CE893B8040C6A49E9E973226 /* RDReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderContentCell.swift; sourceTree = ""; }; 8B35D0622F339A5B8A864FAA0C9EAE47 /* Pods-ReadViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-acknowledgements.plist"; sourceTree = ""; }; - 8B59C9A1B265393E4BA8383B308A5917 /* DTHTMLAttributedStringBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLAttributedStringBuilder.h; path = Core/Source/DTHTMLAttributedStringBuilder.h; sourceTree = ""; }; - 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFoundationConstants.m; path = Core/Source/DTFoundationConstants.m; sourceTree = ""; }; - 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVersion.h; path = Core/Source/DTVersion.h; sourceTree = ""; }; - 8C7F146589FBD04B46D846AE1ECBD10A /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; - 8CFEE298DD52246B46E6FA62B16B38DF /* DTTextHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextHTMLElement.m; path = Core/Source/DTTextHTMLElement.m; sourceTree = ""; }; - 8E3E834CCC952717089550F50A2DE59C /* SSAlertSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SSAlertSwift-Info.plist"; sourceTree = ""; }; - 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Sources/ConstraintViewDSL.swift; sourceTree = ""; }; - 8F2D44B82815CA3397BE2C9F64819B88 /* DTCoreTextFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFunctions.m; path = Core/Source/DTCoreTextFunctions.m; sourceTree = ""; }; - 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Sources/ConstraintOffsetTarget.swift; sourceTree = ""; }; - 8F9C05A5DE7C804D6531F4BBF31A3045 /* rangy-core.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-core.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-core.js"; sourceTree = ""; }; - 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Sources/ConstraintDirectionalInsets.swift; sourceTree = ""; }; - 9129D37C7F89AD8FD530663BB4503FC0 /* NSCoder+DTCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCoder+DTCompatibility.m"; path = "Core/Source/NSCoder+DTCompatibility.m"; sourceTree = ""; }; - 92460D196C5300656C9649784EBD3C58 /* NSAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+HTML.m"; path = "Core/Source/NSAttributedString+HTML.m"; sourceTree = ""; }; - 92AD29D1A051D00F5525A240E49B00A2 /* RDEPUBChapterWarmupOrchestrator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWarmupOrchestrator.swift; sourceTree = ""; }; - 92E7747B6F898FB12DFE1CE4ABDC3531 /* RDEPUBReaderSearchCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchCoordinator.swift; sourceTree = ""; }; - 930D75A53D2FD874346BF17C0A2CB1BC /* RDEPUBCFI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFI.swift; sourceTree = ""; }; - 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Sources/LayoutConstraint.swift; sourceTree = ""; }; - 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ReadingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+ReadingDeprecated.swift"; sourceTree = ""; }; - 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SSAlertSwift-umbrella.h"; sourceTree = ""; }; - 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Sources/Typealiases.swift; sourceTree = ""; }; - 953EF1E3CA69D8F4BF3E4D41B1BEAE2C /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; - 9551DE4A9087AF37320340372B24F7CA /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; - 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+DTNetworkActivity.h"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.h"; sourceTree = ""; }; - 96331868591D020B267B45CA8EF65355 /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; - 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTSmartPagingScrollView.m; path = Core/Source/iOS/DTSmartPagingScrollView.m; sourceTree = ""; }; - 96FA99AA7D4AD0D4246C8DAC1CC0C24E /* DTStylesheetHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTStylesheetHTMLElement.h; path = Core/Source/DTStylesheetHTMLElement.h; sourceTree = ""; }; - 979486118B3E90C08386079D57962701 /* SnapKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertAnimationController.swift; path = Sources/SSAlertSwift/SSAlertAnimationController.swift; sourceTree = ""; }; - 982391EC8620A617B8788C8A6101C96A /* DTDictationPlaceholderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderView.h; path = Core/Source/DTDictationPlaceholderView.h; sourceTree = ""; }; - 98658510AA525496EBF5792E5D9884ED /* DTListItemHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTListItemHTMLElement.h; path = Core/Source/DTListItemHTMLElement.h; sourceTree = ""; }; - 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+WritingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+WritingDeprecated.swift"; sourceTree = ""; }; - 99299A9FD6EF739D18352AC5B9325CB0 /* DTAccessibilityElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityElement.h; path = Core/Source/DTAccessibilityElement.h; sourceTree = ""; }; - 9A1B75050E71BDD96FC19EC6BA129E6A /* DTLinkButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLinkButton.m; path = Core/Source/DTLinkButton.m; sourceTree = ""; }; - 9A2A285973A8C8A81A03D472845DA414 /* RDEPUBNoteModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteModels.swift; sourceTree = ""; }; - 9AD7F70FD18BED0C429A85E579ABF569 /* RDEPUBNotePopupCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupCoordinator.swift; sourceTree = ""; }; - 9B8F910B6B575B689194F9E306239FD5 /* RDEPUBBackgroundPriorityPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundPriorityPolicy.swift; sourceTree = ""; }; - 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTComparing.m"; path = "Core/Source/NSURL+DTComparing.m"; sourceTree = ""; }; - 9C1B2F1D8E3F93A60375AA8853FF1842 /* RDReaderTapRegionHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderTapRegionHandler.swift; sourceTree = ""; }; - 9C6293E97E128E98559FB74D9A342EAD /* NSMutableString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableString+HTML.h"; path = "Core/Source/NSMutableString+HTML.h"; sourceTree = ""; }; - 9C89744F4424D96B176330404D1D82C7 /* RDEPUBTextPageDecorationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageDecorationView.swift; sourceTree = ""; }; - 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = ""; }; - 9D28F67E16027AF4FA4F9D501C4D0712 /* RDReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-umbrella.h"; sourceTree = ""; }; - 9D6C48939A8498A09DCFC7F41ECB8A25 /* NSString+CSS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+CSS.h"; path = "Core/Source/NSString+CSS.h"; sourceTree = ""; }; + 8B8FDAF9E8370366F7FA8524CB0D80B3 /* DTTextAttachmentHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachmentHTMLElement.h; path = Core/Source/DTTextAttachmentHTMLElement.h; sourceTree = ""; }; + 8BA617294E6371DD7FAC32B61E0873F2 /* DTPieProgressIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTPieProgressIndicator.m; path = Core/Source/iOS/DTPieProgressIndicator.m; sourceTree = ""; }; + 8C51FE03884113569904AAA4CAA3AEB6 /* wxread-default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-default.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-default.css"; sourceTree = ""; }; + 8C9575F05D72C239E7E6F079BACDF4C7 /* DTVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVersion.h; path = Core/Source/DTVersion.h; sourceTree = ""; }; + 8CF7CEB31BED0554F3EF3D3442A89B47 /* DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreText.h; path = Core/Source/DTCoreText.h; sourceTree = ""; }; + 8DA0F94C0870C1F0DFADE5E9045E5E6E /* DTDictationPlaceholderTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderTextAttachment.m; path = Core/Source/DTDictationPlaceholderTextAttachment.m; sourceTree = ""; }; + 8E5297E7F5769C61C1838962BA76D4F5 /* NSArray+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+DTError.m"; path = "Core/Source/NSArray+DTError.m"; sourceTree = ""; }; + 8EDA1618562CC224690CF6FC03AFED38 /* DTObjectTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTObjectTextAttachment.m; path = Core/Source/DTObjectTextAttachment.m; sourceTree = ""; }; + 8F25D7766B9F7B666C309052CA726A7B /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; + 8F2DF1EE547C972C1BF12018AFFC5142 /* RDEPUBNoteDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteDetector.swift; sourceTree = ""; }; + 8F653EFBBEDAAC96A34BC93B4211E792 /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; + 8FAAF640165FC1B4B47C546F80D98B1E /* DTColor+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTColor+Compatibility.m"; path = "Core/Source/DTColor+Compatibility.m"; sourceTree = ""; }; + 91C1D68B23A3D8DAF1C0934F17A09917 /* RDEPUBFragmentMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFragmentMarkerInjector.swift; sourceTree = ""; }; + 94705DADD1F09F4162F7D733318238F4 /* NSData+DTCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+DTCrypto.h"; path = "Core/Source/NSData+DTCrypto.h"; sourceTree = ""; }; + 94AC74FD0844C7054C87B2A9D27D847D /* RDEPUBTextSelectionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSelectionController.swift; sourceTree = ""; }; + 94F5CBFE8EF3307F3C9B0E25A5F70E70 /* RDEPUBReaderUIState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderUIState.swift; sourceTree = ""; }; + 9542AFE3A82C8AE56576254CE196E71A /* DTCustomColoredAccessory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCustomColoredAccessory.m; path = Core/Source/iOS/DTCustomColoredAccessory.m; sourceTree = ""; }; + 978449466D53EA6F5D40FCF0F353DDCA /* NSAttributedString+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTCoreText.m"; path = "Core/Source/NSAttributedString+DTCoreText.m"; sourceTree = ""; }; + 98A9D1AD928E701623173D31FC8B35F7 /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; + 98CF9C5D504838741E399811F4D5A0B7 /* NSAttributedString+SmallCaps.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+SmallCaps.m"; path = "Core/Source/NSAttributedString+SmallCaps.m"; sourceTree = ""; }; + 9998A80A1B633EB1C2C1EBB107866B40 /* RDEPUBCFITextAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFITextAssertion.swift; sourceTree = ""; }; + 9A19BDED17612309ACF1752937514F77 /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; + 9A957A416473B3393454FF640ACD97E8 /* RDReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+CollectionView.swift"; sourceTree = ""; }; + 9C12A4A5BB42D0F68DABBD3BDF103BC5 /* DTDictationPlaceholderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderView.h; path = Core/Source/DTDictationPlaceholderView.h; sourceTree = ""; }; + 9C3615C94C147AEA92F022E119810E9F /* Data+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Serialization.swift"; path = "Sources/ZIPFoundation/Data+Serialization.swift"; sourceTree = ""; }; + 9C5E29D728B8CD4EABC0B3DD9CD9DE99 /* UIScreen+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+DTFoundation.h"; path = "Core/Source/iOS/UIScreen+DTFoundation.h"; sourceTree = ""; }; + 9C6CE93FAA68605C6B90FF844A98E440 /* CTLineUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLineUtils.h; path = Core/Source/CTLineUtils.h; sourceTree = ""; }; + 9CA110E3D360292AAFB29F380653D9CE /* RDEPUBReaderAnnotationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAnnotationCoordinator.swift; sourceTree = ""; }; + 9D53D1FE67166E6B0675584BCB425A05 /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; + 9D70402AAC82BB390480E18E45DCF11A /* RDURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDURLReaderController.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Sources/ConstraintLayoutGuide.swift; sourceTree = ""; }; - 9F8BA45FA0D8E3CBAAE6E18272EB0644 /* RDReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDReaderView.debug.xcconfig; sourceTree = ""; }; - 9F8F40493DF0BBB3EA5FC1F759A883C4 /* ResourceBundle-Resources-DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Resources-DTCoreText-Info.plist"; sourceTree = ""; }; - A027614C026728AE2CA282D837F97936 /* RDEPUBPageMapReconciliationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageMapReconciliationCoordinator.swift; sourceTree = ""; }; - A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Sources/ConstraintView.swift; sourceTree = ""; }; - A0927A875CA1F11DBCE60DFC6F0CA0B6 /* NSScanner+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSScanner+HTML.h"; path = "Core/Source/NSScanner+HTML.h"; sourceTree = ""; }; - A0BD48DAF5AE9DB087F2552E99069709 /* DTBlockFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBlockFunctions.h; path = Core/Source/DTBlockFunctions.h; sourceTree = ""; }; - A0EBAC7714A5F73B75AAB47D24B08B71 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Sources/Constraint.swift; sourceTree = ""; }; - A138DB38231B185E189787D33D3B4950 /* RDEPUBReaderLocationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLocationCoordinator.swift; sourceTree = ""; }; - A1B031E2B903C2F177195C1C3D1D1EDB /* DTCoreTextFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFunctions.h; path = Core/Source/DTCoreTextFunctions.h; sourceTree = ""; }; - A24AB4F9BE6993854E38FD95A30B9845 /* RDEPUBCFIResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIResolver.swift; sourceTree = ""; }; - A276DE925253460239BFAEC7663F60D3 /* DTAttributedTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextView.h; path = Core/Source/DTAttributedTextView.h; sourceTree = ""; }; - A2C299CFB47AA6ECF86F7348E1EB751F /* NSMutableAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableAttributedString+HTML.h"; path = "Core/Source/NSMutableAttributedString+HTML.h"; sourceTree = ""; }; - A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTPaths.m"; path = "Core/Source/NSString+DTPaths.m"; sourceTree = ""; }; - A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+DTFoundation.h"; path = "Core/Source/iOS/UIScreen+DTFoundation.h"; sourceTree = ""; }; - A47E648062E9BDBB9E46BD3DC4E12801 /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; - A4E43DCDE0C8751557E7E65FEEB1C865 /* DTLazyImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLazyImageView.m; path = Core/Source/DTLazyImageView.m; sourceTree = ""; }; - A61F5753AE7B5122FE65CF07CF1AD5FD /* RDReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDReaderView-dummy.m"; sourceTree = ""; }; - A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsetTarget.swift; path = Sources/ConstraintDirectionalInsetTarget.swift; sourceTree = ""; }; - A68D72764140BC3DF67A2B9E52CEC7A4 /* DTHorizontalRuleHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHorizontalRuleHTMLElement.m; path = Core/Source/DTHorizontalRuleHTMLElement.m; sourceTree = ""; }; - A7F40EAB66363D681DA68981B17FB492 /* RDReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPagingController.swift; sourceTree = ""; }; - A8052EE9D31E2F5253234D9A7C6A8218 /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; - A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreGraphicsUtils.m; path = Core/Source/DTCoreGraphicsUtils.m; sourceTree = ""; }; - A988B95153188D52B4BF9F4083BB18E9 /* RDEPUBTextAnnotationOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnnotationOverlay.swift; sourceTree = ""; }; - A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnimatedGIF.h; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.h; sourceTree = ""; }; + 9DF9B7EF7992895E4AA2E398522498BC /* rangy-serializer.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-serializer.js"; path = "Sources/RDReaderView/EPUBCore/Resources/rangy-serializer.js"; sourceTree = ""; }; + 9FE811B58EF82E20354C3DABE712313F /* RDEPUBBackgroundPriorityPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundPriorityPolicy.swift; sourceTree = ""; }; + A0A47D7B73C87872B9B05E80A4254D4C /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; + A13D725843764880816F43281F2363FC /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; + A16F8F582626936AC8B388F57B74A6F5 /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; + A1E58E922721839C1D9E53D2DFA357A8 /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; + A20F6F0463A998DC3BD53DE9E63B63DE /* DTSmartPagingScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTSmartPagingScrollView.m; path = Core/Source/iOS/DTSmartPagingScrollView.m; sourceTree = ""; }; + A26FAE3FB6F9DBBC672161B173177A5C /* RDEPUBCFIDOMPathBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIDOMPathBuilder.swift; sourceTree = ""; }; + A29809A2BF0AD11378C7FDE3406150B1 /* RDEPUBReaderController+LocationResolution.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+LocationResolution.swift"; sourceTree = ""; }; + A3BD3ED7913130D32E14D5572CBCC921 /* NSString+DTFormatNumbers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTFormatNumbers.h"; path = "Core/Source/NSString+DTFormatNumbers.h"; sourceTree = ""; }; + A3DE08AC23FE36A6C3F33A04700FDE57 /* DTAnimatedGIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnimatedGIF.m; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.m; sourceTree = ""; }; + A3F7613E99CAA29881A015D0ED969B86 /* NSURL+DTAppLinks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTAppLinks.h"; path = "Core/Source/iOS/NSURL+DTAppLinks.h"; sourceTree = ""; }; + A416E2F4584E41C30A3352FFD3824BE2 /* UIColor+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUB.swift"; sourceTree = ""; }; + A511C95B0250D33F33026861C48BF655 /* WeReadApi.js */ = {isa = PBXFileReference; includeInIndex = 1; name = WeReadApi.js; path = Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js; sourceTree = ""; }; + A592A34CA2EA792DDFAFAEB516FE8A10 /* NSCoder+DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCoder+DTCompatibility.h"; path = "Core/Source/NSCoder+DTCompatibility.h"; sourceTree = ""; }; + A5D1FFCB042340FB917DAAE076DD1CCF /* DTFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTFoundation.modulemap; sourceTree = ""; }; + A601AB41E9B4878B34FC3380355F8DD9 /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; + A61C8F1BDD76EA59082F65269083BD08 /* DTCoreTextConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextConstants.h; path = Core/Source/DTCoreTextConstants.h; sourceTree = ""; }; + A6F6D9E3E51175232197195809304FB2 /* RDReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDReaderView.modulemap; sourceTree = ""; }; + A7E167717A18E0C858C6FD95804249E4 /* NSCharacterSet+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCharacterSet+HTML.h"; path = "Core/Source/NSCharacterSet+HTML.h"; sourceTree = ""; }; + A7E40C17B95F3BFCE6E70D0591DA6F7F /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; + A8A086525BF509F4581693115438B82B /* NSAttributedString+DTDebug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTDebug.h"; path = "Core/Source/NSAttributedString+DTDebug.h"; sourceTree = ""; }; + A8CC38EFEF171FFEE008C32A6319BE6A /* DTFolderMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFolderMonitor.h; path = Core/Source/DTFolderMonitor.h; sourceTree = ""; }; AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ReadViewDemo-dummy.m"; sourceTree = ""; }; - AA3CFD777AD76F97EBA05B3920F5786A /* DTIframeTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTIframeTextAttachment.m; path = Core/Source/DTIframeTextAttachment.m; sourceTree = ""; }; - AA89765B94A26A186DC7829FF979DBC3 /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; - AB3DF251DDD78EDAEE82FBEBDF9CE79B /* RDReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPageChildViewController.swift; sourceTree = ""; }; - AB48BF4B843D518C890BDD2AC749E640 /* RDEPUBCFIRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRange.swift; sourceTree = ""; }; - AB8FBD335486F255F42811FC49E5657C /* UIColor+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUB.swift"; sourceTree = ""; }; - AD2CC39C57A942917B961FC8E73D80F7 /* RDEPUBCFIMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMap.swift; sourceTree = ""; }; - AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Progress.swift"; path = "Sources/ZIPFoundation/Archive+Progress.swift"; sourceTree = ""; }; - ADC5AC8FD4EC45E9BA5654A38715BB93 /* DTTextBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextBlock.m; path = Core/Source/DTTextBlock.m; sourceTree = ""; }; - AF6879143052D4942E4FEA0F92504804 /* RDEPUBReaderSearchBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchBarView.swift; sourceTree = ""; }; - AFC4C9F69BF2D0CAEBAA83896C139D2C /* DTColorFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTColorFunctions.m; path = Core/Source/DTColorFunctions.m; sourceTree = ""; }; - AFE0B56638AFB77F4455784A7ED59876 /* DTDictationPlaceholderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderView.m; path = Core/Source/DTDictationPlaceholderView.m; sourceTree = ""; }; - AFE6D8828F2634226CDA2F79A19625E3 /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; - B0500CA69405E23B09291359EB28331E /* NSMutableAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableAttributedString+HTML.m"; path = "Core/Source/NSMutableAttributedString+HTML.m"; sourceTree = ""; }; - B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+DTMoving.h"; path = "Core/Source/NSMutableArray+DTMoving.h"; sourceTree = ""; }; - B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Sources/ConstraintMakerFinalizable.swift; sourceTree = ""; }; - B1AF2749008FE67A3281B83EE327E41D /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; - B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFolderMonitor.m; path = Core/Source/DTFolderMonitor.m; sourceTree = ""; }; - B2B3D0CB47B0A8E9EC5AF48B7F2DD6B0 /* DTCoreTextConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextConstants.m; path = Core/Source/DTCoreTextConstants.m; sourceTree = ""; }; - B2D39C06DF04E8847916639D58650315 /* RDEPUBReaderContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderContext.swift; sourceTree = ""; }; + AC0A4ED7E936923A29A5EEB1D95D6B55 /* DTTextAttachmentHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachmentHTMLElement.m; path = Core/Source/DTTextAttachmentHTMLElement.m; sourceTree = ""; }; + AC145C21118E90789E7954C445DE047E /* RDEPUBNotePopupViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupViewController.swift; sourceTree = ""; }; + ACA6D26B26D2653D6E1C871A482BD6DF /* NSURL+DTUnshorten.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTUnshorten.h"; path = "Core/Source/NSURL+DTUnshorten.h"; sourceTree = ""; }; + ACD2A4FF41C5A223C2D4B74E0EDA9B2C /* DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTCoreText-Info.plist"; sourceTree = ""; }; + AD5C20289C05F4C1BAD1B1DEEF2485C1 /* RDEPUBTypesettingPipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTypesettingPipeline.swift; sourceTree = ""; }; + ADD5B2F66FCCFB58393314E7B9FE4384 /* NSMutableArray+DTMoving.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+DTMoving.m"; path = "Core/Source/NSMutableArray+DTMoving.m"; sourceTree = ""; }; + AEB527B9C4921752C6B00B0D032F379D /* RDEPUBCFIUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIUtilities.swift; sourceTree = ""; }; + AF1516035C269F7A41EE064AAB14D562 /* DTActivityTitleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTActivityTitleView.h; path = Core/Source/iOS/DTActivityTitleView.h; sourceTree = ""; }; + AF436E76C893E223A4F0BE86C1276054 /* UIScreen+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+DTFoundation.m"; path = "Core/Source/iOS/UIScreen+DTFoundation.m"; sourceTree = ""; }; + B0218A7B243387C79E099CA947CF243D /* Archive+Writing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Writing.swift"; path = "Sources/ZIPFoundation/Archive+Writing.swift"; sourceTree = ""; }; + B08FB1ED81E67058DC00376CA1DFC963 /* RDEPUBTextPaginationInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationInterfaces.swift; sourceTree = ""; }; + B0F1230C085573028B4BC891EA8040C3 /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; + B12CE4962CDC324FB47FB92D6706D149 /* DTLinkButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLinkButton.h; path = Core/Source/DTLinkButton.h; sourceTree = ""; }; + B23C5F038DAC52B75213C0760C431F2B /* DTHTMLWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLWriter.m; path = Core/Source/DTHTMLWriter.m; sourceTree = ""; }; + B37118B8D16847B0F82E06A5B33898AB /* DTCSSStylesheet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSStylesheet.m; path = Core/Source/DTCSSStylesheet.m; sourceTree = ""; }; + B38D5053661772BF3BDE06F5357B5A96 /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; + B39E73DF030C0B322474D5986AD2D2FE /* RDEPUBReaderController+AttachmentTooltip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+AttachmentTooltip.swift"; sourceTree = ""; }; + B41F7D27C2336F89BB0185ACB0B19EA9 /* ZIPFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-umbrella.h"; sourceTree = ""; }; + B43D7603C0D66635268842EC0A2655AC /* NSFileWrapper+DTCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileWrapper+DTCopying.h"; path = "Core/Source/NSFileWrapper+DTCopying.h"; sourceTree = ""; }; + B4A7F7402FAEE3A277A8716DDA115C95 /* NSString+Paragraphs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Paragraphs.m"; path = "Core/Source/NSString+Paragraphs.m"; sourceTree = ""; }; + B4D20A2B33F9F4DD8499FB462DE2731F /* DTAttributedTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextView.h; path = Core/Source/DTAttributedTextView.h; sourceTree = ""; }; B50104DE2E35D820ECA22CDB3E6F96EA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - B509CD4B498635D4536245E43D802ED9 /* DTCSSListStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSListStyle.m; path = Core/Source/DTCSSListStyle.m; sourceTree = ""; }; - B55E6E99C6F879CFD19D3674CE20075C /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; - B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; - B62755E9A395FF22E7405C3FE192D5F3 /* RDEPUBChapterPageCounter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterPageCounter.swift; sourceTree = ""; }; - B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreGraphicsUtils.h; path = Core/Source/DTCoreGraphicsUtils.h; sourceTree = ""; }; - B7672A26922DBD934FA1AC60D49EB322 /* NSNumber+RomanNumerals.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+RomanNumerals.m"; path = "Core/Source/NSNumber+RomanNumerals.m"; sourceTree = ""; }; - B7DD486B95807F803EF1DD2976017779 /* RDEPUBChapterSummaryDiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterSummaryDiskCache.swift; sourceTree = ""; }; - B84FD477EF687A49F011E7FA557C1791 /* RDEPUBChapterCacheKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterCacheKey.swift; sourceTree = ""; }; - B898A07D2E7D8E62F64BD28BAFA3DEFA /* RDEPUBRenderDiagnosticsCollector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderDiagnosticsCollector.swift; sourceTree = ""; }; - B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBase64Coding.h; path = Core/Source/DTBase64Coding.h; sourceTree = ""; }; - B99FF5D96CD045BCC53A9F6F8493C379 /* RDEPUBReaderController+DataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+DataSource.swift"; sourceTree = ""; }; - B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SnapKit-SnapKit_Privacy"; path = SnapKit_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - B9E40164920C9AC1B1413C51835CD370 /* DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTCoreText-Info.plist"; sourceTree = ""; }; - BA142E0FB9C9440BA93BE7BF027F095F /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; - BAA55250015C69FA24DCF3808A74ACA5 /* RDEPUBTextContentInteractionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentInteractionCoordinator.swift; sourceTree = ""; }; - BC1AE55A8C17840C96761BE01A89653E /* RDEPUBDarkImageAdjuster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDarkImageAdjuster.swift; sourceTree = ""; }; - BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnimatedGIF.m; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.m; sourceTree = ""; }; - BCCA590DB72AA93275262A414F16578A /* DTCoreTextFontDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontDescriptor.m; path = Core/Source/DTCoreTextFontDescriptor.m; sourceTree = ""; }; - BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Sources/ConstraintMakerRelatable.swift; sourceTree = ""; }; - BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Entry.swift; path = Sources/ZIPFoundation/Entry.swift; sourceTree = ""; }; - BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTUtilities.h"; path = "Core/Source/NSString+DTUtilities.h"; sourceTree = ""; }; - BF4F3EC137168B92A5DA85AF50CD239F /* NSAttributedString+DTDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTDebug.m"; path = "Core/Source/NSAttributedString+DTDebug.m"; sourceTree = ""; }; - C123C127CC539ACCB510F665DB774899 /* DTAttributedTextContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextContentView.h; path = Core/Source/DTAttributedTextContentView.h; sourceTree = ""; }; - C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTError.m"; path = "Core/Source/NSDictionary+DTError.m"; sourceTree = ""; }; - C241AD9CEC9D6732CFBA6A55B49E64C9 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Sources/ConstraintInsets.swift; sourceTree = ""; }; - C26DBE1150BC9A30B69839783E000358 /* DTCoreTextLayouter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayouter.h; path = Core/Source/DTCoreTextLayouter.h; sourceTree = ""; }; - C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.release.xcconfig; sourceTree = ""; }; - C298199F5DC5390E8B6666F638B34C10 /* DTTextAttachmentHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachmentHTMLElement.h; path = Core/Source/DTTextAttachmentHTMLElement.h; sourceTree = ""; }; - C30D143134EEC5D4BA99459104B76A2E /* DTHTMLParserTextNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserTextNode.h; path = Core/Source/DTHTMLParserTextNode.h; sourceTree = ""; }; - C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; - C5077CB33FD2EA6584AF290C95617DC0 /* RDEPUBReadingLocationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingLocationModels.swift; sourceTree = ""; }; - C518633651B8B05BFB5292862EB4B642 /* RDEPUBSelectionLoupeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionLoupeView.swift; sourceTree = ""; }; - C5B003AC0B46623423334F97FEE379B8 /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; - C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Sources/ConstraintView+Extensions.swift"; sourceTree = ""; }; - C71D83D6AEF198FA680B8A80BF2D9605 /* DTCoreTextLayoutLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutLine.m; path = Core/Source/DTCoreTextLayoutLine.m; sourceTree = ""; }; - C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTUnshorten.m"; path = "Core/Source/NSURL+DTUnshorten.m"; sourceTree = ""; }; - C80DE4FAC18642D5E8D148D8A1E5A566 /* RDEPUBRuntimePageCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimePageCount.swift; sourceTree = ""; }; - C8343CDCF82729A8EBCCA37A6650E34F /* DTHTMLParserNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserNode.h; path = Core/Source/DTHTMLParserNode.h; sourceTree = ""; }; - C8B29AA7038EA68CF6B91D18CC87E743 /* RDEPUBJumpSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJumpSession.swift; sourceTree = ""; }; - C8C20D9A71E6605DEE80342E7122B683 /* DTCoreTextConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextConstants.h; path = Core/Source/DTCoreTextConstants.h; sourceTree = ""; }; - C8E2FC7BE14F90878CE3FB3E317996ED /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; sourceTree = ""; }; - C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Sources/ConstraintAttributes.swift; sourceTree = ""; }; - C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = ""; }; - C9FD96F86CD108FB55F99EDCC82B3771 /* RDEPUBChapterDataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDataCache.swift; sourceTree = ""; }; + B5629838A35BA6A3F2895CFDE6A5FE0B /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; + B6CA8CC4525EF64AA5CEE4A722737F1C /* DTCoreText-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTCoreText-dummy.m"; sourceTree = ""; }; + B76B1E836C34CB755AEE1FBF7DC26BDD /* NSString+DTPaths.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTPaths.h"; path = "Core/Source/NSString+DTPaths.h"; sourceTree = ""; }; + B7C4233DF4FA80BF4A9E6FA5082D49E5 /* DTCoreTextParagraphStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextParagraphStyle.m; path = Core/Source/DTCoreTextParagraphStyle.m; sourceTree = ""; }; + B83D7A73677A2C3141EDEF56B9CE6584 /* DTVideoTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVideoTextAttachment.m; path = Core/Source/DTVideoTextAttachment.m; sourceTree = ""; }; + B8717A7A7BC5A1529A0F80FB3B22675D /* DTFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTFoundation-Info.plist"; sourceTree = ""; }; + B9E19C361904199E2E63EDFFBD64A90C /* RDReaderView+ContentAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+ContentAccess.swift"; sourceTree = ""; }; + BA0A09CCD48B28C7C98016F5B7DCB94A /* RDEPUBImageViewerCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewerCoordinator.swift; sourceTree = ""; }; + BA8A527A4CCB2AF1C1E26744B301F6B8 /* DTIframeTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTIframeTextAttachment.m; path = Core/Source/DTIframeTextAttachment.m; sourceTree = ""; }; + BAE090F5D5825DF3A26C12BB14E21739 /* RDEPUBRenderDiagnosticsCollector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderDiagnosticsCollector.swift; sourceTree = ""; }; + BAE45673EE2875DB23FA7BDD61FDE1EF /* DTCustomColoredAccessory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCustomColoredAccessory.h; path = Core/Source/iOS/DTCustomColoredAccessory.h; sourceTree = ""; }; + BB30DFD1013A322C32A3848B1D6602DA /* RDReaderView+PageCurl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDReaderView+PageCurl.swift"; sourceTree = ""; }; + BC1BAC41A213B19789028A9648DD5BD6 /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; + BC2FC937F877AAF34D20099B548F79F4 /* RDEPUBNotePopupCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupCoordinator.swift; sourceTree = ""; }; + BC59BBF6628D93AAC30CBFE0FF0151F2 /* ZIPFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-prefix.pch"; sourceTree = ""; }; + BD65B936E2A6FEB74718EA86D9AC1899 /* DTCoreTextParagraphStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextParagraphStyle.h; path = Core/Source/DTCoreTextParagraphStyle.h; sourceTree = ""; }; + BE294326627812338FB0A4C644CD32A6 /* RDEPUBFontFallbackResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontFallbackResolver.swift; sourceTree = ""; }; + BE8601B1192179DC899A1156CB46369E /* RDEPUBCFIMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMap.swift; sourceTree = ""; }; + BEA46E51E3616ECEAF0ACCEA9B8C67EF /* DTFolderMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFolderMonitor.m; path = Core/Source/DTFolderMonitor.m; sourceTree = ""; }; + BFF51E56E09E095C92CB5B9F21384027 /* Archive+MemoryFile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+MemoryFile.swift"; path = "Sources/ZIPFoundation/Archive+MemoryFile.swift"; sourceTree = ""; }; + C0DCB00F0B62D7DBE628D2B5FF006E93 /* DTCoreText.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.debug.xcconfig; sourceTree = ""; }; + C16D8899DF97FEA1975D2D134DA77804 /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; + C248323DF03FE7E607F69BF5576B3F41 /* RDReaderViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderViewProtocols.swift; sourceTree = ""; }; + C2E354232C09ED53034E389E0A70A0C2 /* RDReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-umbrella.h"; sourceTree = ""; }; + C33E143A90F5075BA576F52111FFCCB0 /* RDEPUBReaderLoadCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLoadCoordinator.swift; sourceTree = ""; }; + C37DF2A4019097BD40A1E29897024314 /* RDReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-prefix.pch"; sourceTree = ""; }; + C384342E6BCF839582F9467109AC924A /* RDEPUBHTMLNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBHTMLNormalizer.swift; sourceTree = ""; }; + C3E162E0261A5B0850158D3403191E62 /* Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Archive.swift; path = Sources/ZIPFoundation/Archive.swift; sourceTree = ""; }; + C46FCF109DBCB37595D2A3366CF1D765 /* DTCoreTextLayoutFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrame.h; path = Core/Source/DTCoreTextLayoutFrame.h; sourceTree = ""; }; + C477D7EE62BF9A8ACC465998EE02CB76 /* RDReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + C495C74844982FAA1B846A2A89023D12 /* DTCoreTextMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextMacros.h; path = Core/Source/DTCoreTextMacros.h; sourceTree = ""; }; + C5005A9E8F746647585CCAB26853E922 /* NSString+DTFormatNumbers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTFormatNumbers.m"; path = "Core/Source/NSString+DTFormatNumbers.m"; sourceTree = ""; }; + C508E49F6BF9F50B05918C230B033069 /* DTTextBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextBlock.m; path = Core/Source/DTTextBlock.m; sourceTree = ""; }; + C6205EFACA691F3EC37951F5A30B9590 /* RDEPUBReaderSearchCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchCoordinator.swift; sourceTree = ""; }; + C69C7A531B5E021499D8FBF1DBE0E3BB /* NSAttributedStringRunDelegates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NSAttributedStringRunDelegates.m; path = Core/Source/NSAttributedStringRunDelegates.m; sourceTree = ""; }; + C706B8C5A519EE55EC9D545AB3302AD9 /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; + C70E0378F7CBD5A6DA253CC326036A9B /* RDEPUBPageMapReconciliationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageMapReconciliationCoordinator.swift; sourceTree = ""; }; + C7437E451EF2A6AAE750F4983FF9BA5F /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; + C7E09A6C247D465CA0EF71B939B2A040 /* NSArray+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+DTError.h"; path = "Core/Source/NSArray+DTError.h"; sourceTree = ""; }; + C81E5EB72407C54EF8CC882A23759916 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; + C8FE55941A5CBC989B1F8C3E2D5A49AA /* RDEPUBBackgroundCoverageStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundCoverageStore.swift; sourceTree = ""; }; CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "ZIPFoundation-ZIPFoundation_Privacy"; path = ZIPFoundation_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - CA538A48DD3691701EC6B5021D7B7381 /* NSScanner+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSScanner+HTML.m"; path = "Core/Source/NSScanner+HTML.m"; sourceTree = ""; }; - CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTURLEncoding.m"; path = "Core/Source/NSString+DTURLEncoding.m"; sourceTree = ""; }; - CD0C3C872488B6341E22BF47B6F9BBD6 /* RDEPUBBuildDiagnosticsReporter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBuildDiagnosticsReporter.swift; sourceTree = ""; }; - CDC41111F7B2BF68994C924BC0C5794C /* RDEPUBAttachmentTooltipOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipOverlayView.swift; sourceTree = ""; }; - CE6907AC04870132CCE3177E894607DD /* DTCoreTextLayoutFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrame.h; path = Core/Source/DTCoreTextLayoutFrame.h; sourceTree = ""; }; - CE7768E097F8BDE9FBE3752B98CD0101 /* DTCoreText-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-umbrella.h"; sourceTree = ""; }; - CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+DTError.h"; path = "Core/Source/NSArray+DTError.h"; sourceTree = ""; }; - D1599698B5A62671C488F13E07272B09 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.m; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.m; sourceTree = ""; }; + CA5630DC0E663F38A9EC713323697EE1 /* DTLazyImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLazyImageView.m; path = Core/Source/DTLazyImageView.m; sourceTree = ""; }; + CACF20969583778CAC1BC92BB96F27FD /* NSAttributedString+SmallCaps.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+SmallCaps.h"; path = "Core/Source/NSAttributedString+SmallCaps.h"; sourceTree = ""; }; + CAF799848B6E5545BD3003001D3F6518 /* RDEPUBImageViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewController.swift; sourceTree = ""; }; + CB2BD1F8CFECB82D427DF046439E68D6 /* DTHTMLParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParser.h; path = Core/Source/DTHTMLParser/DTHTMLParser.h; sourceTree = ""; }; + CCB06D5D93327CF4E70EB026DFEFE8BE /* RDEPUBBackgroundTrace.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundTrace.swift; sourceTree = ""; }; + CCC633BF76C79E0B4A6750337D5DCDB8 /* DTVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVersion.m; path = Core/Source/DTVersion.m; sourceTree = ""; }; + CE23D3D8B6CDEC776313C06D5CB44FE2 /* RDEPUBSelectionLoupeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionLoupeView.swift; sourceTree = ""; }; + CE761A55BD57C0BFD6336CD073F85C31 /* DTLinkButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLinkButton.m; path = Core/Source/DTLinkButton.m; sourceTree = ""; }; + CE83527CFFC7FC1E222F5634198C03CD /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; + CEBA01360577AAD3FD089B6B17C24260 /* UIFont+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+DTCoreText.m"; path = "Core/Source/UIFont+DTCoreText.m"; sourceTree = ""; }; + CEC237752DE21AB8ADA263DE4977AC0F /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; + CEEC8715398E89B42F9B04E290E8E4FE /* NSString+DTURLEncoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTURLEncoding.h"; path = "Core/Source/NSString+DTURLEncoding.h"; sourceTree = ""; }; + CF108973184A89F47F1A44F491BC7453 /* RDEPUBFontNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontNormalizer.swift; sourceTree = ""; }; + CF1CED3ED65443999913BC0D96ACA151 /* DTImage+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTImage+HTML.m"; path = "Core/Source/DTImage+HTML.m"; sourceTree = ""; }; + D0856C3894240A673B5AB7C2704E9144 /* DTDictationPlaceholderTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderTextAttachment.h; path = Core/Source/DTDictationPlaceholderTextAttachment.h; sourceTree = ""; }; + D18519BCA8FAA9B01A704A0F0B9FFC78 /* Archive+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ZIP64.swift"; path = "Sources/ZIPFoundation/Archive+ZIP64.swift"; sourceTree = ""; }; D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTFoundation; path = DTFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D24FE8634A7AD2562DB8ADB9D4BBB36A /* CTLineUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLineUtils.m; path = Core/Source/CTLineUtils.m; sourceTree = ""; }; - D2BA6D5DBD4C6A9285C4592721790A26 /* DTSmartPagingScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTSmartPagingScrollView.h; path = Core/Source/iOS/DTSmartPagingScrollView.h; sourceTree = ""; }; - D3593ADF561D422F73C8EABAD4A4F440 /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Sources/ConstraintRelation.swift; sourceTree = ""; }; - D36ED8209C907E3E9B074DDB399F54FF /* DTTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachment.h; path = Core/Source/DTTextAttachment.h; sourceTree = ""; }; - D3BFB23BF28CE5120D1FFBD76664087B /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; - D4093D30B372960168C1349100DF7DE0 /* DTAttributedTextCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextCell.h; path = Core/Source/DTAttributedTextCell.h; sourceTree = ""; }; - D4721E12B4121C46B8368D085D91EC2B /* RDEPUBTextPaginationInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationInterfaces.swift; sourceTree = ""; }; - D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Sources/Debugging.swift; sourceTree = ""; }; - D497C3CA364E37DAAFF2C3B90CC7DBE8 /* DTTextBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextBlock.h; path = Core/Source/DTTextBlock.h; sourceTree = ""; }; - D7B5E61166782ED8D585D4FCEE2074DB /* DTLinkButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLinkButton.h; path = Core/Source/DTLinkButton.h; sourceTree = ""; }; - D7FB9FD3FFFF0D8E3D9D354EC7AF35E1 /* RDEPUBNotePopupViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupViewController.swift; sourceTree = ""; }; - D80CD20CB452B31CCCB14AF8567524D3 /* DTCoreText-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-prefix.pch"; sourceTree = ""; }; - D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+DTFoundation.m"; path = "Core/Source/iOS/UIImage+DTFoundation.m"; sourceTree = ""; }; - D863AE4F659A0F71B22DC9FF334DDF4E /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.h; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.h; sourceTree = ""; }; - D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewFrameExtension.swift; path = Sources/SSAlertSwift/UIViewFrameExtension.swift; sourceTree = ""; }; - D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-umbrella.h"; sourceTree = ""; }; - D9AFC4B66F872436A059FE53780D216F /* SSAlertSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SSAlertSwift; path = SSAlertSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DA25968B7C9A40031DA45BB328EA8A2E /* DTStylesheetHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTStylesheetHTMLElement.m; path = Core/Source/DTStylesheetHTMLElement.m; sourceTree = ""; }; - DA80D2B3DB04B3530C801B06AC694048 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; - DA9E9711A4073440ECC06C5BD6D8702F /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = ""; }; - DAA89AE50DEA94816C5333CC1325DDA8 /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; - DBC9280BA00935565E9658775DD7404D /* NSAttributedString+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTCoreText.m"; path = "Core/Source/NSAttributedString+DTCoreText.m"; sourceTree = ""; }; - DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTUtilities.m"; path = "Core/Source/NSString+DTUtilities.m"; sourceTree = ""; }; - DD189DA6054AAE2242F6644A2623B50E /* NSAttributedString+SmallCaps.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+SmallCaps.h"; path = "Core/Source/NSAttributedString+SmallCaps.h"; sourceTree = ""; }; - DD58A1908F3C532210EA65ACE410A44D /* CTLineUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLineUtils.h; path = Core/Source/CTLineUtils.h; sourceTree = ""; }; - DE28C0B33B3E44975093B0F177FDD67F /* RDEPUBCFIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIParser.swift; sourceTree = ""; }; + D28A3E79D83EA4B807E2D3A5EE086B8B /* DTHTMLParserNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserNode.h; path = Core/Source/DTHTMLParserNode.h; sourceTree = ""; }; + D30190E9913BB7FF775D8602E753BA47 /* RDPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPlainTextBookBuilder.swift; sourceTree = ""; }; + D30DBDF1EDB20CF83690AC6619AA0C48 /* NSString+DTPaths.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTPaths.m"; path = "Core/Source/NSString+DTPaths.m"; sourceTree = ""; }; + D3BFAD599CFD612530D8B30DDB9F5D4A /* RDEPUBChapterRuntimeStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterRuntimeStore.swift; sourceTree = ""; }; + D423B0BF37041F8E07C6EFD476F511A4 /* RDEPUBReaderAssemblyCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAssemblyCoordinator.swift; sourceTree = ""; }; + D4C731AA2088D7E873D8E3D21B95D215 /* DTIframeTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTIframeTextAttachment.h; path = Core/Source/DTIframeTextAttachment.h; sourceTree = ""; }; + D4FD083436655F07AFCFB5B5492EF0F1 /* RDEPUBTextContentInteractionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentInteractionCoordinator.swift; sourceTree = ""; }; + D5DD4142DF33E1BE0B5A057101E851C5 /* DTLazyImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLazyImageView.h; path = Core/Source/DTLazyImageView.h; sourceTree = ""; }; + D61BD3F3828530F0B2500FA1C4367C50 /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; + D7F60831A79D296EEABAD2AEB8A8C774 /* RDEPUBPageResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageResolver.swift; sourceTree = ""; }; + D80A72D8B7941D30246858D840EE1EF5 /* DTCoreTextLayouter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayouter.m; path = Core/Source/DTCoreTextLayouter.m; sourceTree = ""; }; + D88A921856D9EF12C78D05D927BF334B /* RDEPUBReaderController+TableOfContents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+TableOfContents.swift"; sourceTree = ""; }; + D97740E10289031B888FFAE803AE441E /* wxread-dark.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-dark.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-dark.css"; sourceTree = ""; }; + D9A812C3E577A3ADC36BAE3FF7AA4D9C /* NSFileWrapper+DTCopying.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileWrapper+DTCopying.m"; path = "Core/Source/NSFileWrapper+DTCopying.m"; sourceTree = ""; }; + D9EB24D09C2239F4C77E17F54D248B80 /* RDEPUBTextAnnotationOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnnotationOverlay.swift; sourceTree = ""; }; + DA2ED17D0DDF5F1C5606BFFD9A512DE4 /* DTCoreTextFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFunctions.h; path = Core/Source/DTCoreTextFunctions.h; sourceTree = ""; }; + DA68A96FA91F03F747A3D85A2DB0B45E /* RDEPUBReaderController+ContentDelegates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ContentDelegates.swift"; sourceTree = ""; }; + DBFE242CACE9410D681C091D4BB7237D /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; + DC7D3AB85C954DA41E1500936C166C0E /* NSString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+HTML.h"; path = "Core/Source/NSString+HTML.h"; sourceTree = ""; }; + DC9EFF22EDE800175B01DE546C97862D /* RDReaderPreloadController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPreloadController.swift; sourceTree = ""; }; + DD0A5FF70CDBE87597264762EC20EF43 /* NSScanner+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSScanner+HTML.h"; path = "Core/Source/NSScanner+HTML.h"; sourceTree = ""; }; + DD7A2DE5BDF72ABC066484CE554BDEF0 /* DTHorizontalRuleHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHorizontalRuleHTMLElement.m; path = Core/Source/DTHorizontalRuleHTMLElement.m; sourceTree = ""; }; DE4821B98DDE6C71411EC139EC6D2762 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTiledLayerWithoutFade.h; path = Core/Source/iOS/DTTiledLayerWithoutFade.h; sourceTree = ""; }; - DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.release.xcconfig; sourceTree = ""; }; - DF988440049800DB7824A94B81D20254 /* Archive+Writing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Writing.swift"; path = "Sources/ZIPFoundation/Archive+Writing.swift"; sourceTree = ""; }; - E0D90EB06FC37D534934542F9CAB1D74 /* DTCSSStylesheet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSStylesheet.m; path = Core/Source/DTCSSStylesheet.m; sourceTree = ""; }; - E0F6036722A2FEED169B57120EB274D1 /* RDEPUBHTMLNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBHTMLNormalizer.swift; sourceTree = ""; }; - E16D20FA492E085BD0871B107B3077B7 /* DTHTMLWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLWriter.m; path = Core/Source/DTHTMLWriter.m; sourceTree = ""; }; - E196F56E68578181D5BDE787DE5C0F3A /* DTColor+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTColor+Compatibility.m"; path = "Core/Source/DTColor+Compatibility.m"; sourceTree = ""; }; - E1F63A854BBF28E93AC1D3F71CD48CBE /* DTAttributedTextCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextCell.m; path = Core/Source/DTAttributedTextCell.m; sourceTree = ""; }; - E20272295EC253826AEE1F83A15D47C5 /* NSAttributedStringRunDelegates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NSAttributedStringRunDelegates.h; path = Core/Source/NSAttributedStringRunDelegates.h; sourceTree = ""; }; - E27C503C8128BC3CE109FFE077AEF325 /* NSString+CSS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+CSS.m"; path = "Core/Source/NSString+CSS.m"; sourceTree = ""; }; - E28CA95D89DBAB2FE56BC8513D5838D7 /* DTHorizontalRuleHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHorizontalRuleHTMLElement.h; path = Core/Source/DTHorizontalRuleHTMLElement.h; sourceTree = ""; }; - E3E5029439FC2CDA4E874FBB500F3FE0 /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; - E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertPresentAnimation.swift; path = Sources/SSAlertSwift/SSAlertPresentAnimation.swift; sourceTree = ""; }; - E4BC2CE5C3B20971FF99A9C8EC487481 /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; - E4C4605A9B7326DBE0CED7EB66A7416F /* RDReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderFlowLayout.swift; sourceTree = ""; }; - E4EDAF459D89DEFB5A597F8278CE222F /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; - E5F69A1E1260BAD7737BEB533F643A15 /* DTLazyImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLazyImageView.h; path = Core/Source/DTLazyImageView.h; sourceTree = ""; }; - E62C5E593037EF8A45E7FAA847D0277C /* DTCoreTextLayoutFrame+Cursor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTCoreTextLayoutFrame+Cursor.m"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.m"; sourceTree = ""; }; - E6F2E79CC33E0823C4E719ECDDFBBE08 /* NSAttributedStringRunDelegates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NSAttributedStringRunDelegates.m; path = Core/Source/NSAttributedStringRunDelegates.m; sourceTree = ""; }; - E808E517A1FE8666CB17EA9D94B4747A /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; - E8428598288FB3C84E993319B4E11B03 /* RDEPUBChapterWindowCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWindowCoordinator.swift; sourceTree = ""; }; - E8C6B44716EC22054F92F4ED84DA6A85 /* RDEPUBNoteResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteResolver.swift; sourceTree = ""; }; - E97368D346BF315D1080DBA98C0788AA /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; - E992F389B960CB699FDDEA5FBD8F31C8 /* RDEPUBCFIUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIUtilities.swift; sourceTree = ""; }; - E9A8B5491FF7E8AB9CD6015AE4E1C0D2 /* RDEPUBCFISerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFISerializer.swift; sourceTree = ""; }; - EA3CE87842A4B39DB8691712AEC0E5FD /* RDEPUBNavigationStateMachine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigationStateMachine.swift; sourceTree = ""; }; + DE83356F8FBC1801D29CA93C1A190D81 /* Archive+Progress.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Progress.swift"; path = "Sources/ZIPFoundation/Archive+Progress.swift"; sourceTree = ""; }; + E0192469A486DA7CECFECEA37518B6B9 /* DTHTMLAttributedStringBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLAttributedStringBuilder.m; path = Core/Source/DTHTMLAttributedStringBuilder.m; sourceTree = ""; }; + E246B080707A0DA836FC0890AE96D529 /* RDReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderPagingController.swift; sourceTree = ""; }; + E3CAAC46883B74B071843E5D38B5BF85 /* DTImage+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTImage+HTML.h"; path = "Core/Source/DTImage+HTML.h"; sourceTree = ""; }; + E4C5EB3F8F005C65005C101A9DBE488A /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; + E510EFB4CE45829A8CAB4E2BE47C0041 /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "Sources/RDReaderView/EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; + E5377786E80195587BF3E8A7589E5925 /* DTHTMLParserTextNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserTextNode.m; path = Core/Source/DTHTMLParserTextNode.m; sourceTree = ""; }; + E5D4D6E12779C54F17AE98A1E6C9B699 /* DTBase64Coding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBase64Coding.m; path = Core/Source/DTBase64Coding.m; sourceTree = ""; }; + E67E858259A9264CC8FD433B51487676 /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; + E6801C4BFA1DBBC56523D5D3F427E8DB /* RDEPUBBookPageMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBookPageMap.swift; sourceTree = ""; }; + E687628EF2FE92D093E3005D21B578E5 /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; + E697E9F69226A6A803098BFD3D202842 /* RDEPUBCFIResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIResolver.swift; sourceTree = ""; }; + E6B46EF6F055A721AF370D705D026E9E /* Data+CompressionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+CompressionDeprecated.swift"; path = "Sources/ZIPFoundation/Data+CompressionDeprecated.swift"; sourceTree = ""; }; + E74132875CC4A311B230B68C085D8CE6 /* ResourceBundle-Resources-DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Resources-DTCoreText-Info.plist"; sourceTree = ""; }; + E744A9171DA8D779C942360378D2EE4F /* RDEPUBJumpSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJumpSession.swift; sourceTree = ""; }; + E7E49A0BE37FE8EEBBC94E752B95C59C /* wxread-replace-latin.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace-latin.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace-latin.css"; sourceTree = ""; }; + E853AAB3B09E0662567752431CEF1D33 /* DTTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachment.h; path = Core/Source/DTTextAttachment.h; sourceTree = ""; }; + E865600EE9117A9153716299FFA7912D /* Archive+Reading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Reading.swift"; path = "Sources/ZIPFoundation/Archive+Reading.swift"; sourceTree = ""; }; + E89F199ECDE796B15CAF8E0C1775FAA6 /* DTCoreTextConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextConstants.m; path = Core/Source/DTCoreTextConstants.m; sourceTree = ""; }; + E8D1DCAA8AAE79FCBD5248D641D583DE /* RDEPUBReaderViewportMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderViewportMonitor.swift; sourceTree = ""; }; + E9204AAD895ABE21EE8841D0A495C916 /* RDEPUBReaderEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderEnvironment.swift; sourceTree = ""; }; + E96C0EEB2032D3CC18F4B37A7C34C84C /* DTAttributedTextContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextContentView.h; path = Core/Source/DTAttributedTextContentView.h; sourceTree = ""; }; + E9D8AB18960B56A997408E3235751624 /* ZIPFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ZIPFoundation-dummy.m"; sourceTree = ""; }; + EA1200B7F3541159D13204D0C860076B /* RDEPUBCFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIError.swift; sourceTree = ""; }; + EA2BF1D7535B036E1356E8DF42A04954 /* DTTextBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextBlock.h; path = Core/Source/DTTextBlock.h; sourceTree = ""; }; + EB578C52D04A71D85CCA25340333F2C2 /* RDEPUBReaderController+PublicAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+PublicAPI.swift"; sourceTree = ""; }; + EB850927957E35DB8CE0F109188C99A9 /* DTCoreTextLayoutLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutLine.m; path = Core/Source/DTCoreTextLayoutLine.m; sourceTree = ""; }; EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ReadViewDemo-umbrella.h"; sourceTree = ""; }; - EBE150E8FBF2AC59607D94086EF644B6 /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; - ECBE8305E343FF00B5DDF4F8F9D18623 /* cssInjector.js */ = {isa = PBXFileReference; includeInIndex = 1; name = cssInjector.js; path = Sources/RDReaderView/EPUBCore/Resources/cssInjector.js; sourceTree = ""; }; - ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintMakerRelatable+Extensions.swift"; path = "Sources/ConstraintMakerRelatable+Extensions.swift"; sourceTree = ""; }; - ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ZIP64.swift"; path = "Sources/ZIPFoundation/Archive+ZIP64.swift"; sourceTree = ""; }; + EBAABB0F2B6957E455D803F386B55761 /* RDEPUBStyleCompatibilityModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleCompatibilityModels.swift; sourceTree = ""; }; + ECE876A9792A03EF4CBCFD3DF6188D46 /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; + ED049C791713944233EE10C7A111C691 /* DTCoreTextGlyphRun.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextGlyphRun.m; path = Core/Source/DTCoreTextGlyphRun.m; sourceTree = ""; }; + ED9A1EBDA0FD72671C7F6FE15F37B906 /* DTTextHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextHTMLElement.h; path = Core/Source/DTTextHTMLElement.h; sourceTree = ""; }; EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTCoreText; path = DTCoreText.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EE4EE750340347ED584C5A2C1164331A /* SSAlertCommonView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertCommonView.swift; path = Sources/SSAlertSwift/SSAlertCommonView.swift; sourceTree = ""; }; - EE9D4A455723797A27F04A15C4E47823 /* DTHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLElement.h; path = Core/Source/DTHTMLElement.h; sourceTree = ""; }; - EEA02BC05A988384DC4551B451ED1E7E /* RDURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDURLReaderController.swift; sourceTree = ""; }; - EEAE1CB7D6F5BB8E33C9562663C93A51 /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; - EEC9D27C90F465491EF9BA9CC8CDA1E1 /* RDEPUBReaderRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderRuntime.swift; sourceTree = ""; }; - EEE1B7CF6E54E7876BBF28948CD65B9E /* RDEPUBBookPageMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBookPageMap.swift; sourceTree = ""; }; - EF27E643619E369E8A9C1FE6EFE18C78 /* DTFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTFoundation.modulemap; sourceTree = ""; }; - EFA3CC091FA3A16CC09C9C66D1BC0E50 /* RDEPUBTextSelectionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSelectionController.swift; sourceTree = ""; }; - F038FB491B9A4A53447EF0DC333301AE /* DTObjectTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTObjectTextAttachment.m; path = Core/Source/DTObjectTextAttachment.m; sourceTree = ""; }; - F0548F684CA2D8C445086389A2BD5265 /* ZIPFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-prefix.pch"; sourceTree = ""; }; - F058E473114A5A8FE875FD5ABBE02F5E /* RDEPUBReaderLoadCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLoadCoordinator.swift; sourceTree = ""; }; - F0D72C5680EBE6CA716EE77281AA4436 /* DTAttributedTextContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextContentView.m; path = Core/Source/DTAttributedTextContentView.m; sourceTree = ""; }; - F20E15B3473E29738F2A09C625A687BB /* RDEPUBImageViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewController.swift; sourceTree = ""; }; - F270A5E6ACC194137AB15688F6F4C759 /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; - F34551B808D265BCB3443EE33D6C1EF4 /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; - F35039A8D0AA1F7BAFC4E5E016057E15 /* DTTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachment.m; path = Core/Source/DTTextAttachment.m; sourceTree = ""; }; - F37563A56C180CE18EEFADE56FA3C17F /* DTAccessibilityViewProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityViewProxy.h; path = Core/Source/DTAccessibilityViewProxy.h; sourceTree = ""; }; - F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SSAlertView.swift; path = Sources/SSAlertSwift/SSAlertView.swift; sourceTree = ""; }; - F46977FAF9F0EAEDF840BDA49288CC99 /* WeReadApi.js */ = {isa = PBXFileReference; includeInIndex = 1; name = WeReadApi.js; path = Sources/RDReaderView/EPUBCore/Resources/WeReadApi.js; sourceTree = ""; }; + EE0841869BD329D156D73D0CFB24542C /* RDEPUBReaderController+DataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+DataSource.swift"; sourceTree = ""; }; + EEB9B65684CB76F24E68191D6A5844D0 /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; + EF625CF6A790938F5CE0F0C7DC36E340 /* DTCoreTextLayoutFrame+Cursor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTCoreTextLayoutFrame+Cursor.m"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.m"; sourceTree = ""; }; + F3C9CA544EBF55130625F6C3AD2ABFB4 /* Archive+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Deprecated.swift"; path = "Sources/ZIPFoundation/Archive+Deprecated.swift"; sourceTree = ""; }; + F3E93C4AC73A09DE1EAE805B0ADE3306 /* NSString+DTUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTUtilities.m"; path = "Core/Source/NSString+DTUtilities.m"; sourceTree = ""; }; + F46010C3A0C82AE5ABEC814D7EC6351B /* DTAttributedTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextView.m; path = Core/Source/DTAttributedTextView.m; sourceTree = ""; }; + F49FC82A04EE9B3B49CBA6CB88ACBC67 /* FileManager+ZIPDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIPDeprecated.swift"; path = "Sources/ZIPFoundation/FileManager+ZIPDeprecated.swift"; sourceTree = ""; }; + F4BE66AE0A6BCE91929B24BAA34DA151 /* RDEPUBDarkImageAdjuster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDarkImageAdjuster.swift; sourceTree = ""; }; F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "DTCoreText-Resources"; path = Resources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - F4E89D45F05E7E9797A973AC12579973 /* RDEPUBChapterOffsetMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterOffsetMap.swift; sourceTree = ""; }; - F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTExtendedFileAttributes.m; path = Core/Source/DTExtendedFileAttributes.m; sourceTree = ""; }; - F53CCB60DE5D06A43E4A52EDB274E7D2 /* NSString+Paragraphs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Paragraphs.m"; path = "Core/Source/NSString+Paragraphs.m"; sourceTree = ""; }; - F5847BF261408B9B82FB3BF7A9390AB3 /* RDEPUBAttachmentNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentNormalizer.swift; sourceTree = ""; }; - F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Sources/ConstraintLayoutSupportDSL.swift; sourceTree = ""; }; - F60BBDE3C78317A1DF3E2FF97B966899 /* RDEPUBChapterLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLoader.swift; sourceTree = ""; }; - F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.release.xcconfig; sourceTree = ""; }; - F734214E067BDBDB581911E1A5CDAADB /* DTBreakHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBreakHTMLElement.m; path = Core/Source/DTBreakHTMLElement.m; sourceTree = ""; }; - F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+ZIP.swift"; path = "Sources/ZIPFoundation/Date+ZIP.swift"; sourceTree = ""; }; - F7B0087DE7C394A677F5883541AB4FB7 /* DTListItemHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTListItemHTMLElement.m; path = Core/Source/DTListItemHTMLElement.m; sourceTree = ""; }; - F81B70DF51F9CD64A7DC5AAF3941F72C /* wxread-replace.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace.css"; path = "Sources/RDReaderView/EPUBCore/Resources/wxread-replace.css"; sourceTree = ""; }; - F9688BB6F63743F17F842CE97BCF847C /* RDEPUBCFICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFICompatibility.swift; sourceTree = ""; }; - F9A2565B302334B662AB51DCF8E65EEE /* DTDictationPlaceholderTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderTextAttachment.h; path = Core/Source/DTDictationPlaceholderTextAttachment.h; sourceTree = ""; }; - FABA3ECEE6A89B4087086F0D2377CB5A /* RDReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDReaderView.modulemap; sourceTree = ""; }; - FB2ABB1D297442D91AA42F1407DB4A58 /* DTTextHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextHTMLElement.h; path = Core/Source/DTTextHTMLElement.h; sourceTree = ""; }; - FB36F27A8101BA01699CFD777FC1CAFA /* RDReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDReaderView-prefix.pch"; sourceTree = ""; }; - FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTPaths.h"; path = "Core/Source/NSString+DTPaths.h"; sourceTree = ""; }; - FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTFoundation-dummy.m"; sourceTree = ""; }; - FD0189649153ACCA56C4C8AD0BEF1E0D /* RDEPUBReaderController+ContentDelegates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ContentDelegates.swift"; sourceTree = ""; }; - FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFoundationConstants.h; path = Core/Source/DTFoundationConstants.h; sourceTree = ""; }; - FD0BB5D8B2ADEBDD25F740A7185B516E /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; - FDD333B409D528E5006FA48F4D70A6F5 /* DTCSSListStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSListStyle.h; path = Core/Source/DTCSSListStyle.h; sourceTree = ""; }; - FE10A5C6934704218EB16F8966AA0814 /* RDEPUBPageBreakPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageBreakPolicy.swift; sourceTree = ""; }; - FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SSAlertSwift.release.xcconfig; sourceTree = ""; }; + F60ACBD9B441413B14468B1BFA1F7C6F /* RDEPUBReaderPaginationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPaginationCoordinator.swift; sourceTree = ""; }; + F63EBF2BF3000B3391F6E693581EA129 /* NSData+DTCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+DTCrypto.m"; path = "Core/Source/NSData+DTCrypto.m"; sourceTree = ""; }; + F788C862D0C386B17128DB735921333C /* RDEPUBReaderController+ExternalLinks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ExternalLinks.swift"; sourceTree = ""; }; + F7C508BE899A1397560A767CAEADB7B9 /* DTHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLElement.h; path = Core/Source/DTHTMLElement.h; sourceTree = ""; }; + F850938C9F348E6ED5216809EE43689D /* RDReaderTapRegionHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderTapRegionHandler.swift; sourceTree = ""; }; + F98CD641441793095A6228F264D13025 /* RDEPUBReaderServices.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderServices.swift; sourceTree = ""; }; + F9D9BEF72311AF9E3239F9B92A9D2842 /* DTAnimatedGIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnimatedGIF.h; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.h; sourceTree = ""; }; + FA107BE47514D01B94B7A2670A9F83E5 /* NSString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+HTML.m"; path = "Core/Source/NSString+HTML.m"; sourceTree = ""; }; + FBA95BB1C6D5F042AFE2454D582DFC55 /* RDEPUBReaderSearchBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchBarView.swift; sourceTree = ""; }; + FCD11C7BF5FACCD5B5A3D2C4991EF047 /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; + FE7F6623805E2DA3B053A0066ADA7E68 /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; FEA9F91758013B23B0EEA71DA22E7475 /* Pods-ReadViewDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-Info.plist"; sourceTree = ""; }; FEB14A8F8170777DB7CCC3F27C8EA57A /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - FEC2659F6ADAB5F211964D1A8CA88C26 /* RDEPUBRuntimeChapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimeChapter.swift; sourceTree = ""; }; - FEEB15F87BA6575BBFE1C5FD19B17CD7 /* DTImageTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTImageTextAttachment.m; path = Core/Source/DTImageTextAttachment.m; sourceTree = ""; }; - FF164505A477C6ED40FE8EF0CB2E6693 /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; - FF3F7BA20A1213804048557D946CEEA9 /* NSAttributedString+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTCoreText.h"; path = "Core/Source/NSAttributedString+DTCoreText.h"; sourceTree = ""; }; + FEC235E4971E5D0ED37AF923AD247D3C /* RDEPUBPageCountCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageCountCache.swift; sourceTree = ""; }; + FF1C41D226C0957F715EFF3F23893386 /* DTFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTFoundation-dummy.m"; sourceTree = ""; }; + FF63F5E8902D6F3F5E845A924EBBC6D3 /* DTFoundationConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFoundationConstants.h; path = Core/Source/DTFoundationConstants.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0690E2F3423B489C060C58F052BA27E8 /* Frameworks */ = { + 241C62665F0673AB5044556DB7A47F1F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 65AA4E5DD815EA54256EB4F859B2CBE1 /* Foundation.framework in Frameworks */, + D063317214AFF5143D9C958E5FAFBB38 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 18ADF4391AD2B9AFFB8C22BB8E39073A /* Frameworks */ = { + 41D2F746EE0F32BE39A378BBE1D33306 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 3E819BE9BEE6A082564F6D50AC1FE536 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 4A09AA29561E2A2483171BE5F449E451 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5AD7A66173E2D71E9D48E779C33AD979 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7D29C0A53AB1B4C1B257D46EBBDC9DA3 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5F41B71D619CE5CB2F653FD0EAD76A81 /* Frameworks */ = { + 6BA994E419B71A34DAC7DC2F80C1E55A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4B01D192E9BA7876FE04643D9B59BB7D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1190,136 +1013,249 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7A27B9BB2F93CD6A273034C4F5C15307 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9272A0B4C967A5616574EAA5802FA096 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9EA8986C070A5282511443AA1423116E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - AEF180508B84AAB5A0712C04958E0AF0 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CDE0C51D4CC555811724B28FB8285A10 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9A0376FF1CA9B7ED0356E0354DE826E5 /* Foundation.framework in Frameworks */, - 53E23429B7E072BE1D580C47944785A3 /* ImageIO.framework in Frameworks */, - EE719709C9E809F3CA56B801792C1CF8 /* QuartzCore.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CE5A833C5532ED1B29593567E3B5AA66 /* Frameworks */ = { + 7BB687433C7B1AC0D2C83CC4255CF94B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - E5A91F32DDA2E21F380CDBBFC1CD94C7 /* Frameworks */ = { + 923127D49FC5F6755FEC287CF9B07812 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + AF2C993F79DBF1586E55F70A9F105C6A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A54A020DFD109D748321C3911B8451A8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA092150563BDAB9BF6BB4E333429810 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DE3267C28E5F163C748DF648D172EE2C /* Foundation.framework in Frameworks */, + B76DE23D085C8DFE63FA9FC05387E02D /* ImageIO.framework in Frameworks */, + 9DCB6AFEED62901AFF45F911F9AAA89C /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 02ADBDED67BF477D7F4068FECEFEFAFE /* CFI */ = { + 017EB082AD13216251C54E6EFC22C072 /* EPUBCore */ = { isa = PBXGroup; children = ( - 930D75A53D2FD874346BF17C0A2CB1BC /* RDEPUBCFI.swift */, - F9688BB6F63743F17F842CE97BCF847C /* RDEPUBCFICompatibility.swift */, - 575B2D957760E0B9F1480FCB092B6B78 /* RDEPUBCFIDOMPathBuilder.swift */, - 4D2063CE799735F3C4AE37FE11567CBC /* RDEPUBCFIError.swift */, - 0524B881754B1D6EBC90981B8760C6B7 /* RDEPUBCFIGenerator.swift */, - AD2CC39C57A942917B961FC8E73D80F7 /* RDEPUBCFIMap.swift */, - DE28C0B33B3E44975093B0F177FDD67F /* RDEPUBCFIParser.swift */, - 11CD06780A381427FE5EDE9D07D4D970 /* RDEPUBCFIPath.swift */, - AB48BF4B843D518C890BDD2AC749E640 /* RDEPUBCFIRange.swift */, - 078D30B87BEEB64D27E0BDB8EB562475 /* RDEPUBCFIRecoveryEngine.swift */, - A24AB4F9BE6993854E38FD95A30B9845 /* RDEPUBCFIResolver.swift */, - E9A8B5491FF7E8AB9CD6015AE4E1C0D2 /* RDEPUBCFISerializer.swift */, - 414962A3F7230445216E714935F3C22F /* RDEPUBCFITextAssertion.swift */, - E992F389B960CB699FDDEA5FBD8F31C8 /* RDEPUBCFIUtilities.swift */, + 98A9D1AD928E701623173D31FC8B35F7 /* RDEPUBAssetRepository.swift */, + 8184024038D8B93BD22ECAAB863B41D9 /* RDEPUBFixedLayoutTemplate.swift */, + 1DD5649E99D72A74F8F2C3B3E5D3A729 /* RDEPUBJavaScriptBridge.swift */, + E67E858259A9264CC8FD433B51487676 /* RDEPUBModels.swift */, + A7E40C17B95F3BFCE6E70D0591DA6F7F /* RDEPUBNavigatorLayoutContext.swift */, + 893DFE6F010A222A98E905EA778740A0 /* RDEPUBPaginator.swift */, + B38D5053661772BF3BDE06F5357B5A96 /* RDEPUBParser.swift */, + 1C2BD942CCE411EF3AB9DCDC8215B180 /* RDEPUBParser+Archive.swift */, + 4CFCD5EFD6EDDC69776A50362DB16409 /* RDEPUBParser+Package.swift */, + 15C005A2A5E6A8263DE1F99AC5D372C0 /* RDEPUBParser+ReadingProfile.swift */, + 11246502ABEC1999B60B3FA41B764E7D /* RDEPUBParser+Resources.swift */, + 8485FAD7356F83F96C2CF8F2171C1DFB /* RDEPUBParser+TOC.swift */, + 0E0D068226C4B5E614B90482A3B4AFC0 /* RDEPUBPreferences.swift */, + C81E5EB72407C54EF8CC882A23759916 /* RDEPUBPublication.swift */, + 5FBE83F7B3B8689CC23FD1657E2A270E /* RDEPUBReadingSession.swift */, + 8F25D7766B9F7B666C309052CA726A7B /* RDEPUBRenderRequest.swift */, + FE7F6623805E2DA3B053A0066ADA7E68 /* RDEPUBResourceResolver.swift */, + 0A317B397274A6DAD784080981649FAC /* RDEPUBResourceURLSchemeHandler.swift */, + CE83527CFFC7FC1E222F5634198C03CD /* RDEPUBSearchEngine.swift */, + 736492CB9D329AD8CB8401330973FBCD /* RDEPUBSearchModels.swift */, + C7437E451EF2A6AAE750F4983FF9BA5F /* RDEPUBStyleSheetBuilder.swift */, + 00D963091969DCF978D7A36BF2747D33 /* RDEPUBTextAnchor.swift */, + 56EA8C75C7045AF8F04F2D56ACA2A18B /* RDEPUBWebView.swift */, + 37AD2B1FCE8C4B62FBC8B751F17EC474 /* RDEPUBWebView+Configuration.swift */, + 89AB081C4A259D931A865EA5A797CAFF /* RDEPUBWebView+FixedLayout.swift */, + EEB9B65684CB76F24E68191D6A5844D0 /* RDEPUBWebView+JavaScriptBridge.swift */, + 10FC9FC44C8A038A286BF6DCD1891DA0 /* RDEPUBWebView+Reflowable.swift */, + 9D53D1FE67166E6B0675584BCB425A05 /* RDEPUBWebView+Search.swift */, + 42A82DADD6CBBE3627BE13B2E0FC8B34 /* RDEPUBWebViewDebug.swift */, + 9562DD652C3F1E63D393B69D04C3D0EB /* CFI */, + 3DE030DD1E49D0CD372ACE04F39588FC /* Models */, + 49397EB7C057319B2CA1AA4239F92807 /* Notes */, ); - name = CFI; - path = CFI; + name = EPUBCore; + path = Sources/RDReaderView/EPUBCore; sourceTree = ""; }; - 0388AB194A762ACB56242F4BF9BA4498 /* Resources */ = { + 04A8FFC6216D98269272DFC3FD51B260 /* Compatibility */ = { isa = PBXGroup; children = ( - 53D473C6F07982D3D25781A343EC5A99 /* PrivacyInfo.xcprivacy */, + 8563248DA3F6A02F5A355DBD1D57E80D /* RDEPUBCSSCompatibilityLayer.swift */, + BE294326627812338FB0A4C644CD32A6 /* RDEPUBFontFallbackResolver.swift */, + EBAABB0F2B6957E455D803F386B55761 /* RDEPUBStyleCompatibilityModels.swift */, ); - name = Resources; + name = Compatibility; + path = Compatibility; sourceTree = ""; }; - 0B2E031EFC525508B0D167AAA6E70507 /* SnapKit */ = { + 06C22A27383EA079F8FF2367C9567BC0 /* DTCoreText */ = { isa = PBXGroup; children = ( - A0EBAC7714A5F73B75AAB47D24B08B71 /* Constraint.swift */, - C9593E7B37569219F8D9A504B47707DC /* ConstraintAttributes.swift */, - 7176B677A350927FC670368313DC2CA1 /* ConstraintConfig.swift */, - 1F090A0289338B14050FAF16C22605B0 /* ConstraintConstantTarget.swift */, - 6578DFAB51436E8DF266FD087700E26B /* ConstraintDescription.swift */, - 91144FC099DD458E61625CD939577DAA /* ConstraintDirectionalInsets.swift */, - A651CEE8062C84A597DBC44ECA3DBCC1 /* ConstraintDirectionalInsetTarget.swift */, - 02CF362F88AB69253F1898E53D7A286A /* ConstraintDSL.swift */, - C241AD9CEC9D6732CFBA6A55B49E64C9 /* ConstraintInsets.swift */, - 32A5ABB8F3656A110B955B0306E9A8C3 /* ConstraintInsetTarget.swift */, - 28D62D3200AC3D4E42C81CDFF7E884E8 /* ConstraintItem.swift */, - 9E6BA0ECCB0ACF8580C3B5192CA9F11B /* ConstraintLayoutGuide.swift */, - 5A9A82CB094636AFB53D6D130D6219BA /* ConstraintLayoutGuide+Extensions.swift */, - 4684B406B325B35F39322D75B59B6479 /* ConstraintLayoutGuideDSL.swift */, - 50297AAB8278F2BB6FCFE82B20C7A049 /* ConstraintLayoutSupport.swift */, - F5B34EE2160C27947D1EEFD42184CF5D /* ConstraintLayoutSupportDSL.swift */, - 60657D08CCDB38BFED30BD40F4720CE4 /* ConstraintMaker.swift */, - 392A75EAF280876545D14AA00517BA4C /* ConstraintMakerEditable.swift */, - 5245010774F8F1C4857763CC7B96E7B4 /* ConstraintMakerExtendable.swift */, - B0B32EA4B7A492EEF26CE260E9AEFA0B /* ConstraintMakerFinalizable.swift */, - 0E138EC76D0DF24544D29D1A4D7429E3 /* ConstraintMakerPrioritizable.swift */, - BD768C27E392C934C06DFB4AC401037C /* ConstraintMakerRelatable.swift */, - ECFE19508E12BF8B0B52E8CB4F724217 /* ConstraintMakerRelatable+Extensions.swift */, - 09BE22EE711B7A38A4443E1C1C12BD79 /* ConstraintMultiplierTarget.swift */, - 8F950CEF31AC0065C0BEAB26BA2CEFA1 /* ConstraintOffsetTarget.swift */, - 45C7129757B54DFD9E445D0A17D73A83 /* ConstraintPriority.swift */, - 882FA707ED3513D263A1E0656AAD2D33 /* ConstraintPriorityTarget.swift */, - 885653999BD237A574B67DB279DE7E87 /* ConstraintRelatableTarget.swift */, - D3593ADF561D422F73C8EABAD4A4F440 /* ConstraintRelation.swift */, - A02EA0374C693F881AB36202FB276DCD /* ConstraintView.swift */, - C6DB34ACB132E465CDF8191F7DB71EF6 /* ConstraintView+Extensions.swift */, - 8E5637603691B9B35C2A886B686D3CE7 /* ConstraintViewDSL.swift */, - D495E2AB1223BD4D4909F8FF1FF47DAF /* Debugging.swift */, - 932FD688DE493323BA6B691BC2CB5094 /* LayoutConstraint.swift */, - 0E8C0D83EB6EDE71B264B6B0DD4644F5 /* LayoutConstraintItem.swift */, - 945D4549E0B9168D7DDB910DE874B874 /* Typealiases.swift */, - 6C647A2EB2720BCBF88B160D124B57BF /* UILayoutSupport+Extensions.swift */, - 0388AB194A762ACB56242F4BF9BA4498 /* Resources */, - 3595ED200AA07F0B71CB42506574798F /* Support Files */, + 9C6CE93FAA68605C6B90FF844A98E440 /* CTLineUtils.h */, + 4FF4A2A7F2C7CFB5DD757BE1A6E59C7B /* CTLineUtils.m */, + 5D146C3F4B7878B5CE8EFF38765580C2 /* DTAccessibilityElement.h */, + 18F842408AB76A580B80255453F2FDF6 /* DTAccessibilityElement.m */, + 399AED6BF151EC39BE4450784795A832 /* DTAccessibilityViewProxy.h */, + 6AC1E707308CDBC9FFC09CECE3117A9A /* DTAccessibilityViewProxy.m */, + 599172147A32B6978EB5AAE1BE55FF7A /* DTAnchorHTMLElement.h */, + 148B993AB228816D19FCB7CD13874C83 /* DTAnchorHTMLElement.m */, + 09FF858DC29B73E9B67B32B03CFF4084 /* DTAttributedLabel.h */, + 3EFAE8DFDDEA1E6047289C86D66381C0 /* DTAttributedLabel.m */, + 068885F1B54CFD5DBBE6E2DC253F7819 /* DTAttributedTextCell.h */, + 814315319ED50AF916C3C8A68C0A47A0 /* DTAttributedTextCell.m */, + E96C0EEB2032D3CC18F4B37A7C34C84C /* DTAttributedTextContentView.h */, + 7203B4D9D997037E0F9D154A3B049738 /* DTAttributedTextContentView.m */, + B4D20A2B33F9F4DD8499FB462DE2731F /* DTAttributedTextView.h */, + F46010C3A0C82AE5ABEC814D7EC6351B /* DTAttributedTextView.m */, + 14283024FA4A0231B32CA22AA907FEFA /* DTBreakHTMLElement.h */, + 7D8AE4BEBD1998839BA83AD05CA6CAC5 /* DTBreakHTMLElement.m */, + 68D81DF1BB2A14F9C186F75BBA5CF50D /* DTColor+Compatibility.h */, + 8FAAF640165FC1B4B47C546F80D98B1E /* DTColor+Compatibility.m */, + 720396ED306E768BAD28007D5E96B757 /* DTColorFunctions.h */, + 4544C4444DCA90E700611D1281969883 /* DTColorFunctions.m */, + 5C3D91FFA65414A2787FEB95576E0097 /* DTCompatibility.h */, + 8CF7CEB31BED0554F3EF3D3442A89B47 /* DTCoreText.h */, + A61C8F1BDD76EA59082F65269083BD08 /* DTCoreTextConstants.h */, + E89F199ECDE796B15CAF8E0C1775FAA6 /* DTCoreTextConstants.m */, + 25DDD76CA572F0C7AB5A8178CF80169D /* DTCoreTextFontCollection.h */, + 722AF38F5106ADDE6F98D282F886A769 /* DTCoreTextFontCollection.m */, + 1EF19AD0EF4889156D46061FB43E0F5D /* DTCoreTextFontDescriptor.h */, + 88464D2E3579F1A5B25DCCA128528938 /* DTCoreTextFontDescriptor.m */, + DA2ED17D0DDF5F1C5606BFFD9A512DE4 /* DTCoreTextFunctions.h */, + 4917E08E6E59460594AC443EDDAB7E77 /* DTCoreTextFunctions.m */, + 771E0D5CBCBC013BF5780FEE5BBA81FF /* DTCoreTextGlyphRun.h */, + ED049C791713944233EE10C7A111C691 /* DTCoreTextGlyphRun.m */, + 72225FB74594FCF18DA8064E7DB3947E /* DTCoreTextLayouter.h */, + D80A72D8B7941D30246858D840EE1EF5 /* DTCoreTextLayouter.m */, + C46FCF109DBCB37595D2A3366CF1D765 /* DTCoreTextLayoutFrame.h */, + 4641C3C93CE32054665ACF80457A7A94 /* DTCoreTextLayoutFrame.m */, + 214F0FC87DE99D3FCE69D98B357F3FFC /* DTCoreTextLayoutFrame+Cursor.h */, + EF625CF6A790938F5CE0F0C7DC36E340 /* DTCoreTextLayoutFrame+Cursor.m */, + 671C2429406FDB36B677F4B6EC85B52F /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */, + 4476B58B93EE7476A4762FE0E26E8178 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */, + 37327141DC73DE2D5742BE6F989094CE /* DTCoreTextLayoutLine.h */, + EB850927957E35DB8CE0F109188C99A9 /* DTCoreTextLayoutLine.m */, + C495C74844982FAA1B846A2A89023D12 /* DTCoreTextMacros.h */, + BD65B936E2A6FEB74718EA86D9AC1899 /* DTCoreTextParagraphStyle.h */, + B7C4233DF4FA80BF4A9E6FA5082D49E5 /* DTCoreTextParagraphStyle.m */, + 0C24F592C4F38F15DC8C46BE0442B59C /* DTCSSListStyle.h */, + 40FD7C9E2E05FB4A73F4C4C70A3AFAF0 /* DTCSSListStyle.m */, + 796EF27FF6AA4B62367B6BD9CEBD85A8 /* DTCSSStylesheet.h */, + B37118B8D16847B0F82E06A5B33898AB /* DTCSSStylesheet.m */, + D0856C3894240A673B5AB7C2704E9144 /* DTDictationPlaceholderTextAttachment.h */, + 8DA0F94C0870C1F0DFADE5E9045E5E6E /* DTDictationPlaceholderTextAttachment.m */, + 9C12A4A5BB42D0F68DABBD3BDF103BC5 /* DTDictationPlaceholderView.h */, + 1FA88D00B7B2B2F0BA98BB92DF035906 /* DTDictationPlaceholderView.m */, + 89268DC8F1FBDE4F3167647B6A4F9216 /* DTHorizontalRuleHTMLElement.h */, + DD7A2DE5BDF72ABC066484CE554BDEF0 /* DTHorizontalRuleHTMLElement.m */, + 4E1066A8FE63AD2C818E26DDCE62DF58 /* DTHTMLAttributedStringBuilder.h */, + E0192469A486DA7CECFECEA37518B6B9 /* DTHTMLAttributedStringBuilder.m */, + F7C508BE899A1397560A767CAEADB7B9 /* DTHTMLElement.h */, + 7A4E9E54E556A72BC885CCC08B3791C1 /* DTHTMLElement.m */, + D28A3E79D83EA4B807E2D3A5EE086B8B /* DTHTMLParserNode.h */, + 5001C74FB9506AEC71E458047698A4AB /* DTHTMLParserNode.m */, + 558FCD3F7E481B782EBFA127486ED15D /* DTHTMLParserTextNode.h */, + E5377786E80195587BF3E8A7589E5925 /* DTHTMLParserTextNode.m */, + 14E63A0D35D4A07BD0123021EA161C99 /* DTHTMLWriter.h */, + B23C5F038DAC52B75213C0760C431F2B /* DTHTMLWriter.m */, + D4C731AA2088D7E873D8E3D21B95D215 /* DTIframeTextAttachment.h */, + BA8A527A4CCB2AF1C1E26744B301F6B8 /* DTIframeTextAttachment.m */, + E3CAAC46883B74B071843E5D38B5BF85 /* DTImage+HTML.h */, + CF1CED3ED65443999913BC0D96ACA151 /* DTImage+HTML.m */, + 27372A23AA4B051867E7D2C749D1DE81 /* DTImageTextAttachment.h */, + 57642B518C047A428FE1266A09E0513F /* DTImageTextAttachment.m */, + D5DD4142DF33E1BE0B5A057101E851C5 /* DTLazyImageView.h */, + CA5630DC0E663F38A9EC713323697EE1 /* DTLazyImageView.m */, + B12CE4962CDC324FB47FB92D6706D149 /* DTLinkButton.h */, + CE761A55BD57C0BFD6336CD073F85C31 /* DTLinkButton.m */, + 5DB480D0B78911DBF96986E64A714907 /* DTListItemHTMLElement.h */, + 61B18088896D291E0CE7718DFE82FAC1 /* DTListItemHTMLElement.m */, + 13597E7190F2C08C5906D7D128E43E99 /* DTObjectTextAttachment.h */, + 8EDA1618562CC224690CF6FC03AFED38 /* DTObjectTextAttachment.m */, + 1A88AA04D7B29A217B432C19AC48AB6B /* DTStylesheetHTMLElement.h */, + 354C1C3A74DB75C8B8608D538212A963 /* DTStylesheetHTMLElement.m */, + E853AAB3B09E0662567752431CEF1D33 /* DTTextAttachment.h */, + 4944FE0BE3205F2EC91A6A0550D30B75 /* DTTextAttachment.m */, + 8B8FDAF9E8370366F7FA8524CB0D80B3 /* DTTextAttachmentHTMLElement.h */, + AC0A4ED7E936923A29A5EEB1D95D6B55 /* DTTextAttachmentHTMLElement.m */, + EA2BF1D7535B036E1356E8DF42A04954 /* DTTextBlock.h */, + C508E49F6BF9F50B05918C230B033069 /* DTTextBlock.m */, + ED9A1EBDA0FD72671C7F6FE15F37B906 /* DTTextHTMLElement.h */, + 69076FC9D4201719C319547346DA3E21 /* DTTextHTMLElement.m */, + 50C2868064310B16D2B5FD9901C846DC /* DTVideoTextAttachment.h */, + B83D7A73677A2C3141EDEF56B9CE6584 /* DTVideoTextAttachment.m */, + E687628EF2FE92D093E3005D21B578E5 /* DTWeakSupport.h */, + 3985FED7BD8EC49191663BEF73FB2C79 /* NSAttributedString+DTCoreText.h */, + 978449466D53EA6F5D40FCF0F353DDCA /* NSAttributedString+DTCoreText.m */, + A8A086525BF509F4581693115438B82B /* NSAttributedString+DTDebug.h */, + 5096458D9BD2818F786BC3B61B91EAC7 /* NSAttributedString+DTDebug.m */, + 7805DFC2CB71F5B6BBF7891876360EFB /* NSAttributedString+HTML.h */, + 71EE0B4D4D1B3D0A55E903E7E0CA44E7 /* NSAttributedString+HTML.m */, + CACF20969583778CAC1BC92BB96F27FD /* NSAttributedString+SmallCaps.h */, + 98CF9C5D504838741E399811F4D5A0B7 /* NSAttributedString+SmallCaps.m */, + 30EB4CF4AD4114DE53786C318621EB19 /* NSAttributedStringRunDelegates.h */, + C69C7A531B5E021499D8FBF1DBE0E3BB /* NSAttributedStringRunDelegates.m */, + A7E167717A18E0C858C6FD95804249E4 /* NSCharacterSet+HTML.h */, + 2F242FC1357DD90FA4FD67E1DB90A837 /* NSCharacterSet+HTML.m */, + A592A34CA2EA792DDFAFAEB516FE8A10 /* NSCoder+DTCompatibility.h */, + 753994141ACB981C898B36B761321C23 /* NSCoder+DTCompatibility.m */, + 5C891B983F0CC956CAE3978A15875819 /* NSDictionary+DTCoreText.h */, + 78887827FF15DE20865DF3A00660993B /* NSDictionary+DTCoreText.m */, + 044BEA679671E16EA9BA9AD627750742 /* NSMutableAttributedString+HTML.h */, + 7CA72FA9A4F2F42A75C58325738A44AC /* NSMutableAttributedString+HTML.m */, + 52053ABC9CD3D4A72CD8A22173428AEB /* NSMutableString+HTML.h */, + 126E6ACAC7C0427806B58DA8E10BDD78 /* NSMutableString+HTML.m */, + 7CFFB65C5D340A4B5C627B3EF02CD127 /* NSNumber+RomanNumerals.h */, + 6E21B10EE150F00F245D297EAB7F2BA2 /* NSNumber+RomanNumerals.m */, + DD0A5FF70CDBE87597264762EC20EF43 /* NSScanner+HTML.h */, + 057DBFBFC99448A0B77A3C0DBB13B4A9 /* NSScanner+HTML.m */, + 3578B97A85BCDC60888FDF87B8F2600C /* NSString+CSS.h */, + 8718F2DB8F0DC085CB012D9996596F3F /* NSString+CSS.m */, + DC7D3AB85C954DA41E1500936C166C0E /* NSString+HTML.h */, + FA107BE47514D01B94B7A2670A9F83E5 /* NSString+HTML.m */, + 0B8321AB80CFE0B94537AEA63E9A79F5 /* NSString+Paragraphs.h */, + B4A7F7402FAEE3A277A8716DDA115C95 /* NSString+Paragraphs.m */, + 398DC798680E2CA64D46B9E19B380356 /* UIFont+DTCoreText.h */, + CEBA01360577AAD3FD089B6B17C24260 /* UIFont+DTCoreText.m */, + 30694C306AB98E50937E9ECB722C31A4 /* Core */, + 8AE80DCE6937729AEA82EC094AC470AE /* Resources */, + 387832C7C64B3B352215F0FD83B927AC /* Support Files */, ); - name = SnapKit; - path = SnapKit; + name = DTCoreText; + path = DTCoreText; sourceTree = ""; }; - 0BCB541A25608F56871618A1D03E9C54 /* Paging */ = { + 0C5B69B2CD80274C6E29E5EA8098B935 /* ChapterRuntime */ = { isa = PBXGroup; children = ( - A7F40EAB66363D681DA68981B17FB492 /* RDReaderPagingController.swift */, - 0E5D2C72E80EF71ECCFDFE5C476ADADE /* RDReaderPreloadController.swift */, - 0786D6430A29C2F90E4832048559BE21 /* RDReaderSpreadResolver.swift */, - 9C1B2F1D8E3F93A60375AA8853FF1842 /* RDReaderTapRegionHandler.swift */, + CCB06D5D93327CF4E70EB026DFEFE8BE /* RDEPUBBackgroundTrace.swift */, + E6801C4BFA1DBBC56523D5D3F427E8DB /* RDEPUBBookPageMap.swift */, + 05B6FB8AE3D884ED289049A7E125D668 /* RDEPUBChapterCacheKey.swift */, + 88EFF88D4E3001A8D2D0E50EF9B94BBA /* RDEPUBChapterDataCache.swift */, + 8097E74036B5D6E168E9714A580060A8 /* RDEPUBChapterLoader.swift */, + 78739A559E3A2EA9FA4A1C17B16746DC /* RDEPUBChapterLocation.swift */, + 15DDB8FAB80CF0B8039A3DCF2D1CE6F5 /* RDEPUBChapterOffsetMap.swift */, + D3BFAD599CFD612530D8B30DDB9F5D4A /* RDEPUBChapterRuntimeStore.swift */, + 14826541B96FDC7B652AA313B700DABA /* RDEPUBChapterSummaryDiskCache.swift */, + 270645F585F13D520FFA031C447E19F1 /* RDEPUBChapterWarmupOrchestrator.swift */, + FEC235E4971E5D0ED37AF923AD247D3C /* RDEPUBPageCountCache.swift */, + D7F60831A79D296EEABAD2AEB8A8C774 /* RDEPUBPageResolver.swift */, + 2A3E72DC0C036C0F8808A44B73C4A5EA /* RDEPUBRuntimeChapter.swift */, + 3C574CD3AE9D1DCCA02A5270BB1130B6 /* RDEPUBRuntimePageCount.swift */, ); - name = Paging; - path = Paging; + name = ChapterRuntime; + path = ChapterRuntime; sourceTree = ""; }; 0D4A349829D1C0DC0E69C0A64B9A4139 /* Pods-ReadViewDemo */ = { @@ -1339,165 +1275,115 @@ path = "Target Support Files/Pods-ReadViewDemo"; sourceTree = ""; }; - 0F7BCD3D7E88C5382380E13EE7B5535F /* Models */ = { + 15F3755B0C326BEBA738A6481B5F643E /* Typesetter */ = { isa = PBXGroup; children = ( - 43B3221062F7881536685FE3C927CC7D /* RDEPUBAnnotationModels.swift */, - 711A407CD08421E62F3C143957DD10DA /* RDEPUBPaginationModels.swift */, - C5077CB33FD2EA6584AF290C95617DC0 /* RDEPUBReadingLocationModels.swift */, - ); - name = Models; - path = Models; - sourceTree = ""; - }; - 13D36789CF3D460E6FFE303B68A66962 /* Typesetter */ = { - isa = PBXGroup; - children = ( - F5847BF261408B9B82FB3BF7A9390AB3 /* RDEPUBAttachmentNormalizer.swift */, - 05ECE185AAFC5A857734DF5495F8E7C2 /* RDEPUBCFIMarkerInjector.swift */, - 545DD46BEAB1D1F7E0530E787095FCB2 /* RDEPUBFontNormalizer.swift */, - 5E8C914D69561C6C9736FCB3C6698CCC /* RDEPUBFragmentMarkerInjector.swift */, - E0F6036722A2FEED169B57120EB274D1 /* RDEPUBHTMLNormalizer.swift */, - B898A07D2E7D8E62F64BD28BAFA3DEFA /* RDEPUBRenderDiagnosticsCollector.swift */, - 0AE0BE26FBA95F74B6173965BEC302EB /* RDEPUBSemanticMarkerInjector.swift */, - 361565CCC385512EA14A6A2C9CFAF08B /* RDEPUBStyleSheetComposer.swift */, - B55E6E99C6F879CFD19D3674CE20075C /* RDEPUBTextRendererSupport.swift */, - 3424A6DFBC2AC519C7C599F18DCDC89D /* RDEPUBTypesettingPipeline.swift */, - 946AB5EF65FFA0C796D6B4E19D4B646D /* Compatibility */, + 6EBB71B95928ABA41A3B33A9DB8E75DD /* RDEPUBAttachmentNormalizer.swift */, + 462A73405A3D510CF9A7F4B5D63BF2B1 /* RDEPUBCFIMarkerInjector.swift */, + CF108973184A89F47F1A44F491BC7453 /* RDEPUBFontNormalizer.swift */, + 91C1D68B23A3D8DAF1C0934F17A09917 /* RDEPUBFragmentMarkerInjector.swift */, + C384342E6BCF839582F9467109AC924A /* RDEPUBHTMLNormalizer.swift */, + BAE090F5D5825DF3A26C12BB14E21739 /* RDEPUBRenderDiagnosticsCollector.swift */, + 0CF3A3E5A1F6B321F72FD2FF3C0AC1E1 /* RDEPUBSemanticMarkerInjector.swift */, + 36D5F0FE11BFC4DA5A60FF82CD8D83E4 /* RDEPUBStyleSheetComposer.swift */, + 425D9BA744DFC5E49D875D81AA8761F8 /* RDEPUBTextRendererSupport.swift */, + AD5C20289C05F4C1BAD1B1DEEF2485C1 /* RDEPUBTypesettingPipeline.swift */, + 04A8FFC6216D98269272DFC3FD51B260 /* Compatibility */, ); name = Typesetter; path = Typesetter; sourceTree = ""; }; - 1B7515007EDD63EDCCE4BAD15D6CA9BA /* Support Files */ = { + 1A823333EC1496E37E1F99813FE335DD /* DTAnimatedGIF */ = { isa = PBXGroup; children = ( - EF27E643619E369E8A9C1FE6EFE18C78 /* DTFoundation.modulemap */, - FCC718115E5C31C88A680522AE36B089 /* DTFoundation-dummy.m */, - 2BA19BD582C1BD54AF673014C04848B6 /* DTFoundation-Info.plist */, - 25F52D9C765ED2FA87834D4310203E0B /* DTFoundation-prefix.pch */, - 5FAB3C7F19A511C2B1B7DFBA3CA308C4 /* DTFoundation-umbrella.h */, - 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */, - DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/DTFoundation"; - sourceTree = ""; - }; - 27F2A646BFA6F6504139570B69BEDF9B /* BuildPipeline */ = { - isa = PBXGroup; - children = ( - CD0C3C872488B6341E22BF47B6F9BBD6 /* RDEPUBBuildDiagnosticsReporter.swift */, - 68A8597AE94ED09E9828E2EEA0D8FFFA /* RDEPUBChapterTailNormalizer.swift */, - 3008F6944BA740CD6E6F5CA33733C911 /* RDEPUBPaginationCacheCoordinator.swift */, - 72BE58BB9BF4DCDFDC6D5430AA2E82E9 /* RDEPUBTextBookBuilder.swift */, - FF164505A477C6ED40FE8EF0CB2E6693 /* RDEPUBTextBookCache.swift */, - 2F34FF3B7E71CCE4E9C73115AA710B1C /* RDEPUBTextBookModels.swift */, - 59036F71583DAE2641D9DAA567DBD208 /* RDEPUBTextBuildPipelineInterfaces.swift */, - C5B003AC0B46623423334F97FEE379B8 /* RDEPUBTextPerformanceSampler.swift */, - ); - name = BuildPipeline; - path = BuildPipeline; - sourceTree = ""; - }; - 29A410FBD4C19138B1D732EC94D8EFB2 /* DTFoundation */ = { - isa = PBXGroup; - children = ( - E2CD122CF123DD3681DAEE021EA37359 /* Core */, - 3C15BAF0B39DC004AB2E6FA38175E25D /* DTAnimatedGIF */, - 64771901367D11DEDD868C197369EA56 /* DTHTMLParser */, - 1B7515007EDD63EDCCE4BAD15D6CA9BA /* Support Files */, - CA6142FEF8E51F79243E3C87378F50AF /* UIKit */, - ); - name = DTFoundation; - path = DTFoundation; - sourceTree = ""; - }; - 3595ED200AA07F0B71CB42506574798F /* Support Files */ = { - isa = PBXGroup; - children = ( - C8E2FC7BE14F90878CE3FB3E317996ED /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */, - 249747495DE8349E480E4789B12D366D /* SnapKit.modulemap */, - 9CE078B465FDEF40EC0469626A2C2469 /* SnapKit-dummy.m */, - DA9E9711A4073440ECC06C5BD6D8702F /* SnapKit-Info.plist */, - 2CD63BBDA1CB02B15A54D2CDD8A3ACD7 /* SnapKit-prefix.pch */, - 0B10D3EC1701BBA4D69926915F942558 /* SnapKit-umbrella.h */, - C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */, - 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SnapKit"; - sourceTree = ""; - }; - 399DBAA31AC98F6F98B27CE5ED36F63D /* Pod */ = { - isa = PBXGroup; - children = ( - 80A3A50AC272F9C52395F4818E87EA19 /* RDReaderView.podspec */, - ); - name = Pod; - sourceTree = ""; - }; - 3C15BAF0B39DC004AB2E6FA38175E25D /* DTAnimatedGIF */ = { - isa = PBXGroup; - children = ( - A9FBC69C7DA29A7283920FDA9EBBCE8A /* DTAnimatedGIF.h */, - BC332335B380BC51C4F05C5CCDFB9189 /* DTAnimatedGIF.m */, + F9D9BEF72311AF9E3239F9B92A9D2842 /* DTAnimatedGIF.h */, + A3DE08AC23FE36A6C3F33A04700FDE57 /* DTAnimatedGIF.m */, ); name = DTAnimatedGIF; sourceTree = ""; }; - 43D8ECA62CF48C3CD5F77E3CA6F466AF /* Products */ = { + 30694C306AB98E50937E9ECB722C31A4 /* Core */ = { isa = PBXGroup; children = ( - EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */, - F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */, - D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */, - 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */, - 238893C9CBD95CB9BDF069EB5A303E17 /* RDReaderView */, - 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */, - 979486118B3E90C08386079D57962701 /* SnapKit */, - B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */, - D9AFC4B66F872436A059FE53780D216F /* SSAlertSwift */, - 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */, - CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */, ); - name = Products; + name = Core; sourceTree = ""; }; - 49882ECBC24E71ACA5E18D6AE9EA639D /* SSAlertSwift */ = { + 34BA0E6288A1D9025DB06B70D292ED49 /* Settings */ = { isa = PBXGroup; children = ( - 6D2EC0B845131A88247902AEA26F40AE /* SSAlertAnimation.swift */, - 97995C73297871C353364E685939DED9 /* SSAlertAnimationController.swift */, - EE4EE750340347ED584C5A2C1164331A /* SSAlertCommonView.swift */, - 81B8F42440B802E6EC2B1FF7E3022F3A /* SSAlertDefaultAnmation.swift */, - E481007A8174943868EBC81CF3B04B9F /* SSAlertPresentAnimation.swift */, - F410ED25E4E84C3D5166261CDF4B58F2 /* SSAlertView.swift */, - 2280F2302F54E90122747821FE681543 /* SSAlertViewExtention.swift */, - D8C351514678D41C58869BD057D5483F /* UIViewFrameExtension.swift */, - 62598D566A90C2374701CEB798B77521 /* Support Files */, + A1E58E922721839C1D9E53D2DFA357A8 /* RDEPUBReaderConfiguration.swift */, + A16F8F582626936AC8B388F57B74A6F5 /* RDEPUBReaderSettings.swift */, + C16D8899DF97FEA1975D2D134DA77804 /* RDEPUBReaderSettingsViewController.swift */, + 34595E922A09667901C926A8EBBC5E1A /* RDEPUBReaderTheme.swift */, ); - name = SSAlertSwift; - path = SSAlertSwift; + name = Settings; + path = Settings; sourceTree = ""; }; - 4C9B2E5C384CA278DFF20A6A25A57C31 /* TextPage */ = { + 387832C7C64B3B352215F0FD83B927AC /* Support Files */ = { isa = PBXGroup; children = ( - BC1AE55A8C17840C96761BE01A89653E /* RDEPUBDarkImageAdjuster.swift */, - EEAE1CB7D6F5BB8E33C9562663C93A51 /* RDEPUBPageInteractionController.swift */, - 47889215B9D350817A491970E6AED97C /* RDEPUBPageLayoutSnapshot.swift */, - C518633651B8B05BFB5292862EB4B642 /* RDEPUBSelectionLoupeView.swift */, - 2F8D349DB593AF848B64723FBF1DF717 /* RDEPUBSelectionOverlayView.swift */, - A988B95153188D52B4BF9F4083BB18E9 /* RDEPUBTextAnnotationOverlay.swift */, - BAA55250015C69FA24DCF3808A74ACA5 /* RDEPUBTextContentInteractionCoordinator.swift */, - 8C7F146589FBD04B46D846AE1ECBD10A /* RDEPUBTextContentView.swift */, - 9C89744F4424D96B176330404D1D82C7 /* RDEPUBTextPageDecorationView.swift */, - 0F9E2282A0A515A241F80997B2F28767 /* RDEPUBTextPageRenderView.swift */, - EFA3CC091FA3A16CC09C9C66D1BC0E50 /* RDEPUBTextSelectionController.swift */, + 741D74BC489AF6715191F2A88E50B016 /* DTCoreText.modulemap */, + B6CA8CC4525EF64AA5CEE4A722737F1C /* DTCoreText-dummy.m */, + ACD2A4FF41C5A223C2D4B74E0EDA9B2C /* DTCoreText-Info.plist */, + 7D4062C36BA5FFBAE9122CAD0DCEC6B6 /* DTCoreText-prefix.pch */, + 13F8FC8B51AD434F5D4B0CF5150D7563 /* DTCoreText-umbrella.h */, + C0DCB00F0B62D7DBE628D2B5FF006E93 /* DTCoreText.debug.xcconfig */, + 7A13F9221A300A89F9F8D0A2AB1794BF /* DTCoreText.release.xcconfig */, + E74132875CC4A311B230B68C085D8CE6 /* ResourceBundle-Resources-DTCoreText-Info.plist */, ); - name = TextPage; - path = TextPage; + name = "Support Files"; + path = "../Target Support Files/DTCoreText"; + sourceTree = ""; + }; + 3DE030DD1E49D0CD372ACE04F39588FC /* Models */ = { + isa = PBXGroup; + children = ( + 3E66D8D0604A6C89AA9DD222FE61F0E2 /* RDEPUBAnnotationModels.swift */, + 43DB30ED1E8B12F6CEC548FBF1290668 /* RDEPUBPaginationModels.swift */, + 1D220183932DB13D0AF20EF12C44A29D /* RDEPUBReadingLocationModels.swift */, + ); + name = Models; + path = Models; + sourceTree = ""; + }; + 426395460B992FC2D2EF86AF65197AD4 /* Pods */ = { + isa = PBXGroup; + children = ( + 06C22A27383EA079F8FF2367C9567BC0 /* DTCoreText */, + DA2E3A6B928E59EEA59E8967EC93C73E /* DTFoundation */, + B45E17EA805660F2389832287623284D /* ZIPFoundation */, + ); + name = Pods; + sourceTree = ""; + }; + 49397EB7C057319B2CA1AA4239F92807 /* Notes */ = { + isa = PBXGroup; + children = ( + 8F2DF1EE547C972C1BF12018AFFC5142 /* RDEPUBNoteDetector.swift */, + 26E305762ECD5788B045AFC816767444 /* RDEPUBNoteModels.swift */, + 761AE6FC1A75A238945BD6F186EAA5E3 /* RDEPUBNoteResolver.swift */, + ); + name = Notes; + path = Notes; + sourceTree = ""; + }; + 4B9763CFE13CC8B0D8AA60EE28156E6D /* Support Files */ = { + isa = PBXGroup; + children = ( + 3DAC9D3802A9F165B2F6B09C2DCF0EB7 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */, + 2361BC151481D2717ED43C5659725945 /* ZIPFoundation.modulemap */, + E9D8AB18960B56A997408E3235751624 /* ZIPFoundation-dummy.m */, + 44133205D7FD87B481BF89EA607CA7A4 /* ZIPFoundation-Info.plist */, + BC59BBF6628D93AAC30CBFE0FF0151F2 /* ZIPFoundation-prefix.pch */, + B41F7D27C2336F89BB0185ACB0B19EA9 /* ZIPFoundation-umbrella.h */, + 79D13938A04579CD1E9E042A39CC4D86 /* ZIPFoundation.debug.xcconfig */, + 766227355308600EFC048F797274454A /* ZIPFoundation.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/ZIPFoundation"; sourceTree = ""; }; 4DABD1D106D01055A2AB87F3DA58A3CC /* iOS */ = { @@ -1513,199 +1399,116 @@ name = iOS; sourceTree = ""; }; - 4E605D80CB4B34AD26274337E004F704 /* Support Files */ = { + 53105D96992884E1673FC639B3987E2C /* DTHTMLParser */ = { isa = PBXGroup; children = ( - 365FB4C3E0FF364C076EE4E9E47C32EA /* DTCoreText.modulemap */, - 015F3EE69253C66E11B931E3360BA5FE /* DTCoreText-dummy.m */, - B9E40164920C9AC1B1413C51835CD370 /* DTCoreText-Info.plist */, - D80CD20CB452B31CCCB14AF8567524D3 /* DTCoreText-prefix.pch */, - CE7768E097F8BDE9FBE3752B98CD0101 /* DTCoreText-umbrella.h */, - 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */, - C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */, - 9F8F40493DF0BBB3EA5FC1F759A883C4 /* ResourceBundle-Resources-DTCoreText-Info.plist */, + CB2BD1F8CFECB82D427DF046439E68D6 /* DTHTMLParser.h */, + 71BBE6384315D7F00F5ECFFF67A85AF9 /* DTHTMLParser.m */, ); - name = "Support Files"; - path = "../Target Support Files/DTCoreText"; + name = DTHTMLParser; sourceTree = ""; }; - 62598D566A90C2374701CEB798B77521 /* Support Files */ = { + 58B9D4234EDD00FD37667D574CBA9DC6 /* Support Files */ = { isa = PBXGroup; children = ( - 4600E9C0EF3B23864C9D7E5E90155F9D /* SSAlertSwift.modulemap */, - 2DE4FA5133891593CB45AF36B8EBF60C /* SSAlertSwift-dummy.m */, - 8E3E834CCC952717089550F50A2DE59C /* SSAlertSwift-Info.plist */, - 32A8BED62113FF47E3925378065FA3BE /* SSAlertSwift-prefix.pch */, - 937CEFA81DA4227008DBFB114783A08B /* SSAlertSwift-umbrella.h */, - 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */, - FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SSAlertSwift"; - sourceTree = ""; - }; - 62D640F7748C5E79310AA9EF7767FDD1 /* ZIPFoundation */ = { - isa = PBXGroup; - children = ( - 1C8F0DCEAA5A3DF38C503CA30DC94C1C /* Archive.swift */, - 61E36C4FE448DDDA03450847FCB785B6 /* Archive+BackingConfiguration.swift */, - 5BA251BAC8B430B3A4D4C4321046B990 /* Archive+Deprecated.swift */, - 4A2659DB0685E16ABAE0382F726DA8C8 /* Archive+Helpers.swift */, - 174FC0CA05D20BB995E211DE5A0857DB /* Archive+MemoryFile.swift */, - AD987C2FA7C8FBC96FD024E421DA0E68 /* Archive+Progress.swift */, - 0619F98DA80922E78A07321D0DC54F62 /* Archive+Reading.swift */, - 934F9BB2B3A313294F121484C3A97A14 /* Archive+ReadingDeprecated.swift */, - DF988440049800DB7824A94B81D20254 /* Archive+Writing.swift */, - 98C7359A7C3FC7675FED220200A43A17 /* Archive+WritingDeprecated.swift */, - ED5693BD171B879406EA14C97F4AD8D8 /* Archive+ZIP64.swift */, - 5964AF1336E2F0DA0E2C32991E76C78C /* Data+Compression.swift */, - 4D641809A99849F80FDCB02F8CE8D6A0 /* Data+CompressionDeprecated.swift */, - 3DC78D0B0F37BF9AD1058CACA9AAF9BE /* Data+Serialization.swift */, - F76A97683FB5E8E8B86EA4AD71F6F4B4 /* Date+ZIP.swift */, - BDD081272B47A3B73CE693D21DC26827 /* Entry.swift */, - 5F991240340FA026C71B68EB25B9F9C8 /* Entry+Serialization.swift */, - 7345CE45F696634CEA692A86D16F684C /* Entry+ZIP64.swift */, - 27B7D3C6F0C845E3D42BBA613FFB0465 /* FileManager+ZIP.swift */, - 04F9B298989305B9569B71E448E8C1D4 /* FileManager+ZIPDeprecated.swift */, - 537BB06317FA188DF7A8A960152520E8 /* URL+ZIP.swift */, - DD6FCBC8887B9E6DA3045CADFEB02EB4 /* Resources */, - F3D99F452BF74190AE8A6D307FDF149B /* Support Files */, - ); - name = ZIPFoundation; - path = ZIPFoundation; - sourceTree = ""; - }; - 62F2A978E55ACE107C18809C9C197080 /* Support Files */ = { - isa = PBXGroup; - children = ( - FABA3ECEE6A89B4087086F0D2377CB5A /* RDReaderView.modulemap */, - A61F5753AE7B5122FE65CF07CF1AD5FD /* RDReaderView-dummy.m */, - 8A1D29D22B94FD4B310B5A419E79057B /* RDReaderView-Info.plist */, - FB36F27A8101BA01699CFD777FC1CAFA /* RDReaderView-prefix.pch */, - 9D28F67E16027AF4FA4F9D501C4D0712 /* RDReaderView-umbrella.h */, - 9F8BA45FA0D8E3CBAAE6E18272EB0644 /* RDReaderView.debug.xcconfig */, - 55CA6158EBEFCD459EB481660A12EB86 /* RDReaderView.release.xcconfig */, - 02946CDDA8033AFAA82187D50800FEA8 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */, + A6F6D9E3E51175232197195809304FB2 /* RDReaderView.modulemap */, + 506A3F4E93699E821176158B4E1A74ED /* RDReaderView-dummy.m */, + 06D709090C07C72DEEF74D75E06AD845 /* RDReaderView-Info.plist */, + C37DF2A4019097BD40A1E29897024314 /* RDReaderView-prefix.pch */, + C2E354232C09ED53034E389E0A70A0C2 /* RDReaderView-umbrella.h */, + 38EFC4374585F70CA0057C2B93243BDB /* RDReaderView.debug.xcconfig */, + 78EB9889508A20E866AC37B22D441FC4 /* RDReaderView.release.xcconfig */, + 4B50A66BAEFD8F677924803465049443 /* ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist */, ); name = "Support Files"; path = "ReadViewDemo/Pods/Target Support Files/RDReaderView"; sourceTree = ""; }; - 64771901367D11DEDD868C197369EA56 /* DTHTMLParser */ = { + 70825513362D8A6FA4F2AE52C1A34691 /* TextPage */ = { isa = PBXGroup; children = ( - 0D75FEDE65722CF41F7F32A164376926 /* DTHTMLParser.h */, - 32FB2B1B0498DCBE7B79BDF49E963E3D /* DTHTMLParser.m */, + F4BE66AE0A6BCE91929B24BAA34DA151 /* RDEPUBDarkImageAdjuster.swift */, + 1FC3BE6BBB4EBD99FF9124BA8E599520 /* RDEPUBPageInteractionController.swift */, + 32B07FB6279468CAC8C8496B97B2B543 /* RDEPUBPageLayoutSnapshot.swift */, + CE23D3D8B6CDEC776313C06D5CB44FE2 /* RDEPUBSelectionLoupeView.swift */, + A13D725843764880816F43281F2363FC /* RDEPUBSelectionOverlayView.swift */, + D9EB24D09C2239F4C77E17F54D248B80 /* RDEPUBTextAnnotationOverlay.swift */, + D4FD083436655F07AFCFB5B5492EF0F1 /* RDEPUBTextContentInteractionCoordinator.swift */, + 57CB038980ADA439CEC82E0EBBD3FC9E /* RDEPUBTextContentView.swift */, + 51282F5AE6E4F8FCD61A8B05638937D2 /* RDEPUBTextPageDecorationView.swift */, + 61228D2169407CE48F19589A5145557B /* RDEPUBTextPageRenderView.swift */, + 94AC74FD0844C7054C87B2A9D27D847D /* RDEPUBTextSelectionController.swift */, ); - name = DTHTMLParser; + name = TextPage; + path = TextPage; sourceTree = ""; }; - 81FAF4124052D4A411C0A8C21B48174C /* Core */ = { + 7460E24FCB37B79E810429AAC51A95FD /* EPUBTextRendering */ = { isa = PBXGroup; children = ( + 7C60AB9DEFB015F6E3A40DECE78AC69B /* RDEPUBChapterData.swift */, + A601AB41E9B4878B34FC3380355F8DD9 /* RDEPUBDTCoreTextRenderer.swift */, + 68CF28E1B8594F100BEAC89F7B9CA20F /* RDEPUBTextIndexTable.swift */, + 77121A149AA3464C8E6A171329293BD2 /* RDEPUBTextPositionConverter.swift */, + D61BD3F3828530F0B2500FA1C4367C50 /* RDEPUBTextRenderer.swift */, + 477676C456F623C8A33D40A533FA960D /* RDEPUBTextSearchEngine.swift */, + D30190E9913BB7FF775D8602E753BA47 /* RDPlainTextBookBuilder.swift */, + AB29EEE80824EBEB1B0E91D6F4ACF0F8 /* BuildPipeline */, + B8402F3806C08042421D9F08E2357FC2 /* Pagination */, + 15F3755B0C326BEBA738A6481B5F643E /* Typesetter */, ); - name = Core; + name = EPUBTextRendering; + path = Sources/RDReaderView/EPUBTextRendering; sourceTree = ""; }; - 889CE3BF1849B77422823421266A37D1 /* Notes */ = { + 828D005E8E94DC05C1C5CCDDE8DA4335 /* Paging */ = { isa = PBXGroup; children = ( - 7D0C0A9C17CB99D2B116A2E6450CE89D /* RDEPUBNoteDetector.swift */, - 9A2A285973A8C8A81A03D472845DA414 /* RDEPUBNoteModels.swift */, - E8C6B44716EC22054F92F4ED84DA6A85 /* RDEPUBNoteResolver.swift */, + E246B080707A0DA836FC0890AE96D529 /* RDReaderPagingController.swift */, + DC9EFF22EDE800175B01DE546C97862D /* RDReaderPreloadController.swift */, + 1BDECCF30428456DD69F6D870693248C /* RDReaderSpreadResolver.swift */, + F850938C9F348E6ED5216809EE43689D /* RDReaderTapRegionHandler.swift */, ); - name = Notes; - path = Notes; + name = Paging; + path = Paging; sourceTree = ""; }; - 88DDD441541D3FB5E20C9F271215D7E7 /* EPUBUI */ = { + 8AE80DCE6937729AEA82EC094AC470AE /* Resources */ = { isa = PBXGroup; children = ( - CDC41111F7B2BF68994C924BC0C5794C /* RDEPUBAttachmentTooltipOverlayView.swift */, - 5D3CFCA211B02F4FB8BEE828C37A318B /* RDEPUBAttachmentTooltipView.swift */, - F20E15B3473E29738F2A09C625A687BB /* RDEPUBImageViewController.swift */, - 47B749BBD9F9ECB3CB4876AFB35FA577 /* RDEPUBImageViewerCoordinator.swift */, - 1A7D80430EE63D6EA20B3BBA26A89B34 /* RDEPUBReaderBottomToolView.swift */, - 58AD77A6558F2424BFBBB829F7651AAC /* RDEPUBReaderChapterListController.swift */, - 6CF99F8C8ED42F614BB051509F8E065B /* RDEPUBReaderController.swift */, - 0595FF1B5274FDF6F9143B6F7FA18D61 /* RDEPUBReaderController+AttachmentTooltip.swift */, - FD0189649153ACCA56C4C8AD0BEF1E0D /* RDEPUBReaderController+ContentDelegates.swift */, - B99FF5D96CD045BCC53A9F6F8493C379 /* RDEPUBReaderController+DataSource.swift */, - 1EBAE1E92B0DEECFFA57D82DC828AB30 /* RDEPUBReaderController+ExternalLinks.swift */, - 5F003AB5BAC52B6BF426F57E7C500BA8 /* RDEPUBReaderController+LocationResolution.swift */, - 3E1485847E9CA847239AB24742D72ABB /* RDEPUBReaderController+PublicAPI.swift */, - 15DB2B4B89706EFDAB413FC86A6C29C0 /* RDEPUBReaderController+RenderSupport.swift */, - 80F37ED477F71A78A2658E146A2A5CB3 /* RDEPUBReaderController+RuntimeBridge.swift */, - 3E01ED3AA3B7599EB648D7BD507B4D92 /* RDEPUBReaderController+TableOfContents.swift */, - 7036B7E2D1B623419E1EB950E58865CC /* RDEPUBReaderDelegate.swift */, - DA80D2B3DB04B3530C801B06AC694048 /* RDEPUBReaderHighlightsViewController.swift */, - 0FADF7F2A0784AA8BE178F33CACE42C9 /* RDEPUBReaderPersistence.swift */, - AF6879143052D4942E4FEA0F92504804 /* RDEPUBReaderSearchBarView.swift */, - BA142E0FB9C9440BA93BE7BF027F095F /* RDEPUBReaderTableOfContentsItem.swift */, - F270A5E6ACC194137AB15688F6F4C759 /* RDEPUBReaderToolView.swift */, - DAA89AE50DEA94816C5333CC1325DDA8 /* RDEPUBReaderTopToolView.swift */, - 520E0A63146D08FBEFF05CA61FA4B8B6 /* RDEPUBViewportTypes.swift */, - 48325761E589FE657E084982A81D5DA6 /* RDEPUBWebContentView.swift */, - 9551DE4A9087AF37320340372B24F7CA /* RDEPUBWebDecorationOverlayView.swift */, - EEA02BC05A988384DC4551B451ED1E7E /* RDURLReaderController.swift */, - 0E78795FD43E657B2F567418E0A7EB30 /* String+RDEPUB.swift */, - AB8FBD335486F255F42811FC49E5657C /* UIColor+RDEPUB.swift */, - AFE6D8828F2634226CDA2F79A19625E3 /* UIColor+RDEPUBHex.swift */, - 96F1B22B2BFA646D65069B83727B0839 /* Notes */, - FC15689DA3F1CFC314BD4FF13CED527E /* ReaderController */, - 8C1A01D4918AD5C5E8AC59A16E2404E4 /* Settings */, - 4C9B2E5C384CA278DFF20A6A25A57C31 /* TextPage */, + 47DC174612C98B2CFB4E7D158169139E /* default.css */, ); - name = EPUBUI; - path = Sources/RDReaderView/EPUBUI; + name = Resources; sourceTree = ""; }; - 8C1A01D4918AD5C5E8AC59A16E2404E4 /* Settings */ = { + 8DC9877037F8A406989B79289F6EFAD8 /* Pod */ = { isa = PBXGroup; children = ( - 2E53AFDDED09CAFF8EFC5BC809DB5855 /* RDEPUBReaderConfiguration.swift */, - 96331868591D020B267B45CA8EF65355 /* RDEPUBReaderSettings.swift */, - 7FC4B1718DDF94A99192ABD5C1B24DAC /* RDEPUBReaderSettingsViewController.swift */, - 953EF1E3CA69D8F4BF3E4D41B1BEAE2C /* RDEPUBReaderTheme.swift */, + C477D7EE62BF9A8ACC465998EE02CB76 /* RDReaderView.podspec */, ); - name = Settings; - path = Settings; + name = Pod; sourceTree = ""; }; - 8FC974FE4013F8502C8F4C9902F99124 /* Pagination */ = { + 9562DD652C3F1E63D393B69D04C3D0EB /* CFI */ = { isa = PBXGroup; children = ( - B62755E9A395FF22E7405C3FE192D5F3 /* RDEPUBChapterPageCounter.swift */, - 81211446372A6A55789AA7E7152E7084 /* RDEPUBCoreTextPageFrameFactory.swift */, - FE10A5C6934704218EB16F8966AA0814 /* RDEPUBPageBreakPolicy.swift */, - 7F8C64CB3F3D0B7D4AA66798C740CB20 /* RDEPUBTextLayouter.swift */, - 07C08997AE3D75194E400010A0AE4820 /* RDEPUBTextLayoutFrame.swift */, - D4721E12B4121C46B8368D085D91EC2B /* RDEPUBTextPaginationInterfaces.swift */, - 78C97EDF23543CE63904C4D8A066A7A1 /* RDEPUBTextPaginationSupport.swift */, + 24B4BDE6AF43475513D28D232AB7D0B9 /* RDEPUBCFI.swift */, + 6DCD270CD8C5A0C917FB01A8B3116DF8 /* RDEPUBCFICompatibility.swift */, + A26FAE3FB6F9DBBC672161B173177A5C /* RDEPUBCFIDOMPathBuilder.swift */, + EA1200B7F3541159D13204D0C860076B /* RDEPUBCFIError.swift */, + 02DDA7AD723C7FEB0B80B0C573EAE679 /* RDEPUBCFIGenerator.swift */, + BE8601B1192179DC899A1156CB46369E /* RDEPUBCFIMap.swift */, + 184CDDD009D8F4384A9E02F953B6D8B6 /* RDEPUBCFIParser.swift */, + 66BF9E68AC68E641A2F40FB7DE03BA5B /* RDEPUBCFIPath.swift */, + 29701CE248CAAA87698BD90F74F6295B /* RDEPUBCFIRange.swift */, + 5E8993D56BA3E8692108E3C53CD52806 /* RDEPUBCFIRecoveryEngine.swift */, + E697E9F69226A6A803098BFD3D202842 /* RDEPUBCFIResolver.swift */, + 6EADA99F8B48CDCB82A6D2D3507EC32C /* RDEPUBCFISerializer.swift */, + 9998A80A1B633EB1C2C1EBB107866B40 /* RDEPUBCFITextAssertion.swift */, + AEB527B9C4921752C6B00B0D032F379D /* RDEPUBCFIUtilities.swift */, ); - name = Pagination; - path = Pagination; - sourceTree = ""; - }; - 946AB5EF65FFA0C796D6B4E19D4B646D /* Compatibility */ = { - isa = PBXGroup; - children = ( - 30EE98BBC2688DFF0B50F9C417007886 /* RDEPUBCSSCompatibilityLayer.swift */, - 5F9FE9924520900BBDF724D9903C5309 /* RDEPUBFontFallbackResolver.swift */, - 5077339D9632D68EDAB64BBEF622E154 /* RDEPUBStyleCompatibilityModels.swift */, - ); - name = Compatibility; - path = Compatibility; - sourceTree = ""; - }; - 96F1B22B2BFA646D65069B83727B0839 /* Notes */ = { - isa = PBXGroup; - children = ( - 9AD7F70FD18BED0C429A85E579ABF569 /* RDEPUBNotePopupCoordinator.swift */, - D7FB9FD3FFFF0D8E3D9D354EC7AF35E1 /* RDEPUBNotePopupViewController.swift */, - ); - name = Notes; - path = Notes; + name = CFI; + path = CFI; sourceTree = ""; }; 994C39A644C0722C7A9E97AB46DB8965 /* Targets Support Files */ = { @@ -1716,267 +1519,180 @@ name = "Targets Support Files"; sourceTree = ""; }; - 9E100780A98E22AF423BFB0DC63B601C /* ReaderView */ = { + 9C7F7E7109B9004B64578ADED4DB8E0D /* Core */ = { isa = PBXGroup; children = ( - 76919E99E9F16C30FA06F643643AA997 /* RDReaderContentCell.swift */, - E4C4605A9B7326DBE0CED7EB66A7416F /* RDReaderFlowLayout.swift */, - 10617286346E2E6D7BB30203A65302CA /* RDReaderGestureController.swift */, - AB3DF251DDD78EDAEE82FBEBDF9CE79B /* RDReaderPageChildViewController.swift */, - 1FE1D4A863768FC78F6B76B6A181267C /* RDReaderView.swift */, - 4C4682C38E0A66C0E9760FC62C00A327 /* RDReaderView+CollectionView.swift */, - 0D170B1455CB3C94EFC34D7B67EDC001 /* RDReaderView+ContentAccess.swift */, - 2E281F0688B1D356CF1654C6063AE77D /* RDReaderView+PageCurl.swift */, - 648D6AC5A8FA53918EDB418D8A36710E /* RDReaderView+ToolView.swift */, - 1058DD74F97F43193DBA11E135ACFF22 /* RDReaderViewProtocols.swift */, - 0BCB541A25608F56871618A1D03E9C54 /* Paging */, + 519087D9CD0F5E440E6D2C3B1AA1DFA2 /* DTBase64Coding.h */, + E5D4D6E12779C54F17AE98A1E6C9B699 /* DTBase64Coding.m */, + 35417EC94F2D58CB80C991F875CE15C2 /* DTBlockFunctions.h */, + 6D2316F422A6C97F95F9CF43E6F8E94F /* DTBlockFunctions.m */, + 8F653EFBBEDAAC96A34BC93B4211E792 /* DTCompatibility.h */, + 2C1A7359A45BB880877A672C57F522FE /* DTCoreGraphicsUtils.h */, + 0372FD1824BC43F7BD6B337430201420 /* DTCoreGraphicsUtils.m */, + 2F75437CE9F9324D315E417014797C1D /* DTExtendedFileAttributes.h */, + 56E8939081946D090FD77A04F879754C /* DTExtendedFileAttributes.m */, + A8CC38EFEF171FFEE008C32A6319BE6A /* DTFolderMonitor.h */, + BEA46E51E3616ECEAF0ACCEA9B8C67EF /* DTFolderMonitor.m */, + FF63F5E8902D6F3F5E845A924EBBC6D3 /* DTFoundationConstants.h */, + 0F80AC45FB1DBF50E0E3AA4F26BFA676 /* DTFoundationConstants.m */, + 207CC0EEB74CECEB43A870FF80560E0F /* DTLog.h */, + 199E2ECC77BDAC03F644C20040F042D4 /* DTLog.m */, + 8C9575F05D72C239E7E6F079BACDF4C7 /* DTVersion.h */, + CCC633BF76C79E0B4A6750337D5DCDB8 /* DTVersion.m */, + E4C5EB3F8F005C65005C101A9DBE488A /* DTWeakSupport.h */, + C7E09A6C247D465CA0EF71B939B2A040 /* NSArray+DTError.h */, + 8E5297E7F5769C61C1838962BA76D4F5 /* NSArray+DTError.m */, + 94705DADD1F09F4162F7D733318238F4 /* NSData+DTCrypto.h */, + F63EBF2BF3000B3391F6E693581EA129 /* NSData+DTCrypto.m */, + 05838D65DEC339C51AADB17346B7E287 /* NSDictionary+DTError.h */, + 45A67761829BBB3974CE24FE50E459EA /* NSDictionary+DTError.m */, + B43D7603C0D66635268842EC0A2655AC /* NSFileWrapper+DTCopying.h */, + D9A812C3E577A3ADC36BAE3FF7AA4D9C /* NSFileWrapper+DTCopying.m */, + 3046397381A83C2F6BAF344B86AD176E /* NSMutableArray+DTMoving.h */, + ADD5B2F66FCCFB58393314E7B9FE4384 /* NSMutableArray+DTMoving.m */, + A3BD3ED7913130D32E14D5572CBCC921 /* NSString+DTFormatNumbers.h */, + C5005A9E8F746647585CCAB26853E922 /* NSString+DTFormatNumbers.m */, + B76B1E836C34CB755AEE1FBF7DC26BDD /* NSString+DTPaths.h */, + D30DBDF1EDB20CF83690AC6619AA0C48 /* NSString+DTPaths.m */, + CEEC8715398E89B42F9B04E290E8E4FE /* NSString+DTURLEncoding.h */, + 131C1D8C96DF2D44A2D4F50C5AEFFF11 /* NSString+DTURLEncoding.m */, + 7C80941DE172AF972D2247659684D93A /* NSString+DTUtilities.h */, + F3E93C4AC73A09DE1EAE805B0ADE3306 /* NSString+DTUtilities.m */, + 1F1F7BFB63DE15D627EB8F64829B8AAD /* NSURL+DTComparing.h */, + 467CC59CEC3B3BC7ACDCA776FDCBDC1D /* NSURL+DTComparing.m */, + ACA6D26B26D2653D6E1C871A482BD6DF /* NSURL+DTUnshorten.h */, + 3A6A858B976D032A3C61540AFF19DEE4 /* NSURL+DTUnshorten.m */, ); - name = ReaderView; - path = Sources/RDReaderView/ReaderView; + name = Core; sourceTree = ""; }; - A5E1FCBC8B49DE230DF2EACDA19A840B /* DTCoreText */ = { + 9CCCE679A167C8125B04E0A05685A334 /* RDReaderView */ = { isa = PBXGroup; children = ( - DD58A1908F3C532210EA65ACE410A44D /* CTLineUtils.h */, - D24FE8634A7AD2562DB8ADB9D4BBB36A /* CTLineUtils.m */, - 99299A9FD6EF739D18352AC5B9325CB0 /* DTAccessibilityElement.h */, - 4F0486D3B46DC92AB254D6EE9CC233BF /* DTAccessibilityElement.m */, - F37563A56C180CE18EEFADE56FA3C17F /* DTAccessibilityViewProxy.h */, - 43CFADE0F46014990052AD67F17C86FF /* DTAccessibilityViewProxy.m */, - 424F12BEB0EDAAF1C719B5103D30C653 /* DTAnchorHTMLElement.h */, - 7D63AE1801C7AB149219317BE7529B26 /* DTAnchorHTMLElement.m */, - 5679D281C282896E6FC352C48E0AF439 /* DTAttributedLabel.h */, - 21BAA93E67D8CBC5297302D798FB4F7A /* DTAttributedLabel.m */, - D4093D30B372960168C1349100DF7DE0 /* DTAttributedTextCell.h */, - E1F63A854BBF28E93AC1D3F71CD48CBE /* DTAttributedTextCell.m */, - C123C127CC539ACCB510F665DB774899 /* DTAttributedTextContentView.h */, - F0D72C5680EBE6CA716EE77281AA4436 /* DTAttributedTextContentView.m */, - A276DE925253460239BFAEC7663F60D3 /* DTAttributedTextView.h */, - 77A613841EB90827AF321DD50B21DB5D /* DTAttributedTextView.m */, - 533CFFF04BE7BC4BDEAE11DF675A84CA /* DTBreakHTMLElement.h */, - F734214E067BDBDB581911E1A5CDAADB /* DTBreakHTMLElement.m */, - 80B3D15ED0D19D020663EF055386291A /* DTColor+Compatibility.h */, - E196F56E68578181D5BDE787DE5C0F3A /* DTColor+Compatibility.m */, - 86A0361390AA0C29BC1A5487083A12A7 /* DTColorFunctions.h */, - AFC4C9F69BF2D0CAEBAA83896C139D2C /* DTColorFunctions.m */, - 2702E05AA7A266B7D8D0F881FD4E09DA /* DTCompatibility.h */, - 53F98F0F060B066CAFBCD3C85C26B2B4 /* DTCoreText.h */, - C8C20D9A71E6605DEE80342E7122B683 /* DTCoreTextConstants.h */, - B2B3D0CB47B0A8E9EC5AF48B7F2DD6B0 /* DTCoreTextConstants.m */, - 0B7771FDE9AB1688166584C0AA03F12A /* DTCoreTextFontCollection.h */, - 5E791886E59DC0FAB02C6BBAB5BE5B6B /* DTCoreTextFontCollection.m */, - 56489D9BA834497E48438A4B4E1CCCFF /* DTCoreTextFontDescriptor.h */, - BCCA590DB72AA93275262A414F16578A /* DTCoreTextFontDescriptor.m */, - A1B031E2B903C2F177195C1C3D1D1EDB /* DTCoreTextFunctions.h */, - 8F2D44B82815CA3397BE2C9F64819B88 /* DTCoreTextFunctions.m */, - 49A21AE1A0AB5383F895B34EA7D6973D /* DTCoreTextGlyphRun.h */, - 36FCB869246FE45FD1C9609A34EB4E74 /* DTCoreTextGlyphRun.m */, - C26DBE1150BC9A30B69839783E000358 /* DTCoreTextLayouter.h */, - 1D6DA580F40DF113709E15CF6542A35C /* DTCoreTextLayouter.m */, - CE6907AC04870132CCE3177E894607DD /* DTCoreTextLayoutFrame.h */, - 029130886CE8E422D16ADF97468CB1B0 /* DTCoreTextLayoutFrame.m */, - 28043173CA3B3787DC401ACEB5398108 /* DTCoreTextLayoutFrame+Cursor.h */, - E62C5E593037EF8A45E7FAA847D0277C /* DTCoreTextLayoutFrame+Cursor.m */, - D863AE4F659A0F71B22DC9FF334DDF4E /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */, - D1599698B5A62671C488F13E07272B09 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */, - 64AB89EAB10148C39B726B26BE04F4F8 /* DTCoreTextLayoutLine.h */, - C71D83D6AEF198FA680B8A80BF2D9605 /* DTCoreTextLayoutLine.m */, - 0F5D34047BAA894BEF1DFA23E6A9DAB1 /* DTCoreTextMacros.h */, - 5D62C5531667F364F14DB67D33FFA554 /* DTCoreTextParagraphStyle.h */, - 5F760D62F6C6F083374702146337F2CB /* DTCoreTextParagraphStyle.m */, - FDD333B409D528E5006FA48F4D70A6F5 /* DTCSSListStyle.h */, - B509CD4B498635D4536245E43D802ED9 /* DTCSSListStyle.m */, - 3B610E558C4917C4257DC198EAFEE2F6 /* DTCSSStylesheet.h */, - E0D90EB06FC37D534934542F9CAB1D74 /* DTCSSStylesheet.m */, - F9A2565B302334B662AB51DCF8E65EEE /* DTDictationPlaceholderTextAttachment.h */, - 477A0FC2A1F0B7F7CCF72D201ECEBAB0 /* DTDictationPlaceholderTextAttachment.m */, - 982391EC8620A617B8788C8A6101C96A /* DTDictationPlaceholderView.h */, - AFE0B56638AFB77F4455784A7ED59876 /* DTDictationPlaceholderView.m */, - E28CA95D89DBAB2FE56BC8513D5838D7 /* DTHorizontalRuleHTMLElement.h */, - A68D72764140BC3DF67A2B9E52CEC7A4 /* DTHorizontalRuleHTMLElement.m */, - 8B59C9A1B265393E4BA8383B308A5917 /* DTHTMLAttributedStringBuilder.h */, - 7C496AB6A73C2D0BD0FF340A6A2960D5 /* DTHTMLAttributedStringBuilder.m */, - EE9D4A455723797A27F04A15C4E47823 /* DTHTMLElement.h */, - 1D4C9B7ED5E04C216AB28E3A4065C1C5 /* DTHTMLElement.m */, - C8343CDCF82729A8EBCCA37A6650E34F /* DTHTMLParserNode.h */, - 11B604FC3B0D5C91FEA763DCC0BE4DC5 /* DTHTMLParserNode.m */, - C30D143134EEC5D4BA99459104B76A2E /* DTHTMLParserTextNode.h */, - 13AB6A32A293E3DC21A7047C6DB958CA /* DTHTMLParserTextNode.m */, - 6B96B0998B49D8E149C995474DA5FE5F /* DTHTMLWriter.h */, - E16D20FA492E085BD0871B107B3077B7 /* DTHTMLWriter.m */, - 3B931AB189BDDE2CCE8578B50BD60AF0 /* DTIframeTextAttachment.h */, - AA3CFD777AD76F97EBA05B3920F5786A /* DTIframeTextAttachment.m */, - 7AB9016408894675D11069CDAACEDE94 /* DTImage+HTML.h */, - 12A5EA26EE7539EDDA90649D22FB675D /* DTImage+HTML.m */, - 426D442C01742E4361F5BC34D43152A6 /* DTImageTextAttachment.h */, - FEEB15F87BA6575BBFE1C5FD19B17CD7 /* DTImageTextAttachment.m */, - E5F69A1E1260BAD7737BEB533F643A15 /* DTLazyImageView.h */, - A4E43DCDE0C8751557E7E65FEEB1C865 /* DTLazyImageView.m */, - D7B5E61166782ED8D585D4FCEE2074DB /* DTLinkButton.h */, - 9A1B75050E71BDD96FC19EC6BA129E6A /* DTLinkButton.m */, - 98658510AA525496EBF5792E5D9884ED /* DTListItemHTMLElement.h */, - F7B0087DE7C394A677F5883541AB4FB7 /* DTListItemHTMLElement.m */, - 073A7F9DF1A554BD1B324EA9E0090E91 /* DTObjectTextAttachment.h */, - F038FB491B9A4A53447EF0DC333301AE /* DTObjectTextAttachment.m */, - 96FA99AA7D4AD0D4246C8DAC1CC0C24E /* DTStylesheetHTMLElement.h */, - DA25968B7C9A40031DA45BB328EA8A2E /* DTStylesheetHTMLElement.m */, - D36ED8209C907E3E9B074DDB399F54FF /* DTTextAttachment.h */, - F35039A8D0AA1F7BAFC4E5E016057E15 /* DTTextAttachment.m */, - C298199F5DC5390E8B6666F638B34C10 /* DTTextAttachmentHTMLElement.h */, - 1ABC2F552388CD08EC1EFDEF606AE222 /* DTTextAttachmentHTMLElement.m */, - D497C3CA364E37DAAFF2C3B90CC7DBE8 /* DTTextBlock.h */, - ADC5AC8FD4EC45E9BA5654A38715BB93 /* DTTextBlock.m */, - FB2ABB1D297442D91AA42F1407DB4A58 /* DTTextHTMLElement.h */, - 8CFEE298DD52246B46E6FA62B16B38DF /* DTTextHTMLElement.m */, - 73A99927E52B24583A6A2CF7E6F23848 /* DTVideoTextAttachment.h */, - 63A6EDF10DA5A051C6CDCBE5D97AF11E /* DTVideoTextAttachment.m */, - 5155CCDD61E030184249A020FE5D74B0 /* DTWeakSupport.h */, - FF3F7BA20A1213804048557D946CEEA9 /* NSAttributedString+DTCoreText.h */, - DBC9280BA00935565E9658775DD7404D /* NSAttributedString+DTCoreText.m */, - 71E2D85A099C99CD82FD1842EE7C52D2 /* NSAttributedString+DTDebug.h */, - BF4F3EC137168B92A5DA85AF50CD239F /* NSAttributedString+DTDebug.m */, - 2D3D7C8444F58D9B3FCB4F3006D2CFBA /* NSAttributedString+HTML.h */, - 92460D196C5300656C9649784EBD3C58 /* NSAttributedString+HTML.m */, - DD189DA6054AAE2242F6644A2623B50E /* NSAttributedString+SmallCaps.h */, - 76F99C8130EE83A22CD223C7F5E6E66E /* NSAttributedString+SmallCaps.m */, - E20272295EC253826AEE1F83A15D47C5 /* NSAttributedStringRunDelegates.h */, - E6F2E79CC33E0823C4E719ECDDFBBE08 /* NSAttributedStringRunDelegates.m */, - 75FA8E843D9225BD65EB9D17825EC0F4 /* NSCharacterSet+HTML.h */, - 713C9FD0354D16AFCCFA630A97F2DA68 /* NSCharacterSet+HTML.m */, - 354C5DD0ACC742762200A640ADA859C6 /* NSCoder+DTCompatibility.h */, - 9129D37C7F89AD8FD530663BB4503FC0 /* NSCoder+DTCompatibility.m */, - 27205D159B39090908CA0E9C3997B784 /* NSDictionary+DTCoreText.h */, - 2C50CAB4241C141EF6EC9ED22AB3A7E8 /* NSDictionary+DTCoreText.m */, - A2C299CFB47AA6ECF86F7348E1EB751F /* NSMutableAttributedString+HTML.h */, - B0500CA69405E23B09291359EB28331E /* NSMutableAttributedString+HTML.m */, - 9C6293E97E128E98559FB74D9A342EAD /* NSMutableString+HTML.h */, - 31F3F91D5624C451E5D44D85B1DDE7C5 /* NSMutableString+HTML.m */, - 8552BE1A1F6A6D2879763DE3B2B8A2DD /* NSNumber+RomanNumerals.h */, - B7672A26922DBD934FA1AC60D49EB322 /* NSNumber+RomanNumerals.m */, - A0927A875CA1F11DBCE60DFC6F0CA0B6 /* NSScanner+HTML.h */, - CA538A48DD3691701EC6B5021D7B7381 /* NSScanner+HTML.m */, - 9D6C48939A8498A09DCFC7F41ECB8A25 /* NSString+CSS.h */, - E27C503C8128BC3CE109FFE077AEF325 /* NSString+CSS.m */, - 8ABDEFEA94DC6408D92AC66DA3625DE5 /* NSString+HTML.h */, - 4428633C8EC3F6289CCF376F588CE0C4 /* NSString+HTML.m */, - 83E37DC74BB53F90A5AD54842858A62F /* NSString+Paragraphs.h */, - F53CCB60DE5D06A43E4A52EDB274E7D2 /* NSString+Paragraphs.m */, - 647FB0C5AAF84C71A7784DD277E48910 /* UIFont+DTCoreText.h */, - 13E1548FC42118F1A4164739DE6BE4E9 /* UIFont+DTCoreText.m */, - 81FAF4124052D4A411C0A8C21B48174C /* Core */, - C2775EE99F51E41166DFC2EFD6739CA0 /* Resources */, - 4E605D80CB4B34AD26274337E004F704 /* Support Files */, - ); - name = DTCoreText; - path = DTCoreText; - sourceTree = ""; - }; - B9CF9F63ECCD4435AA8F5FEDC37E6258 /* Development Pods */ = { - isa = PBXGroup; - children = ( - C0BBFCB6AFC32A8E77FD4ABAB76E1332 /* RDReaderView */, - ); - name = "Development Pods"; - sourceTree = ""; - }; - BE577249DE43AE4728C935914617B087 /* ChapterRuntime */ = { - isa = PBXGroup; - children = ( - 67580684B7C70423FB1C82CD1F685012 /* RDEPUBBackgroundTrace.swift */, - EEE1B7CF6E54E7876BBF28948CD65B9E /* RDEPUBBookPageMap.swift */, - B84FD477EF687A49F011E7FA557C1791 /* RDEPUBChapterCacheKey.swift */, - C9FD96F86CD108FB55F99EDCC82B3771 /* RDEPUBChapterDataCache.swift */, - F60BBDE3C78317A1DF3E2FF97B966899 /* RDEPUBChapterLoader.swift */, - 41EB07D58D668A3EE943B8A619CF70E7 /* RDEPUBChapterLocation.swift */, - F4E89D45F05E7E9797A973AC12579973 /* RDEPUBChapterOffsetMap.swift */, - 4BCCEDB0636CEB528ED4786686A5767F /* RDEPUBChapterRuntimeStore.swift */, - B7DD486B95807F803EF1DD2976017779 /* RDEPUBChapterSummaryDiskCache.swift */, - 92AD29D1A051D00F5525A240E49B00A2 /* RDEPUBChapterWarmupOrchestrator.swift */, - E8428598288FB3C84E993319B4E11B03 /* RDEPUBChapterWindowCoordinator.swift */, - 23D09A34060F1B615AA1CA4089B37AC2 /* RDEPUBChapterWindowSnapshot.swift */, - 4D58FC9E6A5173BAA575CE45D07134D0 /* RDEPUBPageCountCache.swift */, - 45C2C1DE970403173708119093BE0108 /* RDEPUBPageResolver.swift */, - FEC2659F6ADAB5F211964D1A8CA88C26 /* RDEPUBRuntimeChapter.swift */, - C80DE4FAC18642D5E8D148D8A1E5A566 /* RDEPUBRuntimePageCount.swift */, - ); - name = ChapterRuntime; - path = ChapterRuntime; - sourceTree = ""; - }; - C0BBFCB6AFC32A8E77FD4ABAB76E1332 /* RDReaderView */ = { - isa = PBXGroup; - children = ( - ECBE8305E343FF00B5DDF4F8F9D18623 /* cssInjector.js */, - 091E53DC8215AED45D88A2ABA24A2140 /* epub-bridge.js */, - 5E958924060294CE9417399BB02AB344 /* epub-fixed-layout.html */, - 8F9C05A5DE7C804D6531F4BBF31A3045 /* rangy-core.js */, - 25E8E62C9DC0A4AE49F168F04CF8B9D3 /* rangy-serializer.js */, - F46977FAF9F0EAEDF840BDA49288CC99 /* WeReadApi.js */, - 8AE69217E6A738AC11FEB58F2603B17F /* wxread-dark.css */, - 0D253DF65322509913DE34899979C30B /* wxread-default.css */, - F81B70DF51F9CD64A7DC5AAF3941F72C /* wxread-replace.css */, - 6E7E8438D5E5533B7BE96AC6FA8FD8BD /* wxread-replace-latin.css */, - E5E26B54ABA56C00E408CFDA5AA1D213 /* EPUBCore */, - C51190ED4FDD85541ECC59886B5B7142 /* EPUBTextRendering */, - 88DDD441541D3FB5E20C9F271215D7E7 /* EPUBUI */, - 399DBAA31AC98F6F98B27CE5ED36F63D /* Pod */, - 9E100780A98E22AF423BFB0DC63B601C /* ReaderView */, - 62F2A978E55ACE107C18809C9C197080 /* Support Files */, + 5BE399D4DCDB9643D809264D6D5319B2 /* cssInjector.js */, + DBFE242CACE9410D681C091D4BB7237D /* epub-bridge.js */, + E510EFB4CE45829A8CAB4E2BE47C0041 /* epub-fixed-layout.html */, + 445D06D06F2D5CB42E95A6292AFA6D42 /* rangy-core.js */, + 9DF9B7EF7992895E4AA2E398522498BC /* rangy-serializer.js */, + A511C95B0250D33F33026861C48BF655 /* WeReadApi.js */, + D97740E10289031B888FFAE803AE441E /* wxread-dark.css */, + 8C51FE03884113569904AAA4CAA3AEB6 /* wxread-default.css */, + 3CD5E5ED855BD807441CC55E7046DC18 /* wxread-replace.css */, + E7E49A0BE37FE8EEBBC94E752B95C59C /* wxread-replace-latin.css */, + 017EB082AD13216251C54E6EFC22C072 /* EPUBCore */, + 7460E24FCB37B79E810429AAC51A95FD /* EPUBTextRendering */, + F7CEE041C23A1C121CCDAE748A40E722 /* EPUBUI */, + 8DC9877037F8A406989B79289F6EFAD8 /* Pod */, + E11F19B9E444F617C83F35A40D4C9CE0 /* ReaderView */, + 58B9D4234EDD00FD37667D574CBA9DC6 /* Support Files */, ); name = RDReaderView; path = ../..; sourceTree = ""; }; - C2775EE99F51E41166DFC2EFD6739CA0 /* Resources */ = { + AB29EEE80824EBEB1B0E91D6F4ACF0F8 /* BuildPipeline */ = { isa = PBXGroup; children = ( - 05D57D16346FAF830F1F82067307EA9F /* default.css */, + 67B4EE257C537D6F72ADDBBE7747BBE2 /* RDEPUBBuildDiagnosticsReporter.swift */, + 03574AB570F840F4A14B53F85023DBAA /* RDEPUBChapterTailNormalizer.swift */, + 817CF1C7E3DF9EA0272F660987E896AA /* RDEPUBPaginationCacheCoordinator.swift */, + 5EC2AEE3E653B0E8731C706FF3768F46 /* RDEPUBTextBookBuilder.swift */, + FCD11C7BF5FACCD5B5A3D2C4991EF047 /* RDEPUBTextBookCache.swift */, + 0B33491F27938C7846CEB7246FC4B96C /* RDEPUBTextBookModels.swift */, + 5EB446503EBB22EE22C51939A562C457 /* RDEPUBTextBuildPipelineInterfaces.swift */, + 9A19BDED17612309ACF1752937514F77 /* RDEPUBTextPerformanceSampler.swift */, ); - name = Resources; + name = BuildPipeline; + path = BuildPipeline; sourceTree = ""; }; - C51190ED4FDD85541ECC59886B5B7142 /* EPUBTextRendering */ = { + B45E17EA805660F2389832287623284D /* ZIPFoundation */ = { isa = PBXGroup; children = ( - B1AF2749008FE67A3281B83EE327E41D /* RDEPUBChapterData.swift */, - 0E160FF00EF4B6DB318FEDCD72A026F3 /* RDEPUBDTCoreTextRenderer.swift */, - 89755690B804A64EE69FE2D7321CA9B6 /* RDEPUBTextIndexTable.swift */, - 7A971ECCC1DDFDE6D5417E949E3B1FD2 /* RDEPUBTextPositionConverter.swift */, - 5B4081F4EC77470F1257F11DB2A4B55D /* RDEPUBTextRenderer.swift */, - 06733E30802CA08ACF312C763BD37795 /* RDEPUBTextSearchEngine.swift */, - 2739EAD69AB2F5F6FA80E254D294440D /* RDPlainTextBookBuilder.swift */, - 27F2A646BFA6F6504139570B69BEDF9B /* BuildPipeline */, - 8FC974FE4013F8502C8F4C9902F99124 /* Pagination */, - 13D36789CF3D460E6FFE303B68A66962 /* Typesetter */, + C3E162E0261A5B0850158D3403191E62 /* Archive.swift */, + 765A94769106D14615FFB30EE1BD5E65 /* Archive+BackingConfiguration.swift */, + F3C9CA544EBF55130625F6C3AD2ABFB4 /* Archive+Deprecated.swift */, + 55B9309F0BDDDE2C3EE13C97BF2C0F1E /* Archive+Helpers.swift */, + BFF51E56E09E095C92CB5B9F21384027 /* Archive+MemoryFile.swift */, + DE83356F8FBC1801D29CA93C1A190D81 /* Archive+Progress.swift */, + E865600EE9117A9153716299FFA7912D /* Archive+Reading.swift */, + 5193541848D2D1BF115A45D8A730611C /* Archive+ReadingDeprecated.swift */, + B0218A7B243387C79E099CA947CF243D /* Archive+Writing.swift */, + 2373DCA0FC45287BFC063BEA661B8367 /* Archive+WritingDeprecated.swift */, + D18519BCA8FAA9B01A704A0F0B9FFC78 /* Archive+ZIP64.swift */, + 22B69C9433F2FBE5CE8409BD4266DFE8 /* Data+Compression.swift */, + E6B46EF6F055A721AF370D705D026E9E /* Data+CompressionDeprecated.swift */, + 9C3615C94C147AEA92F022E119810E9F /* Data+Serialization.swift */, + 18D23D8D10719754D93032F66EB98536 /* Date+ZIP.swift */, + 0D93C2002AAECD29B3ED5A14026D3DFE /* Entry.swift */, + 76C1831768CE55090EADD902B29B6CD1 /* Entry+Serialization.swift */, + 288589D0B52F73505B43C743D9837578 /* Entry+ZIP64.swift */, + 6C3F8DF48C6EB28BFD05F5BB49793DDA /* FileManager+ZIP.swift */, + F49FC82A04EE9B3B49CBA6CB88ACBC67 /* FileManager+ZIPDeprecated.swift */, + 6430501430329643C8280B3985C48711 /* URL+ZIP.swift */, + D4D1573132E3E8DD3B99E449658562B8 /* Resources */, + 4B9763CFE13CC8B0D8AA60EE28156E6D /* Support Files */, ); - name = EPUBTextRendering; - path = Sources/RDReaderView/EPUBTextRendering; + name = ZIPFoundation; + path = ZIPFoundation; sourceTree = ""; }; - CA6142FEF8E51F79243E3C87378F50AF /* UIKit */ = { + B8402F3806C08042421D9F08E2357FC2 /* Pagination */ = { isa = PBXGroup; children = ( - 8272D0B59ABD6652D0CAE3DFCC2C5EE1 /* DTActivityTitleView.h */, - 4EEFAE80193E1F0DA53400C9AD641410 /* DTActivityTitleView.m */, - 33DB57DF8C5AE334B1BBE9F989352F1D /* DTCustomColoredAccessory.h */, - 0C6BE3B2DA9A8C4CD3760CDAD6F305A5 /* DTCustomColoredAccessory.m */, - 1B443D035BA5652B03A41BE905C5AC17 /* DTPieProgressIndicator.h */, - 5DA1E8494B86FFD79C639DCB8C21E1BB /* DTPieProgressIndicator.m */, - D2BA6D5DBD4C6A9285C4592721790A26 /* DTSmartPagingScrollView.h */, - 96EEB6B022E22A4ABC86D87469D4815B /* DTSmartPagingScrollView.m */, - DF5EDCA3B21964D0462BE0982E2F0BF8 /* DTTiledLayerWithoutFade.h */, - 70F5D03B9B3B7F182C8F5C1F5D4FA7E7 /* DTTiledLayerWithoutFade.m */, - 557DA029E15EC99631B647AE8922007F /* NSURL+DTAppLinks.h */, - 2D36F7CDCD7D5788CDCB3A1421DB242B /* NSURL+DTAppLinks.m */, - 957DB4675D5CCBD3CB1762F08619F3F7 /* UIApplication+DTNetworkActivity.h */, - 77213203802F44012346181FED2856F9 /* UIApplication+DTNetworkActivity.m */, - 15941683D394FB8D7EAE91CD2CF03FF1 /* UIImage+DTFoundation.h */, - D85A85D891A320165843EF9F489178F7 /* UIImage+DTFoundation.m */, - A3765B289CB7E6C5DF6160D8EBC83C3C /* UIScreen+DTFoundation.h */, - 7F051D813D50D20D53205D5FDCAA877C /* UIScreen+DTFoundation.m */, - 79A77584AB3B92B2508AE0BCFCB8FD87 /* UIView+DTFoundation.h */, - 4219E7C32019899890CAB66E5FBDF524 /* UIView+DTFoundation.m */, + 68705BE557E6C1C112D38D056CD4E8FA /* RDEPUBChapterPageCounter.swift */, + 64798D230A6F5C1C52C7353EF9773BB7 /* RDEPUBCoreTextPageFrameFactory.swift */, + 02B465B0AB9FB857FB2C95097E1C4D46 /* RDEPUBPageBreakPolicy.swift */, + 6C6DCF8FFFAD317C3CA1AEFF60080707 /* RDEPUBTextLayouter.swift */, + 5F50EBEDFE92D5373F3FD62727F74BDE /* RDEPUBTextLayoutFrame.swift */, + B08FB1ED81E67058DC00376CA1DFC963 /* RDEPUBTextPaginationInterfaces.swift */, + 1967314246DE47771D6C6F0D8B5BB22A /* RDEPUBTextPaginationSupport.swift */, + ); + name = Pagination; + path = Pagination; + sourceTree = ""; + }; + B9CF9F63ECCD4435AA8F5FEDC37E6258 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 9CCCE679A167C8125B04E0A05685A334 /* RDReaderView */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + C19A6980E5FBD41228C838B0B657602D /* Notes */ = { + isa = PBXGroup; + children = ( + BC2FC937F877AAF34D20099B548F79F4 /* RDEPUBNotePopupCoordinator.swift */, + AC145C21118E90789E7954C445DE047E /* RDEPUBNotePopupViewController.swift */, + ); + name = Notes; + path = Notes; + sourceTree = ""; + }; + CB07546106F457AC4196E207FEBAB4ED /* UIKit */ = { + isa = PBXGroup; + children = ( + AF1516035C269F7A41EE064AAB14D562 /* DTActivityTitleView.h */, + 662D30C1E74D1D5122921475F4024F73 /* DTActivityTitleView.m */, + BAE45673EE2875DB23FA7BDD61FDE1EF /* DTCustomColoredAccessory.h */, + 9542AFE3A82C8AE56576254CE196E71A /* DTCustomColoredAccessory.m */, + 173194D38C897D8E38AD8A194E47DB5C /* DTPieProgressIndicator.h */, + 8BA617294E6371DD7FAC32B61E0873F2 /* DTPieProgressIndicator.m */, + 21CCCCAAF832BE9C859BEDDC79B4E9E2 /* DTSmartPagingScrollView.h */, + A20F6F0463A998DC3BD53DE9E63B63DE /* DTSmartPagingScrollView.m */, + 0764D155F69503AACFA7AD976825E986 /* DTTiledLayerWithoutFade.h */, + 23006DBAC610AEB0A4B3EAFEA4FB0567 /* DTTiledLayerWithoutFade.m */, + A3F7613E99CAA29881A015D0ED969B86 /* NSURL+DTAppLinks.h */, + 3453CFB9BDBF6F9D0937EDF5FB2BD07B /* NSURL+DTAppLinks.m */, + 55423549E54A01F039B5F379B264C73F /* UIApplication+DTNetworkActivity.h */, + 730B56BC97DFF2B1E04DD2608055D9E0 /* UIApplication+DTNetworkActivity.m */, + 1300CC5794E609DB8FBA6FFF90A09408 /* UIImage+DTFoundation.h */, + 499E135F1FEB31C26EB0EF793A90086C /* UIImage+DTFoundation.m */, + 9C5E29D728B8CD4EABC0B3DD9CD9DE99 /* UIScreen+DTFoundation.h */, + AF436E76C893E223A4F0BE86C1276054 /* UIScreen+DTFoundation.m */, + 29DEA4D201BB179BB6E228E9F688CD4C /* UIView+DTFoundation.h */, + 67DA49B61A249C2B8241D8FE166608C9 /* UIView+DTFoundation.m */, ); name = UIKit; sourceTree = ""; @@ -1987,12 +1703,20 @@ 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, B9CF9F63ECCD4435AA8F5FEDC37E6258 /* Development Pods */, D68CA58901FBF589D75F5E40F1EAF5BA /* Frameworks */, - E861498A78913BA984BA96358FC61449 /* Pods */, - 43D8ECA62CF48C3CD5F77E3CA6F466AF /* Products */, + 426395460B992FC2D2EF86AF65197AD4 /* Pods */, + F8A2B0DD84CEFC61D2C703C767D33C43 /* Products */, 994C39A644C0722C7A9E97AB46DB8965 /* Targets Support Files */, ); sourceTree = ""; }; + D4D1573132E3E8DD3B99E449658562B8 /* Resources */ = { + isa = PBXGroup; + children = ( + 006D002D86B43AA52E0AFD2E18459107 /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; D68CA58901FBF589D75F5E40F1EAF5BA /* Frameworks */ = { isa = PBXGroup; children = ( @@ -2001,172 +1725,150 @@ name = Frameworks; sourceTree = ""; }; - DD6FCBC8887B9E6DA3045CADFEB02EB4 /* Resources */ = { + DA2E3A6B928E59EEA59E8967EC93C73E /* DTFoundation */ = { isa = PBXGroup; children = ( - 1E89FE5F2996336E862E82C1E14E0EE7 /* PrivacyInfo.xcprivacy */, + 9C7F7E7109B9004B64578ADED4DB8E0D /* Core */, + 1A823333EC1496E37E1F99813FE335DD /* DTAnimatedGIF */, + 53105D96992884E1673FC639B3987E2C /* DTHTMLParser */, + E21916B80D2B8A09E76AB2CFCB1E1232 /* Support Files */, + CB07546106F457AC4196E207FEBAB4ED /* UIKit */, ); - name = Resources; + name = DTFoundation; + path = DTFoundation; sourceTree = ""; }; - E2CD122CF123DD3681DAEE021EA37359 /* Core */ = { + E11F19B9E444F617C83F35A40D4C9CE0 /* ReaderView */ = { isa = PBXGroup; children = ( - B8E40E302B85493BDE0FE91F829EC01E /* DTBase64Coding.h */, - 061BD3911E4E530C792E65CED7868C33 /* DTBase64Coding.m */, - A0BD48DAF5AE9DB087F2552E99069709 /* DTBlockFunctions.h */, - 375179DD3A4576CEF947E1760BBDC69B /* DTBlockFunctions.m */, - B5FCE04EBB553439D1C2BA1001936293 /* DTCompatibility.h */, - B6425B2235BA00FE865AF58EF44F1144 /* DTCoreGraphicsUtils.h */, - A8DFDCAB69B471EB5667C964865C26CF /* DTCoreGraphicsUtils.m */, - 538572A5C098252D629F2185F1B1C9E8 /* DTExtendedFileAttributes.h */, - F5389D4E96A4AFE175691B4D3D4524E7 /* DTExtendedFileAttributes.m */, - 2101691D5743105B2E3E40376584B91C /* DTFolderMonitor.h */, - B245F7E143F3091652C64F6593E33F7A /* DTFolderMonitor.m */, - FD03567681A79FFB6E81B3105503065D /* DTFoundationConstants.h */, - 8BD568D38C209BA1CC0EBFA809A35204 /* DTFoundationConstants.m */, - 6A1EBB9497F4846C84CA0BF5E4F84FC7 /* DTLog.h */, - 5B007AEEACE9EA271DD73AFD80A74D83 /* DTLog.m */, - 8BD9F2023FF826F67E69E3407A70A8A6 /* DTVersion.h */, - 4AF6156128A1A0CA24D9D06E346B9445 /* DTVersion.m */, - C422BCADBB48E28B549495663705A0FB /* DTWeakSupport.h */, - CEA93EDA6ED54D374265AA5D6B9EBBA9 /* NSArray+DTError.h */, - 73940D215D644B6815A09DA802CFBDDF /* NSArray+DTError.m */, - 02EDFE0EEA47398F3E1A361A73AF6A6C /* NSData+DTCrypto.h */, - 17F750F38183302BF345F40F5A4CDD43 /* NSData+DTCrypto.m */, - 0FC368BD2A8D266EB771E5FB9A5A5B3C /* NSDictionary+DTError.h */, - C18480913E002315E3F5EC6945371697 /* NSDictionary+DTError.m */, - 09C957F3199C596781EFA1DEA1DDCEC8 /* NSFileWrapper+DTCopying.h */, - 1756C6FFCA695290BA62DA4E7B6DD20B /* NSFileWrapper+DTCopying.m */, - B0AC307F12521444C973EA0DE38B4608 /* NSMutableArray+DTMoving.h */, - 53499F40E1790A6CBE8AFEB3AC5BEFC8 /* NSMutableArray+DTMoving.m */, - 6D86C7063D1128EAEB3A30EBEF214B3F /* NSString+DTFormatNumbers.h */, - 1ACA5E519F100582F0D772FCD76125C0 /* NSString+DTFormatNumbers.m */, - FC5EC7C3D1808C9CF53354D7A3D69EE7 /* NSString+DTPaths.h */, - A3565FEE19F19CB43A43409AFFF2BD2C /* NSString+DTPaths.m */, - 31BD7533867336DEA9B835F471767178 /* NSString+DTURLEncoding.h */, - CB7F3535507F56824BA21509302CF8B3 /* NSString+DTURLEncoding.m */, - BE547E464E5D34F9FFB24BAC81D1E4CC /* NSString+DTUtilities.h */, - DCECDBD73595CA88A2208000B4B68352 /* NSString+DTUtilities.m */, - 731C0C61E3AD227D691FBA1C2C17BF7B /* NSURL+DTComparing.h */, - 9BFCAC7C2AEA867E67C63A852576774F /* NSURL+DTComparing.m */, - 054674EB90C625BB4BEA9368ED92592B /* NSURL+DTUnshorten.h */, - C80065DBA5634DAA71129404975D7349 /* NSURL+DTUnshorten.m */, + 8A7E0C51CE893B8040C6A49E9E973226 /* RDReaderContentCell.swift */, + 7941BAA5BADB40ACC8FBC080977F6B51 /* RDReaderFlowLayout.swift */, + 2B8072609EF1BA68F2BF57A0E3A915FB /* RDReaderGestureController.swift */, + 5DFD3ED6CD42E6EA971DDDD51EDB8CA5 /* RDReaderPageChildViewController.swift */, + 5E62277B737F95B1DFDBC287DC795CB6 /* RDReaderView.swift */, + 9A957A416473B3393454FF640ACD97E8 /* RDReaderView+CollectionView.swift */, + B9E19C361904199E2E63EDFFBD64A90C /* RDReaderView+ContentAccess.swift */, + BB30DFD1013A322C32A3848B1D6602DA /* RDReaderView+PageCurl.swift */, + 36E5D959B869D6FFCAE67ACA572FF1C2 /* RDReaderView+ToolView.swift */, + C248323DF03FE7E607F69BF5576B3F41 /* RDReaderViewProtocols.swift */, + 828D005E8E94DC05C1C5CCDDE8DA4335 /* Paging */, ); - name = Core; + name = ReaderView; + path = Sources/RDReaderView/ReaderView; sourceTree = ""; }; - E5E26B54ABA56C00E408CFDA5AA1D213 /* EPUBCore */ = { + E21916B80D2B8A09E76AB2CFCB1E1232 /* Support Files */ = { isa = PBXGroup; children = ( - 49291029E1AB55E3D96DCB4484849F65 /* RDEPUBAssetRepository.swift */, - 033D935836CD653A79E9152E2D84CEEF /* RDEPUBFixedLayoutTemplate.swift */, - E97368D346BF315D1080DBA98C0788AA /* RDEPUBJavaScriptBridge.swift */, - 8421441F10DCB0EDBCF03EAC1018BAD2 /* RDEPUBModels.swift */, - E4BC2CE5C3B20971FF99A9C8EC487481 /* RDEPUBNavigatorLayoutContext.swift */, - 4AD15109A0B89D836EFB914732706228 /* RDEPUBNavigatorState.swift */, - 766C440DABE7721B3D2CE226D8189551 /* RDEPUBPaginator.swift */, - 3BEEDD6EDB66B0EECC515EDCDB618914 /* RDEPUBParser.swift */, - 1DE1D663A9451374F0417DAC8CDAE2BF /* RDEPUBParser+Archive.swift */, - AA89765B94A26A186DC7829FF979DBC3 /* RDEPUBParser+Package.swift */, - 5B4D7B26E7ADBB6053AB3D0ECFDBF379 /* RDEPUBParser+ReadingProfile.swift */, - E808E517A1FE8666CB17EA9D94B4747A /* RDEPUBParser+Resources.swift */, - 67E71F44D9FE962AA1D19EB945E7E657 /* RDEPUBParser+TOC.swift */, - EBE150E8FBF2AC59607D94086EF644B6 /* RDEPUBPreferences.swift */, - 85AC8A746E7DE5FC77159ABF4085CAC7 /* RDEPUBPublication.swift */, - 736A135E9B22B812EE7A51484408FDE1 /* RDEPUBReadingSession.swift */, - 46B85AED3D53815F95E435FA3529141C /* RDEPUBRenderRequest.swift */, - 42B212FB3162CFF37D51BB3E93F765F5 /* RDEPUBResourceResolver.swift */, - E3E5029439FC2CDA4E874FBB500F3FE0 /* RDEPUBResourceURLSchemeHandler.swift */, - FD0BB5D8B2ADEBDD25F740A7185B516E /* RDEPUBSearchEngine.swift */, - 3207A69E5A8BC344BDC277A8BEA51979 /* RDEPUBSearchModels.swift */, - A8052EE9D31E2F5253234D9A7C6A8218 /* RDEPUBStyleSheetBuilder.swift */, - 80D9ED51333D0F99752A8408020C77AF /* RDEPUBTextAnchor.swift */, - 67EA3C4114F424563E73EE3FB42D7CD7 /* RDEPUBWebView.swift */, - D3BFB23BF28CE5120D1FFBD76664087B /* RDEPUBWebView+Configuration.swift */, - A47E648062E9BDBB9E46BD3DC4E12801 /* RDEPUBWebView+FixedLayout.swift */, - 2F752E31955268C74AB0B05584B9CA9D /* RDEPUBWebView+JavaScriptBridge.swift */, - F34551B808D265BCB3443EE33D6C1EF4 /* RDEPUBWebView+Reflowable.swift */, - 50319253F9CADECC2B97F1734E0C834A /* RDEPUBWebView+Search.swift */, - E4EDAF459D89DEFB5A597F8278CE222F /* RDEPUBWebViewDebug.swift */, - 02ADBDED67BF477D7F4068FECEFEFAFE /* CFI */, - 0F7BCD3D7E88C5382380E13EE7B5535F /* Models */, - 889CE3BF1849B77422823421266A37D1 /* Notes */, - ); - name = EPUBCore; - path = Sources/RDReaderView/EPUBCore; - sourceTree = ""; - }; - E861498A78913BA984BA96358FC61449 /* Pods */ = { - isa = PBXGroup; - children = ( - A5E1FCBC8B49DE230DF2EACDA19A840B /* DTCoreText */, - 29A410FBD4C19138B1D732EC94D8EFB2 /* DTFoundation */, - 0B2E031EFC525508B0D167AAA6E70507 /* SnapKit */, - 49882ECBC24E71ACA5E18D6AE9EA639D /* SSAlertSwift */, - 62D640F7748C5E79310AA9EF7767FDD1 /* ZIPFoundation */, - ); - name = Pods; - sourceTree = ""; - }; - F3D99F452BF74190AE8A6D307FDF149B /* Support Files */ = { - isa = PBXGroup; - children = ( - 75C5986EF2D63801A8A30B9D77A7FDD0 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */, - 09C2D4A3D4F602D125FF38B56C91CF84 /* ZIPFoundation.modulemap */, - 4A06A36ADBE678DB44158D32E751FAFF /* ZIPFoundation-dummy.m */, - 64868ADD0419A5D112863F638932DA34 /* ZIPFoundation-Info.plist */, - F0548F684CA2D8C445086389A2BD5265 /* ZIPFoundation-prefix.pch */, - D927F128EBF26AD2C61FD0E6B6F6F5ED /* ZIPFoundation-umbrella.h */, - 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */, - F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */, + A5D1FFCB042340FB917DAAE076DD1CCF /* DTFoundation.modulemap */, + FF1C41D226C0957F715EFF3F23893386 /* DTFoundation-dummy.m */, + B8717A7A7BC5A1529A0F80FB3B22675D /* DTFoundation-Info.plist */, + 08F54C3D9B4AECA08A47309615DC2715 /* DTFoundation-prefix.pch */, + 23588B63FC4026A371F5C683744A664C /* DTFoundation-umbrella.h */, + 85E8DA9DE1F796F12171763D20CBAF27 /* DTFoundation.debug.xcconfig */, + 7503926237A4785CCB864B2BCD1F4C2B /* DTFoundation.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/ZIPFoundation"; + path = "../Target Support Files/DTFoundation"; sourceTree = ""; }; - FC15689DA3F1CFC314BD4FF13CED527E /* ReaderController */ = { + E969828EF0D883E18B1FF151243ECE45 /* ReaderController */ = { isa = PBXGroup; children = ( - 8A19E1D6BC8D283B9BC4BA0EBECBF172 /* RDEPUBBackgroundCoverageStore.swift */, - 9B8F910B6B575B689194F9E306239FD5 /* RDEPUBBackgroundPriorityPolicy.swift */, - C8B29AA7038EA68CF6B91D18CC87E743 /* RDEPUBJumpSession.swift */, - 0F3F0149FB61996B3FFFD4771F697189 /* RDEPUBMetadataParseCancellationController.swift */, - 447E4906FE72C6E3E2AE1CC89D208CAE /* RDEPUBMetadataParseWorker.swift */, - EA3CE87842A4B39DB8691712AEC0E5FD /* RDEPUBNavigationStateMachine.swift */, - A027614C026728AE2CA282D837F97936 /* RDEPUBPageMapReconciliationCoordinator.swift */, - 14DBB472BDBF872F8A5C3A7460B17A31 /* RDEPUBPaginationState.swift */, - 76C28DE5D3FBC9B7F9C1477C95F14725 /* RDEPUBPresentationRuntime.swift */, - 174A6B5E9BDD0636D95688D70EEEF226 /* RDEPUBReaderAnnotationCoordinator.swift */, - 20D029F1D415730DFA1FD010AD485185 /* RDEPUBReaderAssemblyCoordinator.swift */, - 84EB75472DB29B600C9185A097D117B7 /* RDEPUBReaderChromeCoordinator.swift */, - B2D39C06DF04E8847916639D58650315 /* RDEPUBReaderContext.swift */, - 214727C456892B390492D84CDD20BB88 /* RDEPUBReaderDependencies.swift */, - 02FE773F7655B2174F160FE1621181BB /* RDEPUBReaderEnvironment.swift */, - F058E473114A5A8FE875FD5ABBE02F5E /* RDEPUBReaderLoadCoordinator.swift */, - A138DB38231B185E189787D33D3B4950 /* RDEPUBReaderLocationCoordinator.swift */, - 7EC91512D3BEFEDF5FCCF2E267E48B32 /* RDEPUBReaderPaginationCoordinator.swift */, - EEC9D27C90F465491EF9BA9CC8CDA1E1 /* RDEPUBReaderRuntime.swift */, - 92E7747B6F898FB12DFE1CE4ABDC3531 /* RDEPUBReaderSearchCoordinator.swift */, - 2F07C9C63CCAC0DAFE81B6A625199293 /* RDEPUBReaderServices.swift */, - 16A3654E9B076CBACAB460CDD311C9B6 /* RDEPUBReaderState.swift */, - 81F0FDEEC9D85F08CD97F555356F985C /* RDEPUBReaderUIState.swift */, - 5539807EBDC1A071F4E7C8C3DA8F4121 /* RDEPUBReaderViewportMonitor.swift */, - 66EEA7DA60C7DCD504C673D6CF9B74FC /* RDEPUBSelectionState.swift */, - BE577249DE43AE4728C935914617B087 /* ChapterRuntime */, + C8FE55941A5CBC989B1F8C3E2D5A49AA /* RDEPUBBackgroundCoverageStore.swift */, + 9FE811B58EF82E20354C3DABE712313F /* RDEPUBBackgroundPriorityPolicy.swift */, + E744A9171DA8D779C942360378D2EE4F /* RDEPUBJumpSession.swift */, + 720B9BA37AAD0EA225492B8341E5B7A3 /* RDEPUBMetadataParseCancellationController.swift */, + 0C88B7F1F7145821C2F65514186AE335 /* RDEPUBMetadataParseWorker.swift */, + C70E0378F7CBD5A6DA253CC326036A9B /* RDEPUBPageMapReconciliationCoordinator.swift */, + 44A1AD3BAAAF051B1AB7CE90E0F92BE7 /* RDEPUBPresentationRuntime.swift */, + 9CA110E3D360292AAFB29F380653D9CE /* RDEPUBReaderAnnotationCoordinator.swift */, + D423B0BF37041F8E07C6EFD476F511A4 /* RDEPUBReaderAssemblyCoordinator.swift */, + 01B6F1C44AED0554A533AF8573303A47 /* RDEPUBReaderChromeCoordinator.swift */, + 4931FAB1E86E9A03A8ACEB033B58F5E3 /* RDEPUBReaderContext.swift */, + 51852C93D034EBE5B7907AA4E69848A1 /* RDEPUBReaderDependencies.swift */, + E9204AAD895ABE21EE8841D0A495C916 /* RDEPUBReaderEnvironment.swift */, + C33E143A90F5075BA576F52111FFCCB0 /* RDEPUBReaderLoadCoordinator.swift */, + 4ADEC782AE1E07C94B6F01A8AE1CE2C8 /* RDEPUBReaderLocationCoordinator.swift */, + F60ACBD9B441413B14468B1BFA1F7C6F /* RDEPUBReaderPaginationCoordinator.swift */, + 692FB048CB12876AA971EF21B3F71A27 /* RDEPUBReaderRuntime.swift */, + C6205EFACA691F3EC37951F5A30B9590 /* RDEPUBReaderSearchCoordinator.swift */, + F98CD641441793095A6228F264D13025 /* RDEPUBReaderServices.swift */, + 5D74C449E9554743E9908B79188DB9BC /* RDEPUBReaderState.swift */, + 94F5CBFE8EF3307F3C9B0E25A5F70E70 /* RDEPUBReaderUIState.swift */, + E8D1DCAA8AAE79FCBD5248D641D583DE /* RDEPUBReaderViewportMonitor.swift */, + 3BE6C7E2CF696021A9922C1BB675AB1C /* RDEPUBSelectionState.swift */, + 0C5B69B2CD80274C6E29E5EA8098B935 /* ChapterRuntime */, ); name = ReaderController; path = ReaderController; sourceTree = ""; }; + F7CEE041C23A1C121CCDAE748A40E722 /* EPUBUI */ = { + isa = PBXGroup; + children = ( + 1E0F52BED56AC7A04854F459B246AB18 /* RDEPUBAttachmentTooltipOverlayView.swift */, + 59B2B1356107877296E9D282AE94CB05 /* RDEPUBAttachmentTooltipView.swift */, + CAF799848B6E5545BD3003001D3F6518 /* RDEPUBImageViewController.swift */, + BA0A09CCD48B28C7C98016F5B7DCB94A /* RDEPUBImageViewerCoordinator.swift */, + B5629838A35BA6A3F2895CFDE6A5FE0B /* RDEPUBReaderBottomToolView.swift */, + C706B8C5A519EE55EC9D545AB3302AD9 /* RDEPUBReaderChapterListController.swift */, + 210601B1509A4301617C853C5022AA99 /* RDEPUBReaderController.swift */, + B39E73DF030C0B322474D5986AD2D2FE /* RDEPUBReaderController+AttachmentTooltip.swift */, + DA68A96FA91F03F747A3D85A2DB0B45E /* RDEPUBReaderController+ContentDelegates.swift */, + EE0841869BD329D156D73D0CFB24542C /* RDEPUBReaderController+DataSource.swift */, + F788C862D0C386B17128DB735921333C /* RDEPUBReaderController+ExternalLinks.swift */, + A29809A2BF0AD11378C7FDE3406150B1 /* RDEPUBReaderController+LocationResolution.swift */, + EB578C52D04A71D85CCA25340333F2C2 /* RDEPUBReaderController+PublicAPI.swift */, + 338AA349594E53D0CF40F957CAC5D6BC /* RDEPUBReaderController+RenderSupport.swift */, + 1F3BEE5F799C47EEACB7E29C611B8201 /* RDEPUBReaderController+RuntimeBridge.swift */, + D88A921856D9EF12C78D05D927BF334B /* RDEPUBReaderController+TableOfContents.swift */, + 1DB230C0E9A18C8B1C5581CD2D3D0F2F /* RDEPUBReaderDelegate.swift */, + 3545BDB1B440A560114071D125EA94C7 /* RDEPUBReaderHighlightsViewController.swift */, + BC1BAC41A213B19789028A9648DD5BD6 /* RDEPUBReaderPersistence.swift */, + FBA95BB1C6D5F042AFE2454D582DFC55 /* RDEPUBReaderSearchBarView.swift */, + ECE876A9792A03EF4CBCFD3DF6188D46 /* RDEPUBReaderTableOfContentsItem.swift */, + 08EB5C6310B7F9040732D6E905650432 /* RDEPUBReaderToolView.swift */, + A0A47D7B73C87872B9B05E80A4254D4C /* RDEPUBReaderTopToolView.swift */, + 047D134F34D6BDEFF3403095EA60155C /* RDEPUBViewportTypes.swift */, + 5457E010B7ABAB0EA8F28377908D1F23 /* RDEPUBWebContentView.swift */, + CEC237752DE21AB8ADA263DE4977AC0F /* RDEPUBWebDecorationOverlayView.swift */, + 9D70402AAC82BB390480E18E45DCF11A /* RDURLReaderController.swift */, + 74B33EB0B69C4A347B3F466B751289C5 /* String+RDEPUB.swift */, + A416E2F4584E41C30A3352FFD3824BE2 /* UIColor+RDEPUB.swift */, + B0F1230C085573028B4BC891EA8040C3 /* UIColor+RDEPUBHex.swift */, + C19A6980E5FBD41228C838B0B657602D /* Notes */, + E969828EF0D883E18B1FF151243ECE45 /* ReaderController */, + 34BA0E6288A1D9025DB06B70D292ED49 /* Settings */, + 70825513362D8A6FA4F2AE52C1A34691 /* TextPage */, + ); + name = EPUBUI; + path = Sources/RDReaderView/EPUBUI; + sourceTree = ""; + }; + F8A2B0DD84CEFC61D2C703C767D33C43 /* Products */ = { + isa = PBXGroup; + children = ( + EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */, + F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */, + D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */, + 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */, + 238893C9CBD95CB9BDF069EB5A303E17 /* RDReaderView */, + 83410CC9CF2ABE63B90A92F2F988BF65 /* RDReaderView-RDReaderViewAssets */, + 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */, + CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */, + ); + name = Products; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 05F35E6BA63DE209CE2DE67CDF2991AF /* Headers */ = { + 1B5B7378827A92C91FEBA6E7088993EC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 0F0C6DAF9F3854B998337C3A06546C7D /* ZIPFoundation-umbrella.h in Headers */, + BAA8AEE4DC5F22A9BB2D5DFC13F5D489 /* RDReaderView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2243,76 +1945,60 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 3454132B21348ADC70E5D998978134A5 /* Headers */ = { + 33B6840BE83FE6C6AE3C935E73FAB404 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4C17BB41AB2B816631F9477DCA0AAB7E /* RDReaderView-umbrella.h in Headers */, + FFEB74D61E54DC46EFE0DBE2E76EFAA1 /* Pods-ReadViewDemo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 38DD53377E43123969C7117C22004B72 /* Headers */ = { + C0A172710A396D707BB6434EBB995FCF /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 1BE5D635C9CA65847543497C535CDDD7 /* SSAlertSwift-umbrella.h in Headers */, + 4F0E298474D056888D4B8337193755AE /* DTActivityTitleView.h in Headers */, + 7C4E7BA25D1BCA720B26518D940B86C4 /* DTAnimatedGIF.h in Headers */, + B1E427DA5C06EFB8D33AAE782C8439C4 /* DTBase64Coding.h in Headers */, + 6423A9D67FD431A53878A2DE0AF72DF9 /* DTBlockFunctions.h in Headers */, + F702422D9C4B27174535764C70C04D70 /* DTCompatibility.h in Headers */, + B86A7C6918313E26127F7A7DFEF71D6F /* DTCoreGraphicsUtils.h in Headers */, + A0198E2E7AF64E564200EA40E2AAD22B /* DTCustomColoredAccessory.h in Headers */, + 28030B304C060583055AD4BB94B57E73 /* DTExtendedFileAttributes.h in Headers */, + DFDD4F5DEA73A0F97F9B8CEE84973A14 /* DTFolderMonitor.h in Headers */, + 951272D64B0B7B5A0CF5B04D0C70020F /* DTFoundation-umbrella.h in Headers */, + FA5621BECD8E9EF46C9C812FAEE37D60 /* DTFoundationConstants.h in Headers */, + CDD7242E39535B3C2E99C29FBC132189 /* DTHTMLParser.h in Headers */, + B03155EC46B90C179E546A3356E5E364 /* DTLog.h in Headers */, + 9364C9C3F930C82880F73AB4377A2C48 /* DTPieProgressIndicator.h in Headers */, + 10B31BECFD9AE02D5B3D4FC2CCAB3B3F /* DTSmartPagingScrollView.h in Headers */, + F6259670F9185E3EEF80D68DB4B19D64 /* DTTiledLayerWithoutFade.h in Headers */, + 1B9DD076A7AD549EAE75540AE2741CA1 /* DTVersion.h in Headers */, + 994C4AF7960B95E37A468C364C1C83C1 /* DTWeakSupport.h in Headers */, + 3C298E214C6A6859593A68461E673E33 /* NSArray+DTError.h in Headers */, + 816A870DED6E7EBCA32D4E8C7863D2CE /* NSData+DTCrypto.h in Headers */, + 0D077883D7EAB6E86CCB45D8B3FA637A /* NSDictionary+DTError.h in Headers */, + F642FBE5D97AA4DFBBAC2AF5CBD0780A /* NSFileWrapper+DTCopying.h in Headers */, + 39FDF70808F3A3476068FFE7DB45341C /* NSMutableArray+DTMoving.h in Headers */, + FE4A1F4E3837E84BC4CB37947AB56283 /* NSString+DTFormatNumbers.h in Headers */, + BEDDC71E25290A889B7780DFC3825B21 /* NSString+DTPaths.h in Headers */, + F0A3BF24E4999B7D909E632B19150FB2 /* NSString+DTURLEncoding.h in Headers */, + C14064F24F09598DE124FF06E9C928E0 /* NSString+DTUtilities.h in Headers */, + 373C0713BB83948F70327BA339F4E64B /* NSURL+DTAppLinks.h in Headers */, + 8D9119050495487B8722EEFE0296700B /* NSURL+DTComparing.h in Headers */, + 7BF9A741CB88300E294CB5974EC1471D /* NSURL+DTUnshorten.h in Headers */, + E3DFC2B50D4914F6FE69A6A770A8A837 /* UIApplication+DTNetworkActivity.h in Headers */, + 451E2C056209E939AB8C7F2F6F83B908 /* UIImage+DTFoundation.h in Headers */, + DA24A683019CA05950C1966B20AD3B15 /* UIScreen+DTFoundation.h in Headers */, + 0FA9D733C9545D185352CAD655930C82 /* UIView+DTFoundation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 68BE767CD2728366CEB889E27AD94683 /* Headers */ = { + F5EFDF3E9DDCD70973188EA186E85A88 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - FB01A47EE1D09C33FE942CE56D3A874E /* SnapKit-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8A28DB98484AC536EEC1D4F3DDD426DA /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - D10EF7F047A9E5F6E96D92BE4A567C82 /* DTActivityTitleView.h in Headers */, - AD1EC7ACCECE8F6EEEA2A26C980135BC /* DTAnimatedGIF.h in Headers */, - D97D7DD788C4D18A1F59DBAE61D4B5D5 /* DTBase64Coding.h in Headers */, - 78E85BE5ACA8B34F0F0875795AA5227B /* DTBlockFunctions.h in Headers */, - 51287FBF548A17A568489D31DA8947FD /* DTCompatibility.h in Headers */, - B933F0519580CB0C2441B4E30743887D /* DTCoreGraphicsUtils.h in Headers */, - 1303874CF4BC7EDF7BAA430702202C9D /* DTCustomColoredAccessory.h in Headers */, - 4216E83BBAC1EDC764B64A7959687531 /* DTExtendedFileAttributes.h in Headers */, - 0AB5DF1362C7A7A1798E6E453EE48E52 /* DTFolderMonitor.h in Headers */, - 58DF82D5893CEB68C83816F91A3587AA /* DTFoundation-umbrella.h in Headers */, - 84148D57904E24318934EE3997698D38 /* DTFoundationConstants.h in Headers */, - B0060F62ADE3A4E081F443F6C46333C8 /* DTHTMLParser.h in Headers */, - 3B60579AE4F0DAF5C15349148708AEF3 /* DTLog.h in Headers */, - 5152CE03325B9F978C9C5326A45A9DA6 /* DTPieProgressIndicator.h in Headers */, - 4617A3DACB97ECC22D8F2989294DB7CF /* DTSmartPagingScrollView.h in Headers */, - 406988E005ADB31DF5140AA2018B3C7C /* DTTiledLayerWithoutFade.h in Headers */, - 9B30CF6B565D4828956508A42E01F44E /* DTVersion.h in Headers */, - 1F01823286B1441AD4B9465B923FA9FC /* DTWeakSupport.h in Headers */, - 446FDD2DE47E045F80C995422F12224C /* NSArray+DTError.h in Headers */, - D7C8270984BB0CAC469E055BF18385FC /* NSData+DTCrypto.h in Headers */, - C09A25A26F0214CC046A27560A5C4254 /* NSDictionary+DTError.h in Headers */, - 7DDFB8CE7FA04A4304D5A44026DE1BC0 /* NSFileWrapper+DTCopying.h in Headers */, - 896026287F9D8443581759A53020022C /* NSMutableArray+DTMoving.h in Headers */, - 3258B5B23366506DD494C46AFB1C84B8 /* NSString+DTFormatNumbers.h in Headers */, - DD75D0287B74630B9D2E4CC87ECA5D63 /* NSString+DTPaths.h in Headers */, - 86001EE984D0EB14AADF337C5C1BA05B /* NSString+DTURLEncoding.h in Headers */, - 8A2EE040670C6715A4F913614E5CC40B /* NSString+DTUtilities.h in Headers */, - 60E8ADC216658A673DEF71C298CAE616 /* NSURL+DTAppLinks.h in Headers */, - 54A90EEE707DC23289088EDEF91F543C /* NSURL+DTComparing.h in Headers */, - D769636C7B23A599034D81095789FB99 /* NSURL+DTUnshorten.h in Headers */, - 1DA904F591DD5587E18A3958EF462EC9 /* UIApplication+DTNetworkActivity.h in Headers */, - 8593CD0CD62E27B97579259D350ECD85 /* UIImage+DTFoundation.h in Headers */, - F5CF4159843CE7E2E3C023B1E326B7EE /* UIScreen+DTFoundation.h in Headers */, - 65C27A19D68F8932FDDC9DEE58D392FF /* UIView+DTFoundation.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CB8A268CE4B47C658C371D102E5FC518 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 96507B8910C8C9DE0B221CFF0E8518D0 /* Pods-ReadViewDemo-umbrella.h in Headers */, + 16C913C28603A60216C6206E13FDD696 /* ZIPFoundation-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2321,11 +2007,11 @@ /* Begin PBXNativeTarget section */ 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */ = { isa = PBXNativeTarget; - buildConfigurationList = 78AC23F3D0C09D48F14375E47BC46FA9 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; + buildConfigurationList = E81710E3CF86077AD189173E6889CC82 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; buildPhases = ( - FC10E832A2E014898EC28BFEF85842F5 /* Sources */, - 18ADF4391AD2B9AFFB8C22BB8E39073A /* Frameworks */, - A1C467E6329FB71A32BEF2B48C0C1472 /* Resources */, + 403D1403E9065290A1409882D420D49C /* Sources */, + A54A020DFD109D748321C3911B8451A8 /* Frameworks */, + 886C7F517A88C6FFFA4CC0EE701C4D61 /* Resources */, ); buildRules = ( ); @@ -2336,92 +2022,36 @@ productReference = F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */; productType = "com.apple.product-type.bundle"; }; - 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 443B884E65FAE484ACCBE366E916F115 /* Build configuration list for PBXNativeTarget "SnapKit" */; - buildPhases = ( - 68BE767CD2728366CEB889E27AD94683 /* Headers */, - 6D5D9A2CC6D992C1EA0D7B05A6CE9FB2 /* Sources */, - 3E819BE9BEE6A082564F6D50AC1FE536 /* Frameworks */, - 4219728B70BF84CA9DF3AB415875AF83 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 70839219DD5C745549587E2185086ABB /* PBXTargetDependency */, - ); - name = SnapKit; - productName = SnapKit; - productReference = 979486118B3E90C08386079D57962701 /* SnapKit */; - productType = "com.apple.product-type.framework"; - }; - 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */ = { - isa = PBXNativeTarget; - buildConfigurationList = E5E7FE632631B0276CC3F3B2CAABF993 /* Build configuration list for PBXNativeTarget "SSAlertSwift" */; - buildPhases = ( - 38DD53377E43123969C7117C22004B72 /* Headers */, - FE95AEAB6389AEE07DF7CD0D22860983 /* Sources */, - 9EA8986C070A5282511443AA1423116E /* Frameworks */, - 8CDEF0DC1171CEB7621981915CB3E562 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SSAlertSwift; - productName = SSAlertSwift; - productReference = D9AFC4B66F872436A059FE53780D216F /* SSAlertSwift */; - productType = "com.apple.product-type.framework"; - }; 87E2B8A29E8A66B9205D8A41F66E4927 /* Pods-ReadViewDemo */ = { isa = PBXNativeTarget; - buildConfigurationList = D2130827DFC56C5DB08AE4C102BD7959 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */; + buildConfigurationList = 969FEC0B2FA67E4DE3E10F5E98CF39C6 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */; buildPhases = ( - CB8A268CE4B47C658C371D102E5FC518 /* Headers */, - 6ED686CD84F60F9942601B51B9BC5487 /* Sources */, - 5AD7A66173E2D71E9D48E779C33AD979 /* Frameworks */, - 78200D2A9DFC52D4812B6CE5C4CE5910 /* Resources */, + 33B6840BE83FE6C6AE3C935E73FAB404 /* Headers */, + AF09D5A5B57E781D29EB3CD22A1DE186 /* Sources */, + 241C62665F0673AB5044556DB7A47F1F /* Frameworks */, + ABB244EF18715E7F2232890224DD8993 /* Resources */, ); buildRules = ( ); dependencies = ( - A15C9621FEB9E916A0F697C7CD3B4540 /* PBXTargetDependency */, - C50AEE3EDC2E805057072F84F96232C3 /* PBXTargetDependency */, - 2B6415BE84BD798D27F9428CC5D3B68C /* PBXTargetDependency */, - B431640511BC4589F59EE4103D234874 /* PBXTargetDependency */, - F2207952E96E8659148FCB854A8B2E67 /* PBXTargetDependency */, - 5423625E8450816B30A8475F01E8AAFF /* PBXTargetDependency */, + C5C00D86AEC14371CD6BAB279ABDA2DA /* PBXTargetDependency */, + B3C1D0229D855B8FC4690EBB7A414FB4 /* PBXTargetDependency */, + 299D0A928127A948539B11F0E0B15456 /* PBXTargetDependency */, + 44A8C88A6520712D971ECCF7DB5E0E91 /* PBXTargetDependency */, ); name = "Pods-ReadViewDemo"; productName = Pods_ReadViewDemo; productReference = 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */; productType = "com.apple.product-type.framework"; }; - 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */ = { - isa = PBXNativeTarget; - buildConfigurationList = FA0D8FD2632665E77D3755C64F4EFC74 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */; - buildPhases = ( - DDDD9AB047F97F9AAA2C9EBFE6CF7D6B /* Sources */, - CE5A833C5532ED1B29593567E3B5AA66 /* Frameworks */, - 9CE7AB2E55BF3FFBF3DDFD65B42528A9 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SnapKit-SnapKit_Privacy"; - productName = SnapKit_Privacy; - productReference = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; - productType = "com.apple.product-type.bundle"; - }; 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = 43899D66EDA58F53D3766F46D93C4EC3 /* Build configuration list for PBXNativeTarget "DTFoundation" */; + buildConfigurationList = 106179E41DCBAFB020B0B998D50116F5 /* Build configuration list for PBXNativeTarget "DTFoundation" */; buildPhases = ( - 8A28DB98484AC536EEC1D4F3DDD426DA /* Headers */, - 793D446342B037C64E840F94217F48EB /* Sources */, - CDE0C51D4CC555811724B28FB8285A10 /* Frameworks */, - 83D397186F065AFB2763E0DFCAA40555 /* Resources */, + C0A172710A396D707BB6434EBB995FCF /* Headers */, + 8AB15F396BD31D6E2A6DB1FC86EF957A /* Sources */, + CA092150563BDAB9BF6BB4E333429810 /* Frameworks */, + F7B703EED811B0935096F85FB8E15B85 /* Resources */, ); buildRules = ( ); @@ -2434,17 +2064,17 @@ }; AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = DA2CC49129AD3F4620303440F05AC2BE /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; + buildConfigurationList = 3B41B7BCC37E0C0C09134B3AF4F26DF5 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; buildPhases = ( - 05F35E6BA63DE209CE2DE67CDF2991AF /* Headers */, - 201147F8E6A364F2F8ACB5C99C1E82DD /* Sources */, - 7A27B9BB2F93CD6A273034C4F5C15307 /* Frameworks */, - D965ACEA0CABB8C050BF0A133CC81021 /* Resources */, + F5EFDF3E9DDCD70973188EA186E85A88 /* Headers */, + BB54F05FF8C1D6F2A6158AE351D7E19C /* Sources */, + 6BA994E419B71A34DAC7DC2F80C1E55A /* Frameworks */, + AD0C0A0D304818E3A48A3F07DD265975 /* Resources */, ); buildRules = ( ); dependencies = ( - 0CA0593E3860B08AD087CD14D2EDA869 /* PBXTargetDependency */, + D95FDC45550F21721EF8EB81A91A8851 /* PBXTargetDependency */, ); name = ZIPFoundation; productName = ZIPFoundation; @@ -2453,21 +2083,19 @@ }; AA2E57587AA8EECA63C4BE08EA3CB6D2 /* RDReaderView */ = { isa = PBXNativeTarget; - buildConfigurationList = 657380B0395B73E23E564C39924CCB23 /* Build configuration list for PBXNativeTarget "RDReaderView" */; + buildConfigurationList = F839E10A0714CAFC9FF463B6099E2A0A /* Build configuration list for PBXNativeTarget "RDReaderView" */; buildPhases = ( - 3454132B21348ADC70E5D998978134A5 /* Headers */, - 7DA2B691BD63CB512949EDE4AC687847 /* Sources */, - 0690E2F3423B489C060C58F052BA27E8 /* Frameworks */, - 558711D4117F2F78B7305380DCF8E95D /* Resources */, + 1B5B7378827A92C91FEBA6E7088993EC /* Headers */, + A1BE4E37825BDAB5C89924055C5A34DF /* Sources */, + 923127D49FC5F6755FEC287CF9B07812 /* Frameworks */, + 370BA5857517EED2312D7A86B811B14C /* Resources */, ); buildRules = ( ); dependencies = ( - 135CCBF62F02544774EBD62971FFA7BF /* PBXTargetDependency */, - CC4284E96A8A43831A29D84D6DA599D3 /* PBXTargetDependency */, - 05CE4FE9872739B4C815A7EF2478D2A8 /* PBXTargetDependency */, - 5555F6F21ADFD0EBE205EF667713FB4E /* PBXTargetDependency */, - E07882A0DC0DED8B43811D8AE79B7757 /* PBXTargetDependency */, + BA8CD293AA300B9562123D41D99696A6 /* PBXTargetDependency */, + 2C9655F6B4C89F32E587FAF115EE03CC /* PBXTargetDependency */, + BC0C832BFCF4B79EDEB1C3C754A7C7D0 /* PBXTargetDependency */, ); name = RDReaderView; productName = RDReaderView; @@ -2476,11 +2104,11 @@ }; AE7F393FB7805DE2664AB4111873F907 /* RDReaderView-RDReaderViewAssets */ = { isa = PBXNativeTarget; - buildConfigurationList = 7031824EF6D3A2ABDDDAB4A47F8B7092 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */; + buildConfigurationList = E678DBCAC7A96683BD91570AD2C81DB3 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */; buildPhases = ( - 6AA8E48835DD29CE7D4EE25FBF55EB1A /* Sources */, - 5F41B71D619CE5CB2F653FD0EAD76A81 /* Frameworks */, - FD5333C08A361CBCC8E2E33B619E567D /* Resources */, + 2D24213949E1762E0D9D96CA6FE1D136 /* Sources */, + 41D2F746EE0F32BE39A378BBE1D33306 /* Frameworks */, + 3AC0B4FA9C39C69F7AC29F1FF5970256 /* Resources */, ); buildRules = ( ); @@ -2503,8 +2131,8 @@ buildRules = ( ); dependencies = ( - 0ACC6A1B934384D248550F31995477C3 /* PBXTargetDependency */, - FF7A1364D5F46BB26DD0C620A2AE9992 /* PBXTargetDependency */, + E3A26D30EFCE6A679CA0B908152DAC48 /* PBXTargetDependency */, + 19D46876B89FB1A6965AA89784447800 /* PBXTargetDependency */, ); name = DTCoreText; productName = DTCoreText; @@ -2513,11 +2141,11 @@ }; C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = 442D0A561D1A27F605362B5185B9866A /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; + buildConfigurationList = 7AB227059EC1F8C7E624C1F5E7CAF900 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; buildPhases = ( - C577A8863C17DFA378B7D16B073FD552 /* Sources */, - E5A91F32DDA2E21F380CDBBFC1CD94C7 /* Frameworks */, - ECF39B7DFD8973930B27332F58345109 /* Resources */, + 15A26185A7C7B4D247ECFF50FA82F210 /* Sources */, + 7BB687433C7B1AC0D2C83CC4255CF94B /* Frameworks */, + 724A2CE3801C080D61DFE00543AE786F /* Resources */, ); buildRules = ( ); @@ -2548,7 +2176,7 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = 43D8ECA62CF48C3CD5F77E3CA6F466AF /* Products */; + productRefGroup = F8A2B0DD84CEFC61D2C703C767D33C43 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -2558,9 +2186,6 @@ 87E2B8A29E8A66B9205D8A41F66E4927 /* Pods-ReadViewDemo */, AA2E57587AA8EECA63C4BE08EA3CB6D2 /* RDReaderView */, AE7F393FB7805DE2664AB4111873F907 /* RDReaderView-RDReaderViewAssets */, - 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */, - 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */, - 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */, AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */, C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */, ); @@ -2568,6 +2193,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 370BA5857517EED2312D7A86B811B14C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C0567C88DCAE3D057F1F75D7AEDFC5F /* RDReaderView-RDReaderViewAssets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 378BF991D3B318AACBF6D78F57218233 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2576,432 +2209,351 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4219728B70BF84CA9DF3AB415875AF83 /* Resources */ = { + 3AC0B4FA9C39C69F7AC29F1FF5970256 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 87466854F854640618D9ECC4DD87732C /* SnapKit-SnapKit_Privacy in Resources */, + F35B12C3787F02C121BEF6ED16B69605 /* cssInjector.js in Resources */, + 1E9D03D8CDA354903C048CBCBF73FB31 /* epub-bridge.js in Resources */, + 6F50693BC10B3C72DDD1130DDCDB234F /* epub-fixed-layout.html in Resources */, + BF2C1AC7B6C32ED307AD651A46AA6C9C /* rangy-core.js in Resources */, + E73B999DB940594604D5FF8ADEC0EBBC /* rangy-serializer.js in Resources */, + 5ABBCC3416B1FCBFAB56261F283693CA /* WeReadApi.js in Resources */, + 10EDE543DD6FB84E7F83398813B62AD9 /* wxread-dark.css in Resources */, + 8A9311DAF16BE5D746333DF2543918FF /* wxread-default.css in Resources */, + 501F8AD8F97F43A5D7008BE031C7934A /* wxread-replace.css in Resources */, + 5E7F1CB5132C8FB02EA6B1DD947F914D /* wxread-replace-latin.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 558711D4117F2F78B7305380DCF8E95D /* Resources */ = { + 724A2CE3801C080D61DFE00543AE786F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 31656AC7A50C1938C94131120B77B277 /* RDReaderView-RDReaderViewAssets in Resources */, + 69AA93849D36C090BD310B6F0CADD0C5 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 78200D2A9DFC52D4812B6CE5C4CE5910 /* Resources */ = { + 886C7F517A88C6FFFA4CC0EE701C4D61 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3BDB9F7C8367124B362836E4A8BF5341 /* default.css in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + ABB244EF18715E7F2232890224DD8993 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 83D397186F065AFB2763E0DFCAA40555 /* Resources */ = { + AD0C0A0D304818E3A48A3F07DD265975 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + D7CB1C23334ED2DD8CFC33FBE80D2C92 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CDEF0DC1171CEB7621981915CB3E562 /* Resources */ = { + F7B703EED811B0935096F85FB8E15B85 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 9CE7AB2E55BF3FFBF3DDFD65B42528A9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CBEF43E74744676839326C2D833FC6FF /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A1C467E6329FB71A32BEF2B48C0C1472 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CD5204849FC7E2964D7B81BAA7F77264 /* default.css in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D965ACEA0CABB8C050BF0A133CC81021 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4A891B04317BB3931238875910CE7772 /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ECF39B7DFD8973930B27332F58345109 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CE452E92A6D250A7CEC5FCA1DB3F2559 /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FD5333C08A361CBCC8E2E33B619E567D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3C37CBADF5A9D153099D9DD26851B012 /* cssInjector.js in Resources */, - C9A5F7678CAA29D2360F5E9664326A84 /* epub-bridge.js in Resources */, - B07FDC47F5F68E14BED9EC6512D5817F /* epub-fixed-layout.html in Resources */, - 6C762AFC299FFD839633723E95F3524D /* rangy-core.js in Resources */, - 64EA4D70BFC27B08051A38CFD34E9EEB /* rangy-serializer.js in Resources */, - 9295ACA6C5CEA110E02F9A8E7A55D08A /* WeReadApi.js in Resources */, - E92E331262CD68DBE05495F8EA560548 /* wxread-dark.css in Resources */, - 4340432D9A9490D9CF9BC31F6B50B2F2 /* wxread-default.css in Resources */, - 0E9FF4ED55C539850AA4023C7EF7FC4A /* wxread-replace.css in Resources */, - 1616B926586677612AEF659A23ECCD0D /* wxread-replace-latin.css in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 201147F8E6A364F2F8ACB5C99C1E82DD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10FF832A1AF85DA716C94D9E10A85BF3 /* Archive.swift in Sources */, - 3A5CC932C1E41AB85D67620EEA2D0BA8 /* Archive+BackingConfiguration.swift in Sources */, - A8DC6885FE405B71BCF13D91D9CFFF71 /* Archive+Deprecated.swift in Sources */, - 0B7603CC7E4C2D7A63E2BB4D1EB1BA71 /* Archive+Helpers.swift in Sources */, - 8C37B65B5FF8C31744B80DAF99CEF0E9 /* Archive+MemoryFile.swift in Sources */, - FFCD89F746514E86CC9E99A60E64D61B /* Archive+Progress.swift in Sources */, - D22006C17391103A0D2F496D05F012B3 /* Archive+Reading.swift in Sources */, - 1389F2DE24EAF82D9003C16996BB9255 /* Archive+ReadingDeprecated.swift in Sources */, - C2BCA92E8E4BB077023BA1AC445962B3 /* Archive+Writing.swift in Sources */, - 0BECE54788017FB1138CAF0006752F85 /* Archive+WritingDeprecated.swift in Sources */, - 7DBEB16F3A755F919B8AA710F5593C1A /* Archive+ZIP64.swift in Sources */, - A8FC7A36DEF3E31E296CD4D26A815B3D /* Data+Compression.swift in Sources */, - F65BAED40531ADE85C230A2D779A5182 /* Data+CompressionDeprecated.swift in Sources */, - E14170A54A9726BECBB355762C685602 /* Data+Serialization.swift in Sources */, - A0EFD4BB76E51AF257290001AF4944D2 /* Date+ZIP.swift in Sources */, - 468A2F854012BBA18B8CC0458FC89B3F /* Entry.swift in Sources */, - 8CAC2DBDC2672B8F227875C2D05D7555 /* Entry+Serialization.swift in Sources */, - EF4307848004954110D2EBDA5399C02F /* Entry+ZIP64.swift in Sources */, - EA9136B1358F8EFA993DE6CFEEBEACF1 /* FileManager+ZIP.swift in Sources */, - 777AD7CB7399E49BF110AAA8C9036583 /* FileManager+ZIPDeprecated.swift in Sources */, - A0086BC42F0345BCC2FD3B88E3440613 /* URL+ZIP.swift in Sources */, - ACA56466FFD614410CCB31E0A2931D56 /* ZIPFoundation-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6AA8E48835DD29CE7D4EE25FBF55EB1A /* Sources */ = { + 15A26185A7C7B4D247ECFF50FA82F210 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 6D5D9A2CC6D992C1EA0D7B05A6CE9FB2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7C40890FF94AE3B5E3A73AEF73FD0701 /* Constraint.swift in Sources */, - A6306344331E00A5BE222BF52F4D5129 /* ConstraintAttributes.swift in Sources */, - 537A4BFAF3D622FCB0C3A31B71F0D8C0 /* ConstraintConfig.swift in Sources */, - 0AA3A80E4DD1062BA4641DF71F00F773 /* ConstraintConstantTarget.swift in Sources */, - C3D195BDEB02E070383985241CCD749B /* ConstraintDescription.swift in Sources */, - 2B4A9056AEC7A8D350EE3CD248F08DE8 /* ConstraintDirectionalInsets.swift in Sources */, - B4267497AB5BF50898ECA9B77E75EA14 /* ConstraintDirectionalInsetTarget.swift in Sources */, - D76431C60233FF62242A2BD1AE3C826A /* ConstraintDSL.swift in Sources */, - 1E130859A8AB1AE05E4593D519C219A9 /* ConstraintInsets.swift in Sources */, - 6795652F3E65BD7FB9B422F192768372 /* ConstraintInsetTarget.swift in Sources */, - 09BD533E8A50F83694A170194678AE8E /* ConstraintItem.swift in Sources */, - 194664799DF7F4D9E2D1F16EADCA0823 /* ConstraintLayoutGuide.swift in Sources */, - 526BC0691731F81C69DB9755158CB9EF /* ConstraintLayoutGuide+Extensions.swift in Sources */, - F12E325A7ED834D878D4DA821D57594A /* ConstraintLayoutGuideDSL.swift in Sources */, - C6A49A308880D341DDE7D6D90A579684 /* ConstraintLayoutSupport.swift in Sources */, - 31ECE641ED1AC3888D6C9BB35DFCC7A0 /* ConstraintLayoutSupportDSL.swift in Sources */, - D5D469DD6B6F98BCF293C5B83B693459 /* ConstraintMaker.swift in Sources */, - 5476A8BC3143ABF3716F21AF18C67ECB /* ConstraintMakerEditable.swift in Sources */, - 88670A69EF411C639C3AAC8B39848340 /* ConstraintMakerExtendable.swift in Sources */, - 055EF156631EA5706DCECFC0F49D9392 /* ConstraintMakerFinalizable.swift in Sources */, - CE4F13F2F2812EB7B3919F0A91F2E858 /* ConstraintMakerPrioritizable.swift in Sources */, - CF2D91AB9CCA3E706A39D5126BA04C3B /* ConstraintMakerRelatable.swift in Sources */, - AA6C9B258173656A1241F1CF0E80D7D4 /* ConstraintMakerRelatable+Extensions.swift in Sources */, - 9B9FE1C8A205EFB1EA6081CB2885DF5F /* ConstraintMultiplierTarget.swift in Sources */, - 88D5FBA8614CC1A84A6B1288627CB93C /* ConstraintOffsetTarget.swift in Sources */, - 06BD685726847318A09C9590891CD7ED /* ConstraintPriority.swift in Sources */, - E8B4718E98F761D7BD63E98A96D79354 /* ConstraintPriorityTarget.swift in Sources */, - 1DE4CF0A937A4535FAD88245B7B0B577 /* ConstraintRelatableTarget.swift in Sources */, - 221B7E4A6D3AACF716E2830AA77F4163 /* ConstraintRelation.swift in Sources */, - 587D6FEA096B959DB159958EA85DE7AA /* ConstraintView.swift in Sources */, - 74B266A15F5B1DFA3B1D005C7CDBFF0D /* ConstraintView+Extensions.swift in Sources */, - 1A3FDFA1A68A13644CB7D7E28066EAA1 /* ConstraintViewDSL.swift in Sources */, - C6308C05D9FEBC66D46E90617BA932FC /* Debugging.swift in Sources */, - F94303E469C66C27A25A2596C357318E /* LayoutConstraint.swift in Sources */, - BC034149400280A8BB07C18A027494CF /* LayoutConstraintItem.swift in Sources */, - BDFB313B8C690747D6B8C974338A1B03 /* SnapKit-dummy.m in Sources */, - 1510A538CB762F72F7990C17EC617299 /* Typealiases.swift in Sources */, - FE33334602C29ADE729F7AAE4C686668 /* UILayoutSupport+Extensions.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6ED686CD84F60F9942601B51B9BC5487 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F1E9B6D0728711AE4D7154616DBC17EC /* Pods-ReadViewDemo-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 793D446342B037C64E840F94217F48EB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2336E3B7C72AB1702DEAA87786A98284 /* DTActivityTitleView.m in Sources */, - BE0ECECF6F3D871AFE88627E8042FA4D /* DTAnimatedGIF.m in Sources */, - 80A95AF17AF71F69504BF2B6639E2AF4 /* DTBase64Coding.m in Sources */, - 064481778FF8671650240A03A9371744 /* DTBlockFunctions.m in Sources */, - 5EE0E6A4CE24D4F834E95A41DEE57121 /* DTCoreGraphicsUtils.m in Sources */, - 7FF0C80B19CF042F6ADF4A7954DF69AF /* DTCustomColoredAccessory.m in Sources */, - 8D8786B29D0ADDC25829805E11BBDA08 /* DTExtendedFileAttributes.m in Sources */, - 5BC03D1F8B6ED13FB6EE44A06D5B56F8 /* DTFolderMonitor.m in Sources */, - 75DD13197B3A50B7DB6E8C0D453194B3 /* DTFoundation-dummy.m in Sources */, - BCCA1BD09411BFFD19A14D48D087C1C5 /* DTFoundationConstants.m in Sources */, - 5462A8578E68D9DA6636976F732133F8 /* DTHTMLParser.m in Sources */, - FA3F2F0647033F749B690F1F43F1FF9E /* DTLog.m in Sources */, - CD423A7A8D8F156279C62233AA4DAF1D /* DTPieProgressIndicator.m in Sources */, - 0ABC5070A4608ADE7CEEA759C9B5EC82 /* DTSmartPagingScrollView.m in Sources */, - B72FCEF30FCF820E9434CAB06B502027 /* DTTiledLayerWithoutFade.m in Sources */, - 4B5274DA733FBDE60596AEF43A61320E /* DTVersion.m in Sources */, - FC261482E0571EF1D2C176DCC1416271 /* NSArray+DTError.m in Sources */, - 913F50C87F33408387D2FABFB364FEF1 /* NSData+DTCrypto.m in Sources */, - 50FBFEC57DA9CC749DA0D1E8B2B75F7C /* NSDictionary+DTError.m in Sources */, - EFAE66F7F5876B3C3F2357E5D52DF341 /* NSFileWrapper+DTCopying.m in Sources */, - F51FF3BE649DB4F45C1CEDBE5B9992AB /* NSMutableArray+DTMoving.m in Sources */, - 4ACCCA93DA06B2666E192996213E0B0B /* NSString+DTFormatNumbers.m in Sources */, - 4479AD171E4AD6640B04604493ED0A3C /* NSString+DTPaths.m in Sources */, - C9F845A486E47895A25C9C6885C606B6 /* NSString+DTURLEncoding.m in Sources */, - D0871D1ABC6B5B4B121BD9D1F77ED113 /* NSString+DTUtilities.m in Sources */, - AC957DB48302A58F9CA91D3735ADF86A /* NSURL+DTAppLinks.m in Sources */, - 7B83FABA52CF86EF8529E566EAC9367B /* NSURL+DTComparing.m in Sources */, - A0BDB089F8F7C3478AAC3756C3FED67C /* NSURL+DTUnshorten.m in Sources */, - 8FD8FE08A1F383BD78DFEC51D7EE5DF8 /* UIApplication+DTNetworkActivity.m in Sources */, - 316654F1450305B61B2FE4F3CEA4543F /* UIImage+DTFoundation.m in Sources */, - FEE25EB95A909D28146B01F50AB9C904 /* UIScreen+DTFoundation.m in Sources */, - 1501ABBDADA4CFC28913368EEA52B109 /* UIView+DTFoundation.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7DA2B691BD63CB512949EDE4AC687847 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00012FDC4E0B6E7D2912581B460A8992 /* RDEPUBAnnotationModels.swift in Sources */, - E6480EA3947A2C71A3096CCAEBFA9131 /* RDEPUBAssetRepository.swift in Sources */, - ED1258ECC58FC5AC544DDE1883E42034 /* RDEPUBAttachmentNormalizer.swift in Sources */, - D1173237922081A644444BC00B51B8B8 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */, - 1C90896663D69FFC15D8EE09ED2789DA /* RDEPUBAttachmentTooltipView.swift in Sources */, - E4B6BEF132A110AB19F8244537562719 /* RDEPUBBackgroundCoverageStore.swift in Sources */, - DC7462EE3634E61D37537277E0D1C173 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */, - D7C1729E34F5F2CBF878385EABB0F78A /* RDEPUBBackgroundTrace.swift in Sources */, - A2CF42E4C725A1969A6211211C82138A /* RDEPUBBookPageMap.swift in Sources */, - 2C1372BF284AB062A1B6B8C026073E73 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */, - CE62D88B2B0EC135F19EF16E1EE898FB /* RDEPUBCFI.swift in Sources */, - 58445DE0477FD63B598AD8785C45DD1F /* RDEPUBCFICompatibility.swift in Sources */, - 92F6111C95FCD2F3E9A181E4D943A1EE /* RDEPUBCFIDOMPathBuilder.swift in Sources */, - BC81EFE1BD216C5B18F013ADD05FC416 /* RDEPUBCFIError.swift in Sources */, - 5C5E3146F1526E09C1F510BD514D8A65 /* RDEPUBCFIGenerator.swift in Sources */, - 382D4752DB1D51511A713736629A120B /* RDEPUBCFIMap.swift in Sources */, - F4E1C9E1686B902C7D26BF68B034AFEE /* RDEPUBCFIMarkerInjector.swift in Sources */, - F630BEC2086983146AD26D9396323AF1 /* RDEPUBCFIParser.swift in Sources */, - FA58AAD5F76A38FA6D32BF44408811E4 /* RDEPUBCFIPath.swift in Sources */, - 931695433DC077003590F79665E0622A /* RDEPUBCFIRange.swift in Sources */, - 76B6DF0A60F3BB8E9B53581AA2B89ECA /* RDEPUBCFIRecoveryEngine.swift in Sources */, - 502C53D46B40E13673AB6F26044BE287 /* RDEPUBCFIResolver.swift in Sources */, - A77E807D439F105930DF42E053013624 /* RDEPUBCFISerializer.swift in Sources */, - 1D1C0972DCB88C93667236180986F7DA /* RDEPUBCFITextAssertion.swift in Sources */, - 7C43EAC7CB850A7675D2A6D61C8FBF01 /* RDEPUBCFIUtilities.swift in Sources */, - 4E66B9A8089866D932E7127403C0DC52 /* RDEPUBChapterCacheKey.swift in Sources */, - 3534F4FAFC0636E50CB8D9200515E974 /* RDEPUBChapterData.swift in Sources */, - 4AAD976AEFCB0BCC55B8585323321885 /* RDEPUBChapterDataCache.swift in Sources */, - 31A151A1FC37F975CB9B1880C5816546 /* RDEPUBChapterLoader.swift in Sources */, - 491EFCE38A3F50F71087473BE0421212 /* RDEPUBChapterLocation.swift in Sources */, - 2A58CC63B5184D7047EF8794F5FCC014 /* RDEPUBChapterOffsetMap.swift in Sources */, - 7FA38108813D4CB4C8ED33502E91BB5D /* RDEPUBChapterPageCounter.swift in Sources */, - 1D128324740E7CCDDBBA92208805578D /* RDEPUBChapterRuntimeStore.swift in Sources */, - D5FC94BE4999365112D0537777CA2FAB /* RDEPUBChapterSummaryDiskCache.swift in Sources */, - 63E3F3AA068ADE79B61FA2B9682F03ED /* RDEPUBChapterTailNormalizer.swift in Sources */, - 87B07B9129E0E431CAF116B4EE4C0A5D /* RDEPUBChapterWarmupOrchestrator.swift in Sources */, - ECFB291BFD3228FABB8D7CE994E44B61 /* RDEPUBChapterWindowCoordinator.swift in Sources */, - FC2546E55A86C4D94D5F8B809FB5C897 /* RDEPUBChapterWindowSnapshot.swift in Sources */, - 5EF61759B9D9C035F921104933AEE7B5 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */, - 5FA01E9E77A69E8AB98EAD70E51A0FCC /* RDEPUBCSSCompatibilityLayer.swift in Sources */, - 57DD3A0EBB0E32B4D804E8D49FE99001 /* RDEPUBDarkImageAdjuster.swift in Sources */, - 5AB50C364F62809013394E49588190C8 /* RDEPUBDTCoreTextRenderer.swift in Sources */, - 780837EAC09D97BF7EB4CC1415EEF0AE /* RDEPUBFixedLayoutTemplate.swift in Sources */, - 2814E48108DD3E83904D5C9318EE89D9 /* RDEPUBFontFallbackResolver.swift in Sources */, - DD304690E329A997954FD30B7E101746 /* RDEPUBFontNormalizer.swift in Sources */, - F0DCEA4158B69D4D7F327C580EB8CDE5 /* RDEPUBFragmentMarkerInjector.swift in Sources */, - 75668A2C0006C07A19D8D7752400689C /* RDEPUBHTMLNormalizer.swift in Sources */, - 2FE74F960A0ACAC1C71ACDC89972E183 /* RDEPUBImageViewController.swift in Sources */, - 864317F17E7247F95AE8763CDC571AC7 /* RDEPUBImageViewerCoordinator.swift in Sources */, - 9032E6A1A4F1FA89178E3DCF9E76843F /* RDEPUBJavaScriptBridge.swift in Sources */, - BABB631D3E75C2401B0186D33D45F028 /* RDEPUBJumpSession.swift in Sources */, - 55F4D3C5BE4D81A6A193E0799AF0834E /* RDEPUBMetadataParseCancellationController.swift in Sources */, - BCF71935893826A0C7E4D94AE9690198 /* RDEPUBMetadataParseWorker.swift in Sources */, - 2ADC21293994C745E3534DCF850B5994 /* RDEPUBModels.swift in Sources */, - 437298A17902FD1B6BCD2E4FE084DDC2 /* RDEPUBNavigationStateMachine.swift in Sources */, - 87E6B7A76709BC55FD95D822811D521E /* RDEPUBNavigatorLayoutContext.swift in Sources */, - B2D82D043AA2A89BA9000314FE7A45AC /* RDEPUBNavigatorState.swift in Sources */, - 68C89390714FFBFDFCFD1248A346E8E8 /* RDEPUBNoteDetector.swift in Sources */, - 6840A456B0498FA5A20F9F1713E21479 /* RDEPUBNoteModels.swift in Sources */, - E4B55D3DA872FD60436501A4880E8559 /* RDEPUBNotePopupCoordinator.swift in Sources */, - F000848FB2DEADE8E5FBA17C3F6756CF /* RDEPUBNotePopupViewController.swift in Sources */, - 4975956E880208083B5F22F8B5BB2BB3 /* RDEPUBNoteResolver.swift in Sources */, - 0787448DED429142330009FBEEFA6C20 /* RDEPUBPageBreakPolicy.swift in Sources */, - 5E58335E84B16D33094CBE684E8065FC /* RDEPUBPageCountCache.swift in Sources */, - AE43D161B808037299043EC4C7E02B7A /* RDEPUBPageInteractionController.swift in Sources */, - FCD1FF6DA0BBED5100CEA56D71B2EB04 /* RDEPUBPageLayoutSnapshot.swift in Sources */, - 309724DCA5F394FC0187A8EF5094647E /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */, - 0E7C316F098CD51BAF6DF9337F4D4FF3 /* RDEPUBPageResolver.swift in Sources */, - 7C88864F32B503C4E54A5A9B1C332981 /* RDEPUBPaginationCacheCoordinator.swift in Sources */, - 8BDD1C103484829B9DDD106A067C5C02 /* RDEPUBPaginationModels.swift in Sources */, - 63ABC14E426657DEAF0A5309CDC81A48 /* RDEPUBPaginationState.swift in Sources */, - 11949D3539DAA668EF241BFCA2817B99 /* RDEPUBPaginator.swift in Sources */, - AE861D884A8004EF8F7CFADCE86D8411 /* RDEPUBParser.swift in Sources */, - 0AC506D604FCC73E73FEABDB9F62984F /* RDEPUBParser+Archive.swift in Sources */, - 6321BE6DE0C6F2AC7D53FE5BEABD4F83 /* RDEPUBParser+Package.swift in Sources */, - ED95A429520E9CFB6C09FF1DC88AEF00 /* RDEPUBParser+ReadingProfile.swift in Sources */, - B532D38C5A7FC5AE5F0968DC9C9DBCF8 /* RDEPUBParser+Resources.swift in Sources */, - 60DEFF3031960C170BD930117DDBFDE7 /* RDEPUBParser+TOC.swift in Sources */, - 789B886DB594DC9497BB011790BBF7E8 /* RDEPUBPreferences.swift in Sources */, - DB0F934EA8172F157992E1909D319C41 /* RDEPUBPresentationRuntime.swift in Sources */, - 57429646273801FBDE2E8306B96D9415 /* RDEPUBPublication.swift in Sources */, - 3D8657B60B919094A50D9CE9A5F454A4 /* RDEPUBReaderAnnotationCoordinator.swift in Sources */, - BEAF0452878110B598B76B6AD4F46518 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */, - CA1210C0EBDE84C367D23D69B4470853 /* RDEPUBReaderBottomToolView.swift in Sources */, - ED3BD7326F33BCB93CD0B8643A4F1BAB /* RDEPUBReaderChapterListController.swift in Sources */, - 8E5F3603B41FE2CF3FBEC4C9D1337F3C /* RDEPUBReaderChromeCoordinator.swift in Sources */, - 91D8F6C54391A9D3E37F08CC4315AE99 /* RDEPUBReaderConfiguration.swift in Sources */, - 1DCBB39D25EBEDB3B18C44EBD601AFA9 /* RDEPUBReaderContext.swift in Sources */, - 36DEB3A282F5A6B8CD1CA2F085B805F5 /* RDEPUBReaderController.swift in Sources */, - 46BC83888CC2216F28287B7FA1E81136 /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */, - D3D2648D63A8BED58114E8456BD73229 /* RDEPUBReaderController+ContentDelegates.swift in Sources */, - F2B594C44772081247BCDBCBC43625D7 /* RDEPUBReaderController+DataSource.swift in Sources */, - 6E7463B2C7BE39639F53BF3B9171750E /* RDEPUBReaderController+ExternalLinks.swift in Sources */, - 7061077F19BD8B9339FD53134B0E6652 /* RDEPUBReaderController+LocationResolution.swift in Sources */, - B113395265911C8296BC5FAABD0D3667 /* RDEPUBReaderController+PublicAPI.swift in Sources */, - 945A77521BE95FB18A3D1577A50B7F24 /* RDEPUBReaderController+RenderSupport.swift in Sources */, - 3DFAACFD146FD0704B2D180361A1885F /* RDEPUBReaderController+RuntimeBridge.swift in Sources */, - 6B574191C6DBFD6A34B1F5850E599DBB /* RDEPUBReaderController+TableOfContents.swift in Sources */, - B1C2E803A0F46195770A6E288270C00B /* RDEPUBReaderDelegate.swift in Sources */, - 9010223E727BEFED1915B2BB2A35ECFD /* RDEPUBReaderDependencies.swift in Sources */, - 821AC919160B6FCE4FEC3F37F99FEA22 /* RDEPUBReaderEnvironment.swift in Sources */, - BA92ADE493399D9EF1855FC2ECEF4C85 /* RDEPUBReaderHighlightsViewController.swift in Sources */, - 475A20655711B38721CA7D0F558DB434 /* RDEPUBReaderLoadCoordinator.swift in Sources */, - 63BD507DCFB9657844C5822E2BD7C72E /* RDEPUBReaderLocationCoordinator.swift in Sources */, - D02C303FBC1B11C826C8202F4CA02A09 /* RDEPUBReaderPaginationCoordinator.swift in Sources */, - 432C14A294814368D5984610B27E43C4 /* RDEPUBReaderPersistence.swift in Sources */, - 8F95D356B3818234A49F50063C4AA46C /* RDEPUBReaderRuntime.swift in Sources */, - 1898FECC9A67C5227BF5346B043B1A4C /* RDEPUBReaderSearchBarView.swift in Sources */, - 9BC6FB16B5F8448E55D8A5A5FCA15CF1 /* RDEPUBReaderSearchCoordinator.swift in Sources */, - 643C97526CC9533DCA363EB5704559FB /* RDEPUBReaderServices.swift in Sources */, - 707175A0385225FCA5CE079773062EE7 /* RDEPUBReaderSettings.swift in Sources */, - 350C0168585FC1AD0C216F769FBF709A /* RDEPUBReaderSettingsViewController.swift in Sources */, - 55E455C9B7A3ED583443CDE8E668163B /* RDEPUBReaderState.swift in Sources */, - F6D6059B11756279D4DDC1C6550091E6 /* RDEPUBReaderTableOfContentsItem.swift in Sources */, - DF1DCBB316F5B9BCF4A51CC20108CDE1 /* RDEPUBReaderTheme.swift in Sources */, - 212D840F1F1FFA819A65E20B1B3CF7DF /* RDEPUBReaderToolView.swift in Sources */, - 32BE965A17859BA8C63263A2674BD0C6 /* RDEPUBReaderTopToolView.swift in Sources */, - 83A0424762C166BEC92729C7897D70B6 /* RDEPUBReaderUIState.swift in Sources */, - CD9B02582D2A74BF9508F0509696B271 /* RDEPUBReaderViewportMonitor.swift in Sources */, - 5CCD132DD04800227A43A475DAE36FEF /* RDEPUBReadingLocationModels.swift in Sources */, - 395F5B39BB0D706C1C461E3C7D6117A6 /* RDEPUBReadingSession.swift in Sources */, - F09125B0FFA7F64C4682813E3B607E2D /* RDEPUBRenderDiagnosticsCollector.swift in Sources */, - 6C5BB6C686AF9EAAA7934C9F45648A4F /* RDEPUBRenderRequest.swift in Sources */, - EBB6868C2AA00A71178273EA633FC2E5 /* RDEPUBResourceResolver.swift in Sources */, - 7BFDB986A8372D1D292F341704ADF419 /* RDEPUBResourceURLSchemeHandler.swift in Sources */, - 85FBBBEDAD699D4749D2FC02F79CC369 /* RDEPUBRuntimeChapter.swift in Sources */, - FC9E9F7AC93678A4D81A3F0D28D198E9 /* RDEPUBRuntimePageCount.swift in Sources */, - 33BF364D51A0EC9CC944BBDDF2AC4065 /* RDEPUBSearchEngine.swift in Sources */, - 6BADF8A33B372ECD3F1A335EA4A22C07 /* RDEPUBSearchModels.swift in Sources */, - 28A5B812ECDE6E94D5346EF33AB4908D /* RDEPUBSelectionLoupeView.swift in Sources */, - 49493EF208D8B0FD2F8D7FE4B0605F59 /* RDEPUBSelectionOverlayView.swift in Sources */, - 41461DCE168703F25B2447BCA1B4AF2F /* RDEPUBSelectionState.swift in Sources */, - 18798C14A4AF8ACA5A0FDED17DDAF370 /* RDEPUBSemanticMarkerInjector.swift in Sources */, - 2D34BC78BEF8168B26C829D4A4CB0DEE /* RDEPUBStyleCompatibilityModels.swift in Sources */, - C2C21878B6B70BC91A9A54894A546250 /* RDEPUBStyleSheetBuilder.swift in Sources */, - D65E3E389E974CA5EC85C14F8AAC2197 /* RDEPUBStyleSheetComposer.swift in Sources */, - FD6C4803D3BD6697D01780015FAA1458 /* RDEPUBTextAnchor.swift in Sources */, - 7D588676C1FAEE3023C55FD8B37EED1B /* RDEPUBTextAnnotationOverlay.swift in Sources */, - 7BF35387E788616E1A159B0229909E94 /* RDEPUBTextBookBuilder.swift in Sources */, - ECFA20CFAACA1435FC6E6458F774FE56 /* RDEPUBTextBookCache.swift in Sources */, - 43C4F3118715BCDB6941E2FDD47536AE /* RDEPUBTextBookModels.swift in Sources */, - F4422D0EBA217138896E901214ABB8E2 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */, - 63B386907330D3174C4354A68F5BB911 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */, - F8D8F88FF462C764E9B8B3D86DC90837 /* RDEPUBTextContentView.swift in Sources */, - 14B212F03E50D9F5D5C9CB9AC1AEB06F /* RDEPUBTextIndexTable.swift in Sources */, - 7ABAC9BAA6E1F4DC0792041AA718DB32 /* RDEPUBTextLayouter.swift in Sources */, - B08BB5940DA74FF036FFC44380C7848B /* RDEPUBTextLayoutFrame.swift in Sources */, - 44199BE5D667C171C4A97EF5D7908D3C /* RDEPUBTextPageDecorationView.swift in Sources */, - 76025C51C72D8110BD74286B4EEFD793 /* RDEPUBTextPageRenderView.swift in Sources */, - 81EDF2465ACC1ECD6EC9ED3FDBCFAA8B /* RDEPUBTextPaginationInterfaces.swift in Sources */, - 404A17D320743603ED7F97AEBB655C1A /* RDEPUBTextPaginationSupport.swift in Sources */, - 956D4311C0980B3A1C848EF22C8AEE7F /* RDEPUBTextPerformanceSampler.swift in Sources */, - 56D49829FADCD7075A95452CD3D193B2 /* RDEPUBTextPositionConverter.swift in Sources */, - 75442F59FAA9FD0FBB4F803BB9BB35CD /* RDEPUBTextRenderer.swift in Sources */, - DDF0419BFB80D9D1E36AEE87218FC1F6 /* RDEPUBTextRendererSupport.swift in Sources */, - F894C4D1E75C1E9D24AE2CCCC8FFF519 /* RDEPUBTextSearchEngine.swift in Sources */, - F038DE4614358844588617D12CB7C530 /* RDEPUBTextSelectionController.swift in Sources */, - 71EEBB949DF9F1894B271C4268B1A907 /* RDEPUBTypesettingPipeline.swift in Sources */, - 8F756349AF82AC16C8B2675AFC2C2578 /* RDEPUBViewportTypes.swift in Sources */, - D9C976EBF3720A5029D15AAD3EC15E59 /* RDEPUBWebContentView.swift in Sources */, - 51EA2808E014EFABCFD4AF05C3CC153F /* RDEPUBWebDecorationOverlayView.swift in Sources */, - 75A45AE93B151C5A396F302394426A4F /* RDEPUBWebView.swift in Sources */, - F61F52F9C7061BEBF0F04FE32C57963F /* RDEPUBWebView+Configuration.swift in Sources */, - E95694741292C43023C955DDE54CC86C /* RDEPUBWebView+FixedLayout.swift in Sources */, - B51DAE85A896F9709CD80CA9D33102D1 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, - 2B749B511B49409D51CB106A6592D32A /* RDEPUBWebView+Reflowable.swift in Sources */, - F7198C456F52C6ADFDC43B4B111EBB4B /* RDEPUBWebView+Search.swift in Sources */, - 23E6664A8F705A42969CC4456211DC37 /* RDEPUBWebViewDebug.swift in Sources */, - 058883809CB161BCD5DFB310221A5C9E /* RDPlainTextBookBuilder.swift in Sources */, - BD6F470C950D397B0ADB9C78E460C445 /* RDReaderContentCell.swift in Sources */, - 26918ED45C33C4A0887D6BB4529F7A9E /* RDReaderFlowLayout.swift in Sources */, - F8054331081E9008FFBB542F83B40AAA /* RDReaderGestureController.swift in Sources */, - 859E8344D0307DD5FDA218AC68F9743A /* RDReaderPageChildViewController.swift in Sources */, - FC372F89CBD06240B936AB0B8C4AC67D /* RDReaderPagingController.swift in Sources */, - 753E3BDEDB52F0D6B6ACEDC7EA577DA8 /* RDReaderPreloadController.swift in Sources */, - B634BD7CC872DEA5B558A56F0E737005 /* RDReaderSpreadResolver.swift in Sources */, - 1081E871F8472C4F6FA1190EFC80109D /* RDReaderTapRegionHandler.swift in Sources */, - 19310CB1E02EB814225E353079EF6DBD /* RDReaderView.swift in Sources */, - 0AAC638E0C699A21D53F86B82546D9B5 /* RDReaderView+CollectionView.swift in Sources */, - E72EC8AFFB5D6940C67E93D7D8BF8AA4 /* RDReaderView+ContentAccess.swift in Sources */, - 9B582B59618B5F7674FD433A97389BDF /* RDReaderView+PageCurl.swift in Sources */, - 9B9B71183A91A2257C7563C345E664CC /* RDReaderView+ToolView.swift in Sources */, - 76470054E16EAA6B2E465088A40E2287 /* RDReaderView-dummy.m in Sources */, - 455DDDB5ED14B07E3E178FCD46B6D6B8 /* RDReaderViewProtocols.swift in Sources */, - 552386640F85BA29D72638B3652F87EE /* RDURLReaderController.swift in Sources */, - B6DC5982F88F75B77C49C0DCBF412A14 /* String+RDEPUB.swift in Sources */, - EF8FD9D42EB2AC4A434E6FEA3E84B47D /* UIColor+RDEPUB.swift in Sources */, - DB241AE043EAA24F7BF4EED186988C66 /* UIColor+RDEPUBHex.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C577A8863C17DFA378B7D16B073FD552 /* Sources */ = { + 2D24213949E1762E0D9D96CA6FE1D136 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - DDDD9AB047F97F9AAA2C9EBFE6CF7D6B /* Sources */ = { + 403D1403E9065290A1409882D420D49C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; + 8AB15F396BD31D6E2A6DB1FC86EF957A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E187AB7F2733DF034CE8668C1AE062F6 /* DTActivityTitleView.m in Sources */, + 595F78047873532A4208F40405262684 /* DTAnimatedGIF.m in Sources */, + 6E3160EE1463E3D3C42F6D352278D0C6 /* DTBase64Coding.m in Sources */, + C4E1E40043DA623751AF64C5CD396CCC /* DTBlockFunctions.m in Sources */, + C652D268D07948ED1E150C632CC60AF9 /* DTCoreGraphicsUtils.m in Sources */, + E7ECCDF9AA9BF1B385231D19C7167CA3 /* DTCustomColoredAccessory.m in Sources */, + 4475F0D70E29629D04CB64C82FA5CEBF /* DTExtendedFileAttributes.m in Sources */, + A949841C2F45DE9F8FB59DDADA087852 /* DTFolderMonitor.m in Sources */, + 27CAE671400980165BF5E3FD824F08A2 /* DTFoundation-dummy.m in Sources */, + C49D28C5B0E48128D9068C38B5EC8605 /* DTFoundationConstants.m in Sources */, + 8C9C493D4B8725B3BC2DF6F7E2AE2960 /* DTHTMLParser.m in Sources */, + EC3AAE6DEC73415B7A749A9D7ED1D1A2 /* DTLog.m in Sources */, + 63BF2C30A8B633ED2DFB5C9AA4DF5DD0 /* DTPieProgressIndicator.m in Sources */, + 8C254EFFDAFA3432B57B4317B306F448 /* DTSmartPagingScrollView.m in Sources */, + 4FDA4ACF3A9676F39F239791127E4651 /* DTTiledLayerWithoutFade.m in Sources */, + 23E20AD6C625950FDEE2B4C5966C0405 /* DTVersion.m in Sources */, + ACC9E4A469E961237E551759D7DBBE10 /* NSArray+DTError.m in Sources */, + 99AD3357E90AD801A7BA603B32B5DF90 /* NSData+DTCrypto.m in Sources */, + C9D94F33F92551C36226E924C6FF8E18 /* NSDictionary+DTError.m in Sources */, + 00113125175BA26D70BE12F27CCEAB65 /* NSFileWrapper+DTCopying.m in Sources */, + A08A4B4424A089A268AAF2313E0EC40F /* NSMutableArray+DTMoving.m in Sources */, + 10FA9DC27DAC6DA7724D6C6EB28FE0A0 /* NSString+DTFormatNumbers.m in Sources */, + 262232E65FD8CA26C37C33D8B1FB9B3F /* NSString+DTPaths.m in Sources */, + 4C2062F59D9CE0D280C035D83667CFAE /* NSString+DTURLEncoding.m in Sources */, + 43DE22E881166971EA01518084D03267 /* NSString+DTUtilities.m in Sources */, + FBACC93C50F20F2E8F2EC12D2D107DFA /* NSURL+DTAppLinks.m in Sources */, + 58A1F591244259E81CAEAD8AA6AEDD32 /* NSURL+DTComparing.m in Sources */, + 97551B39A196031743612486D44CC480 /* NSURL+DTUnshorten.m in Sources */, + E211604C7EBF2A9552938DE714DCEB4F /* UIApplication+DTNetworkActivity.m in Sources */, + FA898C80CF990AAD44D03448E7664729 /* UIImage+DTFoundation.m in Sources */, + DB121A63241654223079E203F3539ACE /* UIScreen+DTFoundation.m in Sources */, + 635EA3B1D45012F199D6ED4AB783D5E8 /* UIView+DTFoundation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A1BE4E37825BDAB5C89924055C5A34DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 597FB44F34F00977BA886DDAF246D33F /* RDEPUBAnnotationModels.swift in Sources */, + 5C17AB24452486F4AB7BA2DE5EFFB961 /* RDEPUBAssetRepository.swift in Sources */, + A4696A40DFBA4A943DBC243A7C907888 /* RDEPUBAttachmentNormalizer.swift in Sources */, + BBBCEF6E869779226014E3FB48CD21AB /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */, + E450259DBA3997365A02AE5501CCC6FF /* RDEPUBAttachmentTooltipView.swift in Sources */, + 37FF1ADF896F2D0BB383972330F86992 /* RDEPUBBackgroundCoverageStore.swift in Sources */, + 90ED936CB8FF110B74E170B127FCA816 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */, + 72E1E0B3B3A46A92E75CA522B9FCB7B6 /* RDEPUBBackgroundTrace.swift in Sources */, + E075024A8D760FB1935ACBD81E84F329 /* RDEPUBBookPageMap.swift in Sources */, + 6ED0817E085ECE6F0F3A0C33D3E64125 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */, + 6300355A098AC58B01C10D28C5BBFB41 /* RDEPUBCFI.swift in Sources */, + 9948C2140652AD1AEBB485FAF262531A /* RDEPUBCFICompatibility.swift in Sources */, + C2C4D280D6D73F7CFC734CED2A00282D /* RDEPUBCFIDOMPathBuilder.swift in Sources */, + C5563F583B537E0B2BFDE7779B27AE74 /* RDEPUBCFIError.swift in Sources */, + 7D5436BE12850ACBF45A53BB2A6BA466 /* RDEPUBCFIGenerator.swift in Sources */, + 89AAC0AAA4ED7247C740BA2B8E14A430 /* RDEPUBCFIMap.swift in Sources */, + 18F313579FBADD73801F5169F87A6A30 /* RDEPUBCFIMarkerInjector.swift in Sources */, + 6115A9FA0A489CE1476B2F524028E0E5 /* RDEPUBCFIParser.swift in Sources */, + 24B8A2876EFBF98BE592BA30F243E027 /* RDEPUBCFIPath.swift in Sources */, + 45AEBF466DD0EA1130E3D64A8FC80612 /* RDEPUBCFIRange.swift in Sources */, + AE7E76D8301E55488BFA1CF40D0B1990 /* RDEPUBCFIRecoveryEngine.swift in Sources */, + 44B6E32953282F781A5D5ECC8BF8EC1C /* RDEPUBCFIResolver.swift in Sources */, + 640909B07D40D27700CCAE2ACD0ACF4E /* RDEPUBCFISerializer.swift in Sources */, + 52465038F8651BB09BC9F445EFE64FD3 /* RDEPUBCFITextAssertion.swift in Sources */, + 38D45D8BED0B49F0E0FD6667D86805DE /* RDEPUBCFIUtilities.swift in Sources */, + 1AB9937A5882EC596522387625E02C72 /* RDEPUBChapterCacheKey.swift in Sources */, + 3034A9A7C9993A9ACEAE079DB7C159E4 /* RDEPUBChapterData.swift in Sources */, + BA7A1E4027881F2B50F8301696865452 /* RDEPUBChapterDataCache.swift in Sources */, + 36FD94BC47225F46F04D40DD4D97514B /* RDEPUBChapterLoader.swift in Sources */, + DA4D0BF0FDEBBCF68DC7D6C554951F46 /* RDEPUBChapterLocation.swift in Sources */, + 2D1270A235659EAB7D0CDF39B8327963 /* RDEPUBChapterOffsetMap.swift in Sources */, + C37966071017032F0C1FC81FF8244972 /* RDEPUBChapterPageCounter.swift in Sources */, + C3FE7E6D008BF43BC6111D39C2C4C861 /* RDEPUBChapterRuntimeStore.swift in Sources */, + 807780DB924306E4C1B28784712E45D9 /* RDEPUBChapterSummaryDiskCache.swift in Sources */, + 54AE224FF7E59A32A75151324762B076 /* RDEPUBChapterTailNormalizer.swift in Sources */, + 3D54BF064199B24E96A4E00D7A654106 /* RDEPUBChapterWarmupOrchestrator.swift in Sources */, + 983285394453A8129F8E3E2E231B12E5 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */, + BB81FE0BBBCEFAF8A7631E7E34874035 /* RDEPUBCSSCompatibilityLayer.swift in Sources */, + 8EBDD8FF39B5DF1B9ECCEEBD333F374C /* RDEPUBDarkImageAdjuster.swift in Sources */, + EAD57CBB41E96A1BF02C7BAF39845FD0 /* RDEPUBDTCoreTextRenderer.swift in Sources */, + CCDC8842EA30D3F77DD6F88CE1A1849D /* RDEPUBFixedLayoutTemplate.swift in Sources */, + 0B287B2D40A4B263DA9529292BEF9F33 /* RDEPUBFontFallbackResolver.swift in Sources */, + B494EB2836A86D7127501F43DC0CAAEA /* RDEPUBFontNormalizer.swift in Sources */, + 5E6091E20FD3C08AC4BB3DE2C3A299DF /* RDEPUBFragmentMarkerInjector.swift in Sources */, + BE7298B71BD3A291423F7E5B9B1BF52A /* RDEPUBHTMLNormalizer.swift in Sources */, + 360DDB3135C7FD47D373DB988C539CCB /* RDEPUBImageViewController.swift in Sources */, + 45B59D63934EC6A1131DC2270A71DA24 /* RDEPUBImageViewerCoordinator.swift in Sources */, + C01D5DBB466B51C42C269491BFA65838 /* RDEPUBJavaScriptBridge.swift in Sources */, + 3799DDD203E5B4ACD6DC478CC0153CF0 /* RDEPUBJumpSession.swift in Sources */, + 7C34DD458035EC0B9413A83E4C363624 /* RDEPUBMetadataParseCancellationController.swift in Sources */, + C883511DEB54DA7D80409A7C3B60896D /* RDEPUBMetadataParseWorker.swift in Sources */, + 9492443553B7CD522F54CAC8167D8058 /* RDEPUBModels.swift in Sources */, + 80A5F47A61B2CE58811FBA9EA4EEAE6E /* RDEPUBNavigatorLayoutContext.swift in Sources */, + A3A9D6374488C6608ADF437FFECDB17B /* RDEPUBNoteDetector.swift in Sources */, + 418BA261DBB5B3CBCEA84B21192BE5EA /* RDEPUBNoteModels.swift in Sources */, + B5CE97B23B3C54DD7BF5B08002A60B71 /* RDEPUBNotePopupCoordinator.swift in Sources */, + 2BDEC97E2DDF4218FDD5DFF1F1DC16F2 /* RDEPUBNotePopupViewController.swift in Sources */, + 90C8F1B2156343A41987386589DA591C /* RDEPUBNoteResolver.swift in Sources */, + B85D036F0AAB424992C26B037799148A /* RDEPUBPageBreakPolicy.swift in Sources */, + 66ABF5306138D4C39A4B521ECD2B1386 /* RDEPUBPageCountCache.swift in Sources */, + DA2B1C25CEFDE2A9962BBC9F853D7E34 /* RDEPUBPageInteractionController.swift in Sources */, + 5E7ED02087D9553656C56D64CF23291D /* RDEPUBPageLayoutSnapshot.swift in Sources */, + 3F4489815030D85B098664869FD06D00 /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */, + 24C5169AB172176FCBF41CD84724782C /* RDEPUBPageResolver.swift in Sources */, + 5F9F2080B7F3468C9E9BC2EC43A036D3 /* RDEPUBPaginationCacheCoordinator.swift in Sources */, + B3EA920CB255EE8B43C5A51D68F00869 /* RDEPUBPaginationModels.swift in Sources */, + AD328CC506B6184BE8C4E9FA7914E039 /* RDEPUBPaginator.swift in Sources */, + D60B799B41BE4B575A3C4CCEB4FAB0FF /* RDEPUBParser.swift in Sources */, + B64B2F42273B15382F3E5A97B55148EA /* RDEPUBParser+Archive.swift in Sources */, + 69BF25DA82C771108676AB97973A545E /* RDEPUBParser+Package.swift in Sources */, + 5EDC7E764198A5BD8E4F93662E72B40C /* RDEPUBParser+ReadingProfile.swift in Sources */, + 7E5503757330B3AAEDD0BF3A966B9A0E /* RDEPUBParser+Resources.swift in Sources */, + A68D4A2382460F426465EDDAF8EBB1F8 /* RDEPUBParser+TOC.swift in Sources */, + 61563CE4742FACF31146E47D46A558D0 /* RDEPUBPreferences.swift in Sources */, + 416916BBDD8A2F9D3FB0E05F07B6B9EF /* RDEPUBPresentationRuntime.swift in Sources */, + 75F99FA499756ED1A681052EC2445DC6 /* RDEPUBPublication.swift in Sources */, + 13E0E60D1E91FE73DA3C19EFA23EF59D /* RDEPUBReaderAnnotationCoordinator.swift in Sources */, + 85CAB9A77555702AFF3AD8D0842585F7 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */, + E575E69F9286412E8ED2D26A367C5993 /* RDEPUBReaderBottomToolView.swift in Sources */, + 06B91127429E64FE098A50E0549E9B62 /* RDEPUBReaderChapterListController.swift in Sources */, + 49DBA3BF291BE1AA349C439DE6E74ED7 /* RDEPUBReaderChromeCoordinator.swift in Sources */, + F1C2AEADA00E8EB7EBFE3AE1B3D75CC1 /* RDEPUBReaderConfiguration.swift in Sources */, + E74119D71F7BA53C6ED117180A9B7C76 /* RDEPUBReaderContext.swift in Sources */, + 4E8F3FE99F2F7CE831ACB4244ADF381C /* RDEPUBReaderController.swift in Sources */, + 5FAE9F6E6EE4A8A8C8547059FC5EC13A /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */, + 568A0B72299CDAF86374403711F57669 /* RDEPUBReaderController+ContentDelegates.swift in Sources */, + AB96076F48CD56721F47B5D8CD68B870 /* RDEPUBReaderController+DataSource.swift in Sources */, + F19DCC1F1A6D50AAAE2CDB35DC9328BF /* RDEPUBReaderController+ExternalLinks.swift in Sources */, + AC51EB535FBB37484F8A3BA23CBD41DD /* RDEPUBReaderController+LocationResolution.swift in Sources */, + 02E00A11A960FFC1CF719FF107A97A56 /* RDEPUBReaderController+PublicAPI.swift in Sources */, + F388DEF5AC1D6F6267025046B37645A7 /* RDEPUBReaderController+RenderSupport.swift in Sources */, + 3DA2135F0842C596563E610AC1B162B3 /* RDEPUBReaderController+RuntimeBridge.swift in Sources */, + AC4426FAED5C421324BB8940BD528EE8 /* RDEPUBReaderController+TableOfContents.swift in Sources */, + 46AD9CE8A6300737D0DE3750BE12E55D /* RDEPUBReaderDelegate.swift in Sources */, + F54455C0ECA25680B1A0D16909BA0907 /* RDEPUBReaderDependencies.swift in Sources */, + CD98679C55356A6F98EFE3ABD712C514 /* RDEPUBReaderEnvironment.swift in Sources */, + 2FD40BB5079CB1F7FDED414B9F0CD770 /* RDEPUBReaderHighlightsViewController.swift in Sources */, + 9A1B43DFB3162F43E83DD398EE07D031 /* RDEPUBReaderLoadCoordinator.swift in Sources */, + A1BD7803BE40F71EF65DC8FE3C1487CB /* RDEPUBReaderLocationCoordinator.swift in Sources */, + D62F0FFD57165636F2C5E74D2550604E /* RDEPUBReaderPaginationCoordinator.swift in Sources */, + E7BF39112456E5806CBFA1D998740944 /* RDEPUBReaderPersistence.swift in Sources */, + 709C4BA2B6C35035434CD7A41C050A9A /* RDEPUBReaderRuntime.swift in Sources */, + 9D381AA072A4C03E3B554FA7925940FF /* RDEPUBReaderSearchBarView.swift in Sources */, + 6090E5E9EDF9213F6AAE38EFAD608B89 /* RDEPUBReaderSearchCoordinator.swift in Sources */, + 5935C35EB75A5FD5C0B8D288B7ED2418 /* RDEPUBReaderServices.swift in Sources */, + 02A298783B59EBF1DA7E6734E86384BC /* RDEPUBReaderSettings.swift in Sources */, + 2925F96E721F741F60C0D2B5AECDBED3 /* RDEPUBReaderSettingsViewController.swift in Sources */, + EC832377DBB2E3443B37165DDDD9F9D6 /* RDEPUBReaderState.swift in Sources */, + 0A5BECD47E7FF9EA5C92717197F50DD0 /* RDEPUBReaderTableOfContentsItem.swift in Sources */, + 4419BDA1F006E749CA40A99C1E6CEDFF /* RDEPUBReaderTheme.swift in Sources */, + 5CE8BD1A9C7FE28802CD9409E4282D5F /* RDEPUBReaderToolView.swift in Sources */, + 918384360781B784B0A347C5213C7166 /* RDEPUBReaderTopToolView.swift in Sources */, + A5DE70F19A97D8C9445781764D944031 /* RDEPUBReaderUIState.swift in Sources */, + 86130B323946B0228B860A4302D18B41 /* RDEPUBReaderViewportMonitor.swift in Sources */, + 08711CEABB218DF984EA628D9B08BA47 /* RDEPUBReadingLocationModels.swift in Sources */, + 6A9D50C84AE349AF8E4D6E27DF651FE2 /* RDEPUBReadingSession.swift in Sources */, + 37DD0E5A1E4470E7DC30934C28EFBC65 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */, + DC5237C283BD4408F2E478D6C4FEA6B2 /* RDEPUBRenderRequest.swift in Sources */, + BB2A7A05D4D4017BD37A1EB4528182EF /* RDEPUBResourceResolver.swift in Sources */, + E7160A3E14A6F4EF789C499852B0EC6A /* RDEPUBResourceURLSchemeHandler.swift in Sources */, + 26073F7564244C7DDBD20B7A99849F21 /* RDEPUBRuntimeChapter.swift in Sources */, + 15F821001C70BC0400B5E85BC445A048 /* RDEPUBRuntimePageCount.swift in Sources */, + 66BECA8D265426E7C9B47833EBA79D55 /* RDEPUBSearchEngine.swift in Sources */, + 4B3799CED66DE4CF5358AAC35D27F212 /* RDEPUBSearchModels.swift in Sources */, + 2B5D0753E9B3BFF6F7C695CAF9916DA3 /* RDEPUBSelectionLoupeView.swift in Sources */, + C52E92F3360BF420615A59DE950DEE16 /* RDEPUBSelectionOverlayView.swift in Sources */, + 83DF18691BCACC408ABEEC12F0B1AB3E /* RDEPUBSelectionState.swift in Sources */, + 30D40C2BD0CA2DB6C95A66EB01535DA7 /* RDEPUBSemanticMarkerInjector.swift in Sources */, + 088E349DD58B48DC5A3F210B3AA2B08E /* RDEPUBStyleCompatibilityModels.swift in Sources */, + 164D6A138BDB59AC18E7B37ED730966B /* RDEPUBStyleSheetBuilder.swift in Sources */, + 13D28951E31D694F91F1D7AAC21D42BF /* RDEPUBStyleSheetComposer.swift in Sources */, + 08EC0B2843F92A4C922EB790C33B077F /* RDEPUBTextAnchor.swift in Sources */, + 6BA40E6FA6DC4701D8156456EB5CF0ED /* RDEPUBTextAnnotationOverlay.swift in Sources */, + 303DAA818CDDA98AF92E4FBF2A732B8A /* RDEPUBTextBookBuilder.swift in Sources */, + 6CD9816C0995369B167186FF189B7575 /* RDEPUBTextBookCache.swift in Sources */, + EC88499170030571BD9326F9EB05204C /* RDEPUBTextBookModels.swift in Sources */, + C4766E69557D560A763EC5BB6A4C2A41 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */, + 6B577F035D0593AA9E0BF092E752E7D9 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */, + 8E2679367E3A543EDEC5A518D23EB92E /* RDEPUBTextContentView.swift in Sources */, + 2DF9FD4220363B628D1C492D280B21F7 /* RDEPUBTextIndexTable.swift in Sources */, + DE3BF24CA186AAA2CC673A2BADE2AFA1 /* RDEPUBTextLayouter.swift in Sources */, + D0500D64054753A876D60373E284FD28 /* RDEPUBTextLayoutFrame.swift in Sources */, + 32003AEED9194998E4CE19D8655A1CA9 /* RDEPUBTextPageDecorationView.swift in Sources */, + 2136CAFEBA602E1F1D9AE43D901686B6 /* RDEPUBTextPageRenderView.swift in Sources */, + AF6AC3DDB170B49DC3F06E9914DCCED8 /* RDEPUBTextPaginationInterfaces.swift in Sources */, + B3B9497580D0189374A08C3A349F5230 /* RDEPUBTextPaginationSupport.swift in Sources */, + 7CA5624AA51A18C916104986509C592C /* RDEPUBTextPerformanceSampler.swift in Sources */, + 7A2DDB5D730FCA75152369EFCEE390B1 /* RDEPUBTextPositionConverter.swift in Sources */, + C93C8998F0A29B91C91C7E5C43C564BF /* RDEPUBTextRenderer.swift in Sources */, + 84A49180E4E633858662A7B72A501BB6 /* RDEPUBTextRendererSupport.swift in Sources */, + E42412F34F904022FAD5ED27F09BC3D2 /* RDEPUBTextSearchEngine.swift in Sources */, + 334A13941CD393644146CF756B266584 /* RDEPUBTextSelectionController.swift in Sources */, + 855D697E9DC5C605D6178EA976B05E97 /* RDEPUBTypesettingPipeline.swift in Sources */, + 1F2EA31B0B1121ED145A815C6116F9B7 /* RDEPUBViewportTypes.swift in Sources */, + E9ACCCDF0303E912403C573C32CCC86B /* RDEPUBWebContentView.swift in Sources */, + 3B49170468F853F1664D619454E612F4 /* RDEPUBWebDecorationOverlayView.swift in Sources */, + D650EC467B29EB175C9588C57079205A /* RDEPUBWebView.swift in Sources */, + 6387DFB2BFA51419C2B108337303C3BF /* RDEPUBWebView+Configuration.swift in Sources */, + 1BE1C10942015A97018CA403574B5F97 /* RDEPUBWebView+FixedLayout.swift in Sources */, + FF2AF67ED01DD3C78822AF567FC64051 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, + 527BD4D564B72BED5FF27088B1078D9D /* RDEPUBWebView+Reflowable.swift in Sources */, + 4BC10B95FF401CE4B81EB29E08A14C85 /* RDEPUBWebView+Search.swift in Sources */, + C263E5368A76EC4E43AF7EE9E067D725 /* RDEPUBWebViewDebug.swift in Sources */, + 4EF862E8A01AC4423C7A684BADFEECBB /* RDPlainTextBookBuilder.swift in Sources */, + AB700CDBB85072A2E9F40018E1ECDB00 /* RDReaderContentCell.swift in Sources */, + 5A041AAE66088AD15755C6C5BA152E2F /* RDReaderFlowLayout.swift in Sources */, + D87E35AEA840419649DB90B3A656E758 /* RDReaderGestureController.swift in Sources */, + C1EC1F4D33F9FA969CB9513D933443E2 /* RDReaderPageChildViewController.swift in Sources */, + 70AF1621102FFF12F7DA88DDD8254054 /* RDReaderPagingController.swift in Sources */, + C7F3140CE021BAD613B8F941F859A64E /* RDReaderPreloadController.swift in Sources */, + E2A039DEE00E19644C9723F195BF80EC /* RDReaderSpreadResolver.swift in Sources */, + 63C748495E15AFA55CFECE60EA39DE3A /* RDReaderTapRegionHandler.swift in Sources */, + 6D0848863B29EC8AF0BCD7D30013C8AA /* RDReaderView.swift in Sources */, + 1B7C6AEE9BE9547FDA5301683625CC1D /* RDReaderView+CollectionView.swift in Sources */, + 4243E07D3DE0A37254A56F24C60139A3 /* RDReaderView+ContentAccess.swift in Sources */, + 1B2F48EC9DE304484E8DD123EC028E9D /* RDReaderView+PageCurl.swift in Sources */, + 96F613CFCEA008628E950E6844EAFCE6 /* RDReaderView+ToolView.swift in Sources */, + 8777BFC6890E10C885F3D5CB9779B6C3 /* RDReaderView-dummy.m in Sources */, + C9366A21A153894FCC5898ABAA1BC673 /* RDReaderViewProtocols.swift in Sources */, + 1C2E78B721E91C8CA0427004A6B5CADF /* RDURLReaderController.swift in Sources */, + B82276ED843A24848B1F0AE805583492 /* String+RDEPUB.swift in Sources */, + 04A447AC67CE557F0D6535CCAA7E672A /* UIColor+RDEPUB.swift in Sources */, + 0C73693788D2965F6E5D255519E050B9 /* UIColor+RDEPUBHex.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AF09D5A5B57E781D29EB3CD22A1DE186 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7408D293C24C3BD9CBBCBB530B50938B /* Pods-ReadViewDemo-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BB54F05FF8C1D6F2A6158AE351D7E19C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B62C7195C031CD59BF3BFCAB531791C2 /* Archive.swift in Sources */, + 53D8722E9B869009D27AC6E0ACBAB6BA /* Archive+BackingConfiguration.swift in Sources */, + 0C1FE3FEF711D728FDFF14CF277B2E4E /* Archive+Deprecated.swift in Sources */, + 60AE4530CADCF5D851EFB088FD1CC32B /* Archive+Helpers.swift in Sources */, + 78AF9AA3502FD29F501DDF8986B67578 /* Archive+MemoryFile.swift in Sources */, + DC43DD003EAA9A027363E201898A4C54 /* Archive+Progress.swift in Sources */, + 4BEF7F1D48D5407BA2CCADEDBD0933BA /* Archive+Reading.swift in Sources */, + 045ECA6DF954F21A52A3A318CB0A959A /* Archive+ReadingDeprecated.swift in Sources */, + C0DFE2AA259BE82AA47339B21CDFC958 /* Archive+Writing.swift in Sources */, + 8413070AC439CC5F8EEB0E56D762B968 /* Archive+WritingDeprecated.swift in Sources */, + 221B98812070AB1112E255528B64EDBA /* Archive+ZIP64.swift in Sources */, + 64B9E0A8AD351336BCFAEEE49A596BC5 /* Data+Compression.swift in Sources */, + 46D92965B81BEDB4DBD7FA6050448D0A /* Data+CompressionDeprecated.swift in Sources */, + CC24C5C5E758475B1A32E952B508824B /* Data+Serialization.swift in Sources */, + 4F363B073676BB21128E5BAF85D05EE8 /* Date+ZIP.swift in Sources */, + 0C7FEDFB0E8C8C55F63378C60C4208FA /* Entry.swift in Sources */, + 8D4499E5E0E1C3E85EB14B5A6603900A /* Entry+Serialization.swift in Sources */, + CCC0BA8885804092995A8C2F0A719E36 /* Entry+ZIP64.swift in Sources */, + 08C9C48A7BD681F075086F7E53660F69 /* FileManager+ZIP.swift in Sources */, + 2CE58BC822323243DA3DB3FD583F7E31 /* FileManager+ZIPDeprecated.swift in Sources */, + 5AE0C11BD819CF2A3C11CFC802DE0C06 /* URL+ZIP.swift in Sources */, + 9714230EA35DBAC275C9C8B030D4004E /* ZIPFoundation-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F5FD889341D3D1DCCA58EA12D78CF9E8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3071,186 +2623,93 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - FC10E832A2E014898EC28BFEF85842F5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FE95AEAB6389AEE07DF7CD0D22860983 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CF9676D97EB35D85E8982BA0B31922CC /* SSAlertAnimation.swift in Sources */, - 255C0D1CD0B98AF28752B5477E33E56C /* SSAlertAnimationController.swift in Sources */, - 090F57E692EEA5A8B0FF67920032C543 /* SSAlertCommonView.swift in Sources */, - 5E1420A9BFA59300AAA3F5ADC85B651A /* SSAlertDefaultAnmation.swift in Sources */, - 2E9A526389D5AED82CEECF4A40CAD66A /* SSAlertPresentAnimation.swift in Sources */, - DD909F2C768FC2BE36DA19EB9A2E9630 /* SSAlertSwift-dummy.m in Sources */, - 72E212C2DAC151323027585C8DD020B5 /* SSAlertView.swift in Sources */, - FC2603B7B764AACD1C0BFA66BFC597B2 /* SSAlertViewExtention.swift in Sources */, - B838F1859B7D755B45253F6D3F8A29DA /* UIViewFrameExtension.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 05CE4FE9872739B4C815A7EF2478D2A8 /* PBXTargetDependency */ = { + 19D46876B89FB1A6965AA89784447800 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SSAlertSwift; - target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; - targetProxy = D3E98DD4790BB372C0E5F91F8321F7DE /* PBXContainerItemProxy */; + name = DTFoundation; + target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; + targetProxy = A392AC630ADF96D856B6EEBAAD3FFB9D /* PBXContainerItemProxy */; }; - 0ACC6A1B934384D248550F31995477C3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "DTCoreText-Resources"; - target = 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */; - targetProxy = FED8F0022C504C26192D989340E637E7 /* PBXContainerItemProxy */; - }; - 0CA0593E3860B08AD087CD14D2EDA869 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "ZIPFoundation-ZIPFoundation_Privacy"; - target = C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */; - targetProxy = 672E86FACF832D60405977714EFBB3A4 /* PBXContainerItemProxy */; - }; - 135CCBF62F02544774EBD62971FFA7BF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = CE2FD9FBF5539D25AFA1E7A15E4C86E4 /* PBXContainerItemProxy */; - }; - 2B6415BE84BD798D27F9428CC5D3B68C /* PBXTargetDependency */ = { + 299D0A928127A948539B11F0E0B15456 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = RDReaderView; target = AA2E57587AA8EECA63C4BE08EA3CB6D2 /* RDReaderView */; - targetProxy = B8B574023C6A5A8EB40C86AC78E6E104 /* PBXContainerItemProxy */; + targetProxy = 618E065085B263D2E1799C600289EB6E /* PBXContainerItemProxy */; }; - 5423625E8450816B30A8475F01E8AAFF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZIPFoundation; - target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = 6642083DC898BC7F864CCCA3293ECEE0 /* PBXContainerItemProxy */; - }; - 5555F6F21ADFD0EBE205EF667713FB4E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapKit; - target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = 04FFC401B252E7BCD021482951CB6BF1 /* PBXContainerItemProxy */; - }; - 70839219DD5C745549587E2185086ABB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "SnapKit-SnapKit_Privacy"; - target = 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */; - targetProxy = 3E6D8EDF5498446099B387DD9BB81D95 /* PBXContainerItemProxy */; - }; - A15C9621FEB9E916A0F697C7CD3B4540 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = 6A1037ABDFA57F93BA3EEA2239EF8BD4 /* PBXContainerItemProxy */; - }; - B431640511BC4589F59EE4103D234874 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SSAlertSwift; - target = 8619D5ADECF2B26CFD9A9826D61D289A /* SSAlertSwift */; - targetProxy = 22BB1F120B8BE2CDBECB11ED2A9C4EFB /* PBXContainerItemProxy */; - }; - C50AEE3EDC2E805057072F84F96232C3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTFoundation; - target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = 544B5AD60561B80F8F55BB1203814841 /* PBXContainerItemProxy */; - }; - CC4284E96A8A43831A29D84D6DA599D3 /* PBXTargetDependency */ = { + 2C9655F6B4C89F32E587FAF115EE03CC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "RDReaderView-RDReaderViewAssets"; target = AE7F393FB7805DE2664AB4111873F907 /* RDReaderView-RDReaderViewAssets */; - targetProxy = 834DE8DAF657C6E3C86813C528C3AF5A /* PBXContainerItemProxy */; + targetProxy = 4C44EA9D067E5F15FC4C82C5DCEFF85E /* PBXContainerItemProxy */; }; - E07882A0DC0DED8B43811D8AE79B7757 /* PBXTargetDependency */ = { + 44A8C88A6520712D971ECCF7DB5E0E91 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ZIPFoundation; target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = 29E236F5FC2EAE3DC8E25AE4B11C749B /* PBXContainerItemProxy */; + targetProxy = 95D435994BF2E09ED48E93B3EA046E5D /* PBXContainerItemProxy */; }; - F2207952E96E8659148FCB854A8B2E67 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapKit; - target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = CBC99AD96DBA1A12A5A3D7EBD99EA30B /* PBXContainerItemProxy */; - }; - FF7A1364D5F46BB26DD0C620A2AE9992 /* PBXTargetDependency */ = { + B3C1D0229D855B8FC4690EBB7A414FB4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = DTFoundation; target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = 417F80B067DF93DCD6E6ED0DCC7BDE0B /* PBXContainerItemProxy */; + targetProxy = 077B82F75DD704BB3F3D60FB9454BDD5 /* PBXContainerItemProxy */; + }; + BA8CD293AA300B9562123D41D99696A6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 782CA4FFE40915340FFE27E8241A14BF /* PBXContainerItemProxy */; + }; + BC0C832BFCF4B79EDEB1C3C754A7C7D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ZIPFoundation; + target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; + targetProxy = A5D83DA5C53D3731426918AC75105BE3 /* PBXContainerItemProxy */; + }; + C5C00D86AEC14371CD6BAB279ABDA2DA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 7E334ACAA496278856830A5E289D889E /* PBXContainerItemProxy */; + }; + D95FDC45550F21721EF8EB81A91A8851 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "ZIPFoundation-ZIPFoundation_Privacy"; + target = C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */; + targetProxy = 9FCD52B645EFFA5837720169D29D5E80 /* PBXContainerItemProxy */; + }; + E3A26D30EFCE6A679CA0B908152DAC48 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "DTCoreText-Resources"; + target = 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */; + targetProxy = 0D040B1696E237AC90129FBF5F045668 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0BEE6AD7401BF34E911D373B3BAB8F69 /* Debug */ = { + 15FF297429104A191E653936DE4614E2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9F8BA45FA0D8E3CBAAE6E18272EB0644 /* RDReaderView.debug.xcconfig */; + baseConfigurationReference = 7A13F9221A300A89F9F8D0A2AB1794BF /* DTCoreText.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = RDReaderView; - INFOPLIST_FILE = "Target Support Files/RDReaderView/ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; + IBSC_MODULE = DTCoreText; + INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = RDReaderViewAssets; + PRODUCT_NAME = Resources; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Debug; - }; - 0D652336EA69645906E67630E35F3EA9 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; - PRODUCT_MODULE_NAME = ZIPFoundation; - PRODUCT_NAME = ZIPFoundation; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; name = Release; }; - 0FAC9B086846BEC73DD79CD3B21F22ED /* Release */ = { + 1DBA69CFBAB5965CF41704A7A4699A8A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */; + baseConfigurationReference = 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -3282,15 +2741,14 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 1BDD9222409B330FFE1145B235F8D646 /* Release */ = { + 2524D81FD8B66F8F5BB1E875FAF2C3FF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DF670EC438F05ACC1F1C7B725DBDAA18 /* DTFoundation.release.xcconfig */; + baseConfigurationReference = 7503926237A4785CCB864B2BCD1F4C2B /* DTFoundation.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3328,9 +2786,27 @@ }; name = Release; }; - 3A6E30E7BE8B292FCF7502BDC0B4356E /* Debug */ = { + 388ABD240C101381EFBFFDFFB8E71CFB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; + baseConfigurationReference = 766227355308600EFC048F797274454A /* ZIPFoundation.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IBSC_MODULE = ZIPFoundation; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + PRODUCT_NAME = ZIPFoundation_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 38F26975406F3306CA386A6895730D0A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 79D13938A04579CD1E9E042A39CC4D86 /* ZIPFoundation.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; @@ -3409,9 +2885,9 @@ }; name = Release; }; - 44EFAF28815AE3B0D8BE985EF5C52165 /* Release */ = { + 5143437B47FD89476FCD808982490792 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 55CA6158EBEFCD459EB481660A12EB86 /* RDReaderView.release.xcconfig */; + baseConfigurationReference = 78EB9889508A20E866AC37B22D441FC4 /* RDReaderView.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; @@ -3427,49 +2903,9 @@ }; name = Release; }; - 603301BC85E2C8F97FC067AD66D9C366 /* Release */ = { + 62FCE98EDB06FB15524D313F85827664 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap"; - PRODUCT_MODULE_NAME = SnapKit; - PRODUCT_NAME = SnapKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 64D7D63248B7B88072F9B834889C7A84 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4BEC60CB3EDA1C189D3B062E29217440 /* ZIPFoundation.debug.xcconfig */; + baseConfigurationReference = 79D13938A04579CD1E9E042A39CC4D86 /* ZIPFoundation.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3506,56 +2942,17 @@ }; name = Debug; }; - 73BBB08AD96AC1A6A095E15ADC5FCEE1 /* Debug */ = { + 67C81F4D0EE1C713345A96B80FF6AF41 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 8B867F93D82C156FA151686A151B02EA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */; + baseConfigurationReference = 38EFC4374585F70CA0057C2B93243BDB /* RDReaderView.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDReaderView"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = DTCoreText; - INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; + IBSC_MODULE = RDReaderView; + INFOPLIST_FILE = "Target Support Files/RDReaderView/ResourceBundle-RDReaderViewAssets-RDReaderView-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = Resources; + PRODUCT_NAME = RDReaderViewAssets; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -3563,9 +2960,9 @@ }; name = Debug; }; - 9302285829D4222700BDCBC1674D80DB /* Release */ = { + 818CFB0EE79845F4608AF6AE4E2F2CA7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 55CA6158EBEFCD459EB481660A12EB86 /* RDReaderView.release.xcconfig */; + baseConfigurationReference = 38EFC4374585F70CA0057C2B93243BDB /* RDReaderView.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3597,15 +2994,14 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.10; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 95AC82A5A1F8F461F1931C7EE44591CF /* Debug */ = { + 86DD9513441B4DC038FABDEA3F15E324 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6014DA7213E4687224F2BF921E30002C /* DTFoundation.debug.xcconfig */; + baseConfigurationReference = 766227355308600EFC048F797274454A /* ZIPFoundation.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3618,9 +3014,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -3628,23 +3024,24 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; - PRODUCT_MODULE_NAME = DTFoundation; - PRODUCT_NAME = DTFoundation; + MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; + PRODUCT_MODULE_NAME = ZIPFoundation; + PRODUCT_NAME = ZIPFoundation; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 9FA854C1CBB94CA8A7D021112E99FAAD /* Release */ = { + 950B7FB12FFF341A15D16DF57974FDEF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */; + baseConfigurationReference = C0DCB00F0B62D7DBE628D2B5FF006E93 /* DTCoreText.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; @@ -3658,7 +3055,7 @@ TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Release; + name = Debug; }; A0DC1C2C814704734F83EAB35BB20B21 /* Debug */ = { isa = XCBuildConfiguration; @@ -3729,7 +3126,7 @@ }; A1F5B44E8E7C59A962189D14989BCAFF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C2840BE6D91479CCBC2E908FBD9DA183 /* DTCoreText.release.xcconfig */; + baseConfigurationReference = 7A13F9221A300A89F9F8D0A2AB1794BF /* DTCoreText.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3769,7 +3166,7 @@ }; A843E21C1B95C92BE904EB3F8115DD30 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 78873FAFC0AD9E930D6050A7F976714B /* DTCoreText.debug.xcconfig */; + baseConfigurationReference = C0DCB00F0B62D7DBE628D2B5FF006E93 /* DTCoreText.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3806,45 +3203,9 @@ }; name = Debug; }; - B3DEB407BA8C034F4F21D89FF4182F50 /* Debug */ = { + B67B5F10B54A8C30229274A6F866A131 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = SnapKit_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - B512D1AE8EFFB2D4FC7CA54D4ECE4DCB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53D2AB2348A9B9C582FDC2CDB2E434FC /* SnapKit.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = SnapKit_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - BF63D3DB86F9631AE61E1C6251395788 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C960B7AA0B9B8CC473FACFEC64F9906D /* SnapKit.debug.xcconfig */; + baseConfigurationReference = 85E8DA9DE1F796F12171763D20CBAF27 /* DTFoundation.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3857,9 +3218,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist"; + INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -3867,9 +3228,9 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap"; - PRODUCT_MODULE_NAME = SnapKit; - PRODUCT_NAME = SnapKit; + MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; + PRODUCT_MODULE_NAME = DTFoundation; + PRODUCT_NAME = DTFoundation; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -3881,10 +3242,12 @@ }; name = Debug; }; - D085D866F9D833BB5CA078D4AF7DD793 /* Release */ = { + C9A3C41671C64664CEDC2482C0D7591C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FE2991699D0391172DEADF2F4613E320 /* SSAlertSwift.release.xcconfig */; + baseConfigurationReference = 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -3895,9 +3258,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.6; LD_RUNPATH_SEARCH_PATHS = ( @@ -3905,14 +3266,15 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift.modulemap"; - PRODUCT_MODULE_NAME = SSAlertSwift; - PRODUCT_NAME = SSAlertSwift; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -3920,65 +3282,9 @@ }; name = Release; }; - D095725E14566EE767978A7BC08F407F /* Debug */ = { + E35F568DB5034B527C776EA84F168BAC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 18387159515E0523AFB4204B1AF940ED /* SSAlertSwift.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SSAlertSwift/SSAlertSwift.modulemap"; - PRODUCT_MODULE_NAME = SSAlertSwift; - PRODUCT_NAME = SSAlertSwift; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - E89F4F77CC27B0B9E5F866BA8F1ABFA6 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F699881ABDBEB419AEBA661AD5A21F35 /* ZIPFoundation.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = ZIPFoundation; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.6; - PRODUCT_NAME = ZIPFoundation_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - F9A9014E4CEF388283EBA8FE47E86A4E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F8BA45FA0D8E3CBAAE6E18272EB0644 /* RDReaderView.debug.xcconfig */; + baseConfigurationReference = 78EB9889508A20E866AC37B22D441FC4 /* RDReaderView.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -4010,10 +3316,11 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.10; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; /* End XCBuildConfiguration section */ @@ -4027,29 +3334,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 43899D66EDA58F53D3766F46D93C4EC3 /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { + 106179E41DCBAFB020B0B998D50116F5 /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { isa = XCConfigurationList; buildConfigurations = ( - 95AC82A5A1F8F461F1931C7EE44591CF /* Debug */, - 1BDD9222409B330FFE1145B235F8D646 /* Release */, + B67B5F10B54A8C30229274A6F866A131 /* Debug */, + 2524D81FD8B66F8F5BB1E875FAF2C3FF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 442D0A561D1A27F605362B5185B9866A /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { + 3B41B7BCC37E0C0C09134B3AF4F26DF5 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3A6E30E7BE8B292FCF7502BDC0B4356E /* Debug */, - E89F4F77CC27B0B9E5F866BA8F1ABFA6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 443B884E65FAE484ACCBE366E916F115 /* Build configuration list for PBXNativeTarget "SnapKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BF63D3DB86F9631AE61E1C6251395788 /* Debug */, - 603301BC85E2C8F97FC067AD66D9C366 /* Release */, + 62FCE98EDB06FB15524D313F85827664 /* Debug */, + 86DD9513441B4DC038FABDEA3F15E324 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4063,65 +3361,47 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 657380B0395B73E23E564C39924CCB23 /* Build configuration list for PBXNativeTarget "RDReaderView" */ = { + 7AB227059EC1F8C7E624C1F5E7CAF900 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { isa = XCConfigurationList; buildConfigurations = ( - F9A9014E4CEF388283EBA8FE47E86A4E /* Debug */, - 9302285829D4222700BDCBC1674D80DB /* Release */, + 38F26975406F3306CA386A6895730D0A /* Debug */, + 388ABD240C101381EFBFFDFFB8E71CFB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7031824EF6D3A2ABDDDAB4A47F8B7092 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */ = { + 969FEC0B2FA67E4DE3E10F5E98CF39C6 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0BEE6AD7401BF34E911D373B3BAB8F69 /* Debug */, - 44EFAF28815AE3B0D8BE985EF5C52165 /* Release */, + 1DBA69CFBAB5965CF41704A7A4699A8A /* Debug */, + C9A3C41671C64664CEDC2482C0D7591C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 78AC23F3D0C09D48F14375E47BC46FA9 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { + E678DBCAC7A96683BD91570AD2C81DB3 /* Build configuration list for PBXNativeTarget "RDReaderView-RDReaderViewAssets" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8B867F93D82C156FA151686A151B02EA /* Debug */, - 9FA854C1CBB94CA8A7D021112E99FAAD /* Release */, + 67C81F4D0EE1C713345A96B80FF6AF41 /* Debug */, + 5143437B47FD89476FCD808982490792 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D2130827DFC56C5DB08AE4C102BD7959 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */ = { + E81710E3CF86077AD189173E6889CC82 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { isa = XCConfigurationList; buildConfigurations = ( - 73BBB08AD96AC1A6A095E15ADC5FCEE1 /* Debug */, - 0FAC9B086846BEC73DD79CD3B21F22ED /* Release */, + 950B7FB12FFF341A15D16DF57974FDEF /* Debug */, + 15FF297429104A191E653936DE4614E2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DA2CC49129AD3F4620303440F05AC2BE /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { + F839E10A0714CAFC9FF463B6099E2A0A /* Build configuration list for PBXNativeTarget "RDReaderView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 64D7D63248B7B88072F9B834889C7A84 /* Debug */, - 0D652336EA69645906E67630E35F3EA9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E5E7FE632631B0276CC3F3B2CAABF993 /* Build configuration list for PBXNativeTarget "SSAlertSwift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - D095725E14566EE767978A7BC08F407F /* Debug */, - D085D866F9D833BB5CA078D4AF7DD793 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FA0D8FD2632665E77D3755C64F4EFC74 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B3DEB407BA8C034F4F21D89FF4182F50 /* Debug */, - B512D1AE8EFFB2D4FC7CA54D4ECE4DCB /* Release */, + 818CFB0EE79845F4608AF6AE4E2F2CA7 /* Debug */, + E35F568DB5034B527C776EA84F168BAC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ReadViewDemo/Pods/SSAlertSwift/README.md b/ReadViewDemo/Pods/SSAlertSwift/README.md deleted file mode 100644 index 40e61bf..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# SSAlert -实际开发中经常遇到各种自定义的弹窗的需求,其中编写弹窗动画和遮罩就很繁琐,而且一个一个去写重复的代码,代码会变得更加冗余。 - -SSAlert封装了动画部分,而且支持自定义动画。可以快速构建弹窗,简单易用,基本可以满足大部分弹窗需求。自带常用自定义弹窗,类型系统的UIAlertView,UIActionSheet。 -# 特性 -- 支持OC、Swift版本 -- 支持自定义弹窗内容,可以根据弹窗内容frame布局和自动布局确定弹窗大小 -- 支持动画展示后刷新弹窗的大小 -- 支带透明、黑色、无三种背景遮罩 -- 自带从上、下、左、右、中弹出动画,动画支持弹簧效果,而且可以设置位置偏移量 -- 支持自定义动画,动画隐藏回调 -- 支持模态视图弹窗,支持拖拽隐藏 -- 自带类似系统的弹窗UIAlertView,UIActionSheet -# 效果图 - - -# 使用 - -## 1.导入代码 - -### Objective-C项目 - -1. pod 'SSAlert' -2. #import -### Swift项目 - -1. pod 'SSAlertSwift' -2. import SSAlertSwift - -## 2.SSAlertView用法 - -### SSAlertView的初始化 - -SSAlertView的初始化有两种,一种是普通弹窗,一种是模态视图弹窗,两种的区别在于,前者是弹出一个View,后者是弹窗一个UIViewController。当需要点击弹窗上按钮不关闭弹窗跳转界面时候,可以使用模态视图弹窗。 - -普通弹窗初始化: -``` - let customView = UIView() - customView.frame = CGRect(x:0,y:0,width:200,height:200) - let alertView = SSAlertView(customView: customView, onView: navigationController!.view) -``` -模态视图弹窗初始化: -``` -let customView = UIView() -customView.frame = CGRect(x:0,y:0,width:200,height:200) -let alertView = SSAlertView(customView: customView, fromViewController: self) -``` -### SSAlertView的动画设置 - -遵循 **SSAlertAnimation** 协议的自定义动画都可以设置 **SSAlertView** 的 **animation** 属性 - - **SSAlertView**自带的动画效果:**SSAlertDefaultAnmation**,提供上、下、左、右、中弹出动画等 - ``` - let animation = SSAlertDefaultAnmation(state: .fromCenter) - alertView.animation = animation - ``` -### SSAlertView的展示和隐藏 - ``` - alertView.show() - alertView.hide() - ``` -### SSAlertView的大小刷新 -``` - customView.frame = CGRect(x:0,y:0,width:400,height:400) - alertView.refreshFrame() -``` - -## 3.自带类型系统UIAlert,UIActionSheet的用法 -``` -/// -let alertView = SSAlertView.alertView(style: .alert, title: "自定义Alert弹窗", message: "自带自定义Alert弹窗,类似系统的UIAlertView", cancelButton: "Cancel", otherButtons: ["OK"], onView: navigationController!.view){ index in - print(index) - } -alertView.show() - - /// -let alertView = SSAlertView.modalAlertView(style: .actionSheet, title: "自定义ActionSheet弹窗", message: "自带自定义ActionSheet弹窗,类似系统的ActionSheet", cancelButton: "Cancel", otherButtons: ["action1", "action2", "action3", "action4"], fromViewController: self) { index in - print(index) -} -alertView.show() -``` - -## 4.自定义SSAlertCommonView -``` - let action1 = SSAlertAction(style: .actionSheet, title: "自定义Action1") { - print("自定义Action1") - } - action1.titleColor = .red - action1.backgroundColor = .yellow - action1.titleFont = UIFont.systemFont(ofSize: 18) - action1.height = 80 - - let action2 = SSAlertAction(style: .actionSheet, title: "自定义Action2") { - print("自定义Action2") - } - action2.titleColor = .yellow - action2.backgroundColor = .red - action2.titleFont = UIFont.systemFont(ofSize: 22) - action2.height = 55 - - let commonView = SSAlertCommonView(title: "自定义SSAlertCommonView", message: "文本文本文本文本文本文本", style: .actionSheet, actions: [action1, action2]) - commonView.backgroundColor = .white - let alertView = SSAlertView(customView: commonView, onView: navigationController!.view, animation: SSAlertDefaultAnmation(state: .fromBottom)) - alertView.show() -``` - -更多用法请下载代码,观看[demo](https://github.com/namesubai/SSAlert), - -觉得好用,手动点个Star❤️❤️❤️❤️ - diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimation.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimation.swift deleted file mode 100644 index 5a3d66f..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimation.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SSAlertAnimation.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation -public typealias PanProgress = CGFloat -public typealias PanCancelProgress = CGFloat -public typealias DimissIsCancel = Bool -public protocol SSAlertAnimation { - /// 动画时间 - func animationDuration() -> TimeInterval - /// 展示动画 - func showAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion:(((Bool) -> Void))?) - /// 隐藏动画 - func hideAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion:(((Bool) -> Bool))?) - /// 刷新大小动画 - func refreshAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion:(((Bool) -> Void))?) - /// 拖拽隐藏动画,当是模态视图弹窗才有 - func panToDimissTransilatePoint(point: CGPoint, panViewFrame: CGRect) -> (PanProgress, PanCancelProgress) -} - diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimationController.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimationController.swift deleted file mode 100644 index bb9901f..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertAnimationController.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// SSAlertAnimationController.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation - - -class SSAlertAnimationController: UIViewController { - var isDimiss: Bool = false - var isHideStatusBar = false { - didSet { - setNeedsStatusBarAppearanceUpdate() - } - } - var isShowNavWhenViewWillDisappear = true - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .clear - } - - override var prefersStatusBarHidden: Bool { - return isHideStatusBar - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - navigationController?.setNavigationBarHidden(true, animated: animated) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - if !isDimiss, isShowNavWhenViewWillDisappear { - navigationController?.setNavigationBarHidden(false, animated: animated) - } - } - - override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { - super.dismiss(animated: flag, completion: completion) - isDimiss = true - } -} - - diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertCommonView.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertCommonView.swift deleted file mode 100644 index 703134c..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertCommonView.swift +++ /dev/null @@ -1,335 +0,0 @@ -// -// SSAlertCommonView.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation - -public extension SSAlertAction { - enum Style { - case alert - case actionSheet - } -} - - -public class SSAlertAction: NSObject { - public var title: String - public var titleFont = UIFont.systemFont(ofSize: 16) - public var titleColor: UIColor? = nil - public var height: CGFloat = 55 - public var backgroundColor: UIColor? = nil - public private(set) var style: Style - private var addAction:(() -> Void)? = nil - public init(style: Style, title: String, addAction: (() -> Void)? = nil) { - self.style = style - self.title = title - self.addAction = addAction - if style == .alert { - height = 50 - } - super.init() - } - func triggerAction() { - if let addAction = addAction { - addAction() - } - } -} - - - -extension SSAlertCommonView { - public static var alertMaxWidth = UIScreen.main.bounds.width * 0.7 - public static var actionSheetMaxWidth = UIScreen.main.bounds.width - public static var buttonSpace: CGFloat = 0.5 - - public static var safeAreaBottomMargin: CGFloat { - if #available(iOS 11.0, *) { - return UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 - } - return 0 - } -} - -public class SSAlertCommonView: UIView { - - public lazy var titleLabel: UILabel = { - let label = UILabel() - label.font = UIFont.systemFont(ofSize: 16) - label.numberOfLines = 0 - label.textAlignment = .center - return label - }() - - public lazy var messageLabel: UILabel = { - let label = UILabel() - label.font = UIFont.systemFont(ofSize: 14) - label.numberOfLines = 0 - label.textAlignment = .center - return label - }() - - public lazy var containerView: UIView = { - let view = UIView() - return view - }() - - public lazy var buttonView: UIView = { - let view = UIView() - return view - }() - - public var lineColor: UIColor? = nil { - didSet { - lineArray.forEach { lineView in - lineView.backgroundColor = lineColor - } - } - } - - public var lineEdgeInsets: UIEdgeInsets = .zero { - didSet { - refreshFrame() - } - } - public private(set) var style: SSAlertAction.Style - public private(set) var actions: [SSAlertAction] - public private(set) var title: String? - public private(set) var message: String? - - private var buttonArray: [UIButton] = [] - private var lineArray: [UIView] = [] - private var hasText = false - - - public init(title: String? = nil, message: String? = nil, style: SSAlertAction.Style, actions:[SSAlertAction] = []) { - self.title = title - self.message = message - self.style = style - self.actions = actions - super.init(frame: .zero) - makeUI() - } - - private func makeUI() { - addSubview(containerView) - if let title = title, !title.isEmpty { - titleLabel.text = title - containerView.addSubview(titleLabel) - hasText = true - } - if let message = message, !message.isEmpty { - messageLabel.text = message - containerView.addSubview(messageLabel) - hasText = true - } - - if actions.count > 0 { - addSubview(buttonView) - actions.forEach { action in - let button = UIButton(type: .system) - button.setTitle(action.title, for: .normal) - button.backgroundColor = backgroundColor - if let backgroundColor = action.backgroundColor { - button.backgroundColor = backgroundColor - } - button.titleLabel?.font = action.titleFont - button.setTitleColor(action.titleColor, for: .normal) - button.addTarget(self, action: #selector(buttonAction(button:)), for: .touchUpInside) - buttonView.addSubview(button) - buttonArray.append(button) - var isAddLineView = false - if style == .actionSheet { - if hasText { - isAddLineView = true - } else { - if actions[actions.count - 1] != action { - isAddLineView = true - } - } - } else { - if actions.count > 2 { - if hasText { - isAddLineView = true - } else { - if actions[actions.count - 1] != action { - isAddLineView = true - } - } - } else { - if actions.count == 1 { - if hasText { - isAddLineView = true - } - } else { - if hasText { - isAddLineView = true - } else { - if actions[actions.count - 1] != action { - isAddLineView = true - } - } - } - - } - } - if isAddLineView { - let linView = UIView() - linView.backgroundColor = UIColor.lightGray.withAlphaComponent(0.5) - buttonView.addSubview(linView) - lineArray.append(linView) - } - } - } - - refreshFrame() - } - - private func refreshFrame() { - let space: CGFloat = 15 - let viewMaxWidth = style == .alert ? SSAlertCommonView.alertMaxWidth : SSAlertCommonView.actionSheetMaxWidth - var height: CGFloat = 0 - let width = viewMaxWidth - let containerWidth = viewMaxWidth - space * 2 - var originY: CGFloat = 0 - var cotainerOriginY: CGFloat = 0 - if titleLabel.superview != nil { - let titleSize = titleLabel.sizeThatFits(CGSize(width: containerWidth, height: CGFloat(MAXFLOAT))) - titleLabel.ss_origin = CGPoint(x: 0, y: cotainerOriginY) - titleLabel.ss_size = CGSize(width: containerWidth, height: titleSize.height) - height += (titleSize.height + space) - cotainerOriginY += (space + titleSize.height) - originY = space - } - - if messageLabel.superview != nil { - let messageSize = messageLabel.sizeThatFits(CGSize(width: containerWidth, height: CGFloat(MAXFLOAT))) - messageLabel.ss_origin = CGPoint(x: 0, y: cotainerOriginY) - messageLabel.ss_size = CGSize(width: containerWidth, height: messageSize.height) - height += (messageSize.height + space) - cotainerOriginY += (space + messageSize.height) - originY = space - } - - containerView.ss_origin = CGPoint(x: space, y: originY) - containerView.ss_size = CGSize(width: containerWidth, height: height) - originY += height - - if !buttonArray.isEmpty { - let buttonSpace: CGFloat = SSAlertCommonView.buttonSpace - var buttonTotalHeight: CGFloat = 0 - var buttonTopY: CGFloat = 0 - if style == .actionSheet { - for index in 0.. 2 { - buttonArray.forEach { button in - let index = buttonArray.firstIndex(of: button) - let action = actions[index!] - - if lineArray.count == buttonArray.count { - let lineView = lineArray[index!] - lineView.frame = CGRect(x: lineEdgeInsets.left, y: buttonTopY, width: width - lineEdgeInsets.left - lineEdgeInsets.right, height: buttonSpace) - buttonTopY += buttonSpace - } - if lineArray.count == buttonArray.count - 1 { - if index! < lineArray.count { - let lineView = lineArray[index!] - lineView.frame = CGRect(x: lineEdgeInsets.left, y: buttonTopY + action.height, width: width - lineEdgeInsets.left - lineEdgeInsets.right, height: buttonSpace) - buttonTopY += buttonSpace - } - } - - button.ss_origin = CGPoint(x: 0, y: buttonTopY) - button.ss_size = CGSize(width: width, height: action.height) - buttonTopY += action.height - } - buttonTotalHeight = buttonTopY - } else { - if buttonArray.count == 1 { - let button = buttonArray.first! - let action = actions.first! - if lineArray.count > 0 { - let lineView = lineArray.first! - lineView.frame = CGRect(x: lineEdgeInsets.left, y: buttonTopY, width: width - lineEdgeInsets.left - lineEdgeInsets.right, height: buttonSpace) - buttonTopY += buttonSpace - } - button.ss_origin = CGPoint(x: 0, y: buttonTopY) - button.ss_size = CGSize(width: width, height: action.height) - buttonTotalHeight = buttonTopY - } else { - let button1 = buttonArray.first! - let button2 = buttonArray.last! - let action1 = actions.first! - let action2 = actions.last! - let maxButtonHeight = max(action1.height, action2.height) - if hasText { - let lineView1 = lineArray.first! - lineView1.frame = CGRect(x: 0, y: buttonTopY, width: width, height: buttonSpace) - buttonTopY += buttonSpace - } - - button1.ss_origin = CGPoint(x: 0, y: buttonTopY) - button1.ss_size = CGSize(width: width / 2 - buttonSpace / 2, height: maxButtonHeight) - - - button2.ss_origin = CGPoint(x: button1.frame.maxX + buttonSpace, y: buttonTopY) - button2.ss_size = CGSize(width: width / 2 - buttonSpace / 2, height: maxButtonHeight) - - let lineView2 = lineArray.last! - lineView2.frame = CGRect(x: button1.frame.maxX, y: buttonSpace, width: buttonSpace, height: button1.ss_h) - buttonTopY += maxButtonHeight - } - buttonTotalHeight = buttonTopY - } - } - - buttonView.ss_origin = CGPoint(x: 0, y: originY) - buttonView.ss_size = CGSize(width: width, height: buttonTotalHeight) - height += buttonTotalHeight + (originY > 0 ? space : 0) - - } - self.ss_size = CGSize(width: width, height: height) - } - - @objc private func buttonAction(button: UIButton) { - let index = buttonArray.firstIndex(of: button) - let action = actions[index!] - action.triggerAction() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertDefaultAnmation.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertDefaultAnmation.swift deleted file mode 100644 index 534ba29..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertDefaultAnmation.swift +++ /dev/null @@ -1,223 +0,0 @@ -// -// SSAlertDefaultAnmation.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation -extension SSAlertDefaultAnmation { - public enum State { - case fromTop, fromLeft, fromBottom, fromRight, fromCenter - } -} - - -open class SSAlertDefaultAnmation: NSObject { - public var state: State - /// 中心点偏移原来位置位移 - public var centerOffset: CGPoint = .zero - /// 动画的时间 - public var duration: TimeInterval = 0.3 - /// 展示动画是否开启弹簧效果 - public var isSpringShowAnimation: Bool = true - /// 滑动消失距离触发 - public var panDimissProgress: CGFloat = 0.4 - public var usingSpringWithDamping: CGFloat = 0.8 - public var initialSpringVelocity: CGFloat = 0.5 - private weak var animationView: SSAlertView? = nil - public init(state: State) { - self.state = state - super.init() - } - - private func animation(animated: Bool, isSpringAnimation: Bool = true, animations: @escaping (() -> Void), completion: ((Bool) -> Void)? = nil) { - if animated { - if isSpringAnimation { - UIView.animate(withDuration: animationDuration(), - delay: 0, - usingSpringWithDamping: usingSpringWithDamping, - initialSpringVelocity: initialSpringVelocity, - options: [], - animations: animations, - completion: completion) - } else { - UIView.animate(withDuration: animationDuration(), - animations: animations, - completion: completion) - } - - } else { - animations() - if let completion = completion { - completion(true) - } - } - } - - - public func setCenterOffset(center offset: CGPoint, duration: TimeInterval = 0.3, animated: Bool = true, completion:((Bool) -> Void)?) { - self.duration = duration - self.animation(animated: animated, animations: { - self.animationView?.transform = CGAffineTransform.init(translationX: offset.x, y: offset.y) - }, completion: completion) - - } -} - -extension SSAlertDefaultAnmation: SSAlertAnimation { - public func animationDuration() -> TimeInterval { - return duration - } - - public func showAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion: (((Bool) -> Void))?) { - guard let animationSuperView = animationView.superview else { - return - } - self.animationView = animationView - animationView.alpha = 1 - animationView.ss_size = viewSize - switch state { - case .fromBottom: - animationView.ss_centerX = animationSuperView.ss_w / 2 + centerOffset.x - animationView.ss_y = animationSuperView.ss_h - animation(animated: animated, isSpringAnimation: isSpringShowAnimation, animations: { [weak self] in guard let self = self else { return } - animationView.transform = CGAffineTransform.init(translationX: 0, y: -animationView.ss_h + self.centerOffset.y) - animationView.backgroundMask?.alpha = 1; - }, completion: completion) - - case .fromTop: - animationView.ss_centerX = animationSuperView.ss_w / 2 + centerOffset.x - animationView.ss_y = -animationView.ss_h - animation(animated: animated, isSpringAnimation: isSpringShowAnimation, animations: { [weak self] in guard let self = self else { return } - animationView.transform = CGAffineTransform.init(translationX: 0, y: animationView.ss_h + self.centerOffset.y) - animationView.backgroundMask?.alpha = 1; - }, completion: completion) - - case .fromLeft: - animationView.ss_centerY = animationSuperView.ss_h / 2 + centerOffset.y - animationView.ss_x = -animationView.ss_w - animation(animated: animated, isSpringAnimation: isSpringShowAnimation, animations: { - animationView.transform = CGAffineTransform.init(translationX: animationView.ss_w + self.centerOffset.x, y: 0) - animationView.backgroundMask?.alpha = 1; - }, completion: completion) - - case .fromRight: - animationView.ss_centerY = animationSuperView.ss_h / 2 + centerOffset.y - animationView.ss_x = animationSuperView.ss_w - animation(animated: animated, isSpringAnimation: isSpringShowAnimation, animations: { - animationView.transform = CGAffineTransform.init(translationX: -animationView.ss_w + self.centerOffset.x, y: 0) - animationView.backgroundMask?.alpha = 1; - }, completion: completion) - - case .fromCenter: - animationView.ss_centerX = animationSuperView.ss_w / 2 + centerOffset.x - animationView.ss_centerY = animationSuperView.ss_h / 2 + centerOffset.y - animationView.transform = CGAffineTransform.init(scaleX: 1.5, y: 1.5) - animationView.alpha = 0 - animation(animated: animated, isSpringAnimation: isSpringShowAnimation, animations: { - animationView.alpha = 1 - animationView.transform = CGAffineTransform.identity - animationView.backgroundMask?.alpha = 1; - }, completion: completion) - - } - } - - public func hideAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion: (((Bool) -> Bool))?) { - self.animationView = animationView - animation(animated: animated, isSpringAnimation: false, animations: { - if self.state == .fromCenter { - animationView.alpha = 0 - } else { - animationView.transform = CGAffineTransform.identity - } - animationView.backgroundMask?.alpha = 0 - }, completion: { - finished in - var isCancel = false - if let completion = completion { - isCancel = completion(finished) - } - if !isCancel { - animationView.removeFromSuperview() - animationView.backgroundMask?.removeFromSuperview() - self.animationView = nil - } - }) - } - - public func refreshAnimationOfAnimationView(animationView: SSAlertView, viewSize: CGSize, animated: Bool, completion: (((Bool) -> Void))?) { - guard let animationSuperView = animationView.superview else { - return - } - self.animationView = animationView - animationView.alpha = 1 - animationView.ss_size = viewSize - switch state { - case .fromBottom: - animationView.ss_centerX = animationSuperView.ss_w / 2.0 + centerOffset.x - animation(animated: animated, animations: { - animationView.ss_y = animationSuperView.ss_h - viewSize.height + self.centerOffset.y - }, completion: completion) - - case .fromTop: - animationView.ss_centerX = animationSuperView.ss_w / 2.0 + centerOffset.x - animation(animated: animated, animations: { - animationView.ss_y = self.centerOffset.y - }, completion: completion) - - case .fromLeft: - animationView.ss_centerY = animationSuperView.ss_h / 2.0 + centerOffset.y - animation(animated: animated, animations: { - animationView.ss_x = self.centerOffset.x - }, completion: completion) - - case .fromRight: - animationView.ss_centerY = animationSuperView.ss_h / 2.0 + centerOffset.y - animation(animated: animated, animations: { - animationView.ss_x = animationSuperView.ss_w - viewSize.width + self.centerOffset.x - }, completion: completion) - - case .fromCenter: - animationView.alpha = 0 - animationView.ss_centerX = animationSuperView.ss_w / 2 + centerOffset.x - animationView.ss_centerY = animationSuperView.ss_h / 2 + centerOffset.y - animationView.transform = CGAffineTransform.init(scaleX: 1.5, y: 1.5) - animation(animated: animated, animations: { - animationView.alpha = 1 - animationView.transform = CGAffineTransform.identity - }, completion: completion) - - } - } - - public func panToDimissTransilatePoint(point: CGPoint, panViewFrame: CGRect) -> (PanProgress, PanCancelProgress) { - var progress: CGFloat = 0 - switch state { - case .fromTop: - if point.y <= 0 { - progress = abs(point.y / panViewFrame.height) - } - case .fromBottom: - if point.y >= 0 { - progress = abs(point.y / panViewFrame.height) - } - - case .fromLeft: - if point.x <= 0 { - progress = abs(point.x / panViewFrame.width) - } - - case .fromRight: - if point.x >= 0 { - progress = abs(point.x / panViewFrame.width) - } - case .fromCenter: - progress = abs(point.y / panViewFrame.height) - } - return (progress, panDimissProgress) - } -} - - diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertPresentAnimation.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertPresentAnimation.swift deleted file mode 100644 index 58d07d2..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertPresentAnimation.swift +++ /dev/null @@ -1,222 +0,0 @@ -// -// SSAlertPresentAnimation.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation - -typealias PanDimissAnimation = (CGPoint, CGRect) -> (PanProgress, PanCancelProgress) -typealias DimissAnimation = (DimissIsCancel) -> Void - -class SSCustomInteractiveAnimation: UIPercentDrivenInteractiveTransition { - private(set) var panGestureRecognizer: UIPanGestureRecognizer - private var panDimissAnimation: PanDimissAnimation? - private var dimissAnimation: DimissAnimation? - - init(panGestureRecognizer: UIPanGestureRecognizer, panDimissAnimation: PanDimissAnimation?, dimissAnimation: DimissAnimation?) { - self.panGestureRecognizer = panGestureRecognizer - self.panDimissAnimation = panDimissAnimation - self.dimissAnimation = dimissAnimation - super.init() - self.completionSpeed = 0.2 - panGestureRecognizer.addTarget(self, action: #selector(panAction(pan:))) - } - - @objc private func panAction(pan: UIPanGestureRecognizer) { - guard let view = pan.view else { - return - } - let poin = pan.translation(in: view) - var progress: CGFloat = 0 - var cancelProgress: CGFloat = 0.4 - if let panDimissAnimation = self.panDimissAnimation { - let (tProgress, tCancelProgress) = panDimissAnimation(poin, pan.view!.frame) - progress = tProgress - cancelProgress = tCancelProgress - } - switch pan.state { - case .began: - pan.setTranslation(CGPoint(x: 0, y: 0), in: view) - case .changed: - update(progress) - case .cancelled: - cancel() - case .ended: - if progress > cancelProgress { - finish() - dimissAnimation?(false) - } else { - cancel() - dimissAnimation?(true) - } - default: - break - } - } - - override func startInteractiveTransition(_ transitionContext: UIViewControllerContextTransitioning) { - super.startInteractiveTransition(transitionContext) - } - - deinit { - panGestureRecognizer.removeTarget(self, action: #selector(panAction(pan:))) - } -} - -class SSAlertPresentAnimation: NSObject { - typealias AnimationCompletion = () -> Void - var duration: TimeInterval = 0.35 - private var showAnimation: AnimationCompletion? = nil - private var hideAnimation: AnimationCompletion? = nil - private var endCompletion: AnimationCompletion? = nil - private var panDimissAnimation: PanDimissAnimation? = nil - private var dimissAnimation: DimissAnimation? = nil - - private var transitionContext: UIViewControllerContextTransitioning? - private weak var nav: UINavigationController? - private weak var animationView: UIView? - private var panGestureRecognizer: UIPanGestureRecognizer? - - init(navigationViewController: UINavigationController, animationView: UIView, canPanDimiss: Bool = true) { - self.nav = navigationViewController - self.animationView = animationView - super.init() - if canPanDimiss { - let pan = UIPanGestureRecognizer(target: self, action: #selector(panAction(pan:))) - pan.maximumNumberOfTouches = 1 - animationView.addGestureRecognizer(pan) - } - } - - @objc func panAction(pan: UIPanGestureRecognizer) { - if pan.state == .began { - panGestureRecognizer = pan - nav?.viewControllers[0].dismiss(animated: true, completion: { - [weak self] in guard let self = self else { return } - self.panGestureRecognizer = nil - }); - } - } - - func animationCompletion(showAnimation: AnimationCompletion? = nil, - hideAnimation: AnimationCompletion? = nil, - endCompletion: AnimationCompletion? = nil, - panDimissAnimation: PanDimissAnimation? = nil, - dimissAnimation: DimissAnimation? = nil) { - if showAnimation != nil { - self.showAnimation = showAnimation - } - if hideAnimation != nil { - self.hideAnimation = hideAnimation - } - - if endCompletion != nil { - self.endCompletion = endCompletion - } - if panDimissAnimation != nil { - self.panDimissAnimation = panDimissAnimation - } - if panDimissAnimation != nil { - self.panDimissAnimation = panDimissAnimation - } - - if dimissAnimation != nil { - self.dimissAnimation = dimissAnimation - } - } - - @discardableResult - func setCompleteTransitionIsHide(isHide: Bool) -> Bool { - if let transitionContext = transitionContext { - let isCancelled = transitionContext.transitionWasCancelled - if !isCancelled { - if isHide { - transitionContext.containerView.subviews.forEach { subView in - subView.removeFromSuperview() - } - } - - } - transitionContext.completeTransition(!isCancelled) - return isCancelled - } - - return false - } -} - -extension SSAlertPresentAnimation: UIViewControllerTransitioningDelegate { - func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return self - } - func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { - return self - } - - func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { - if self.panGestureRecognizer != nil { - return SSCustomInteractiveAnimation(panGestureRecognizer: self.panGestureRecognizer!, panDimissAnimation: self.panDimissAnimation, dimissAnimation: dimissAnimation) - } - return nil - } - func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { - if self.panGestureRecognizer != nil { - - return SSCustomInteractiveAnimation(panGestureRecognizer: self.panGestureRecognizer!, panDimissAnimation: self.panDimissAnimation, dimissAnimation: dimissAnimation) - } - return nil - } -} - -extension SSAlertPresentAnimation: UIViewControllerAnimatedTransitioning { - func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return self.duration - } - - func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - self.transitionContext = transitionContext - let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) - let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) - let containerView = transitionContext.containerView - - if let fromVC = fromVC, let toVC = toVC { - var fromView = fromVC.view - var toView = toVC.view - if transitionContext.responds(to: #selector(UIViewControllerContextTransitioning.view(forKey:))) { - fromView = transitionContext.view(forKey: UITransitionContextViewKey.from) - toView = transitionContext.view(forKey: UITransitionContextViewKey.to) - } - let isPresenting = toVC.presentingViewController == fromVC - if isPresenting { - if let toView = toView { - containerView.addSubview(toView) - - } - if let showAnimation = self.showAnimation { - showAnimation() - } - } else { - if let toView = toView, let fromView = fromView { - containerView.insertSubview(toView, belowSubview: fromView) - - } - if let hideAnimation = self.hideAnimation { - hideAnimation() - } - } - - - } - - } - - - - func animationEnded(_ transitionCompleted: Bool) { - if let endCompletion = self.endCompletion, transitionCompleted, let transitionContext = transitionContext, transitionContext.isInteractive { - endCompletion() - } - } -} diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertView.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertView.swift deleted file mode 100644 index dde0613..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertView.swift +++ /dev/null @@ -1,312 +0,0 @@ -// -// SSAlertView.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import UIKit - -extension SSAlertView { - public enum BackgroundMaskType { - /// 默认没有遮罩 - case none - - /// 透明遮罩 - case clear - - /// 黑色遮罩 - case black - } -} - -fileprivate extension SSAlertView { - typealias HideCompletion = () -> Void - class HideCompletionData: NSObject { - var completion: HideCompletion? - } -} - -open class SSAlertView: UIView { - /// customView 的内间距 - public var customEdgeInsets: UIEdgeInsets = .zero { - didSet { - setNeedsDisplay() - layoutIfNeeded() - } - } - - /// 展示和隐藏动画设置 - public var animation: SSAlertAnimation - - ///遮罩视图 - public private(set) var backgroundMask: UIView? - - /// 是否点击遮罩隐藏,默认点击会隐藏 - public var canTouchMaskHide: Bool = true - /// 点击遮罩隐藏是否开启动画,默认nil,跟随展示的时候设置是否开启动画 - public var isTouchMaskHideAnimated: Bool? = nil - - /// 模态视图弹窗才有 - public private(set) var navigationController: UINavigationController? - - public var isHideStatusBar = false { - didSet { - self.toViewContrller?.isHideStatusBar = isHideStatusBar - } - } - public var isShowNavWhenViewWillDisappear = true { - didSet { - self.toViewContrller?.isShowNavWhenViewWillDisappear = isShowNavWhenViewWillDisappear - } - } - private var onView: UIView - public private(set) var maskType: BackgroundMaskType - public private(set) var customView: UIView - private weak var fromViewController: UIViewController? - private weak var toViewContrller: SSAlertAnimationController? - private var presentAnimation: SSAlertPresentAnimation? - private var canPanDimiss: Bool = false - private var hideCompletions = [HideCompletionData]() - /// 初始化(普通视图弹窗) - public init(customView: UIView, - onView: UIView, - animation: SSAlertAnimation = SSAlertDefaultAnmation(state: .fromCenter), - maskType: BackgroundMaskType = .black) { - self.animation = animation - self.onView = onView - self.maskType = maskType - self.customView = customView - super.init(frame: .zero) - makeUI() - } - - /// 初始化(模态视图弹窗),canPanDimiss: 是否支持拖拽消息 - public convenience init(customView: UIView, - fromViewController: UIViewController, - animation: SSAlertAnimation = SSAlertDefaultAnmation(state: .fromCenter), - navigationControllerClass: UINavigationController.Type = UINavigationController.self, - maskType: BackgroundMaskType = .black, - canPanDimiss: Bool = true) { - let animaionVC = SSAlertAnimationController() - self.init(customView: customView, onView: animaionVC.view, animation: animation, maskType: maskType) - animaionVC.isHideStatusBar = self.isHideStatusBar - if let superViewController = superViewController(view: customView), superViewController != animaionVC { - animaionVC.addChild(superViewController) - superViewController.didMove(toParent: animaionVC) - } - self.canPanDimiss = canPanDimiss - self.fromViewController = fromViewController - let nav = navigationControllerClass.init(rootViewController: animaionVC) - nav.modalPresentationStyle = .custom - self.navigationController = nav - self.canPanDimiss = canPanDimiss - let animation = SSAlertPresentAnimation(navigationViewController: nav, animationView: customView, canPanDimiss: canPanDimiss) - self.navigationController!.transitioningDelegate = animation - self.navigationController!.modalPresentationCapturesStatusBarAppearance = true - self.presentAnimation = animation - self.toViewContrller = animaionVC - - } - - open override func layoutSubviews() { - super.layoutSubviews() - backgroundMask?.frame = CGRect(x: 0, y: 0, width: onView.ss_w, height: onView.ss_h) - customView.ss_x = customEdgeInsets.left - customView.ss_y = customEdgeInsets.top - customView.ss_w = frame.width - customEdgeInsets.left - customEdgeInsets.right - customView.ss_h = frame.height - customEdgeInsets.top - customEdgeInsets.bottom - } - - - private func makeUI() { - if maskType != .none { - let backgroundMask = UIButton() - backgroundMask.alpha = 0 - onView.addSubview(backgroundMask) - backgroundMask.addTarget(self, action: #selector(backgroundMaskAction), for: .touchUpInside) - self.backgroundMask = backgroundMask - if maskType == .black { - backgroundMask.backgroundColor = UIColor.black.withAlphaComponent(0.3) - } - } - addSubview(customView) - onView.addSubview(self) - } - /// 展示 - public func show(animated: Bool = true, completion: (() -> Void)? = nil) { - if navigationController != nil { - presentView(animated: animated, completion: completion) - } else { - showView(animated: animated, completion: completion) - } - } - /// 隐藏 - public func hide(animated: Bool = true, completion: (() -> Void)? = nil) { - if navigationController != nil { - dimissView(animated: animated, completion: completion) - } else { - hideView(animated: animated, completion: completion) - } - } - - /// 展示(普通视图弹窗) - /// - Parameter animated: 是否动画 - private func showView(animated: Bool = true, completion: (() -> Void)? = nil) { - isTouchMaskHideAnimated = animated - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - animation.showAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated, completion: { _ in completion?() }) - } - /// 隐藏(普通视图弹窗) - /// - Parameter animated: 是否动画 - private func hideView(animated: Bool = true, completion: (() -> Void)? = nil) { - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - animation.hideAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated) { [weak self] _ in guard let self = self else { return false } - completion?() - - self.hideCompletions.forEach { hideC in - hideC.completion?() - hideC.completion = nil - self.hideCompletions.removeAll(where: {$0 == hideC}) - } - - return false - } - - } - /// 展示(模态视图弹窗) - /// - Parameter animated: 是否动画 - private func presentView(animated: Bool = true, completion: (() -> Void)? = nil) { - isTouchMaskHideAnimated = animated - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - presentAnimation?.animationCompletion(showAnimation: { - [weak self] in guard let self = self else { return } - self.animation.showAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated) { _ in - self.presentAnimation?.setCompleteTransitionIsHide(isHide: false) - completion?() - } - }) - self.presentAnimation?.duration = animation.animationDuration() - ///存在的问题: app当前显示的是弹窗界面,默认presnent出来的视图且modalPresentationStyle不是CurrentContext这这种,这个视图的presentingVC默认根控制器,例如存在tabbarVC的话就是tabbarVC,这个会造成一个问题:当这个视图dimiss的时候,会把所有的presentedVC都dimiss(其实调用dimiss的时候是调用当前视图的presentigngVC去dimiss,遵循随创建随释放) - /// 这个通过设置 definesPresentationContext = true,modalPresentationStyle = UIModalPresentationOverCurrentContext,这样当前视图的presentigngVC为 self.navigationController, - /// UIModalPresentationOverCurrentContext和 UIModalPresentationCurrentContext的区别是弹出的界面,前者不会把底部的视图stact移除,后者则会。 - self.navigationController?.definesPresentationContext = true - self.navigationController?.modalPresentationStyle = .overCurrentContext - self.fromViewController?.present(self.navigationController!, animated: true, completion: nil) - if canPanDimiss { - dimissViewDragToHideAnimation(animated: animated) - } - } - /// 隐藏(模态视图弹窗) - /// - Parameter animated: 是否动画 - private func dimissView(animated: Bool = true, completion: (() -> Void)? = nil) { - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - presentAnimation?.animationCompletion(hideAnimation: { - [weak self] in guard let self = self else { return } - self.animation.hideAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated) { _ in - return self.presentAnimation!.setCompleteTransitionIsHide(isHide: true) - } - }) - self.presentAnimation?.duration = animation.animationDuration() - self.toViewContrller?.dismiss(animated: animated, completion: { - [weak self] in guard let self = self else { return } - completion?() - self.hideCompletions.forEach { hideC in - hideC.completion?() - hideC.completion = nil - self.hideCompletions.removeAll(where: {$0 == hideC}) - } - }) - } - - private func dimissViewDragToHideAnimation(animated: Bool) { - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - presentAnimation?.animationCompletion(hideAnimation: { - [weak self] in guard let self = self else { return } - self.animation.hideAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated) { _ in - return self.presentAnimation!.setCompleteTransitionIsHide(isHide: true) - } - },endCompletion: { - [weak self] in guard let self = self else { return } - self.hideCompletions.forEach { hideC in - hideC.completion?() - hideC.completion = nil - self.hideCompletions.removeAll(where: {$0 == hideC}) - } - }, panDimissAnimation: { [weak self] point, frame in - guard let self = self else { return (0, 0.4) } - return self.animation.panToDimissTransilatePoint(point: point, panViewFrame: frame) - }, dimissAnimation: { [weak self] isCancel in guard let self = self else { return } - self.toViewContrller?.isDimiss = !isCancel - }) - self.presentAnimation?.duration = animation.animationDuration() - } - - public func refreshFrame(animated: Bool = true) { - var customSize = customView.systemLayoutSizeFitting(UIView.layoutFittingExpandedSize) - if customView.ss_size != .zero { - customSize = customView.ss_size - } - let size = CGSize(width: customSize.width + customEdgeInsets.left + customEdgeInsets.right, height: customSize.height + customEdgeInsets.top + customEdgeInsets.bottom) - animation.refreshAnimationOfAnimationView(animationView: self, viewSize: size, animated: animated, completion: nil) - } - - - @objc private func backgroundMaskAction() { - if canTouchMaskHide { - if fromViewController != nil { - dimissView(animated: isTouchMaskHideAnimated ?? false) - } else { - hideView(animated: isTouchMaskHideAnimated ?? false) - } - } - } - - private func superViewController(view: UIView) -> UIViewController? { - var next = view.next - while next != nil { - if next is UIViewController { - return next as? UIViewController - } else { - next = next!.next - } - } - return nil - } - - public func observeHideCompletion(completion: (() -> Void)?) { - let completionData = HideCompletionData() - completionData.completion = completion - self.hideCompletions.append(completionData) - } - - required public init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - -} - - - - - diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertViewExtention.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertViewExtention.swift deleted file mode 100644 index 037ee1b..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/SSAlertViewExtention.swift +++ /dev/null @@ -1,127 +0,0 @@ -// -// SSAlertViewExtention.swift -// SSAlert -// -// Created by yangsq on 2021/8/13. -// - -import Foundation - -extension SSAlertView { - @discardableResult - public class func alertView(style: SSAlertAction.Style, title: String? = nil, message: String? = nil, cancelButton: String? = nil, otherButtons: [String] = [], onView: UIView, onTrigger:((Int) -> Void)? = nil) -> SSAlertView { - var actionArray = [SSAlertAction]() - var cancelAction: SSAlertAction? = nil - var alertView: SSAlertView? - if style == .alert { - if let cancelButton = cancelButton, !cancelButton.isEmpty { - cancelAction = SSAlertAction(style: style, title: cancelButton, addAction: { - if let onTrigger = onTrigger { - onTrigger(0) - } - alertView?.hide() - }) - actionArray.append(cancelAction!) - } - otherButtons.forEach { title in - let action = SSAlertAction(style: style, title: title) { - if let onTrigger = onTrigger { - let index = otherButtons.firstIndex(of: title) - onTrigger(cancelAction != nil ? (index! + 1) : index!) - } - } - actionArray.append(action) - } - } - - if style == .actionSheet { - otherButtons.forEach { title in - let action = SSAlertAction(style: style, title: title) { - if let onTrigger = onTrigger { - let index = otherButtons.firstIndex(of: title) - onTrigger(cancelAction != nil ? (index! + 1) : index!) - } - } - actionArray.append(action) - } - if let cancelButton = cancelButton, !cancelButton.isEmpty { - cancelAction = SSAlertAction(style: style, title: cancelButton, addAction: { - if let onTrigger = onTrigger { - onTrigger(0) - } - alertView?.hide() - }) - actionArray.append(cancelAction!) - } - } - - let customView = SSAlertCommonView(title: title, message: message, style: style, actions: actionArray) - customView.backgroundColor = .white - alertView = SSAlertView(customView: customView, onView: onView, animation: SSAlertDefaultAnmation(state: style == .actionSheet ? .fromBottom : .fromCenter), maskType: .black) - alertView!.canTouchMaskHide = false - if style == .alert { - alertView!.layer.cornerRadius = 10 - alertView!.layer.masksToBounds = true - } - return alertView! - } - - @discardableResult - public class func modalAlertView(style: SSAlertAction.Style, title: String? = nil, message: String? = nil, cancelButton: String? = nil, otherButtons: [String] = [], fromViewController: UIViewController, navigationViewControllerClass: UINavigationController.Type = UINavigationController.self, onTrigger:((Int) -> Void)? = nil) -> SSAlertView { - var actionArray = [SSAlertAction]() - var cancelAction: SSAlertAction? = nil - var alertView: SSAlertView? - if style == .alert { - if let cancelButton = cancelButton, !cancelButton.isEmpty { - cancelAction = SSAlertAction(style: style, title: cancelButton, addAction: { - if let onTrigger = onTrigger { - onTrigger(0) - } - alertView?.hide() - }) - actionArray.append(cancelAction!) - } - otherButtons.forEach { title in - let action = SSAlertAction(style: style, title: title) { - if let onTrigger = onTrigger { - let index = otherButtons.firstIndex(of: title) - onTrigger(cancelAction != nil ? (index! + 1) : index!) - } - } - actionArray.append(action) - } - } - - if style == .actionSheet { - otherButtons.forEach { title in - let action = SSAlertAction(style: style, title: title) { - if let onTrigger = onTrigger { - let index = otherButtons.firstIndex(of: title) - onTrigger(cancelAction != nil ? (index! + 1) : index!) - } - } - actionArray.append(action) - } - if let cancelButton = cancelButton, !cancelButton.isEmpty { - cancelAction = SSAlertAction(style: style, title: cancelButton, addAction: { - if let onTrigger = onTrigger { - onTrigger(0) - } - alertView?.hide() - }) - actionArray.append(cancelAction!) - } - } - let customView = SSAlertCommonView(title: title, message: message, style: style, actions: actionArray) - customView.backgroundColor = .white - alertView = SSAlertView(customView: customView,fromViewController: fromViewController, animation: SSAlertDefaultAnmation(state: style == .actionSheet ? .fromBottom : .fromCenter), navigationControllerClass: navigationViewControllerClass, maskType: .black) - alertView!.canTouchMaskHide = false - if style == .alert { - alertView!.layer.cornerRadius = 10 - alertView!.layer.masksToBounds = true - } - return alertView! - } - - -} diff --git a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/UIViewFrameExtension.swift b/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/UIViewFrameExtension.swift deleted file mode 100644 index c1022dc..0000000 --- a/ReadViewDemo/Pods/SSAlertSwift/Sources/SSAlertSwift/UIViewFrameExtension.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// UIViewFrameExtension.swift -// Pods-SSAlertSwiftDemo -// -// Created by yangsq on 2021/8/13. -// - -import UIKit - -public extension UIView { - var ss_size: CGSize { - get { - frame.size - } - set { - var frame = frame - frame.size = newValue - self.frame = frame - } - } - - var ss_origin: CGPoint { - get { - frame.origin - } - set { - var frame = frame - frame.origin = newValue - self.frame = frame - } - } - - var ss_center: CGPoint { - get { - center - } - set { - center = newValue - } - } - - var ss_x: CGFloat { - get { - frame.origin.x - } - set { - var frame = frame - frame.origin.x = newValue - self.frame = frame - } - } - - var ss_maxX: CGFloat { - get { - frame.maxX - } - } - - var ss_y: CGFloat { - get { - frame.origin.y - } - set { - var frame = frame - frame.origin.y = newValue - self.frame = frame - } - } - - var ss_maxY: CGFloat { - get { - frame.maxY - } - set { - var frame = frame - frame.origin.y = newValue - self.frame = frame - } - } - - var ss_w: CGFloat { - get { - frame.width - } - set { - var frame = frame - frame.size.width = newValue - self.frame = frame - } - } - - var ss_h: CGFloat { - get { - frame.height - } - set { - var frame = frame - frame.size.height = newValue - self.frame = frame - } - } - - var ss_centerX: CGFloat { - get { - center.x - } - set { - var center = center - center.x = newValue - self.center = center - } - } - - var ss_centerY: CGFloat { - get { - center.y - } - set { - var center = center - center.y = newValue - self.center = center - } - } - - func ss_moveToCenter() { - if let superV = superview { - ss_center = CGPoint(x: superV.frame.width / 2, y: superV.frame.height / 2) - } - } -} - - diff --git a/ReadViewDemo/Pods/SnapKit/LICENSE b/ReadViewDemo/Pods/SnapKit/LICENSE deleted file mode 100644 index a18ccfb..0000000 --- a/ReadViewDemo/Pods/SnapKit/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/ReadViewDemo/Pods/SnapKit/README.md b/ReadViewDemo/Pods/SnapKit/README.md deleted file mode 100644 index e1be307..0000000 --- a/ReadViewDemo/Pods/SnapKit/README.md +++ /dev/null @@ -1,155 +0,0 @@ - - -SnapKit is a DSL to make Auto Layout easy on both iOS and OS X. - -[![Build Status](https://travis-ci.org/SnapKit/SnapKit.svg)](https://travis-ci.org/SnapKit/SnapKit) -[![Platform](https://img.shields.io/cocoapods/p/SnapKit.svg?style=flat)](https://github.com/SnapKit/SnapKit) -[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/SnapKit.svg)](https://cocoapods.org/pods/SnapKit) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) - -#### ⚠️ **To use with Swift 4.x please ensure you are using >= 4.0.0** ⚠️ -#### ⚠️ **To use with Swift 5.x please ensure you are using >= 5.0.0** ⚠️ - -## Contents - -- [Requirements](#requirements) -- [Migration Guides](#migration-guides) -- [Communication](#communication) -- [Installation](#installation) -- [Usage](#usage) -- [Credits](#credits) -- [License](#license) - -## Requirements - -- iOS 12.0+ / Mac OS X 10.13+ / tvOS 10.0+ -- Xcode 10.0+ -- Swift 4.0+ - -## Migration Guides - -- [SnapKit 3.0 Migration Guide](Documentation/SnapKit%203.0%20Migration%20Guide.md) - -## Communication - -- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit). (Tag 'snapkit') -- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit). -- If you **found a bug**, open an issue. -- If you **have a feature request**, open an issue. -- If you **want to contribute**, submit a pull request. - - -## Installation - -### CocoaPods - -[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command: - -```bash -$ gem install cocoapods -``` - -> CocoaPods 1.1.0+ is required to build SnapKit 4.0.0+. - -To integrate SnapKit into your Xcode project using CocoaPods, specify it in your `Podfile`: - -```ruby -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '10.0' -use_frameworks! - -target '' do - pod 'SnapKit', '~> 5.7.0' -end -``` - -Then, run the following command: - -```bash -$ pod install -``` - -### Carthage - -[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. - -You can install Carthage with [Homebrew](http://brew.sh/) using the following command: - -```bash -$ brew update -$ brew install carthage -``` - -To integrate SnapKit into your Xcode project using Carthage, specify it in your `Cartfile`: - -```ogdl -github "SnapKit/SnapKit" ~> 5.0.0 -``` - -Run `carthage update` to build the framework and drag the built `SnapKit.framework` into your Xcode project. - -### Swift Package Manager - -[Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies. - -> Xcode 11+ is required to build SnapKit using Swift Package Manager. - -To integrate SnapKit into your Xcode project using Swift Package Manager, add it to the dependencies value of your `Package.swift`: - -```swift -dependencies: [ - .package(url: "https://github.com/SnapKit/SnapKit.git", .upToNextMajor(from: "5.0.1")) -] -``` - -### Manually - -If you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually. - ---- - -## Usage - -### Quick Start - -```swift -import SnapKit - -class MyViewController: UIViewController { - - lazy var box = UIView() - - override func viewDidLoad() { - super.viewDidLoad() - - self.view.addSubview(box) - box.backgroundColor = .green - box.snp.makeConstraints { (make) -> Void in - make.width.height.equalTo(50) - make.center.equalTo(self.view) - } - } - -} -``` - -### Playground -You can try SnapKit in Playground. - -**Note:** - -> To try SnapKit in playground, open `SnapKit.xcworkspace` and build SnapKit.framework for any simulator first. - -### Resources - -- [Documentation](https://snapkit.github.io/SnapKit/docs/) -- [F.A.Q.](https://snapkit.github.io/SnapKit/faq/) - -## Credits - -- Robert Payne ([@robertjpayne](https://twitter.com/robertjpayne)) -- Many other contributors - -## License - -SnapKit is released under the MIT license. See LICENSE for details. diff --git a/ReadViewDemo/Pods/SnapKit/Sources/Constraint.swift b/ReadViewDemo/Pods/SnapKit/Sources/Constraint.swift deleted file mode 100644 index b890152..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/Constraint.swift +++ /dev/null @@ -1,341 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - -public final class Constraint { - - internal let sourceLocation: (String, UInt) - internal let label: String? - - private let from: ConstraintItem - private let to: ConstraintItem - private let relation: ConstraintRelation - private let multiplier: ConstraintMultiplierTarget - private var constant: ConstraintConstantTarget { - didSet { - self.updateConstantAndPriorityIfNeeded() - } - } - private var priority: ConstraintPriorityTarget { - didSet { - self.updateConstantAndPriorityIfNeeded() - } - } - public var layoutConstraints: [LayoutConstraint] - - public var isActive: Bool { - set { - if newValue { - activate() - } - else { - deactivate() - } - } - - get { - for layoutConstraint in self.layoutConstraints { - if layoutConstraint.isActive { - return true - } - } - return false - } - } - - // MARK: Initialization - - internal init(from: ConstraintItem, - to: ConstraintItem, - relation: ConstraintRelation, - sourceLocation: (String, UInt), - label: String?, - multiplier: ConstraintMultiplierTarget, - constant: ConstraintConstantTarget, - priority: ConstraintPriorityTarget) { - self.from = from - self.to = to - self.relation = relation - self.sourceLocation = sourceLocation - self.label = label - self.multiplier = multiplier - self.constant = constant - self.priority = priority - self.layoutConstraints = [] - - // get attributes - let layoutFromAttributes = self.from.attributes.layoutAttributes - let layoutToAttributes = self.to.attributes.layoutAttributes - - // get layout from - let layoutFrom = self.from.layoutConstraintItem! - - // get relation - let layoutRelation = self.relation.layoutRelation - - for layoutFromAttribute in layoutFromAttributes { - // get layout to attribute - let layoutToAttribute: LayoutAttribute - #if canImport(UIKit) - if layoutToAttributes.count > 0 { - if self.from.attributes == .edges && self.to.attributes == .margins { - switch layoutFromAttribute { - case .left: - layoutToAttribute = .leftMargin - case .right: - layoutToAttribute = .rightMargin - case .top: - layoutToAttribute = .topMargin - case .bottom: - layoutToAttribute = .bottomMargin - default: - fatalError() - } - } else if self.from.attributes == .margins && self.to.attributes == .edges { - switch layoutFromAttribute { - case .leftMargin: - layoutToAttribute = .left - case .rightMargin: - layoutToAttribute = .right - case .topMargin: - layoutToAttribute = .top - case .bottomMargin: - layoutToAttribute = .bottom - default: - fatalError() - } - } else if self.from.attributes == .directionalEdges && self.to.attributes == .directionalMargins { - switch layoutFromAttribute { - case .leading: - layoutToAttribute = .leadingMargin - case .trailing: - layoutToAttribute = .trailingMargin - case .top: - layoutToAttribute = .topMargin - case .bottom: - layoutToAttribute = .bottomMargin - default: - fatalError() - } - } else if self.from.attributes == .directionalMargins && self.to.attributes == .directionalEdges { - switch layoutFromAttribute { - case .leadingMargin: - layoutToAttribute = .leading - case .trailingMargin: - layoutToAttribute = .trailing - case .topMargin: - layoutToAttribute = .top - case .bottomMargin: - layoutToAttribute = .bottom - default: - fatalError() - } - } else if self.from.attributes == self.to.attributes { - layoutToAttribute = layoutFromAttribute - } else { - layoutToAttribute = layoutToAttributes[0] - } - } else { - if self.to.target == nil && (layoutFromAttribute == .centerX || layoutFromAttribute == .centerY) { - layoutToAttribute = layoutFromAttribute == .centerX ? .left : .top - } else { - layoutToAttribute = layoutFromAttribute - } - } - #else - if self.from.attributes == self.to.attributes { - layoutToAttribute = layoutFromAttribute - } else if layoutToAttributes.count > 0 { - layoutToAttribute = layoutToAttributes[0] - } else { - layoutToAttribute = layoutFromAttribute - } - #endif - - // get layout constant - let layoutConstant: CGFloat = self.constant.constraintConstantTargetValueFor(layoutAttribute: layoutToAttribute) - - // get layout to - var layoutTo: AnyObject? = self.to.target - - // use superview if possible - if layoutTo == nil && layoutToAttribute != .width && layoutToAttribute != .height { - layoutTo = layoutFrom.superview - } - - // create layout constraint - let layoutConstraint = LayoutConstraint( - item: layoutFrom, - attribute: layoutFromAttribute, - relatedBy: layoutRelation, - toItem: layoutTo, - attribute: layoutToAttribute, - multiplier: self.multiplier.constraintMultiplierTargetValue, - constant: layoutConstant - ) - - // set label - layoutConstraint.label = self.label - - // set priority - layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue) - - // set constraint - layoutConstraint.constraint = self - - // append - self.layoutConstraints.append(layoutConstraint) - } - } - - // MARK: Public - - @available(*, deprecated, renamed:"activate()") - public func install() { - self.activate() - } - - @available(*, deprecated, renamed:"deactivate()") - public func uninstall() { - self.deactivate() - } - - public func activate() { - self.activateIfNeeded() - } - - public func deactivate() { - self.deactivateIfNeeded() - } - - @discardableResult - public func update(offset: ConstraintOffsetTarget) -> Constraint { - self.constant = offset.constraintOffsetTargetValue - return self - } - - @discardableResult - public func update(inset: ConstraintInsetTarget) -> Constraint { - self.constant = inset.constraintInsetTargetValue - return self - } - - #if canImport(UIKit) - @discardableResult - @available(iOS 11.0, tvOS 11.0, *) - public func update(inset: ConstraintDirectionalInsetTarget) -> Constraint { - self.constant = inset.constraintDirectionalInsetTargetValue - return self - } - #endif - - @discardableResult - public func update(priority: ConstraintPriorityTarget) -> Constraint { - self.priority = priority.constraintPriorityTargetValue - return self - } - - @discardableResult - public func update(priority: ConstraintPriority) -> Constraint { - self.priority = priority.value - return self - } - - @available(*, deprecated, renamed:"update(offset:)") - public func updateOffset(amount: ConstraintOffsetTarget) -> Void { self.update(offset: amount) } - - @available(*, deprecated, renamed:"update(inset:)") - public func updateInsets(amount: ConstraintInsetTarget) -> Void { self.update(inset: amount) } - - @available(*, deprecated, renamed:"update(priority:)") - public func updatePriority(amount: ConstraintPriorityTarget) -> Void { self.update(priority: amount) } - - @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.") - public func updatePriorityRequired() -> Void {} - - @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.") - public func updatePriorityHigh() -> Void { fatalError("Must be implemented by Concrete subclass.") } - - @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.") - public func updatePriorityMedium() -> Void { fatalError("Must be implemented by Concrete subclass.") } - - @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.") - public func updatePriorityLow() -> Void { fatalError("Must be implemented by Concrete subclass.") } - - // MARK: Internal - - internal func updateConstantAndPriorityIfNeeded() { - for layoutConstraint in self.layoutConstraints { - let attribute = (layoutConstraint.secondAttribute == .notAnAttribute) ? layoutConstraint.firstAttribute : layoutConstraint.secondAttribute - layoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: attribute) - - let requiredPriority = ConstraintPriority.required.value - if (layoutConstraint.priority.rawValue < requiredPriority), (self.priority.constraintPriorityTargetValue != requiredPriority) { - layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue) - } - } - } - - internal func activateIfNeeded(updatingExisting: Bool = false) { - guard let item = self.from.layoutConstraintItem else { - print("WARNING: SnapKit failed to get from item from constraint. Activate will be a no-op.") - return - } - let layoutConstraints = self.layoutConstraints - - if updatingExisting { - var existingLayoutConstraints: [LayoutConstraint] = [] - for constraint in item.constraints { - existingLayoutConstraints += constraint.layoutConstraints - } - - for layoutConstraint in layoutConstraints { - let existingLayoutConstraint = existingLayoutConstraints.first { $0 == layoutConstraint } - guard let updateLayoutConstraint = existingLayoutConstraint else { - fatalError("Updated constraint could not find existing matching constraint to update: \(layoutConstraint)") - } - - let updateLayoutAttribute = (updateLayoutConstraint.secondAttribute == .notAnAttribute) ? updateLayoutConstraint.firstAttribute : updateLayoutConstraint.secondAttribute - updateLayoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: updateLayoutAttribute) - } - } else { - NSLayoutConstraint.activate(layoutConstraints) - item.add(constraints: [self]) - } - } - - internal func deactivateIfNeeded() { - guard let item = self.from.layoutConstraintItem else { - print("WARNING: SnapKit failed to get from item from constraint. Deactivate will be a no-op.") - return - } - let layoutConstraints = self.layoutConstraints - NSLayoutConstraint.deactivate(layoutConstraints) - item.remove(constraints: [self]) - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintAttributes.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintAttributes.swift deleted file mode 100644 index c1a79c2..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintAttributes.swift +++ /dev/null @@ -1,203 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -internal struct ConstraintAttributes : OptionSet, ExpressibleByIntegerLiteral { - - typealias IntegerLiteralType = UInt - - internal init(rawValue: UInt) { - self.rawValue = rawValue - } - internal init(_ rawValue: UInt) { - self.init(rawValue: rawValue) - } - internal init(nilLiteral: ()) { - self.rawValue = 0 - } - internal init(integerLiteral rawValue: IntegerLiteralType) { - self.init(rawValue: rawValue) - } - - internal private(set) var rawValue: UInt - internal static var allZeros: ConstraintAttributes { return 0 } - internal static func convertFromNilLiteral() -> ConstraintAttributes { return 0 } - internal var boolValue: Bool { return self.rawValue != 0 } - - internal func toRaw() -> UInt { return self.rawValue } - internal static func fromRaw(_ raw: UInt) -> ConstraintAttributes? { return self.init(raw) } - internal static func fromMask(_ raw: UInt) -> ConstraintAttributes { return self.init(raw) } - - // normal - - internal static let none: ConstraintAttributes = 0 - internal static let left: ConstraintAttributes = ConstraintAttributes(UInt(1) << 0) - internal static let top: ConstraintAttributes = ConstraintAttributes(UInt(1) << 1) - internal static let right: ConstraintAttributes = ConstraintAttributes(UInt(1) << 2) - internal static let bottom: ConstraintAttributes = ConstraintAttributes(UInt(1) << 3) - internal static let leading: ConstraintAttributes = ConstraintAttributes(UInt(1) << 4) - internal static let trailing: ConstraintAttributes = ConstraintAttributes(UInt(1) << 5) - internal static let width: ConstraintAttributes = ConstraintAttributes(UInt(1) << 6) - internal static let height: ConstraintAttributes = ConstraintAttributes(UInt(1) << 7) - internal static let centerX: ConstraintAttributes = ConstraintAttributes(UInt(1) << 8) - internal static let centerY: ConstraintAttributes = ConstraintAttributes(UInt(1) << 9) - internal static let lastBaseline: ConstraintAttributes = ConstraintAttributes(UInt(1) << 10) - - @available(iOS 8.0, OSX 10.11, *) - internal static let firstBaseline: ConstraintAttributes = ConstraintAttributes(UInt(1) << 11) - - @available(iOS 8.0, *) - internal static let leftMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 12) - - @available(iOS 8.0, *) - internal static let rightMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 13) - - @available(iOS 8.0, *) - internal static let topMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 14) - - @available(iOS 8.0, *) - internal static let bottomMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 15) - - @available(iOS 8.0, *) - internal static let leadingMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 16) - - @available(iOS 8.0, *) - internal static let trailingMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 17) - - @available(iOS 8.0, *) - internal static let centerXWithinMargins: ConstraintAttributes = ConstraintAttributes(UInt(1) << 18) - - @available(iOS 8.0, *) - internal static let centerYWithinMargins: ConstraintAttributes = ConstraintAttributes(UInt(1) << 19) - - // aggregates - - internal static let edges: ConstraintAttributes = [.horizontalEdges, .verticalEdges] - internal static let horizontalEdges: ConstraintAttributes = [.left, .right] - internal static let verticalEdges: ConstraintAttributes = [.top, .bottom] - internal static let directionalEdges: ConstraintAttributes = [.directionalHorizontalEdges, .directionalVerticalEdges] - internal static let directionalHorizontalEdges: ConstraintAttributes = [.leading, .trailing] - internal static let directionalVerticalEdges: ConstraintAttributes = [.top, .bottom] - internal static let size: ConstraintAttributes = [.width, .height] - internal static let center: ConstraintAttributes = [.centerX, .centerY] - - @available(iOS 8.0, *) - internal static let margins: ConstraintAttributes = [.leftMargin, .topMargin, .rightMargin, .bottomMargin] - - @available(iOS 8.0, *) - internal static let directionalMargins: ConstraintAttributes = [.leadingMargin, .topMargin, .trailingMargin, .bottomMargin] - - @available(iOS 8.0, *) - internal static let centerWithinMargins: ConstraintAttributes = [.centerXWithinMargins, .centerYWithinMargins] - - internal var layoutAttributes:[LayoutAttribute] { - var attrs = [LayoutAttribute]() - if (self.contains(ConstraintAttributes.left)) { - attrs.append(.left) - } - if (self.contains(ConstraintAttributes.top)) { - attrs.append(.top) - } - if (self.contains(ConstraintAttributes.right)) { - attrs.append(.right) - } - if (self.contains(ConstraintAttributes.bottom)) { - attrs.append(.bottom) - } - if (self.contains(ConstraintAttributes.leading)) { - attrs.append(.leading) - } - if (self.contains(ConstraintAttributes.trailing)) { - attrs.append(.trailing) - } - if (self.contains(ConstraintAttributes.width)) { - attrs.append(.width) - } - if (self.contains(ConstraintAttributes.height)) { - attrs.append(.height) - } - if (self.contains(ConstraintAttributes.centerX)) { - attrs.append(.centerX) - } - if (self.contains(ConstraintAttributes.centerY)) { - attrs.append(.centerY) - } - if (self.contains(ConstraintAttributes.lastBaseline)) { - attrs.append(.lastBaseline) - } - - #if canImport(UIKit) - if (self.contains(ConstraintAttributes.firstBaseline)) { - attrs.append(.firstBaseline) - } - if (self.contains(ConstraintAttributes.leftMargin)) { - attrs.append(.leftMargin) - } - if (self.contains(ConstraintAttributes.rightMargin)) { - attrs.append(.rightMargin) - } - if (self.contains(ConstraintAttributes.topMargin)) { - attrs.append(.topMargin) - } - if (self.contains(ConstraintAttributes.bottomMargin)) { - attrs.append(.bottomMargin) - } - if (self.contains(ConstraintAttributes.leadingMargin)) { - attrs.append(.leadingMargin) - } - if (self.contains(ConstraintAttributes.trailingMargin)) { - attrs.append(.trailingMargin) - } - if (self.contains(ConstraintAttributes.centerXWithinMargins)) { - attrs.append(.centerXWithinMargins) - } - if (self.contains(ConstraintAttributes.centerYWithinMargins)) { - attrs.append(.centerYWithinMargins) - } - #endif - - return attrs - } -} - -internal func + (left: ConstraintAttributes, right: ConstraintAttributes) -> ConstraintAttributes { - return left.union(right) -} - -internal func +=(left: inout ConstraintAttributes, right: ConstraintAttributes) { - left.formUnion(right) -} - -internal func -=(left: inout ConstraintAttributes, right: ConstraintAttributes) { - left.subtract(right) -} - -internal func ==(left: ConstraintAttributes, right: ConstraintAttributes) -> Bool { - return left.rawValue == right.rawValue -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConfig.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConfig.swift deleted file mode 100644 index 9bd0f23..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConfig.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit - public typealias ConstraintInterfaceLayoutDirection = UIUserInterfaceLayoutDirection -#else - import AppKit - public typealias ConstraintInterfaceLayoutDirection = NSUserInterfaceLayoutDirection -#endif - - -public struct ConstraintConfig { - - public static var interfaceLayoutDirection: ConstraintInterfaceLayoutDirection = .leftToRight - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConstantTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConstantTarget.swift deleted file mode 100644 index e16f503..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintConstantTarget.swift +++ /dev/null @@ -1,213 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintConstantTarget { -} - -extension CGPoint: ConstraintConstantTarget { -} - -extension CGSize: ConstraintConstantTarget { -} - -extension ConstraintInsets: ConstraintConstantTarget { -} - -#if canImport(UIKit) -@available(iOS 11.0, tvOS 11.0, *) -extension ConstraintDirectionalInsets: ConstraintConstantTarget { -} -#endif - -extension ConstraintConstantTarget { - - internal func constraintConstantTargetValueFor(layoutAttribute: LayoutAttribute) -> CGFloat { - if let value = self as? CGFloat { - return value - } - - if let value = self as? Float { - return CGFloat(value) - } - - if let value = self as? Double { - return CGFloat(value) - } - - if let value = self as? Int { - return CGFloat(value) - } - - if let value = self as? UInt { - return CGFloat(value) - } - - if let value = self as? CGSize { - if layoutAttribute == .width { - return value.width - } else if layoutAttribute == .height { - return value.height - } else { - return 0.0 - } - } - - if let value = self as? CGPoint { - #if canImport(UIKit) - switch layoutAttribute { - case .left, .right, .leading, .trailing, .centerX, .leftMargin, .rightMargin, .leadingMargin, .trailingMargin, .centerXWithinMargins: - return value.x - case .top, .bottom, .centerY, .topMargin, .bottomMargin, .centerYWithinMargins, .lastBaseline, .firstBaseline: - return value.y - case .width, .height, .notAnAttribute: - return 0.0 - #if swift(>=5.0) - @unknown default: - return 0.0 - #endif - } - #else - switch layoutAttribute { - case .left, .right, .leading, .trailing, .centerX: - return value.x - case .top, .bottom, .centerY, .lastBaseline, .firstBaseline: - return value.y - case .width, .height, .notAnAttribute: - return 0.0 - #if swift(>=5.0) - @unknown default: - return 0.0 - #endif - } - #endif - } - - if let value = self as? ConstraintInsets { - #if canImport(UIKit) - switch layoutAttribute { - case .left, .leftMargin: - return value.left - case .top, .topMargin, .firstBaseline: - return value.top - case .right, .rightMargin: - return -value.right - case .bottom, .bottomMargin, .lastBaseline: - return -value.bottom - case .leading, .leadingMargin: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right - case .trailing, .trailingMargin: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left - case .centerX, .centerXWithinMargins: - return (value.left - value.right) / 2 - case .centerY, .centerYWithinMargins: - return (value.top - value.bottom) / 2 - case .width: - return -(value.left + value.right) - case .height: - return -(value.top + value.bottom) - case .notAnAttribute: - return 0.0 - #if swift(>=5.0) - @unknown default: - return 0.0 - #endif - } - #else - switch layoutAttribute { - case .left: - return value.left - case .top, .firstBaseline: - return value.top - case .right: - return -value.right - case .bottom, .lastBaseline: - return -value.bottom - case .leading: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right - case .trailing: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left - case .centerX: - return (value.left - value.right) / 2 - case .centerY: - return (value.top - value.bottom) / 2 - case .width: - return -(value.left + value.right) - case .height: - return -(value.top + value.bottom) - case .notAnAttribute: - return 0.0 - #if swift(>=5.0) - @unknown default: - return 0.0 - #endif - } - #endif - } - - #if canImport(UIKit) - if #available(iOS 11.0, tvOS 11.0, *), let value = self as? ConstraintDirectionalInsets { - switch layoutAttribute { - case .left, .leftMargin: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.leading : value.trailing - case .top, .topMargin, .firstBaseline: - return value.top - case .right, .rightMargin: - return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.trailing : -value.leading - case .bottom, .bottomMargin, .lastBaseline: - return -value.bottom - case .leading, .leadingMargin: - return value.leading - case .trailing, .trailingMargin: - return -value.trailing - case .centerX, .centerXWithinMargins: - return (value.leading - value.trailing) / 2 - case .centerY, .centerYWithinMargins: - return (value.top - value.bottom) / 2 - case .width: - return -(value.leading + value.trailing) - case .height: - return -(value.top + value.bottom) - case .notAnAttribute: - return 0.0 - #if swift(>=5.0) - @unknown default: - return 0.0 - #else - default: - return 0.0 - #endif - } - } - #endif - - return 0.0 - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDSL.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDSL.swift deleted file mode 100644 index 5683b7f..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDSL.swift +++ /dev/null @@ -1,209 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintDSL { - - var target: AnyObject? { get } - - func setLabel(_ value: String?) - func label() -> String? - -} -extension ConstraintDSL { - - public func setLabel(_ value: String?) { - objc_setAssociatedObject(self.target as Any, &labelKey, value, .OBJC_ASSOCIATION_COPY_NONATOMIC) - } - public func label() -> String? { - return objc_getAssociatedObject(self.target as Any, &labelKey) as? String - } - -} -private var labelKey: UInt8 = 0 - - -public protocol ConstraintBasicAttributesDSL : ConstraintDSL { -} -extension ConstraintBasicAttributesDSL { - - // MARK: Basics - - public var left: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.left) - } - - public var top: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top) - } - - public var right: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.right) - } - - public var bottom: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom) - } - - public var leading: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leading) - } - - public var trailing: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailing) - } - - public var width: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.width) - } - - public var height: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height) - } - - public var centerX: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerX) - } - - public var centerY: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerY) - } - - public var edges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.edges) - } - - public var directionalEdges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalEdges) - } - - public var horizontalEdges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.horizontalEdges) - } - - public var verticalEdges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.verticalEdges) - } - - public var directionalHorizontalEdges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalHorizontalEdges) - } - - public var directionalVerticalEdges: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalVerticalEdges) - } - - public var size: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.size) - } - - public var center: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.center) - } - -} - -public protocol ConstraintAttributesDSL : ConstraintBasicAttributesDSL { -} -extension ConstraintAttributesDSL { - - // MARK: Baselines - @available(*, deprecated, renamed:"lastBaseline") - public var baseline: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline) - } - - @available(iOS 8.0, OSX 10.11, *) - public var lastBaseline: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline) - } - - @available(iOS 8.0, OSX 10.11, *) - public var firstBaseline: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.firstBaseline) - } - - // MARK: Margins - - @available(iOS 8.0, *) - public var leftMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leftMargin) - } - - @available(iOS 8.0, *) - public var topMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.topMargin) - } - - @available(iOS 8.0, *) - public var rightMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.rightMargin) - } - - @available(iOS 8.0, *) - public var bottomMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottomMargin) - } - - @available(iOS 8.0, *) - public var leadingMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leadingMargin) - } - - @available(iOS 8.0, *) - public var trailingMargin: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailingMargin) - } - - @available(iOS 8.0, *) - public var centerXWithinMargins: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerXWithinMargins) - } - - @available(iOS 8.0, *) - public var centerYWithinMargins: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerYWithinMargins) - } - - @available(iOS 8.0, *) - public var margins: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.margins) - } - - @available(iOS 8.0, *) - public var directionalMargins: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalMargins) - } - - @available(iOS 8.0, *) - public var centerWithinMargins: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerWithinMargins) - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDescription.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDescription.swift deleted file mode 100644 index b9d476c..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDescription.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class ConstraintDescription { - - internal let item: LayoutConstraintItem - internal var attributes: ConstraintAttributes - internal var relation: ConstraintRelation? = nil - internal var sourceLocation: (String, UInt)? = nil - internal var label: String? = nil - internal var related: ConstraintItem? = nil - internal var multiplier: ConstraintMultiplierTarget = 1.0 - internal var constant: ConstraintConstantTarget = 0.0 - internal var priority: ConstraintPriorityTarget = 1000.0 - internal lazy var constraint: Constraint? = { - guard let relation = self.relation, - let related = self.related, - let sourceLocation = self.sourceLocation else { - return nil - } - let from = ConstraintItem(target: self.item, attributes: self.attributes) - - return Constraint( - from: from, - to: related, - relation: relation, - sourceLocation: sourceLocation, - label: self.label, - multiplier: self.multiplier, - constant: self.constant, - priority: self.priority - ) - }() - - // MARK: Initialization - - internal init(item: LayoutConstraintItem, attributes: ConstraintAttributes) { - self.item = item - self.attributes = attributes - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift deleted file mode 100644 index 4c3c418..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) -import UIKit -#else -import AppKit -#endif - -#if canImport(UIKit) -public protocol ConstraintDirectionalInsetTarget: ConstraintConstantTarget { -} - -@available(iOS 11.0, tvOS 11.0, *) -extension ConstraintDirectionalInsets: ConstraintDirectionalInsetTarget { -} - -extension ConstraintDirectionalInsetTarget { - - @available(iOS 11.0, tvOS 11.0, *) - internal var constraintDirectionalInsetTargetValue: ConstraintDirectionalInsets { - if let amount = self as? ConstraintDirectionalInsets { - return amount - } else { - return ConstraintDirectionalInsets(top: 0, leading: 0, bottom: 0, trailing: 0) - } - } -} -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift deleted file mode 100644 index 056b5c8..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -#if canImport(UIKit) - @available(iOS 11.0, tvOS 11.0, *) - public typealias ConstraintDirectionalInsets = NSDirectionalEdgeInsets -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsetTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsetTarget.swift deleted file mode 100644 index 43c0220..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsetTarget.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintInsetTarget: ConstraintConstantTarget { -} - -extension Int: ConstraintInsetTarget { -} - -extension UInt: ConstraintInsetTarget { -} - -extension Float: ConstraintInsetTarget { -} - -extension Double: ConstraintInsetTarget { -} - -extension CGFloat: ConstraintInsetTarget { -} - -extension ConstraintInsets: ConstraintInsetTarget { -} - -extension ConstraintInsetTarget { - - internal var constraintInsetTargetValue: ConstraintInsets { - if let amount = self as? ConstraintInsets { - return amount - } else if let amount = self as? Float { - return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount)) - } else if let amount = self as? Double { - return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount)) - } else if let amount = self as? CGFloat { - return ConstraintInsets(top: amount, left: amount, bottom: amount, right: amount) - } else if let amount = self as? Int { - return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount)) - } else if let amount = self as? UInt { - return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount)) - } else { - return ConstraintInsets(top: 0, left: 0, bottom: 0, right: 0) - } - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsets.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsets.swift deleted file mode 100644 index 64d781d..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintInsets.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -#if canImport(UIKit) - public typealias ConstraintInsets = UIEdgeInsets -#else - public typealias ConstraintInsets = NSEdgeInsets -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintItem.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintItem.swift deleted file mode 100644 index 2f92221..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintItem.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public final class ConstraintItem { - - internal weak var target: AnyObject? - internal let attributes: ConstraintAttributes - - internal init(target: AnyObject?, attributes: ConstraintAttributes) { - self.target = target - self.attributes = attributes - } - - internal var layoutConstraintItem: LayoutConstraintItem? { - return self.target as? LayoutConstraintItem - } - -} - -public func ==(lhs: ConstraintItem, rhs: ConstraintItem) -> Bool { - // pointer equality - guard lhs !== rhs else { - return true - } - - // must both have valid targets and identical attributes - guard let target1 = lhs.target, - let target2 = rhs.target, - target1 === target2 && lhs.attributes == rhs.attributes else { - return false - } - - return true -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift deleted file mode 100644 index e9fd9b3..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#endif - - -@available(iOS 9.0, OSX 10.11, *) -public extension ConstraintLayoutGuide { - - var snp: ConstraintLayoutGuideDSL { - return ConstraintLayoutGuideDSL(guide: self) - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift deleted file mode 100644 index fd89556..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -#if canImport(UIKit) - @available(iOS 9.0, *) - public typealias ConstraintLayoutGuide = UILayoutGuide -#else - @available(OSX 10.11, *) - public typealias ConstraintLayoutGuide = NSLayoutGuide -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift deleted file mode 100644 index 7e78261..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -@available(iOS 9.0, OSX 10.11, *) -public struct ConstraintLayoutGuideDSL: ConstraintAttributesDSL { - - @discardableResult - public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] { - return ConstraintMaker.prepareConstraints(item: self.guide, closure: closure) - } - - public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.makeConstraints(item: self.guide, closure: closure) - } - - public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.remakeConstraints(item: self.guide, closure: closure) - } - - public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.updateConstraints(item: self.guide, closure: closure) - } - - public func removeConstraints() { - ConstraintMaker.removeConstraints(item: self.guide) - } - - public var target: AnyObject? { - return self.guide - } - - internal let guide: ConstraintLayoutGuide - - internal init(guide: ConstraintLayoutGuide) { - self.guide = guide - - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift deleted file mode 100644 index 085f5cd..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -#if canImport(UIKit) - @available(iOS 8.0, *) - public typealias ConstraintLayoutSupport = UILayoutSupport -#else - public class ConstraintLayoutSupport {} -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift deleted file mode 100644 index 71e1158..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -@available(iOS 8.0, *) -public struct ConstraintLayoutSupportDSL: ConstraintDSL { - - public var target: AnyObject? { - return self.support - } - - internal let support: ConstraintLayoutSupport - - internal init(support: ConstraintLayoutSupport) { - self.support = support - - } - - public var top: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top) - } - - public var bottom: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom) - } - - public var height: ConstraintItem { - return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height) - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMaker.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMaker.swift deleted file mode 100644 index 7c352f6..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMaker.swift +++ /dev/null @@ -1,224 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - -public class ConstraintMaker { - - public var left: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.left) - } - - public var top: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.top) - } - - public var bottom: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.bottom) - } - - public var right: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.right) - } - - public var leading: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.leading) - } - - public var trailing: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.trailing) - } - - public var width: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.width) - } - - public var height: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.height) - } - - public var centerX: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.centerX) - } - - public var centerY: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.centerY) - } - - @available(*, deprecated, renamed:"lastBaseline") - public var baseline: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.lastBaseline) - } - - public var lastBaseline: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.lastBaseline) - } - - @available(iOS 8.0, OSX 10.11, *) - public var firstBaseline: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.firstBaseline) - } - - @available(iOS 8.0, *) - public var leftMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.leftMargin) - } - - @available(iOS 8.0, *) - public var rightMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.rightMargin) - } - - @available(iOS 8.0, *) - public var topMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.topMargin) - } - - @available(iOS 8.0, *) - public var bottomMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.bottomMargin) - } - - @available(iOS 8.0, *) - public var leadingMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.leadingMargin) - } - - @available(iOS 8.0, *) - public var trailingMargin: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.trailingMargin) - } - - @available(iOS 8.0, *) - public var centerXWithinMargins: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.centerXWithinMargins) - } - - @available(iOS 8.0, *) - public var centerYWithinMargins: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.centerYWithinMargins) - } - - public var edges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.edges) - } - public var horizontalEdges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.horizontalEdges) - } - public var verticalEdges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.verticalEdges) - } - public var directionalEdges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.directionalEdges) - } - public var directionalHorizontalEdges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.directionalHorizontalEdges) - } - public var directionalVerticalEdges: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.directionalVerticalEdges) - } - public var size: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.size) - } - public var center: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.center) - } - - @available(iOS 8.0, *) - public var margins: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.margins) - } - - @available(iOS 8.0, *) - public var directionalMargins: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.directionalMargins) - } - - @available(iOS 8.0, *) - public var centerWithinMargins: ConstraintMakerExtendable { - return self.makeExtendableWithAttributes(.centerWithinMargins) - } - - public let item: LayoutConstraintItem - private var descriptions = [ConstraintDescription]() - - internal init(item: LayoutConstraintItem) { - self.item = item - self.item.prepare() - } - - internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable { - let description = ConstraintDescription(item: self.item, attributes: attributes) - self.descriptions.append(description) - return ConstraintMakerExtendable(description) - } - - internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] { - let maker = ConstraintMaker(item: item) - closure(maker) - var constraints: [Constraint] = [] - for description in maker.descriptions { - guard let constraint = description.constraint else { - continue - } - constraints.append(constraint) - } - return constraints - } - - internal static func makeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) { - let constraints = prepareConstraints(item: item, closure: closure) - for constraint in constraints { - constraint.activateIfNeeded(updatingExisting: false) - } - } - - internal static func remakeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) { - self.removeConstraints(item: item) - self.makeConstraints(item: item, closure: closure) - } - - internal static func updateConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) { - guard item.constraints.count > 0 else { - self.makeConstraints(item: item, closure: closure) - return - } - - let constraints = prepareConstraints(item: item, closure: closure) - for constraint in constraints { - constraint.activateIfNeeded(updatingExisting: true) - } - } - - internal static func removeConstraints(item: LayoutConstraintItem) { - let constraints = item.constraints - for constraint in constraints { - constraint.deactivateIfNeeded() - } - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerEditable.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerEditable.swift deleted file mode 100644 index 0e08e38..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerEditable.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class ConstraintMakerEditable: ConstraintMakerPrioritizable { - - @discardableResult - public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable { - self.description.multiplier = amount - return self - } - - @discardableResult - public func dividedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable { - return self.multipliedBy(1.0 / amount.constraintMultiplierTargetValue) - } - - @discardableResult - public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable { - self.description.constant = amount.constraintOffsetTargetValue - return self - } - - @discardableResult - public func inset(_ amount: ConstraintInsetTarget) -> ConstraintMakerEditable { - self.description.constant = amount.constraintInsetTargetValue - return self - } - - #if canImport(UIKit) - @discardableResult - @available(iOS 11.0, tvOS 11.0, *) - public func inset(_ amount: ConstraintDirectionalInsetTarget) -> ConstraintMakerEditable { - self.description.constant = amount.constraintDirectionalInsetTargetValue - return self - } - #endif -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift deleted file mode 100644 index b30688e..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift +++ /dev/null @@ -1,195 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class ConstraintMakerExtendable: ConstraintMakerRelatable { - - public var left: ConstraintMakerExtendable { - self.description.attributes += .left - return self - } - - public var top: ConstraintMakerExtendable { - self.description.attributes += .top - return self - } - - public var bottom: ConstraintMakerExtendable { - self.description.attributes += .bottom - return self - } - - public var right: ConstraintMakerExtendable { - self.description.attributes += .right - return self - } - - public var leading: ConstraintMakerExtendable { - self.description.attributes += .leading - return self - } - - public var trailing: ConstraintMakerExtendable { - self.description.attributes += .trailing - return self - } - - public var width: ConstraintMakerExtendable { - self.description.attributes += .width - return self - } - - public var height: ConstraintMakerExtendable { - self.description.attributes += .height - return self - } - - public var centerX: ConstraintMakerExtendable { - self.description.attributes += .centerX - return self - } - - public var centerY: ConstraintMakerExtendable { - self.description.attributes += .centerY - return self - } - - @available(*, deprecated, renamed:"lastBaseline") - public var baseline: ConstraintMakerExtendable { - self.description.attributes += .lastBaseline - return self - } - - public var lastBaseline: ConstraintMakerExtendable { - self.description.attributes += .lastBaseline - return self - } - - @available(iOS 8.0, OSX 10.11, *) - public var firstBaseline: ConstraintMakerExtendable { - self.description.attributes += .firstBaseline - return self - } - - @available(iOS 8.0, *) - public var leftMargin: ConstraintMakerExtendable { - self.description.attributes += .leftMargin - return self - } - - @available(iOS 8.0, *) - public var rightMargin: ConstraintMakerExtendable { - self.description.attributes += .rightMargin - return self - } - - @available(iOS 8.0, *) - public var topMargin: ConstraintMakerExtendable { - self.description.attributes += .topMargin - return self - } - - @available(iOS 8.0, *) - public var bottomMargin: ConstraintMakerExtendable { - self.description.attributes += .bottomMargin - return self - } - - @available(iOS 8.0, *) - public var leadingMargin: ConstraintMakerExtendable { - self.description.attributes += .leadingMargin - return self - } - - @available(iOS 8.0, *) - public var trailingMargin: ConstraintMakerExtendable { - self.description.attributes += .trailingMargin - return self - } - - @available(iOS 8.0, *) - public var centerXWithinMargins: ConstraintMakerExtendable { - self.description.attributes += .centerXWithinMargins - return self - } - - @available(iOS 8.0, *) - public var centerYWithinMargins: ConstraintMakerExtendable { - self.description.attributes += .centerYWithinMargins - return self - } - - public var edges: ConstraintMakerExtendable { - self.description.attributes += .edges - return self - } - public var horizontalEdges: ConstraintMakerExtendable { - self.description.attributes += .horizontalEdges - return self - } - public var verticalEdges: ConstraintMakerExtendable { - self.description.attributes += .verticalEdges - return self - } - public var directionalEdges: ConstraintMakerExtendable { - self.description.attributes += .directionalEdges - return self - } - public var directionalHorizontalEdges: ConstraintMakerExtendable { - self.description.attributes += .directionalHorizontalEdges - return self - } - public var directionalVerticalEdges: ConstraintMakerExtendable { - self.description.attributes += .directionalVerticalEdges - return self - } - public var size: ConstraintMakerExtendable { - self.description.attributes += .size - return self - } - - @available(iOS 8.0, *) - public var margins: ConstraintMakerExtendable { - self.description.attributes += .margins - return self - } - - @available(iOS 8.0, *) - public var directionalMargins: ConstraintMakerExtendable { - self.description.attributes += .directionalMargins - return self - } - - @available(iOS 8.0, *) - public var centerWithinMargins: ConstraintMakerExtendable { - self.description.attributes += .centerWithinMargins - return self - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift deleted file mode 100644 index 8342476..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class ConstraintMakerFinalizable { - - internal let description: ConstraintDescription - - internal init(_ description: ConstraintDescription) { - self.description = description - } - - @discardableResult - public func labeled(_ label: String) -> ConstraintMakerFinalizable { - self.description.label = label - return self - } - - public var constraint: Constraint { - return self.description.constraint! - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift deleted file mode 100644 index 05451e6..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - -@available(*, deprecated, message:"Use ConstraintMakerPrioritizable instead.") -public typealias ConstraintMakerPriortizable = ConstraintMakerPrioritizable - -public class ConstraintMakerPrioritizable: ConstraintMakerFinalizable { - - @discardableResult - public func priority(_ amount: ConstraintPriority) -> ConstraintMakerFinalizable { - self.description.priority = amount.value - return self - } - - @discardableResult - public func priority(_ amount: ConstraintPriorityTarget) -> ConstraintMakerFinalizable { - self.description.priority = amount - return self - } - - @available(*, deprecated, message:"Use priority(.required) instead.") - @discardableResult - public func priorityRequired() -> ConstraintMakerFinalizable { - return self.priority(.required) - } - - @available(*, deprecated, message:"Use priority(.high) instead.") - @discardableResult - public func priorityHigh() -> ConstraintMakerFinalizable { - return self.priority(.high) - } - - @available(*, deprecated, message:"Use priority(.medium) instead.") - @discardableResult - public func priorityMedium() -> ConstraintMakerFinalizable { - return self.priority(.medium) - } - - @available(*, deprecated, message:"Use priority(.low) instead.") - @discardableResult - public func priorityLow() -> ConstraintMakerFinalizable { - return self.priority(.low) - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift deleted file mode 100644 index bfde272..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -extension ConstraintMakerRelatable { - - @discardableResult - public func equalToSuperview(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.") - } - return self.relatedTo(closure(other), relation: .equal, file: file, line: line) - } - - @discardableResult - public func lessThanOrEqualToSuperview(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `lessThanOrEqualToSuperview`.") - } - return self.relatedTo(closure(other), relation: .lessThanOrEqual, file: file, line: line) - } - - @discardableResult - public func greaterThanOrEqualToSuperview(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `greaterThanOrEqualToSuperview`.") - } - return self.relatedTo(closure(other), relation: .greaterThanOrEqual, file: file, line: line) - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift deleted file mode 100644 index 0a3d5ee..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift +++ /dev/null @@ -1,115 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class ConstraintMakerRelatable { - - internal let description: ConstraintDescription - - internal init(_ description: ConstraintDescription) { - self.description = description - } - - internal func relatedTo(_ other: ConstraintRelatableTarget, relation: ConstraintRelation, file: String, line: UInt) -> ConstraintMakerEditable { - let related: ConstraintItem - let constant: ConstraintConstantTarget - - if let other = other as? ConstraintItem { - guard other.attributes == ConstraintAttributes.none || - other.attributes.layoutAttributes.count <= 1 || - other.attributes.layoutAttributes == self.description.attributes.layoutAttributes || - other.attributes == .edges && self.description.attributes == .margins || - other.attributes == .margins && self.description.attributes == .edges || - other.attributes == .directionalEdges && self.description.attributes == .directionalMargins || - other.attributes == .directionalMargins && self.description.attributes == .directionalEdges else { - fatalError("Cannot constraint to multiple non identical attributes. (\(file), \(line))"); - } - - related = other - constant = 0.0 - } else if let other = other as? ConstraintView { - related = ConstraintItem(target: other, attributes: ConstraintAttributes.none) - constant = 0.0 - } else if let other = other as? ConstraintConstantTarget { - related = ConstraintItem(target: nil, attributes: ConstraintAttributes.none) - constant = other - } else if #available(iOS 9.0, OSX 10.11, *), let other = other as? ConstraintLayoutGuide { - related = ConstraintItem(target: other, attributes: ConstraintAttributes.none) - constant = 0.0 - } else { - fatalError("Invalid constraint. (\(file), \(line))") - } - - let editable = ConstraintMakerEditable(self.description) - editable.description.sourceLocation = (file, line) - editable.description.relation = relation - editable.description.related = related - editable.description.constant = constant - return editable - } - - @discardableResult - public func equalTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable { - return self.relatedTo(other, relation: .equal, file: file, line: line) - } - - @discardableResult - public func equalToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.") - } - return self.relatedTo(other, relation: .equal, file: file, line: line) - } - - @discardableResult - public func lessThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable { - return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line) - } - - @discardableResult - public func lessThanOrEqualToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `lessThanOrEqualToSuperview`.") - } - return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line) - } - - @discardableResult - public func greaterThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable { - return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line) - } - - @discardableResult - public func greaterThanOrEqualToSuperview(_ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable { - guard let other = self.description.item.superview else { - fatalError("Expected superview but found nil when attempting make constraint `greaterThanOrEqualToSuperview`.") - } - return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line) - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift deleted file mode 100644 index ac537ba..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintMultiplierTarget { - - var constraintMultiplierTargetValue: CGFloat { get } - -} - -extension Int: ConstraintMultiplierTarget { - - public var constraintMultiplierTargetValue: CGFloat { - return CGFloat(self) - } - -} - -extension UInt: ConstraintMultiplierTarget { - - public var constraintMultiplierTargetValue: CGFloat { - return CGFloat(self) - } - -} - -extension Float: ConstraintMultiplierTarget { - - public var constraintMultiplierTargetValue: CGFloat { - return CGFloat(self) - } - -} - -extension Double: ConstraintMultiplierTarget { - - public var constraintMultiplierTargetValue: CGFloat { - return CGFloat(self) - } - -} - -extension CGFloat: ConstraintMultiplierTarget { - - public var constraintMultiplierTargetValue: CGFloat { - return self - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift deleted file mode 100644 index 6ec1107..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintOffsetTarget: ConstraintConstantTarget { -} - -extension Int: ConstraintOffsetTarget { -} - -extension UInt: ConstraintOffsetTarget { -} - -extension Float: ConstraintOffsetTarget { -} - -extension Double: ConstraintOffsetTarget { -} - -extension CGFloat: ConstraintOffsetTarget { -} - -extension ConstraintOffsetTarget { - - internal var constraintOffsetTargetValue: CGFloat { - let offset: CGFloat - if let amount = self as? Float { - offset = CGFloat(amount) - } else if let amount = self as? Double { - offset = CGFloat(amount) - } else if let amount = self as? CGFloat { - offset = CGFloat(amount) - } else if let amount = self as? Int { - offset = CGFloat(amount) - } else if let amount = self as? UInt { - offset = CGFloat(amount) - } else { - offset = 0.0 - } - return offset - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriority.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriority.swift deleted file mode 100644 index bf90693..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriority.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - -public struct ConstraintPriority : ExpressibleByFloatLiteral, Equatable, Strideable { - public typealias FloatLiteralType = Float - - public let value: Float - - public init(floatLiteral value: Float) { - self.value = value - } - - public init(_ value: Float) { - self.value = value - } - - public static var required: ConstraintPriority { - return 1000.0 - } - - public static var high: ConstraintPriority { - return 750.0 - } - - public static var medium: ConstraintPriority { - #if os(OSX) - return 501.0 - #else - return 500.0 - #endif - - } - - public static var low: ConstraintPriority { - return 250.0 - } - - public static func ==(lhs: ConstraintPriority, rhs: ConstraintPriority) -> Bool { - return lhs.value == rhs.value - } - - // MARK: Strideable - - public func advanced(by n: FloatLiteralType) -> ConstraintPriority { - return ConstraintPriority(floatLiteral: value + n) - } - - public func distance(to other: ConstraintPriority) -> FloatLiteralType { - return other.value - value - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift deleted file mode 100644 index 1aa701e..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift +++ /dev/null @@ -1,85 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintPriorityTarget { - - var constraintPriorityTargetValue: Float { get } - -} - -extension Int: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return Float(self) - } - -} - -extension UInt: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return Float(self) - } - -} - -extension Float: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return self - } - -} - -extension Double: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return Float(self) - } - -} - -extension CGFloat: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return Float(self) - } - -} - -#if canImport(UIKit) -extension UILayoutPriority: ConstraintPriorityTarget { - - public var constraintPriorityTargetValue: Float { - return self.rawValue - } - -} -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift deleted file mode 100644 index df04464..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol ConstraintRelatableTarget { -} - -extension Int: ConstraintRelatableTarget { -} - -extension UInt: ConstraintRelatableTarget { -} - -extension Float: ConstraintRelatableTarget { -} - -extension Double: ConstraintRelatableTarget { -} - -extension CGFloat: ConstraintRelatableTarget { -} - -extension CGSize: ConstraintRelatableTarget { -} - -extension CGPoint: ConstraintRelatableTarget { -} - -extension ConstraintInsets: ConstraintRelatableTarget { -} - -#if canImport(UIKit) -@available(iOS 11.0, tvOS 11.0, *) -extension ConstraintDirectionalInsets: ConstraintRelatableTarget { -} -#endif - -extension ConstraintItem: ConstraintRelatableTarget { -} - -extension ConstraintView: ConstraintRelatableTarget { -} - -@available(iOS 9.0, OSX 10.11, *) -extension ConstraintLayoutGuide: ConstraintRelatableTarget { -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelation.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelation.swift deleted file mode 100644 index 643d499..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintRelation.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -internal enum ConstraintRelation : Int { - case equal = 1 - case lessThanOrEqual - case greaterThanOrEqual - - internal var layoutRelation: LayoutRelation { - get { - switch(self) { - case .equal: - return .equal - case .lessThanOrEqual: - return .lessThanOrEqual - case .greaterThanOrEqual: - return .greaterThanOrEqual - } - } - } -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView+Extensions.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView+Extensions.swift deleted file mode 100644 index 1225c04..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView+Extensions.swift +++ /dev/null @@ -1,152 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public extension ConstraintView { - - @available(*, deprecated, renamed:"snp.left") - var snp_left: ConstraintItem { return self.snp.left } - - @available(*, deprecated, renamed:"snp.top") - var snp_top: ConstraintItem { return self.snp.top } - - @available(*, deprecated, renamed:"snp.right") - var snp_right: ConstraintItem { return self.snp.right } - - @available(*, deprecated, renamed:"snp.bottom") - var snp_bottom: ConstraintItem { return self.snp.bottom } - - @available(*, deprecated, renamed:"snp.leading") - var snp_leading: ConstraintItem { return self.snp.leading } - - @available(*, deprecated, renamed:"snp.trailing") - var snp_trailing: ConstraintItem { return self.snp.trailing } - - @available(*, deprecated, renamed:"snp.width") - var snp_width: ConstraintItem { return self.snp.width } - - @available(*, deprecated, renamed:"snp.height") - var snp_height: ConstraintItem { return self.snp.height } - - @available(*, deprecated, renamed:"snp.centerX") - var snp_centerX: ConstraintItem { return self.snp.centerX } - - @available(*, deprecated, renamed:"snp.centerY") - var snp_centerY: ConstraintItem { return self.snp.centerY } - - @available(*, deprecated, renamed:"snp.baseline") - var snp_baseline: ConstraintItem { return self.snp.baseline } - - @available(*, deprecated, renamed:"snp.lastBaseline") - @available(iOS 8.0, OSX 10.11, *) - var snp_lastBaseline: ConstraintItem { return self.snp.lastBaseline } - - @available(iOS, deprecated, renamed:"snp.firstBaseline") - @available(iOS 8.0, OSX 10.11, *) - var snp_firstBaseline: ConstraintItem { return self.snp.firstBaseline } - - @available(iOS, deprecated, renamed:"snp.leftMargin") - @available(iOS 8.0, *) - var snp_leftMargin: ConstraintItem { return self.snp.leftMargin } - - @available(iOS, deprecated, renamed:"snp.topMargin") - @available(iOS 8.0, *) - var snp_topMargin: ConstraintItem { return self.snp.topMargin } - - @available(iOS, deprecated, renamed:"snp.rightMargin") - @available(iOS 8.0, *) - var snp_rightMargin: ConstraintItem { return self.snp.rightMargin } - - @available(iOS, deprecated, renamed:"snp.bottomMargin") - @available(iOS 8.0, *) - var snp_bottomMargin: ConstraintItem { return self.snp.bottomMargin } - - @available(iOS, deprecated, renamed:"snp.leadingMargin") - @available(iOS 8.0, *) - var snp_leadingMargin: ConstraintItem { return self.snp.leadingMargin } - - @available(iOS, deprecated, renamed:"snp.trailingMargin") - @available(iOS 8.0, *) - var snp_trailingMargin: ConstraintItem { return self.snp.trailingMargin } - - @available(iOS, deprecated, renamed:"snp.centerXWithinMargins") - @available(iOS 8.0, *) - var snp_centerXWithinMargins: ConstraintItem { return self.snp.centerXWithinMargins } - - @available(iOS, deprecated, renamed:"snp.centerYWithinMargins") - @available(iOS 8.0, *) - var snp_centerYWithinMargins: ConstraintItem { return self.snp.centerYWithinMargins } - - @available(*, deprecated, renamed:"snp.edges") - var snp_edges: ConstraintItem { return self.snp.edges } - - @available(*, deprecated, renamed:"snp.size") - var snp_size: ConstraintItem { return self.snp.size } - - @available(*, deprecated, renamed:"snp.center") - var snp_center: ConstraintItem { return self.snp.center } - - @available(iOS, deprecated, renamed:"snp.margins") - @available(iOS 8.0, *) - var snp_margins: ConstraintItem { return self.snp.margins } - - @available(iOS, deprecated, renamed:"snp.centerWithinMargins") - @available(iOS 8.0, *) - var snp_centerWithinMargins: ConstraintItem { return self.snp.centerWithinMargins } - - @available(*, deprecated, renamed:"snp.prepareConstraints(_:)") - func snp_prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] { - return self.snp.prepareConstraints(closure) - } - - @available(*, deprecated, renamed:"snp.makeConstraints(_:)") - func snp_makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - self.snp.makeConstraints(closure) - } - - @available(*, deprecated, renamed:"snp.remakeConstraints(_:)") - func snp_remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - self.snp.remakeConstraints(closure) - } - - @available(*, deprecated, renamed:"snp.updateConstraints(_:)") - func snp_updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - self.snp.updateConstraints(closure) - } - - @available(*, deprecated, renamed:"snp.removeConstraints()") - func snp_removeConstraints() { - self.snp.removeConstraints() - } - - var snp: ConstraintViewDSL { - return ConstraintViewDSL(view: self) - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView.swift deleted file mode 100644 index 1203300..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintView.swift +++ /dev/null @@ -1,35 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -#if canImport(UIKit) - public typealias ConstraintView = UIView -#else - public typealias ConstraintView = NSView -#endif diff --git a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintViewDSL.swift b/ReadViewDemo/Pods/SnapKit/Sources/ConstraintViewDSL.swift deleted file mode 100644 index 8567e54..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/ConstraintViewDSL.swift +++ /dev/null @@ -1,101 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public struct ConstraintViewDSL: ConstraintAttributesDSL { - - @discardableResult - public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] { - return ConstraintMaker.prepareConstraints(item: self.view, closure: closure) - } - - public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.makeConstraints(item: self.view, closure: closure) - } - - public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.remakeConstraints(item: self.view, closure: closure) - } - - public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) { - ConstraintMaker.updateConstraints(item: self.view, closure: closure) - } - - public func removeConstraints() { - ConstraintMaker.removeConstraints(item: self.view) - } - - public var contentHuggingHorizontalPriority: Float { - get { - return self.view.contentHuggingPriority(for: .horizontal).rawValue - } - nonmutating set { - self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .horizontal) - } - } - - public var contentHuggingVerticalPriority: Float { - get { - return self.view.contentHuggingPriority(for: .vertical).rawValue - } - nonmutating set { - self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .vertical) - } - } - - public var contentCompressionResistanceHorizontalPriority: Float { - get { - return self.view.contentCompressionResistancePriority(for: .horizontal).rawValue - } - nonmutating set { - self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .horizontal) - } - } - - public var contentCompressionResistanceVerticalPriority: Float { - get { - return self.view.contentCompressionResistancePriority(for: .vertical).rawValue - } - nonmutating set { - self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .vertical) - } - } - - public var target: AnyObject? { - return self.view - } - - internal let view: ConstraintView - - internal init(view: ConstraintView) { - self.view = view - - } - -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/Debugging.swift b/ReadViewDemo/Pods/SnapKit/Sources/Debugging.swift deleted file mode 100644 index f4120b2..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/Debugging.swift +++ /dev/null @@ -1,169 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - -public extension LayoutConstraint { - - override var description: String { - var description = "<" - - description += descriptionForObject(self) - - if let firstItem = conditionalOptional(from: self.firstItem) { - description += " \(descriptionForObject(firstItem))" - } - - if self.firstAttribute != .notAnAttribute { - description += ".\(descriptionForAttribute(self.firstAttribute))" - } - - description += " \(descriptionForRelation(self.relation))" - - if let secondItem = self.secondItem { - description += " \(descriptionForObject(secondItem))" - } - - if self.secondAttribute != .notAnAttribute { - description += ".\(descriptionForAttribute(self.secondAttribute))" - } - - if self.multiplier != 1.0 { - description += " * \(self.multiplier)" - } - - if self.secondAttribute == .notAnAttribute { - description += " \(self.constant)" - } else { - if self.constant > 0.0 { - description += " + \(self.constant)" - } else if self.constant < 0.0 { - description += " - \(abs(self.constant))" - } - } - - if self.priority.rawValue != 1000.0 { - description += " ^\(self.priority)" - } - - description += ">" - - return description - } - -} - -private func descriptionForRelation(_ relation: LayoutRelation) -> String { - switch relation { - case .equal: return "==" - case .greaterThanOrEqual: return ">=" - case .lessThanOrEqual: return "<=" - #if swift(>=5.0) - @unknown default: return "unknown" - #endif - } -} - -private func descriptionForAttribute(_ attribute: LayoutAttribute) -> String { - #if canImport(UIKit) - switch attribute { - case .notAnAttribute: return "notAnAttribute" - case .top: return "top" - case .left: return "left" - case .bottom: return "bottom" - case .right: return "right" - case .leading: return "leading" - case .trailing: return "trailing" - case .width: return "width" - case .height: return "height" - case .centerX: return "centerX" - case .centerY: return "centerY" - case .lastBaseline: return "lastBaseline" - case .firstBaseline: return "firstBaseline" - case .topMargin: return "topMargin" - case .leftMargin: return "leftMargin" - case .bottomMargin: return "bottomMargin" - case .rightMargin: return "rightMargin" - case .leadingMargin: return "leadingMargin" - case .trailingMargin: return "trailingMargin" - case .centerXWithinMargins: return "centerXWithinMargins" - case .centerYWithinMargins: return "centerYWithinMargins" - #if swift(>=5.0) - @unknown default: return "unknown" - #endif - } - #else - switch attribute { - case .notAnAttribute: return "notAnAttribute" - case .top: return "top" - case .left: return "left" - case .bottom: return "bottom" - case .right: return "right" - case .leading: return "leading" - case .trailing: return "trailing" - case .width: return "width" - case .height: return "height" - case .centerX: return "centerX" - case .centerY: return "centerY" - case .lastBaseline: return "lastBaseline" - case .firstBaseline: return "firstBaseline" - #if swift(>=5.0) - @unknown default: return "unknown" - #endif - } - #endif -} - -private func conditionalOptional(from object: Optional) -> Optional { - return object -} - -private func conditionalOptional(from object: T) -> Optional { - return Optional.some(object) -} - -private func descriptionForObject(_ object: AnyObject) -> String { - let pointerDescription = String(format: "%p", UInt(bitPattern: ObjectIdentifier(object))) - var desc = "" - - desc += type(of: object).description() - - if let object = object as? ConstraintView { - desc += ":\(object.snp.label() ?? pointerDescription)" - } else if let object = object as? LayoutConstraint { - desc += ":\(object.label ?? pointerDescription)" - } else { - desc += ":\(pointerDescription)" - } - - if let object = object as? LayoutConstraint, let file = object.constraint?.sourceLocation.0, let line = object.constraint?.sourceLocation.1 { - desc += "@\((file as NSString).lastPathComponent)#\(line)" - } - - desc += "" - return desc -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraint.swift b/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraint.swift deleted file mode 100644 index 607616d..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraint.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public class LayoutConstraint : NSLayoutConstraint { - - public var label: String? { - get { - return self.identifier - } - set { - self.identifier = newValue - } - } - - internal weak var constraint: Constraint? = nil - -} - -internal func ==(lhs: LayoutConstraint, rhs: LayoutConstraint) -> Bool { - // If firstItem or secondItem on either constraint has a dangling pointer - // this comparison can cause a crash. The solution for this is to ensure - // your layout code hold strong references to things like Views, LayoutGuides - // and LayoutAnchors as SnapKit will not keep strong references to any of these. - guard lhs.firstAttribute == rhs.firstAttribute && - lhs.secondAttribute == rhs.secondAttribute && - lhs.relation == rhs.relation && - lhs.priority == rhs.priority && - lhs.multiplier == rhs.multiplier && - lhs.secondItem === rhs.secondItem && - lhs.firstItem === rhs.firstItem else { - return false - } - return true -} diff --git a/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraintItem.swift b/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraintItem.swift deleted file mode 100644 index 4f41b5d..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/LayoutConstraintItem.swift +++ /dev/null @@ -1,93 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#else - import AppKit -#endif - - -public protocol LayoutConstraintItem: AnyObject { -} - -@available(iOS 9.0, OSX 10.11, *) -extension ConstraintLayoutGuide : LayoutConstraintItem { -} - -extension ConstraintView : LayoutConstraintItem { -} - - -extension LayoutConstraintItem { - - internal func prepare() { - if let view = self as? ConstraintView { - view.translatesAutoresizingMaskIntoConstraints = false - } - } - - internal var superview: ConstraintView? { - if let view = self as? ConstraintView { - return view.superview - } - - if #available(iOS 9.0, OSX 10.11, *), let guide = self as? ConstraintLayoutGuide { - return guide.owningView - } - - return nil - } - internal var constraints: [Constraint] { - return self.constraintsSet.allObjects as! [Constraint] - } - - internal func add(constraints: [Constraint]) { - let constraintsSet = self.constraintsSet - for constraint in constraints { - constraintsSet.add(constraint) - } - } - - internal func remove(constraints: [Constraint]) { - let constraintsSet = self.constraintsSet - for constraint in constraints { - constraintsSet.remove(constraint) - } - } - - private var constraintsSet: NSMutableSet { - let constraintsSet: NSMutableSet - - if let existing = objc_getAssociatedObject(self, &constraintsKey) as? NSMutableSet { - constraintsSet = existing - } else { - constraintsSet = NSMutableSet() - objc_setAssociatedObject(self, &constraintsKey, constraintsSet, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - return constraintsSet - - } - -} -private var constraintsKey: UInt8 = 0 diff --git a/ReadViewDemo/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy b/ReadViewDemo/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy deleted file mode 100644 index e540750..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,14 +0,0 @@ - - - - - NSPrivacyTracking - - NSPrivacyAccessedAPITypes - - NSPrivacyCollectedDataTypes - - NSPrivacyTrackingDomains - - - diff --git a/ReadViewDemo/Pods/SnapKit/Sources/Typealiases.swift b/ReadViewDemo/Pods/SnapKit/Sources/Typealiases.swift deleted file mode 100644 index c0e6982..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/Typealiases.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Foundation - -#if canImport(UIKit) - import UIKit -#if swift(>=4.2) - typealias LayoutRelation = NSLayoutConstraint.Relation - typealias LayoutAttribute = NSLayoutConstraint.Attribute -#else - typealias LayoutRelation = NSLayoutRelation - typealias LayoutAttribute = NSLayoutAttribute -#endif - typealias LayoutPriority = UILayoutPriority -#else - import AppKit - typealias LayoutRelation = NSLayoutConstraint.Relation - typealias LayoutAttribute = NSLayoutConstraint.Attribute - typealias LayoutPriority = NSLayoutConstraint.Priority -#endif - diff --git a/ReadViewDemo/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift b/ReadViewDemo/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift deleted file mode 100644 index 801cc3c..0000000 --- a/ReadViewDemo/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SnapKit -// -// Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#if canImport(UIKit) - import UIKit -#endif - - -@available(iOS 8.0, *) -public extension ConstraintLayoutSupport { - - var snp: ConstraintLayoutSupportDSL { - return ConstraintLayoutSupportDSL(support: self) - } - -} diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.markdown b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.markdown index f37645f..c99ec56 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.markdown +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.markdown @@ -53,29 +53,6 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## SnapKit - -Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - ## ZIPFoundation MIT License diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.plist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.plist index fa59cd4..11337d9 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.plist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-acknowledgements.plist @@ -76,35 +76,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Type PSGroupSpecifier - - FooterText - Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - SnapKit - Type - PSGroupSpecifier - FooterText MIT License diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist index 5b0981a..18a9ff0 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist @@ -2,6 +2,4 @@ ${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks ${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework ${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework ${BUILT_PRODUCTS_DIR}/RDReaderView/RDReaderView.framework -${BUILT_PRODUCTS_DIR}/SSAlertSwift/SSAlertSwift.framework -${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist index 897905e..410fd64 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist @@ -1,6 +1,4 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTCoreText.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTFoundation.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDReaderView.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SSAlertSwift.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist index 5b0981a..18a9ff0 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist @@ -2,6 +2,4 @@ ${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks ${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework ${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework ${BUILT_PRODUCTS_DIR}/RDReaderView/RDReaderView.framework -${BUILT_PRODUCTS_DIR}/SSAlertSwift/SSAlertSwift.framework -${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist index 897905e..410fd64 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist @@ -1,6 +1,4 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTCoreText.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTFoundation.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDReaderView.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SSAlertSwift.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh index fc91f53..28d1c76 100755 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh @@ -179,16 +179,12 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework" install_framework "${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDReaderView/RDReaderView.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SSAlertSwift/SSAlertSwift.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework" install_framework "${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDReaderView/RDReaderView.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SSAlertSwift/SSAlertSwift.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig index 7850427..de3b625 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView/RDReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift/SSAlertSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView/RDReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -l"xml2" -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "RDReaderView" -framework "SSAlertSwift" -framework "SnapKit" -framework "ZIPFoundation" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "RDReaderView" -framework "ZIPFoundation" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig index 7850427..de3b625 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView/RDReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift/SSAlertSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView/RDReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -l"xml2" -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "RDReaderView" -framework "SSAlertSwift" -framework "SnapKit" -framework "ZIPFoundation" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"xml2" -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "RDReaderView" -framework "ZIPFoundation" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.debug.xcconfig index e3fa074..dfe5382 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.debug.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.debug.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "SSAlertSwift" -framework "SnapKit" -framework "ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.release.xcconfig index e3fa074..dfe5382 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.release.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDReaderView/RDReaderView.release.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "SSAlertSwift" -framework "SnapKit" -framework "ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist deleted file mode 100644 index f4e510b..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.0.15 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-dummy.m b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-dummy.m deleted file mode 100644 index 8992bcd..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SSAlertSwift : NSObject -@end -@implementation PodsDummy_SSAlertSwift -@end diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-umbrella.h b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-umbrella.h deleted file mode 100644 index 63b97bf..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double SSAlertSwiftVersionNumber; -FOUNDATION_EXPORT const unsigned char SSAlertSwiftVersionString[]; - diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.debug.xcconfig deleted file mode 100644 index 179a9f6..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SSAlertSwift -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.modulemap b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.modulemap deleted file mode 100644 index 2ebe0f1..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module SSAlertSwift { - umbrella header "SSAlertSwift-umbrella.h" - - export * - module * { export * } -} diff --git a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.release.xcconfig deleted file mode 100644 index 179a9f6..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SSAlertSwift/SSAlertSwift.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SSAlertSwift -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SSAlertSwift -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist b/ReadViewDemo/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist deleted file mode 100644 index d6be571..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 5.7.1 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-Info.plist b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-Info.plist deleted file mode 100644 index af3ef2c..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 5.7.1 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-dummy.m b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-dummy.m deleted file mode 100644 index b44e8e5..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SnapKit : NSObject -@end -@implementation PodsDummy_SnapKit -@end diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h deleted file mode 100644 index 1b1be64..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double SnapKitVersionNumber; -FOUNDATION_EXPORT const unsigned char SnapKitVersionString[]; - diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig deleted file mode 100644 index 3e6e223..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.modulemap b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.modulemap deleted file mode 100644 index 4b3e47b..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module SnapKit { - umbrella header "SnapKit-umbrella.h" - - export * - module * { export * } -} diff --git a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig deleted file mode 100644 index 3e6e223..0000000 --- a/ReadViewDemo/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift b/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift index 00aee13..906e586 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBJavaScriptBridge.swift @@ -166,10 +166,23 @@ enum RDEPUBJavaScriptBridge { return string } + /// Encodes a string value as a safe JavaScript string literal. + /// + /// Uses JSON serialization to handle escaping of quotes, backslashes, control + /// characters, and Unicode, then strips the array wrapper to produce a standalone + /// JS string literal (including surrounding quotes). + /// + /// - Parameter value: The string to encode, or `nil` which produces the JS keyword `null`. + /// - Returns: A JavaScript string literal safe for inline embedding in JS source. private static func javaScriptStringLiteral(_ value: String?) -> String { guard let value else { return "null" } - return jsonString(from: [value], fallback: "[null]") - .replacingOccurrences(of: "[", with: "") - .replacingOccurrences(of: "]", with: "") + guard JSONSerialization.isValidJSONObject([value]), + let data = try? JSONSerialization.data(withJSONObject: [value], options: []), + let arrayString = String(data: data, encoding: .utf8) else { + return "null" + } + // JSON encodes ["value"] as `["value"]`. Drop the leading `[` and trailing `]` + // to yield `"value"` — a valid JS string literal with all special characters escaped. + return String(arrayString.dropFirst().dropLast()) } } diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorLayoutContext.swift b/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorLayoutContext.swift index bfd669b..087b28b 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorLayoutContext.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorLayoutContext.swift @@ -37,12 +37,20 @@ public struct RDEPUBNavigatorLayoutContext: Equatable { return CGSize(width: width, height: containerSize.height) } + /// Content insets that account for safe area (Dynamic Island / notch) on iPhone. + /// Uses the larger of safeAreaInsets and reflowableContentInsets for top/bottom + /// to ensure content is never hidden under the Dynamic Island or home indicator. + public var safeReflowableContentInsets: UIEdgeInsets { + let top = max(safeAreaInsets.top, reflowableContentInsets.top) + let bottom = max(safeAreaInsets.bottom, reflowableContentInsets.bottom) + let left = max(safeAreaInsets.left, reflowableContentInsets.left) + let right = max(safeAreaInsets.right, reflowableContentInsets.right) + return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right) + } + + /// Fixed layout content insets that respect safe areas on all devices including iPhone. public var fixedContentInset: UIEdgeInsets { var insets = safeAreaInsets - if userInterfaceIdiom != .phone { - insets = .zero - } - let horizontalInsets = max(insets.left, insets.right) insets.left = horizontalInsets insets.right = horizontalInsets diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorState.swift b/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorState.swift deleted file mode 100644 index d07937c..0000000 --- a/Sources/RDReaderView/EPUBCore/RDEPUBNavigatorState.swift +++ /dev/null @@ -1,21 +0,0 @@ - -import Foundation - -public enum RDEPUBNavigatorState: String, Codable { - - case initializing - - case loading - - case idle - - case jumping - - case moving - - case repaginating - - public var isStableForSnapshotApplication: Bool { - self == .idle - } -} \ No newline at end of file diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBParser+Archive.swift b/Sources/RDReaderView/EPUBCore/RDEPUBParser+Archive.swift index 1b6a19b..7cb301b 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBParser+Archive.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBParser+Archive.swift @@ -29,7 +29,11 @@ extension RDEPUBParser { let extractionURL = temporaryExtractionDirectory(for: epubURL) if fileManager.fileExists(atPath: extractionURL.path) { - return extractionURL + let containerURL = extractionURL.appendingPathComponent("META-INF/container.xml") + if fileManager.fileExists(atPath: containerURL.path) { + return extractionURL + } + try? fileManager.removeItem(at: extractionURL) } guard let archive = Archive(url: epubURL, accessMode: .read) else { @@ -38,24 +42,50 @@ extension RDEPUBParser { try fileManager.createDirectory(at: extractionURL, withIntermediateDirectories: true) - for entry in archive { - guard let destinationURL = validatedExtractionDestination(for: entry.path, extractionRoot: extractionURL) else { - throw RDEPUBParserError.invalidArchiveEntryPath(entry.path) - } - switch entry.type { - case .directory: - try fileManager.createDirectory(at: destinationURL, withIntermediateDirectories: true) - case .file: - try fileManager.createDirectory(at: destinationURL.deletingLastPathComponent(), withIntermediateDirectories: true) - _ = try archive.extract(entry, to: destinationURL) - case .symlink: - continue + do { + for entry in archive { + if shouldSkipEntry(entry.path) { continue } + + guard let destinationURL = validatedExtractionDestination(for: entry.path, extractionRoot: extractionURL) else { + if isCriticalEntry(entry.path) { + throw RDEPUBParserError.invalidArchiveEntryPath(entry.path) + } + continue + } + switch entry.type { + case .directory: + try fileManager.createDirectory(at: destinationURL, withIntermediateDirectories: true) + case .file: + try fileManager.createDirectory(at: destinationURL.deletingLastPathComponent(), withIntermediateDirectories: true) + _ = try archive.extract(entry, to: destinationURL) + case .symlink: + continue + } } + } catch { + try? fileManager.removeItem(at: extractionURL) + throw error } return extractionURL } + private func isCriticalEntry(_ entryPath: String) -> Bool { + let lowercased = entryPath.lowercased() + return lowercased == "mimetype" + || lowercased.hasPrefix("meta-inf/") + || lowercased.hasSuffix(".opf") + } + + private func shouldSkipEntry(_ entryPath: String) -> Bool { + let lowercased = entryPath.lowercased() + if lowercased.hasPrefix("__macosx/") { return true } + if lowercased.hasPrefix(".ds_store") { return true } + if lowercased.contains("/.ds_store") { return true } + if lowercased.hasSuffix("/thumbs.db") { return true } + return false + } + private func validatedExtractionDestination(for entryPath: String, extractionRoot: URL) -> URL? { if entryPath.hasPrefix("/") { diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBParser.swift b/Sources/RDReaderView/EPUBCore/RDEPUBParser.swift index dc0b838..2bec998 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBParser.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBParser.swift @@ -21,6 +21,64 @@ public final class RDEPUBParser { public init() {} + // MARK: - Cache Management + + /// The base directory used for EPUB extraction caches. + public static var extractionCacheBaseDirectory: URL { + FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first? + .appendingPathComponent("ssreaderview-epub", isDirectory: true) + ?? FileManager.default.temporaryDirectory.appendingPathComponent("ssreaderview-epub", isDirectory: true) + } + + /// Removes all EPUB extraction caches from disk. + /// Call this when the host app wants to free disk space, e.g. on didReceiveMemoryWarning + /// or during cleanup when the reader is no longer needed. + public static func cleanExtractionCache() throws { + let fileManager = FileManager.default + let baseURL = extractionCacheBaseDirectory + guard fileManager.fileExists(atPath: baseURL.path) else { return } + try fileManager.removeItem(at: baseURL) + } + + /// Evicts extraction caches until total disk usage is below the given threshold, + /// removing least-recently-accessed directories first. + /// - Parameter maxBytes: Maximum total bytes for all extraction caches. Defaults to 500 MB. + public static func evictExtractionCache(maxBytes: UInt64 = 500 * 1024 * 1024) throws { + let fileManager = FileManager.default + let baseURL = extractionCacheBaseDirectory + guard fileManager.fileExists(atPath: baseURL.path) else { return } + + let contents = try fileManager.contentsOfDirectory( + at: baseURL, + includingPropertiesForKeys: [.contentAccessDateKey, .isDirectoryKey], + options: .skipsHiddenFiles + ) + + var entries: [(url: URL, accessDate: Date, size: UInt64)] = [] + var totalSize: UInt64 = 0 + + for directoryURL in contents { + guard let resourceValues = try? directoryURL.resourceValues(forKeys: [.isDirectoryKey, .contentAccessDateKey]), + resourceValues.isDirectory == true else { + continue + } + let directorySize = directoryURL.directorySize + let accessDate = resourceValues.contentAccessDate ?? Date.distantPast + entries.append((url: directoryURL, accessDate: accessDate, size: directorySize)) + totalSize += directorySize + } + + guard totalSize > maxBytes else { return } + + entries.sort { $0.accessDate < $1.accessDate } + + for entry in entries { + guard totalSize > maxBytes else { break } + try? fileManager.removeItem(at: entry.url) + totalSize -= entry.size + } + } + public func makePublication() -> RDEPUBPublication { RDEPUBPublication(parser: self) } @@ -75,4 +133,24 @@ public final class RDEPUBParser { public func parseNavDocument(_ navURL: URL, baseURL: URL? = nil) -> [EPUBTableOfContentsItem] { parseNavDocumentItems(at: navURL, baseURL: baseURL ?? navURL.deletingLastPathComponent()) } +} + +// MARK: - URL Directory Size Extension + +private extension URL { + var directorySize: UInt64 { + let fileManager = FileManager.default + guard let enumerator = fileManager.enumerator(at: self, includingPropertiesForKeys: [.fileSizeKey], options: [.skipsHiddenFiles], errorHandler: nil) else { + return 0 + } + var totalSize: UInt64 = 0 + for case let fileURL as URL in enumerator { + guard let resourceValues = try? fileURL.resourceValues(forKeys: [.fileSizeKey]), + let fileSize = resourceValues.fileSize else { + continue + } + totalSize += UInt64(fileSize) + } + return totalSize + } } \ No newline at end of file diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBReadingSession.swift b/Sources/RDReaderView/EPUBCore/RDEPUBReadingSession.swift index 9da3738..ebd52ac 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBReadingSession.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBReadingSession.swift @@ -7,18 +7,10 @@ public final class RDEPUBReadingSession { public let publication: RDEPUBPublication - public private(set) var navigatorState: RDEPUBNavigatorState = .initializing - public private(set) var activePages: [EPUBPage] = [] public private(set) var activeChapters: [EPUBChapterInfo] = [] - public private(set) var stagedPages: [EPUBPage]? - - public private(set) var stagedChapters: [EPUBChapterInfo]? - - public private(set) var stagedRestoreLocation: RDEPUBLocation? - public private(set) var pendingNavigationLocation: RDEPUBLocation? public private(set) var pendingNavigationPageNum: Int? @@ -37,16 +29,10 @@ public final class RDEPUBReadingSession { publication.resourceResolver } - public func transition(to state: RDEPUBNavigatorState) { - navigatorState = state - } - public func resetRuntimeState() { - navigatorState = .initializing activePages = [] activeChapters = [] clearPendingNavigation() - clearStagedSnapshot() currentViewport = nil currentReadingContext = nil } @@ -56,36 +42,6 @@ public final class RDEPUBReadingSession { activeChapters = snapshot.chapters } - public func stageSnapshot(_ snapshot: PaginationSnapshot, restoreLocation: RDEPUBLocation?) { - stagedPages = snapshot.pages - stagedChapters = snapshot.chapters - stagedRestoreLocation = restoreLocation - } - - public func stagedSnapshot() -> PaginationSnapshot? { - guard let stagedPages, let stagedChapters else { - return nil - } - return (stagedPages, stagedChapters) - } - - public func consumeStagedSnapshotIfAllowed() -> (snapshot: PaginationSnapshot, restoreLocation: RDEPUBLocation?)? { - guard navigatorState.isStableForSnapshotApplication, - let stagedPages, - let stagedChapters else { - return nil - } - let restoreLocation = stagedRestoreLocation - clearStagedSnapshot() - return ((stagedPages, stagedChapters), restoreLocation) - } - - public func clearStagedSnapshot() { - stagedPages = nil - stagedChapters = nil - stagedRestoreLocation = nil - } - public func clearPendingNavigation() { pendingNavigationLocation = nil pendingNavigationPageNum = nil @@ -241,7 +197,6 @@ public final class RDEPUBReadingSession { pendingNavigationLocation = shouldKeepPendingNavigation ? normalizedLocation : nil pendingNavigationPageNum = shouldKeepPendingNavigation ? pageIndex + 1 : nil pendingNavigationHighlightRangeInfo = hasTargetHighlightRangeInfo ? targetHighlightRangeInfo : nil - transition(to: .jumping) return pageIndex + 1 } @@ -292,9 +247,6 @@ public final class RDEPUBReadingSession { if pendingNavigationPageNum == pageNumber { clearPendingNavigation() } - if navigatorState == .jumping || navigatorState == .moving { - transition(to: .idle) - } } public func currentReadingLocation(bookIdentifier: String?) -> RDEPUBLocation? { diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBResourceURLSchemeHandler.swift b/Sources/RDReaderView/EPUBCore/RDEPUBResourceURLSchemeHandler.swift index 3e7e63e..eeb05fe 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBResourceURLSchemeHandler.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBResourceURLSchemeHandler.swift @@ -1,4 +1,3 @@ - import Foundation import WebKit @@ -19,6 +18,8 @@ public final class RDEPUBResourceURLSchemeHandler: NSObject, WKURLSchemeHandler private let syncQueue = DispatchQueue(label: "com.ssreaderview.epub.scheme-handler") + private let ioQueue = DispatchQueue(label: "com.ssreaderview.epub.scheme-handler.io", qos: .utility) + private var activeTasks: [ObjectIdentifier: Bool] = [:] private static let debugMetricsQueue = DispatchQueue(label: "com.ssreaderview.epub.scheme-handler.metrics") private static var streamedResponseCount = 0 @@ -69,6 +70,8 @@ public final class RDEPUBResourceURLSchemeHandler: NSObject, WKURLSchemeHandler expectedContentLength: 0, textEncodingName: Self.textEncodingName(for: requestURL.pathExtension) ) + // H-08 fix: These calls happen synchronously in webView(_:start:) which + // runs on the same queue WebKit calls start on, so no thread violation here. urlSchemeTask.didReceive(response) urlSchemeTask.didReceive(Data()) urlSchemeTask.didFinish() @@ -116,61 +119,153 @@ public final class RDEPUBResourceURLSchemeHandler: NSObject, WKURLSchemeHandler return size } + /// H-08 fix: Dispatch all WKURLSchemeTask completion callbacks to the main queue, + /// ensuring they run on the same serial queue that WebKit calls start() on. + /// Also: cancelled tasks now call didFailWithError(NSURLErrorCancelled) instead + /// of silently returning, satisfying the protocol requirement that every started + /// task must receive a completion callback. private func respondWithInMemoryData(fileURL: URL, requestURL: URL, taskID: ObjectIdentifier, urlSchemeTask: any WKURLSchemeTask) { - do { - let data = try Data(contentsOf: fileURL) - guard isTaskActive(taskID) else { return } - let response = URLResponse( - url: requestURL, - mimeType: Self.mimeType(for: fileURL.pathExtension), - expectedContentLength: data.count, - textEncodingName: Self.textEncodingName(for: fileURL.pathExtension) - ) - urlSchemeTask.didReceive(response) - urlSchemeTask.didReceive(data) - urlSchemeTask.didFinish() - Self.recordInMemoryResponse() - RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "finished") - } catch { - guard isTaskActive(taskID) else { return } - Self.recordFailure() - RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "failed", error: error) - urlSchemeTask.didFailWithError(error) + ioQueue.async { [weak self] in + guard let self else { + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + do { + let data = try Data(contentsOf: fileURL) + guard self.isTaskActive(taskID) else { + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + let response = URLResponse( + url: requestURL, + mimeType: Self.mimeType(for: fileURL.pathExtension), + expectedContentLength: data.count, + textEncodingName: Self.textEncodingName(for: fileURL.pathExtension) + ) + self.dispatchTaskSuccessCallback( + taskID: taskID, + urlSchemeTask: urlSchemeTask + ) { + urlSchemeTask.didReceive(response) + urlSchemeTask.didReceive(data) + urlSchemeTask.didFinish() + } + Self.recordInMemoryResponse() + RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "finished") + } catch { + guard self.isTaskActive(taskID) else { + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + Self.recordFailure() + RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "failed", error: error) + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(error) + } + } + self.clearTask(taskID) } - clearTask(taskID) } private func respondWithStreaming(fileURL: URL, requestURL: URL, taskID: ObjectIdentifier, urlSchemeTask: any WKURLSchemeTask, fileSize: UInt64) { - let response = URLResponse( - url: requestURL, - mimeType: Self.mimeType(for: fileURL.pathExtension), - expectedContentLength: Int(fileSize), - textEncodingName: Self.textEncodingName(for: fileURL.pathExtension) - ) - urlSchemeTask.didReceive(response) + ioQueue.async { [weak self] in + guard let self else { + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + let response = URLResponse( + url: requestURL, + mimeType: Self.mimeType(for: fileURL.pathExtension), + expectedContentLength: Int(fileSize), + textEncodingName: Self.textEncodingName(for: fileURL.pathExtension) + ) + self.dispatchTaskCallbackIfActive(taskID: taskID) { + urlSchemeTask.didReceive(response) + } - guard let fileHandle = try? FileHandle(forReadingFrom: fileURL) else { - guard isTaskActive(taskID) else { return } - Self.recordFailure() - urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorFileDoesNotExist)) - clearTask(taskID) - return - } + guard let fileHandle = try? FileHandle(forReadingFrom: fileURL) else { + guard self.isTaskActive(taskID) else { + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + Self.recordFailure() + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorFileDoesNotExist)) + } + self.clearTask(taskID) + return + } - let chunkSize = 65_536 - defer { - fileHandle.closeFile() - clearTask(taskID) + let chunkSize = 65_536 + var streamingCompleted = false + defer { + fileHandle.closeFile() + if !streamingCompleted { + // Task was cancelled during streaming; didFailWithError already sent above + // or will be sent by the guard check below. No need to send again. + } + self.clearTask(taskID) + } + while true { + guard self.isTaskActive(taskID) else { + // H-08 fix: Task was cancelled. Send didFailWithError on main queue. + DispatchQueue.main.async { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + } + return + } + let data = fileHandle.readData(ofLength: chunkSize) + if data.isEmpty { break } + self.dispatchTaskCallbackIfActive(taskID: taskID) { + urlSchemeTask.didReceive(data) + } + } + streamingCompleted = true + self.dispatchTaskSuccessCallback( + taskID: taskID, + urlSchemeTask: urlSchemeTask + ) { + urlSchemeTask.didFinish() + } + Self.recordStreamedResponse() + RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "finished-streaming") } - while true { - guard isTaskActive(taskID) else { return } - let data = fileHandle.readData(ofLength: chunkSize) - if data.isEmpty { break } - urlSchemeTask.didReceive(data) + } + + private func dispatchTaskCallbackIfActive(taskID: ObjectIdentifier, _ callback: @escaping () -> Void) { + DispatchQueue.main.async { [weak self] in + guard let self, self.isTaskActive(taskID) else { return } + callback() + } + } + + private func dispatchTaskSuccessCallback( + taskID: ObjectIdentifier, + urlSchemeTask: any WKURLSchemeTask, + _ callback: @escaping () -> Void + ) { + DispatchQueue.main.async { [weak self] in + guard let self else { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + return + } + guard self.isTaskActive(taskID) else { + urlSchemeTask.didFailWithError(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled)) + self.clearTask(taskID) + return + } + callback() } - urlSchemeTask.didFinish() - Self.recordStreamedResponse() - RDEPUBWebViewDebug.logSchemeTask("ResourceScheme", requestURL: requestURL, fileURL: fileURL, event: "finished-streaming") } private static func recordStreamedResponse() { diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Configuration.swift b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Configuration.swift index 5bd4b28..7ca2286 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Configuration.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBWebView+Configuration.swift @@ -36,11 +36,18 @@ extension RDEPUBWebView { guard let self else { return } self.handleSelectionMenuAction(action) } - UIMenuController.shared.menuItems = [ - UIMenuItem(title: "拷贝", action: #selector(RDEPUBAnnotationWebView.rd_copy(_:))), - UIMenuItem(title: "高亮", action: #selector(RDEPUBAnnotationWebView.rd_highlight(_:))), - UIMenuItem(title: "批注", action: #selector(RDEPUBAnnotationWebView.rd_annotate(_:))) - ] + // M-15: Use UIEditMenuInteraction on iOS 16+ to replace deprecated UIMenuController + if #available(iOS 16.0, *) { + let interaction = UIEditMenuInteraction(delegate: webView) + webView.addInteraction(interaction) + webView._editMenuInteraction = interaction + } else { + UIMenuController.shared.menuItems = [ + UIMenuItem(title: "拷贝", action: #selector(RDEPUBAnnotationWebView.rd_copy(_:))), + UIMenuItem(title: "高亮", action: #selector(RDEPUBAnnotationWebView.rd_highlight(_:))), + UIMenuItem(title: "批注", action: #selector(RDEPUBAnnotationWebView.rd_annotate(_:))) + ] + } webView.navigationDelegate = self webView.scrollView.isScrollEnabled = false webView.scrollView.showsHorizontalScrollIndicator = false @@ -82,6 +89,10 @@ extension RDEPUBWebView { if let webView { RDEPUBWebViewDebug.log(debugScope, message: "teardown webView=\(RDEPUBWebViewDebug.webViewID(webView))") } + // M-15: Clean up UIEditMenuInteraction on iOS 16+ + if #available(iOS 16.0, *), let interaction = (webView as? RDEPUBAnnotationWebView)?._editMenuInteraction as? UIEditMenuInteraction { + webView?.removeInteraction(interaction) + } webView?.navigationDelegate = nil if let userContentController = webView?.configuration.userContentController { RDEPUBJavaScriptBridge.messageNames.forEach { diff --git a/Sources/RDReaderView/EPUBCore/RDEPUBWebView.swift b/Sources/RDReaderView/EPUBCore/RDEPUBWebView.swift index e17349a..ae28125 100644 --- a/Sources/RDReaderView/EPUBCore/RDEPUBWebView.swift +++ b/Sources/RDReaderView/EPUBCore/RDEPUBWebView.swift @@ -33,6 +33,10 @@ final class RDEPUBAnnotationWebView: WKWebView { var onSelectionAction: ((RDEPUBAnnotationMenuAction) -> Void)? + // M-15: Backing store for UIEditMenuInteraction (iOS 16+). + // Stored as Any? to avoid @available on stored property restriction. + var _editMenuInteraction: Any? + override var canBecomeFirstResponder: Bool { true } @@ -61,6 +65,29 @@ final class RDEPUBAnnotationWebView: WKWebView { } } +// MARK: - UIEditMenuInteractionDelegate (iOS 16+) + +@available(iOS 16.0, *) +extension RDEPUBAnnotationWebView: UIEditMenuInteractionDelegate { + func editMenuInteraction( + _ interaction: UIEditMenuInteraction, + menuFor configuration: UIEditMenuConfiguration + ) -> UIMenu { + UIMenu(children: [ + UICommand(title: "拷贝", action: #selector(rd_copy(_:))), + UICommand(title: "高亮", action: #selector(rd_highlight(_:))), + UICommand(title: "批注", action: #selector(rd_annotate(_:))) + ]) + } + + func editMenuInteraction( + _ interaction: UIEditMenuInteraction, + targetRectFor configuration: UIEditMenuConfiguration + ) -> CGRect { + bounds + } +} + public final class RDEPUBWebView: UIView { public weak var delegate: RDEPUBWebViewDelegate? @@ -126,6 +153,11 @@ public final class RDEPUBWebView: UIView { fatalError("init(coder:) has not been implemented") } + // M-08: Retain cycle note — webView → configuration.userContentController → self (as WKScriptMessageHandler) + // forms a retain cycle. The cycle is broken by calling teardownWebView(), which removes + // the message handlers. teardownWebView() is called in reset() and deinit. IMPORTANT: + // deinit may never trigger if the cycle is not broken first. Every code path that disposes + // of this view MUST call reset() before releasing the last reference. deinit { teardownWebView() } diff --git a/Sources/RDReaderView/EPUBTextRendering/BuildPipeline/RDEPUBTextBookCache.swift b/Sources/RDReaderView/EPUBTextRendering/BuildPipeline/RDEPUBTextBookCache.swift index 6815187..71ef854 100644 --- a/Sources/RDReaderView/EPUBTextRendering/BuildPipeline/RDEPUBTextBookCache.swift +++ b/Sources/RDReaderView/EPUBTextRendering/BuildPipeline/RDEPUBTextBookCache.swift @@ -104,7 +104,7 @@ final class ChapterPaginationArchive: NSObject, NSSecureCoding { public final class RDEPUBTextBookCache { - public var schemaVersion: Int = 13 + public var schemaVersion: Int = 14 private let queue = DispatchQueue(label: "com.rdreader.textbookcache", qos: .utility) diff --git a/Sources/RDReaderView/EPUBTextRendering/Typesetter/RDEPUBHTMLNormalizer.swift b/Sources/RDReaderView/EPUBTextRendering/Typesetter/RDEPUBHTMLNormalizer.swift index 61c50f2..10aaa02 100644 --- a/Sources/RDReaderView/EPUBTextRendering/Typesetter/RDEPUBHTMLNormalizer.swift +++ b/Sources/RDReaderView/EPUBTextRendering/Typesetter/RDEPUBHTMLNormalizer.swift @@ -27,6 +27,7 @@ struct RDEPUBHTMLNormalizer: RDEPUBTypesettingStage { } cleanedHTML = normalizeAttachmentHTMLMarkers(in: cleanedHTML) + cleanedHTML = normalizeBodyLeadingSpacing(in: cleanedHTML) return cleanedHTML } @@ -129,6 +130,64 @@ struct RDEPUBHTMLNormalizer: RDEPUBTypesettingStage { return normalized } + private static func normalizeBodyLeadingSpacing(in html: String) -> String { + var normalized = html + + if let bodyStartRegex = try? NSRegularExpression( + pattern: #"(]*>)\s+"#, + options: [.caseInsensitive] + ) { + normalized = bodyStartRegex.stringByReplacingMatches( + in: normalized, + options: [], + range: NSRange(location: 0, length: (normalized as NSString).length), + withTemplate: "$1" + ) + } + + if let bodyEndRegex = try? NSRegularExpression( + pattern: #"\s+()"#, + options: [.caseInsensitive] + ) { + normalized = bodyEndRegex.stringByReplacingMatches( + in: normalized, + options: [], + range: NSRange(location: 0, length: (normalized as NSString).length), + withTemplate: "$1" + ) + } + + guard let firstBlockRegex = try? NSRegularExpression( + pattern: #"(]*>)(\s*)(<(?h[1-6]|p|div|blockquote|section|article|ul|ol)\b[^>]*>)"#, + options: [.caseInsensitive] + ) else { + return normalized + } + + let nsNormalized = normalized as NSString + let fullRange = NSRange(location: 0, length: nsNormalized.length) + guard let match = firstBlockRegex.firstMatch(in: normalized, options: [], range: fullRange), + match.numberOfRanges >= 4, + let bodyRange = Range(match.range(at: 1), in: normalized), + let blockRange = Range(match.range(at: 3), in: normalized) else { + return normalized + } + + let prefix = String(normalized[.. 0, currentSize.height > 0 else { return } - let stillChanged = abs(currentSize.width - self.lastTextPaginationPageSize!.width) > 0.5 - || abs(currentSize.height - self.lastTextPaginationPageSize!.height) > 0.5 + guard let previousPageSize = self.lastTextPaginationPageSize else { return } + let stillChanged = abs(currentSize.width - previousPageSize.width) > 0.5 + || abs(currentSize.height - previousPageSize.height) > 0.5 guard stillChanged else { return } self.repaginatePreservingCurrentLocation() } diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController+LocationResolution.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController+LocationResolution.swift index c30876d..28fcb44 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController+LocationResolution.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController+LocationResolution.swift @@ -137,7 +137,6 @@ extension RDEPUBReaderController { guard let textBook, let page = textBook.page(at: pageNumber) else { - readingSession?.transition(to: .idle) return } diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift index c3880a1..d6d2e96 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderController.swift @@ -6,10 +6,12 @@ public final class RDEPUBReaderController: UIViewController { public var configuration: RDEPUBReaderConfiguration { didSet { + // M-09: Apply all configuration side effects even before view is loaded, + // but UI-dependent actions only after view is loaded. readerContext.configuration = configuration + guard isViewLoaded else { return } applyWebViewDebugPolicy() persistReaderSettingsIfNeeded() - guard isViewLoaded else { return } let oldConfiguration = oldValue applyReaderViewConfiguration() @@ -176,11 +178,6 @@ public final class RDEPUBReaderController: UIViewController { set { readerContext.paginationToken = newValue } } - var paginator: RDEPUBPaginator? { - get { readerContext.paginator } - set { readerContext.paginator = newValue } - } - var searchState: RDEPUBSearchState? { get { readerContext.searchState } set { readerContext.searchState = newValue } @@ -291,6 +288,11 @@ public final class RDEPUBReaderController: UIViewController { runtime.viewportMonitor.viewDidLayoutSubviews() } + public override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + runtime.handleMemoryWarning() + } + public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) runtime.viewportMonitor.viewWillTransition(with: coordinator) diff --git a/Sources/RDReaderView/EPUBUI/RDEPUBReaderPersistence.swift b/Sources/RDReaderView/EPUBUI/RDEPUBReaderPersistence.swift index 5ff87af..c4e113d 100644 --- a/Sources/RDReaderView/EPUBUI/RDEPUBReaderPersistence.swift +++ b/Sources/RDReaderView/EPUBUI/RDEPUBReaderPersistence.swift @@ -77,60 +77,104 @@ public final class RDEPUBUserDefaultsPersistence: RDEPUBReaderPersistence { guard let data = defaults.data(forKey: locationPrefix + bookIdentifier) else { return nil } - return try? JSONDecoder().decode(RDEPUBLocation.self, from: data) + do { + return try JSONDecoder().decode(RDEPUBLocation.self, from: data) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to decode location for '\(bookIdentifier)': \(error)") + #endif + return nil + } } public func saveLocation(_ location: RDEPUBLocation, for bookIdentifier: String) { - guard let data = try? JSONEncoder().encode(location) else { - return + do { + let data = try JSONEncoder().encode(location) + defaults.set(data, forKey: locationPrefix + bookIdentifier) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to encode location for '\(bookIdentifier)': \(error)") + #endif } - defaults.set(data, forKey: locationPrefix + bookIdentifier) } public func loadBookmarks(for bookIdentifier: String) -> [RDEPUBBookmark] { guard let data = defaults.data(forKey: bookmarksPrefix + bookIdentifier) else { return [] } - return (try? JSONDecoder().decode([RDEPUBBookmark].self, from: data)) ?? [] + do { + return try JSONDecoder().decode([RDEPUBBookmark].self, from: data) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to decode bookmarks for '\(bookIdentifier)': \(error)") + #endif + return [] + } } public func saveBookmarks(_ bookmarks: [RDEPUBBookmark], for bookIdentifier: String) { - guard let data = try? JSONEncoder().encode(bookmarks) else { - return + do { + let data = try JSONEncoder().encode(bookmarks) + defaults.set(data, forKey: bookmarksPrefix + bookIdentifier) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to encode bookmarks for '\(bookIdentifier)': \(error)") + #endif } - defaults.set(data, forKey: bookmarksPrefix + bookIdentifier) } public func loadHighlights(for bookIdentifier: String) -> [RDEPUBHighlight] { guard let data = defaults.data(forKey: highlightsPrefix + bookIdentifier) else { return [] } - return (try? JSONDecoder().decode([RDEPUBHighlight].self, from: data)) ?? [] + do { + return try JSONDecoder().decode([RDEPUBHighlight].self, from: data) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to decode highlights for '\(bookIdentifier)': \(error)") + #endif + return [] + } } public func saveHighlights(_ highlights: [RDEPUBHighlight], for bookIdentifier: String) { - guard let data = try? JSONEncoder().encode(highlights) else { - return - } - if data.count > 1_048_576 { + do { + let data = try JSONEncoder().encode(highlights) + if data.count > 1_048_576 { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ saveHighlights data size (\(data.count) bytes) exceeds 1MB for: \(bookIdentifier)") + #endif + } + defaults.set(data, forKey: highlightsPrefix + bookIdentifier) + } catch { #if DEBUG - print("[RDEPUBUserDefaultsPersistence] ⚠️ saveHighlights data size (\(data.count) bytes) exceeds 1MB for: \(bookIdentifier)") + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to encode highlights for '\(bookIdentifier)': \(error)") #endif } - defaults.set(data, forKey: highlightsPrefix + bookIdentifier) } public func loadReaderSettings() -> RDEPUBReaderSettings? { guard let data = defaults.data(forKey: settingsKey) else { return nil } - return try? JSONDecoder().decode(RDEPUBReaderSettings.self, from: data) + do { + return try JSONDecoder().decode(RDEPUBReaderSettings.self, from: data) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to decode reader settings: \(error)") + #endif + return nil + } } public func saveReaderSettings(_ settings: RDEPUBReaderSettings) { - guard let data = try? JSONEncoder().encode(settings) else { - return + do { + let data = try JSONEncoder().encode(settings) + defaults.set(data, forKey: settingsKey) + } catch { + #if DEBUG + print("[RDEPUBUserDefaultsPersistence] ⚠️ Failed to encode reader settings: \(error)") + #endif } - defaults.set(data, forKey: settingsKey) } } diff --git a/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift b/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift index 1eca093..6bb35a8 100644 --- a/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift +++ b/Sources/RDReaderView/EPUBUI/RDURLReaderController.swift @@ -154,11 +154,18 @@ public final class RDURLReaderController: UIViewController { let bookTitle = bookURL.deletingPathExtension().lastPathComponent let pageSize = currentTextPageSize() let renderStyle = currentTextRenderStyle() + let safeInsets = view.safeAreaInsets + let edgeInsets = UIEdgeInsets( + top: max(epubConfiguration.reflowableContentInsets.top, safeInsets.top), + left: max(epubConfiguration.reflowableContentInsets.left, safeInsets.left), + bottom: max(epubConfiguration.reflowableContentInsets.bottom, safeInsets.bottom), + right: max(epubConfiguration.reflowableContentInsets.right, safeInsets.right) + ) let builder = RDPlainTextBookBuilder( layoutConfig: RDEPUBTextLayoutConfig( frameWidth: pageSize.width, frameHeight: pageSize.height, - edgeInsets: epubConfiguration.reflowableContentInsets, + edgeInsets: edgeInsets, numberOfColumns: 1, columnGap: 20, avoidOrphans: false, diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterDataCache.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterDataCache.swift index 526e1e6..7f7fef3 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterDataCache.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterDataCache.swift @@ -3,19 +3,37 @@ import Foundation final class RDEPUBChapterDataCache { private var storage: [Int: RDEPUBRuntimeChapter] = [:] + private var accessOrder: [Int] = [] // H-05: LRU tracking for eviction + private let maxEntryCount: Int private let lock = NSLock() + init(maxEntryCount: Int = 30) { + self.maxEntryCount = maxEntryCount + } + subscript(_ spineIndex: Int) -> RDEPUBRuntimeChapter? { get { lock.lock() defer { lock.unlock() } - return storage[spineIndex] + guard let chapter = storage[spineIndex] else { + return nil + } + touchLocked(spineIndex) + return chapter } set { lock.lock() defer { lock.unlock() } - storage[spineIndex] = newValue + if let newValue { + storage[spineIndex] = newValue + touchLocked(spineIndex) + // Evict oldest entries if over limit + evictIfNeededLocked() + } else { + storage.removeValue(forKey: spineIndex) + accessOrder.removeAll { $0 == spineIndex } + } } } @@ -29,11 +47,29 @@ final class RDEPUBChapterDataCache { lock.lock() defer { lock.unlock() } storage.removeValue(forKey: spineIndex) + accessOrder.removeAll { $0 == spineIndex } } func removeAll() { lock.lock() defer { lock.unlock() } storage.removeAll() + accessOrder.removeAll() } -} \ No newline at end of file + + /// H-05: Evict least recently used entries when cache exceeds maxEntryCount. + /// Must be called while holding lock. + private func evictIfNeededLocked() { + while storage.count > maxEntryCount, let oldest = accessOrder.first { + storage.removeValue(forKey: oldest) + accessOrder.removeFirst() + } + } + + /// Marks an entry as most recently used. + /// Must be called while holding lock. + private func touchLocked(_ spineIndex: Int) { + accessOrder.removeAll { $0 == spineIndex } + accessOrder.append(spineIndex) + } +} diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterLoader.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterLoader.swift index 27eaee2..fb50c18 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterLoader.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterLoader.swift @@ -46,12 +46,29 @@ final class RDEPUBChapterLoader { store: RDEPUBChapterRuntimeStore, priority: LoadPriority = .navigation, completion: @escaping (Result) -> Void + ) { + let layoutSnapshot = context?.makeLayoutSnapshot() + loadChapterWithSnapshot( + spineIndex: spineIndex, + store: store, + priority: priority, + layoutSnapshot: layoutSnapshot, + completion: completion + ) + } + + private func loadChapterWithSnapshot( + spineIndex: Int, + store: RDEPUBChapterRuntimeStore, + priority: LoadPriority, + layoutSnapshot: RDEPUBLayoutSnapshot?, + completion: @escaping (Result) -> Void ) { if let cached = store.chapterData(for: spineIndex) { if let context { scheduleDeferredCFIMapBuildIfNeeded( for: cached, - cacheKey: makeCacheKey(spineIndex: spineIndex, context: context), + cacheKey: makeCacheKey(spineIndex: spineIndex, context: context, layoutSnapshot: layoutSnapshot), store: store ) } @@ -83,15 +100,15 @@ final class RDEPUBChapterLoader { store.markBuilding(true) _ = store.beginPendingChapterLoad(for: spineIndex) - store.chapterLoadQueue.async { [self] in - guard let context = self.context else { + store.chapterLoadQueue.async { [weak self] in + guard let self, let context = self.context else { store.endPendingChapterLoad(for: spineIndex) store.markBuilding(false) - self.resolvePendingLoad(spineIndex: spineIndex, result: .failure(RDEPUBChapterLoadError.missingParser)) + self?.resolvePendingLoad(spineIndex: spineIndex, result: .failure(RDEPUBChapterLoadError.missingParser)) return } let queuePriority = self.pendingPriority(for: spineIndex) ?? priority - let cacheKey = self.makeCacheKey(spineIndex: spineIndex, context: context) + let cacheKey = self.makeCacheKey(spineIndex: spineIndex, context: context, layoutSnapshot: layoutSnapshot) let precomputedPageRanges = store.pageCount(for: cacheKey)?.pageRanges let diskSummary: RDEPUBChapterSummary? @@ -109,7 +126,8 @@ final class RDEPUBChapterLoader { spineIndex: spineIndex, availablePageRanges: availablePageRanges, diskSummary: diskSummary, - context: context + context: context, + layoutSnapshot: layoutSnapshot ) store.insertChapter(chapter) @@ -137,7 +155,7 @@ final class RDEPUBChapterLoader { store.markBuilding(false) self.resolvePendingLoad(spineIndex: spineIndex, result: .success(chapter)) - self.loadChapter(spineIndex: target, store: store, priority: .navigation, completion: { _ in }) + self.loadChapterWithSnapshot(spineIndex: target, store: store, priority: .navigation, layoutSnapshot: layoutSnapshot, completion: { _ in }) return } store.markBuilding(false) @@ -163,7 +181,8 @@ final class RDEPUBChapterLoader { func loadChapterSynchronouslyForMigration( spineIndex: Int, - store: RDEPUBChapterRuntimeStore? + store: RDEPUBChapterRuntimeStore?, + layoutSnapshot: RDEPUBLayoutSnapshot? = nil ) throws -> RDEPUBRuntimeChapter { guard let context else { throw RDEPUBChapterLoadError.missingParser @@ -173,7 +192,7 @@ final class RDEPUBChapterLoader { if let store { scheduleDeferredCFIMapBuildIfNeeded( for: cached, - cacheKey: makeCacheKey(spineIndex: spineIndex, context: context), + cacheKey: makeCacheKey(spineIndex: spineIndex, context: context, layoutSnapshot: layoutSnapshot), store: store ) } @@ -202,12 +221,13 @@ final class RDEPUBChapterLoader { store.assertNotOnChapterLoadQueue() + let snapshot = layoutSnapshot ?? context.makeLayoutSnapshot() var result: Result? let semaphore = DispatchSemaphore(value: 0) store.chapterLoadQueue.async { do { let chapter: RDEPUBRuntimeChapter = try autoreleasepool { - let cacheKey = self.makeCacheKey(spineIndex: spineIndex, context: context) + let cacheKey = self.makeCacheKey(spineIndex: spineIndex, context: context, layoutSnapshot: snapshot) let precomputedPageRanges = store.pageCount(for: cacheKey)?.pageRanges let diskSummary: RDEPUBChapterSummary? if precomputedPageRanges == nil { @@ -219,7 +239,8 @@ final class RDEPUBChapterLoader { spineIndex: spineIndex, availablePageRanges: precomputedPageRanges ?? diskSummary?.pageRanges.map(\.nsRange), diskSummary: diskSummary, - context: context + context: context, + layoutSnapshot: snapshot ) store.insertChapter(chapter) let pageCount = RDEPUBRuntimePageCount( @@ -288,16 +309,28 @@ final class RDEPUBChapterLoader { spineIndex: Int, availablePageRanges: [NSRange]?, diskSummary: RDEPUBChapterSummary? = nil, - context: RDEPUBReaderContext + context: RDEPUBReaderContext, + layoutSnapshot: RDEPUBLayoutSnapshot? = nil ) throws -> RDEPUBRuntimeChapter { guard let parser = context.parser, let publication = context.publication else { throw RDEPUBChapterLoadError.missingParser } - let pageSize = context.currentTextPageSize() - let style = context.currentTextRenderStyle() - let layoutConfig = context.currentTextLayoutConfig(pageSize: pageSize) + let pageSize: CGSize + let style: RDEPUBTextRenderStyle + let layoutConfig: RDEPUBTextLayoutConfig + + if let snapshot = layoutSnapshot { + pageSize = snapshot.pageSize + style = snapshot.style + layoutConfig = snapshot.layoutConfig + } else { + assert(Thread.isMainThread, "buildChapter() requires a layoutSnapshot when called off the main thread. Capture a snapshot via makeLayoutSnapshot() before dispatching to a background queue.") + pageSize = context.currentTextPageSize() + style = context.currentTextRenderStyle() + layoutConfig = context.currentTextLayoutConfig(pageSize: pageSize) + } if let pageRanges = availablePageRanges { @@ -330,7 +363,8 @@ final class RDEPUBChapterLoader { spineIndex: spineIndex, pageSize: pageSize, layoutConfig: layoutConfig, - context: context + context: context, + layoutSnapshot: layoutSnapshot ) } @@ -542,7 +576,8 @@ final class RDEPUBChapterLoader { spineIndex: Int, pageSize: CGSize, layoutConfig: RDEPUBTextLayoutConfig, - context: RDEPUBReaderContext + context: RDEPUBReaderContext, + layoutSnapshot: RDEPUBLayoutSnapshot? = nil ) throws -> RDEPUBRuntimeChapter { let layouter = RDEPUBTextLayouter( attributedString: chapter.attributedContent, @@ -559,7 +594,7 @@ final class RDEPUBChapterLoader { ) let pageRanges = chapter.pages.map { $0.contentRange } - let cacheKey = makeCacheKey(spineIndex: spineIndex, context: context) + let cacheKey = makeCacheKey(spineIndex: spineIndex, context: context, layoutSnapshot: layoutSnapshot) summaryDiskCache?.write(summary: makeSummary(for: chapter.pages, fragmentOffsets: chapter.fragmentOffsets, offsetMap: offsetMap, cacheKey: cacheKey), for: cacheKey) return RDEPUBRuntimeChapter( @@ -575,11 +610,22 @@ final class RDEPUBChapterLoader { ) } - private func makeCacheKey(spineIndex: Int, context: RDEPUBReaderContext) -> RDEPUBChapterCacheKey { - let style = context.currentTextRenderStyle() - let layoutConfig = context.currentTextLayoutConfig(pageSize: context.currentTextPageSize()) + private func makeCacheKey(spineIndex: Int, context: RDEPUBReaderContext, layoutSnapshot: RDEPUBLayoutSnapshot? = nil) -> RDEPUBChapterCacheKey { + let style: RDEPUBTextRenderStyle + let layoutConfig: RDEPUBTextLayoutConfig + let lineHeightMultiple: CGFloat - let lineHeightMultiple = context.configuration.lineHeightMultiple + if let snapshot = layoutSnapshot { + style = snapshot.style + layoutConfig = snapshot.layoutConfig + lineHeightMultiple = context.configuration.lineHeightMultiple + } else { + assert(Thread.isMainThread, "makeCacheKey() requires a layoutSnapshot when called off the main thread. Capture a snapshot via makeLayoutSnapshot() before dispatching to a background queue.") + let pageSize = context.currentTextPageSize() + style = context.currentTextRenderStyle() + layoutConfig = context.currentTextLayoutConfig(pageSize: pageSize) + lineHeightMultiple = context.configuration.lineHeightMultiple + } let renderSignature = [ style.font.fontName, diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterRuntimeStore.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterRuntimeStore.swift index 322ccc6..a0d2689 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterRuntimeStore.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterRuntimeStore.swift @@ -12,6 +12,10 @@ final class RDEPUBChapterRuntimeStore { private let chapterLoadQueueKey = DispatchSpecificKey() + // M-02: currentSpineIndex and windowSpineIndices are accessed only from the main thread + // (verified by audit of all 7 access points). They are not protected by locks unlike + // navigationLock/prefetchLock/buildingLock/cfiMapLock, but this is safe as long as + // access remains main-thread-only. Do NOT access from chapterLoadQueue. private(set) var currentSpineIndex: Int? private(set) var windowSpineIndices: [Int] = [] @@ -39,6 +43,7 @@ final class RDEPUBChapterRuntimeStore { init() { imageCache.countLimit = 50 + imageCache.totalCostLimit = 104_857_600 // 100 MB chapterLoadQueue.setSpecific(key: chapterLoadQueueKey, value: ()) } diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterSummaryDiskCache.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterSummaryDiskCache.swift index 74733e3..75f6705 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterSummaryDiskCache.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterSummaryDiskCache.swift @@ -172,7 +172,7 @@ struct RDEPUBChapterSummary: Codable { let pageMetadataList: [PageMetadataSummary] - static let currentSchemaVersion = 16 + static let currentSchemaVersion = 17 struct RangeData: Codable { diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWarmupOrchestrator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWarmupOrchestrator.swift index caec9f2..ad7b265 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWarmupOrchestrator.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWarmupOrchestrator.swift @@ -82,8 +82,6 @@ final class RDEPUBChapterWarmupOrchestrator { totalSpineCount: publication.spine.count, windowRadius: context.configuration.chapterWindowRadius ) - presentationRuntime.navigationStateMachine.transition(to: .preparingChapter(spineIndex: spineIndex)) - if !chapterReady { guard allowSynchronousLoad else { scheduleAsynchronousChapterPreparation( @@ -105,7 +103,6 @@ final class RDEPUBChapterWarmupOrchestrator { } markPrepareResolved(pageNumber) - presentationRuntime.navigationStateMachine.transition(to: .presentingWindow) completion?(true) maybePrefetchUpcomingChapters(aroundAbsolutePageNumber: pageNumber, in: bookPageMap) scheduleAdjacentChapterPrefetches(for: spineIndex, totalSpineCount: publication.spine.count) @@ -378,7 +375,6 @@ final class RDEPUBChapterWarmupOrchestrator { switch result { case .success: self.markPrepareResolved(triggerPageNumber) - self.presentationRuntime.navigationStateMachine.transition(to: .presentingWindow) completion?(true) self.appendLoadedForwardChaptersToCurrentPageMapIfPossible() self.refreshVisibleContentIfNeeded(afterPreparing: spineIndex, triggerPageNumber: triggerPageNumber) diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowCoordinator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowCoordinator.swift deleted file mode 100644 index 9114b0d..0000000 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowCoordinator.swift +++ /dev/null @@ -1,246 +0,0 @@ -import Foundation - -final class RDEPUBChapterWindowCoordinator { - - private unowned let context: RDEPUBReaderContext - - private let store: RDEPUBChapterRuntimeStore - - private let loader: RDEPUBChapterLoader - - private(set) var currentSnapshot: RDEPUBChapterWindowSnapshot? - - var onSnapshotChanged: ((RDEPUBChapterWindowSnapshot) -> Void)? - - init(context: RDEPUBReaderContext, store: RDEPUBChapterRuntimeStore, loader: RDEPUBChapterLoader) { - self.context = context - self.store = store - self.loader = loader - } - - private var restoreChapterOffset: Int? - - func openBook(at targetSpineIndex: Int, restoreChapterOffset: Int? = nil) { - let totalSpineCount = context.publication?.spine.count ?? 0 - store.setCurrentChapter( - spineIndex: targetSpineIndex, - totalSpineCount: totalSpineCount, - windowRadius: context.configuration.chapterWindowRadius - ) - self.restoreChapterOffset = restoreChapterOffset - - isSwitchingChapter = true - - store.setNavigationTarget(spineIndex: targetSpineIndex) - - store.clearPrefetchTargets() - - loadChapterWithFallback(initialSpineIndex: targetSpineIndex, totalSpineCount: totalSpineCount) - } - - private func loadChapterWithFallback(initialSpineIndex: Int, totalSpineCount: Int) { - loader.loadChapter(spineIndex: initialSpineIndex, store: store, priority: .navigation) { [weak self] result in - guard let self = self else { return } - switch result { - case .success(let chapter): - self.isSwitchingChapter = false - self.buildSnapshotAroundCurrent(chapter: chapter) - case .failure(let error): - let nextIndex = initialSpineIndex + 1 - if nextIndex < totalSpineCount { - self.store.setCurrentChapter( - spineIndex: nextIndex, - totalSpineCount: totalSpineCount, - windowRadius: self.context.configuration.chapterWindowRadius - ) - self.store.setNavigationTarget(spineIndex: nextIndex) - self.loadChapterWithFallback(initialSpineIndex: nextIndex, totalSpineCount: totalSpineCount) - } else { - - self.isSwitchingChapter = false - self.handle(error: error) - } - } - } - } - - private func buildSnapshotAroundCurrent(chapter: RDEPUBRuntimeChapter) { - guard let current = store.currentSpineIndex else { - return - } - let chapters = store.windowSpineIndices.compactMap { spineIndex -> RDEPUBRuntimeChapter? in - if spineIndex == chapter.spineIndex { - return chapter - } - return store.chapterData(for: spineIndex) - } - let snapshot = RDEPUBChapterWindowSnapshot.from(chapters: chapters, anchorSpineIndex: current) - currentSnapshot = snapshot - isApplyingSnapshot = true - onSnapshotChanged?(snapshot) - isApplyingSnapshot = false - - if let offset = restoreChapterOffset, - let chapter = snapshot.chapterForPage(flattenedPageIndex: snapshot.anchorPageOffset), - let pageIndex = chapter.chapterOffsetMap.pageIndex(forChapterOffset: offset) { - let targetPage = snapshot.anchorPageOffset + pageIndex - context.readerView?.transitionToPage(pageNum: targetPage, animated: false) - } else if snapshot.pageCount > 0 { - - context.readerView?.transitionToPage(pageNum: snapshot.anchorPageOffset, animated: false) - } - restoreChapterOffset = nil - - prefetchAdjacent(current: current) - } - - private func prefetchAdjacent(current: Int) { - for spineIndex in store.windowSpineIndices where spineIndex != current { - guard store.chapterData(for: spineIndex) == nil else { continue } - store.addPrefetchTarget(spineIndex) - loader.loadChapter(spineIndex: spineIndex, store: store, priority: .prefetch) { [weak self] result in - guard let self = self, case .success = result else { return } - self.refreshSnapshot() - } - } - } - - func flipToNextChapter(completion: @escaping (Result) -> Void) { - guard let current = store.currentSpineIndex else { return } - let next = current + 1 - let totalSpineCount = context.publication?.spine.count ?? 0 - guard next < totalSpineCount else { return } - - flipToChapter(spineIndex: next, completion: completion) - } - - func flipToPreviousChapter(completion: @escaping (Result) -> Void) { - guard let current = store.currentSpineIndex, current > 0 else { return } - flipToChapter(spineIndex: current - 1, completion: completion) - } - - func flipToChapter( - spineIndex: Int, - completion: @escaping (Result) -> Void - ) { - let totalSpineCount = context.publication?.spine.count ?? 0 - - store.setNavigationTarget(spineIndex: spineIndex) - - store.clearPrefetchTargets() - - isSwitchingChapter = true - - store.setCurrentChapter( - spineIndex: spineIndex, - totalSpineCount: totalSpineCount, - windowRadius: context.configuration.chapterWindowRadius - ) - let evictable = store.evictableSpineIndices() - for idx in evictable { - store.evict(spineIndex: idx) - } - - if let cached = store.chapterData(for: spineIndex) { - buildSnapshotAroundCurrent(chapter: cached) - isSwitchingChapter = false - if let snap = currentSnapshot { - completion(.success(snap)) - } - return - } - - loader.loadChapter(spineIndex: spineIndex, store: store, priority: .navigation) { [weak self] result in - guard let self = self else { return } - self.isSwitchingChapter = false - switch result { - case .success(let chapter): - self.buildSnapshotAroundCurrent(chapter: chapter) - if let snap = self.currentSnapshot { - completion(.success(snap)) - } - case .failure(let error): - completion(.failure(error)) - } - } - } - - func refreshSnapshot() { - guard let current = store.currentSpineIndex, - let currentChapter = store.chapterData(for: current) else { return } - - guard isReaderIdle() else { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in - self?.refreshSnapshot() - } - return - } - - let chapters = store.windowSpineIndices.compactMap { store.chapterData(for: $0) } - let newSnapshot = RDEPUBChapterWindowSnapshot.from(chapters: chapters, anchorSpineIndex: current) - - if snapshotContentChanged(old: currentSnapshot, new: newSnapshot) { - currentSnapshot = newSnapshot - isApplyingSnapshot = true - onSnapshotChanged?(newSnapshot) - isApplyingSnapshot = false - } - } - - func maintainWindow(afterMovingTo spineIndex: Int) { - let totalSpineCount = context.publication?.spine.count ?? 0 - - store.setCurrentChapter( - spineIndex: spineIndex, - totalSpineCount: totalSpineCount, - windowRadius: context.configuration.chapterWindowRadius - ) - for idx in store.evictableSpineIndices() { - store.evict(spineIndex: idx) - } - - prefetchAdjacent(current: spineIndex) - } - - private func handle(error: Error) { - DispatchQueue.main.async { [weak self] in - guard let self else { return } - self.context.hideLoading() - } - } - - private func snapshotContentChanged( - old: RDEPUBChapterWindowSnapshot?, - new: RDEPUBChapterWindowSnapshot - ) -> Bool { - guard let old = old else { return true } - - if old.chapters.count != new.chapters.count { return true } - - let oldSpines = old.chapters.map { $0.spineIndex } - let newSpines = new.chapters.map { $0.spineIndex } - if oldSpines != newSpines { return true } - - if old.pageCount != new.pageCount { return true } - - for (oldCh, newCh) in zip(old.chapters, new.chapters) { - if oldCh.pages.count != newCh.pages.count { return true } - } - - if old.anchorChapterIndex != new.anchorChapterIndex - || old.anchorPageOffset != new.anchorPageOffset { return true } - - return false - } - - private func isReaderIdle() -> Bool { - guard !store.isBuilding else { return false } - guard !isSwitchingChapter else { return false } - guard !isApplyingSnapshot else { return false } - return true - } - - private var isSwitchingChapter: Bool = false - - private var isApplyingSnapshot: Bool = false -} diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowSnapshot.swift b/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowSnapshot.swift deleted file mode 100644 index 561d838..0000000 --- a/Sources/RDReaderView/EPUBUI/ReaderController/ChapterRuntime/RDEPUBChapterWindowSnapshot.swift +++ /dev/null @@ -1,58 +0,0 @@ -import Foundation - -struct RDEPUBChapterWindowSnapshot { - - let chapters: [RDEPUBRuntimeChapter] - - let flattenedPages: [RDEPUBTextPage] - - let anchorChapterIndex: Int - - let anchorPageOffset: Int - - let windowStartSpineIndex: Int - - static func from( - chapters: [RDEPUBRuntimeChapter], - anchorSpineIndex: Int - ) -> RDEPUBChapterWindowSnapshot { - let sortedChapters = chapters.sorted { $0.spineIndex < $1.spineIndex } - let anchorIndex = sortedChapters.firstIndex { $0.spineIndex == anchorSpineIndex } ?? 0 - let pageOffset = sortedChapters.prefix(anchorIndex).reduce(0) { $0 + $1.pages.count } - - var allPages: [RDEPUBTextPage] = [] - for (chIdx, ch) in sortedChapters.enumerated() { - for var page in ch.pages { - page.chapterIndex = chIdx - allPages.append(page) - } - } - - let windowStartSpineIndex = sortedChapters.first?.spineIndex ?? anchorSpineIndex - - return RDEPUBChapterWindowSnapshot( - chapters: sortedChapters, - flattenedPages: allPages, - anchorChapterIndex: anchorIndex, - anchorPageOffset: pageOffset, - windowStartSpineIndex: windowStartSpineIndex - ) - } - - func chapterForPage(flattenedPageIndex: Int) -> RDEPUBRuntimeChapter? { - var offset = 0 - for ch in chapters { - if flattenedPageIndex < offset + ch.pages.count { - return ch - } - offset += ch.pages.count - } - return nil - } - - func spineIndexForPage(flattenedPageIndex: Int) -> Int? { - return chapterForPage(flattenedPageIndex: flattenedPageIndex)?.spineIndex - } - - var pageCount: Int { flattenedPages.count } -} diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBBackgroundPriorityPolicy.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBBackgroundPriorityPolicy.swift index b5d9fa7..0d5a652 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBBackgroundPriorityPolicy.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBBackgroundPriorityPolicy.swift @@ -63,6 +63,7 @@ final class RDEPUBBackgroundPriorityManager { private(set) var policy: RDEPUBBackgroundPriorityPolicy private var warmAnchors: [RDEPUBWarmJumpAnchor] = [] + private let warmAnchorsLock = NSLock() private(set) var currentGeneration: Int = 0 @@ -84,11 +85,13 @@ final class RDEPUBBackgroundPriorityManager { sequenceNumber: currentGeneration ) + warmAnchorsLock.lock() warmAnchors.insert(anchor, at: 0) if warmAnchors.count > policy.maxWarmJumpAnchors { warmAnchors = Array(warmAnchors.prefix(policy.maxWarmJumpAnchors)) } + warmAnchorsLock.unlock() currentGeneration += 1 coldCursor = 0 @@ -103,10 +106,17 @@ final class RDEPUBBackgroundPriorityManager { let uncachedIndices = allBuildableIndices.filter { !cachedSpineIndices.contains($0) } guard !uncachedIndices.isEmpty else { return [] } + // M-03: Snapshot warmAnchors under lock since it's written on main thread + // and read on background thread. + warmAnchorsLock.lock() + let warmAnchorsSnapshot = warmAnchors + warmAnchorsLock.unlock() + let items = uncachedIndices.map { spineIndex -> (spineIndex: Int, band: RDEPUBPriorityBand) in let band = classifySpineIndex( spineIndex: spineIndex, - currentSpineIndex: currentSpineIndex + currentSpineIndex: currentSpineIndex, + warmAnchors: warmAnchorsSnapshot ) return (spineIndex, band) } @@ -131,7 +141,8 @@ final class RDEPUBBackgroundPriorityManager { private func classifySpineIndex( spineIndex: Int, - currentSpineIndex: Int? + currentSpineIndex: Int?, + warmAnchors: [RDEPUBWarmJumpAnchor] ) -> RDEPUBPriorityBand { if let current = currentSpineIndex { @@ -152,11 +163,15 @@ final class RDEPUBBackgroundPriorityManager { } func currentWarmAnchors() -> [RDEPUBWarmJumpAnchor] { - warmAnchors + warmAnchorsLock.lock() + defer { warmAnchorsLock.unlock() } + return warmAnchors } func reset() { + warmAnchorsLock.lock() warmAnchors.removeAll() + warmAnchorsLock.unlock() currentGeneration = 0 coldCursor = 0 } diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBMetadataParseWorker.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBMetadataParseWorker.swift index 8eac08d..82918e2 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBMetadataParseWorker.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBMetadataParseWorker.swift @@ -26,7 +26,7 @@ final class RDEPUBMetadataParseWorker { private let backgroundInteractionCooldown: CFAbsoluteTime = 0.8 - unowned let context: RDEPUBReaderContext + weak var context: RDEPUBReaderContext? let cancellationController: RDEPUBMetadataParseCancellationController @@ -114,12 +114,16 @@ final class RDEPUBMetadataParseWorker { } func start(token: UUID, restoreLocation: RDEPUBLocation?) { - let context = self.context let cancellationController = self.cancellationController DispatchQueue.global(qos: .utility).async { [weak self] in guard let self else { return } - defer { self.context.runtime?.paginationCoordinator.finishMetadataParseCancellationController(cancellationController) } + let context = self.context + guard let context, + context.controller != nil, + !cancellationController.isCancelled, + context.paginationToken == token else { return } + defer { context.runtime?.paginationCoordinator.finishMetadataParseCancellationController(cancellationController) } guard context.controller != nil, !cancellationController.isCancelled, context.paginationToken == token else { return } @@ -382,10 +386,16 @@ final class RDEPUBMetadataParseWorker { private func waitForReadingInteractionToSettle( cancellationController: RDEPUBMetadataParseCancellationController? = nil ) { - while context.controller != nil, + let semaphore = DispatchSemaphore(value: 0) + let maxWaitIterations = 100 // ~8 seconds max wait + var iteration = 0 + while context?.controller != nil, cancellationController?.isCancelled != true, - context.secondsSinceLastUserNavigation() < backgroundInteractionCooldown { - Thread.sleep(forTimeInterval: 0.08) + iteration < maxWaitIterations { + let elapsed = context?.secondsSinceLastUserNavigation() ?? 0 + if elapsed >= backgroundInteractionCooldown { break } + semaphore.wait(timeout: .now() + 0.08) + iteration += 1 } } @@ -403,8 +413,7 @@ final class RDEPUBMetadataParseWorker { let delay = Self.retryDelays[min(retryCount, Self.retryDelays.count - 1)] DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + delay) { [weak self] in - guard let self else { return } - let context = self.context + guard let self, let context = self.context else { return } guard context.controller != nil, context.paginationToken == self.token, !cancellationController.isCancelled else { diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBNavigationStateMachine.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBNavigationStateMachine.swift deleted file mode 100644 index 3d63e7a..0000000 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBNavigationStateMachine.swift +++ /dev/null @@ -1,76 +0,0 @@ -import Foundation - -enum RDEPUBNavigationState: Equatable { - case idle - case initialLoading - case restoringLocation - case preparingChapter(spineIndex: Int) - case presentingWindow - case reconcilingFullMap - case repaginating -} - -final class RDEPUBNavigationStateMachine { - - private let lock = NSLock() - - private(set) var state: RDEPUBNavigationState = .idle - - func transition(to newState: RDEPUBNavigationState) { - lock.lock() - let oldState = state - state = newState - lock.unlock() - #if DEBUG - validateTransition(from: oldState, to: newState) - #endif - } - - #if DEBUG - private func validateTransition(from oldState: RDEPUBNavigationState, to newState: RDEPUBNavigationState) { - let isValid: Bool - switch (oldState, newState) { - case (.idle, .initialLoading), - (.idle, .preparingChapter), - (.idle, .restoringLocation), - (.idle, .idle): - isValid = true - case (.initialLoading, .preparingChapter), - (.initialLoading, .presentingWindow), - (.initialLoading, .idle), - (.initialLoading, .initialLoading): - isValid = true - case (.restoringLocation, .preparingChapter), - (.restoringLocation, .presentingWindow), - (.restoringLocation, .idle), - (.restoringLocation, .restoringLocation): - isValid = true - case (.preparingChapter, .presentingWindow), - (.preparingChapter, .preparingChapter), - (.preparingChapter, .idle): - isValid = true - case (.presentingWindow, .idle), - (.presentingWindow, .reconcilingFullMap), - (.presentingWindow, .preparingChapter), - (.presentingWindow, .presentingWindow), - (.presentingWindow, .repaginating): - isValid = true - case (.reconcilingFullMap, .presentingWindow), - (.reconcilingFullMap, .idle), - (.reconcilingFullMap, .reconcilingFullMap): - isValid = true - case (.repaginating, .presentingWindow), - (.repaginating, .idle), - (.repaginating, .repaginating): - isValid = true - default: - isValid = false - } - if !isValid { - #if DEBUG - assertionFailure("Unexpected navigation state transition: \(oldState) → \(newState)") - #endif - } - } - #endif -} diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPaginationState.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPaginationState.swift deleted file mode 100644 index 08619b0..0000000 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPaginationState.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation - -enum RDEPUBPaginationStateSource: String { - case initialPartial - case asyncExtension - case pendingFullMap - case fullReplacement - case settingsPreview - case cacheRestore - case repagination -} - -struct RDEPUBPaginationState { - - var activePageMap: RDEPUBBookPageMap? - - var pendingPageMapUpdates: [RDEPUBPendingPageMapUpdate] = [] - - var chapterWindowSnapshot: RDEPUBChapterWindowSnapshot? - - var source: RDEPUBPaginationStateSource = .initialPartial -} diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPresentationRuntime.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPresentationRuntime.swift index 668cb78..62efa51 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPresentationRuntime.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBPresentationRuntime.swift @@ -8,7 +8,6 @@ enum RDEPUBPendingPageMapUpdateKind { struct RDEPUBPendingPageMapUpdate { let pageMap: RDEPUBBookPageMap - let source: RDEPUBPaginationStateSource let kind: RDEPUBPendingPageMapUpdateKind } @@ -22,10 +21,6 @@ final class RDEPUBPresentationRuntime { private unowned let reconciliationCoordinator: RDEPUBPageMapReconciliationCoordinator - let navigationStateMachine = RDEPUBNavigationStateMachine() - - private(set) var paginationState = RDEPUBPaginationState() - init( context: RDEPUBReaderContext, locationCoordinator: RDEPUBReaderLocationCoordinator, @@ -43,19 +38,14 @@ final class RDEPUBPresentationRuntime { restoreLocation: RDEPUBLocation?, finishPagination: (RDEPUBLocation?) -> Void ) { - navigationStateMachine.transition(to: .presentingWindow) context.textBook = nil context.bookPageMap = bookPageMap context.pendingPageMapUpdates.removeAll() context.replaceActiveSnapshot(makeSnapshot(from: bookPageMap)) - paginationState.activePageMap = bookPageMap - paginationState.pendingPageMapUpdates.removeAll() - paginationState.source = .initialPartial finishPagination(restoreLocation) } func refreshBookPageMapInPlace(_ bookPageMap: RDEPUBBookPageMap) { - navigationStateMachine.transition(to: .reconcilingFullMap) RDEPUBBackgroundTrace.log( "Reconciliation", "refreshBookPageMapInPlace: enqueued reconcileFullMap chapters=\(bookPageMap.totalChapters) pages=\(bookPageMap.totalPages)" @@ -63,7 +53,6 @@ final class RDEPUBPresentationRuntime { enqueuePendingPageMapUpdate( RDEPUBPendingPageMapUpdate( pageMap: bookPageMap, - source: .pendingFullMap, kind: .reconcileFullMap ) ) @@ -99,7 +88,6 @@ final class RDEPUBPresentationRuntime { enqueuePendingPageMapUpdate( RDEPUBPendingPageMapUpdate( pageMap: bookPageMap, - source: .asyncExtension, kind: .extendPartial( currentPageNumber: currentPageNumber, currentLocation: currentLocation @@ -109,28 +97,19 @@ final class RDEPUBPresentationRuntime { } func applySettingsPreviewPageMap(_ bookPageMap: RDEPUBBookPageMap) { - navigationStateMachine.transition(to: .presentingWindow) context.bookPageMap = bookPageMap context.replaceActiveSnapshot(makeSnapshot(from: bookPageMap)) - paginationState.activePageMap = bookPageMap - paginationState.source = .settingsPreview } func queueForwardAppendedPageMap(_ bookPageMap: RDEPUBBookPageMap) { enqueuePendingPageMapUpdate( RDEPUBPendingPageMapUpdate( pageMap: bookPageMap, - source: .asyncExtension, kind: .appendForward ) ) } - func clear() { - paginationState = RDEPUBPaginationState() - navigationStateMachine.transition(to: .idle) - } - func makeSnapshot(from bookPageMap: RDEPUBBookPageMap) -> RDEPUBReadingSession.PaginationSnapshot { let pages = bookPageMap.entries.flatMap { entry in (0.. Bool { switch update.kind { case .reconcileFullMap: - navigationStateMachine.transition(to: .reconcilingFullMap) let decision = reconciliationCoordinator.evaluateTakeover( candidatePageMap: update.pageMap, candidateSegment: nil, @@ -248,7 +225,7 @@ final class RDEPUBPresentationRuntime { case .extendPartial(_, let currentLocation): removePendingPageMapUpdate(at: index) - applyPageMapToLiveModel(update.pageMap, source: update.source) + applyPageMapToLiveModel(update.pageMap) if let currentLocation, rebindVisibleLocation(currentLocation, readerView: readerView, controller: controller) { return true @@ -266,7 +243,7 @@ final class RDEPUBPresentationRuntime { case .appendForward: removePendingPageMapUpdate(at: index) - applyPageMapToLiveModel(update.pageMap, source: update.source) + applyPageMapToLiveModel(update.pageMap) readerView.reloadPageCountOnly() return true } @@ -305,7 +282,7 @@ final class RDEPUBPresentationRuntime { if context.bookPageMap != nil, context.runtime?.prepareOnDemandChapter( forAbsolutePageNumber: targetPageNumber, - allowSynchronousLoad: true + allowSynchronousLoad: false ) == false { return false } @@ -317,16 +294,10 @@ final class RDEPUBPresentationRuntime { return true } - private func applyPageMapToLiveModel( - _ pageMap: RDEPUBBookPageMap, - source: RDEPUBPaginationStateSource - ) { - navigationStateMachine.transition(to: .presentingWindow) + private func applyPageMapToLiveModel(_ pageMap: RDEPUBBookPageMap) { context.bookPageMap = pageMap context.replaceActiveSnapshot(makeSnapshot(from: pageMap)) discardSupersededPendingPageMapUpdates(afterApplying: pageMap) - paginationState.activePageMap = pageMap - paginationState.source = source } private func removePendingPageMapUpdate(at index: Int) { @@ -334,7 +305,6 @@ final class RDEPUBPresentationRuntime { guard updates.indices.contains(index) else { return } updates.remove(at: index) context.pendingPageMapUpdates = updates - paginationState.pendingPageMapUpdates = updates } private func discardSupersededPendingPageMapUpdates(afterApplying liveMap: RDEPUBBookPageMap) { @@ -346,7 +316,6 @@ final class RDEPUBPresentationRuntime { ) } context.pendingPageMapUpdates = updates - paginationState.pendingPageMapUpdates = updates } private func pendingPriority(for kind: RDEPUBPendingPageMapUpdateKind) -> Int { @@ -384,4 +353,4 @@ final class RDEPUBPresentationRuntime { && candidate.pageMap.totalPages >= existing.pageMap.totalPages ) } -} +} \ No newline at end of file diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift index 5ce082e..11ba88a 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift @@ -1,5 +1,14 @@ import UIKit +/// Captures layout parameters on the main thread for safe use on background queues. +/// Create via `RDEPUBReaderContext.makeLayoutSnapshot()` before dispatching work off the main thread. +struct RDEPUBLayoutSnapshot { + let pageSize: CGSize + let style: RDEPUBTextRenderStyle + let layoutConfig: RDEPUBTextLayoutConfig + let renderSignature: String +} + final class RDEPUBReaderContext { private let activityLock = NSLock() @@ -73,11 +82,6 @@ final class RDEPUBReaderContext { set { state.paginationToken = newValue } } - var paginator: RDEPUBPaginator? { - get { state.paginator } - set { state.paginator = newValue } - } - var searchState: RDEPUBSearchState? { get { state.searchState } set { state.searchState = newValue } @@ -159,43 +163,57 @@ final class RDEPUBReaderContext { } func currentPreferences() -> RDEPUBPreferences { - configuration.makePreferences() + let safeInsets = controller?.view.safeAreaInsets ?? .zero + return configuration.makePreferences(safeAreaInsets: safeInsets) + } + + /// Captures all layout parameters needed for background chapter loading. + /// Must be called on the main thread. The returned snapshot is safe to use on any thread. + func makeLayoutSnapshot() -> RDEPUBLayoutSnapshot { + dispatchPrecondition(condition: .onQueue(.main)) + let pageSize = currentTextPageSize() + let style = currentTextRenderStyle() + let layoutConfig = currentTextLayoutConfig(pageSize: pageSize) + let renderSignature = renderSignature(style: style, pageSize: pageSize, layoutConfig: layoutConfig) + return RDEPUBLayoutSnapshot( + pageSize: pageSize, + style: style, + layoutConfig: layoutConfig, + renderSignature: renderSignature + ) } func currentTextPageSize() -> CGSize { - if Thread.isMainThread { - let pageNum = (readerView?.currentPage ?? -1) >= 0 ? readerView?.currentPage : nil - if let readerView, let pageNum { - let resolvedSize = readerView.resolvedSinglePageSize(pageNum: pageNum) - if resolvedSize.width > 0, resolvedSize.height > 0 { - return resolvedSize - } + // M-04: Use dispatchPrecondition instead of assert so it's enforced in Release builds too. + dispatchPrecondition(condition: .onQueue(.main)) + + let pageNum = (readerView?.currentPage ?? -1) >= 0 ? readerView?.currentPage : nil + if let readerView, let pageNum { + let resolvedSize = readerView.resolvedSinglePageSize(pageNum: pageNum) + if resolvedSize.width > 0, resolvedSize.height > 0 { + return resolvedSize } - let viewportSize = currentLayoutContext().viewportSize - if viewportSize.width > 0, viewportSize.height > 0 { - return viewportSize - } - } else if let lastTextPaginationPageSize, - lastTextPaginationPageSize.width > 0, - lastTextPaginationPageSize.height > 0 { + } + let viewportSize = currentLayoutContext().viewportSize + if viewportSize.width > 0, viewportSize.height > 0 { + return viewportSize + } + if let lastTextPaginationPageSize, + lastTextPaginationPageSize.width > 0, + lastTextPaginationPageSize.height > 0 { return lastTextPaginationPageSize - } else { - let mainThreadSize = DispatchQueue.main.sync { [weak self] in - self?.currentTextPageSize() ?? .zero - } - if mainThreadSize.width > 0, mainThreadSize.height > 0 { - return mainThreadSize - } } return environment.fallbackViewportSize } func currentTextRenderStyle() -> RDEPUBTextRenderStyle { - environment.currentTextRenderStyle(configuration: configuration) + dispatchPrecondition(condition: .onQueue(.main)) + return environment.currentTextRenderStyle(configuration: configuration) } func currentTextLayoutConfig(pageSize: CGSize) -> RDEPUBTextLayoutConfig { - environment.currentTextLayoutConfig(configuration: configuration, pageSize: pageSize) + dispatchPrecondition(condition: .onQueue(.main)) + return environment.currentTextLayoutConfig(configuration: configuration, pageSize: pageSize) } func resolvedTextRenderer() -> RDEPUBTextRenderer { @@ -282,10 +300,19 @@ final class RDEPUBReaderContext { } func currentRenderSignature() -> String { + dispatchPrecondition(condition: .onQueue(.main)) let style = currentTextRenderStyle() let pageSize = currentTextPageSize() let layoutConfig = currentTextLayoutConfig(pageSize: pageSize) - return [ + return renderSignature(style: style, pageSize: pageSize, layoutConfig: layoutConfig) + } + + private func renderSignature( + style: RDEPUBTextRenderStyle, + pageSize: CGSize, + layoutConfig: RDEPUBTextLayoutConfig + ) -> String { + [ style.font.fontName, "\(style.font.pointSize)", "\(configuration.lineHeightMultiple)", diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderEnvironment.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderEnvironment.swift index ed8544a..d9dfa4d 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderEnvironment.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderEnvironment.swift @@ -46,10 +46,11 @@ final class RDEPUBReaderEnvironment { configuration: RDEPUBReaderConfiguration, pageSize: CGSize ) -> RDEPUBTextLayoutConfig { - RDEPUBTextLayoutConfig( + let layoutContext = currentLayoutContext(configuration: configuration) + return RDEPUBTextLayoutConfig( frameWidth: max(pageSize.width, 1), frameHeight: max(pageSize.height, 1), - edgeInsets: configuration.reflowableContentInsets, + edgeInsets: layoutContext.safeReflowableContentInsets, numberOfColumns: configuration.numberOfColumns, columnGap: configuration.columnGap, avoidOrphans: false, diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLoadCoordinator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLoadCoordinator.swift index c29bf15..43405f0 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLoadCoordinator.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLoadCoordinator.swift @@ -1,14 +1,14 @@ import Foundation final class RDEPUBReaderLoadCoordinator { - private unowned let context: RDEPUBReaderContext + private weak var context: RDEPUBReaderContext? init(context: RDEPUBReaderContext) { self.context = context } func startInitialLoadIfNeeded() { - guard let controller = context.controller, + guard let context, let controller = context.controller, let readerView = context.readerView, !controller.didStartInitialLoad, readerView.bounds.width > 0, @@ -20,14 +20,14 @@ final class RDEPUBReaderLoadCoordinator { } func loadPublication() { - guard let controller = context.controller else { return } + guard let context, let controller = context.controller else { return } context.showLoading() let loadToken = UUID() context.paginationToken = loadToken - DispatchQueue.global(qos: .userInitiated).async { [weak controller] in - guard let controller else { return } - let parser = self.context.makeParser() + DispatchQueue.global(qos: .userInitiated).async { [weak self] in + guard let self, let context = self.context, let controller = context.controller else { return } + let parser = context.makeParser() do { try parser.parse(epubURL: controller.epubURL) @@ -37,9 +37,10 @@ final class RDEPUBReaderLoadCoordinator { let bookmarks = controller.persistence?.loadBookmarks(for: bookIdentifier) ?? [] let highlights = controller.persistence?.loadHighlights(for: bookIdentifier) ?? [] - DispatchQueue.main.async { - guard self.context.paginationToken == loadToken else { return } - self.context.runtime?.applyParsedPublication( + DispatchQueue.main.async { [weak self] in + guard let self, let context = self.context else { return } + guard context.paginationToken == loadToken else { return } + context.runtime?.applyParsedPublication( parser: parser, publication: publication, bookIdentifier: bookIdentifier, @@ -49,9 +50,10 @@ final class RDEPUBReaderLoadCoordinator { ) } } catch { - DispatchQueue.main.async { - guard self.context.paginationToken == loadToken else { return } - self.context.handle(error: error) + DispatchQueue.main.async { [weak self] in + guard let self, let context = self.context else { return } + guard context.paginationToken == loadToken else { return } + context.handle(error: error) } } } @@ -65,14 +67,13 @@ final class RDEPUBReaderLoadCoordinator { bookmarks: [RDEPUBBookmark], highlights: [RDEPUBHighlight] ) { - guard let controller = context.controller else { return } + guard let context, let controller = context.controller else { return } context.parser = parser context.publication = publication context.currentBookIdentifier = bookIdentifier context.activeBookmarks = bookmarks context.activeHighlights = highlights context.readingSession = RDEPUBReadingSession(publication: publication) - context.readingSession?.transition(to: .loading) controller.title = parser.metadata.title.isEmpty ? controller.epubURL.deletingPathExtension().lastPathComponent : parser.metadata.title diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLocationCoordinator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLocationCoordinator.swift index 773d410..0c34441 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLocationCoordinator.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderLocationCoordinator.swift @@ -22,7 +22,6 @@ final class RDEPUBReaderLocationCoordinator { } guard let targetPageNumber = controller.pageNumber(for: location, rangeInfo: targetHighlightRangeInfo) else { readerView.transitionToPage(pageNum: 0) - context.readingSession?.transition(to: .idle) return false } @@ -44,7 +43,6 @@ final class RDEPUBReaderLocationCoordinator { targetHighlightRangeInfo: targetHighlightRangeInfo ) } else { - context.readingSession?.transition(to: .jumping) } readerView.transitionToPage(pageNum: max(targetPageNumber - 1, 0), animated: animated) diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderPaginationCoordinator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderPaginationCoordinator.swift index b4164c4..ea065e1 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderPaginationCoordinator.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderPaginationCoordinator.swift @@ -23,7 +23,6 @@ final class RDEPUBReaderPaginationCoordinator { } controller.isRepaginating = true - context.runtime?.presentationRuntime.navigationStateMachine.transition(to: .repaginating) controller.errorLabel.isHidden = true controller.showLoading() let token = UUID() @@ -51,7 +50,6 @@ final class RDEPUBReaderPaginationCoordinator { } let paginator = context.makePaginator() - context.paginator = paginator paginator.calculate( parser: parser, hostingView: controller.ensurePaginationHostView(), @@ -63,7 +61,6 @@ final class RDEPUBReaderPaginationCoordinator { preferences: controller.currentPreferences(), layoutContext: controller.currentLayoutContext() ) - self.context.paginator = nil self.context.runtime?.applyPaginationSnapshot(snapshot, restoreLocation: restoreLocation) } } @@ -106,15 +103,12 @@ final class RDEPUBReaderPaginationCoordinator { guard let controller = context.controller, let readerView = context.readerView else { return } controller.isRepaginating = false - context.runtime?.presentationRuntime.navigationStateMachine.transition(to: .presentingWindow) controller.hideLoading() readerView.reloadData() if let targetLocation = restoreLocation { controller.restoreReadingLocation(targetLocation) - context.readingSession?.transition(to: .idle) } else { readerView.transitionToPage(pageNum: 0) - context.readingSession?.transition(to: .idle) } context.runtime?.viewportMonitor.processPendingChangeAfterPagination() @@ -171,10 +165,12 @@ final class RDEPUBReaderPaginationCoordinator { let pageSize = controller.currentTextPageSize() context.lastTextPaginationPageSize = pageSize + let layoutSnapshot = context.makeLayoutSnapshot() + let runtime = context.runtime DispatchQueue.global(qos: .utility).async { [weak controller] in guard controller != nil else { return } - guard context.controller != nil else { return } + guard let runtime else { return } let prioritizedCandidates = self.prioritizedBuildableSpineIndices( publication: publication, readingSession: readingSession, @@ -190,16 +186,16 @@ final class RDEPUBReaderPaginationCoordinator { } do { - guard context.controller != nil, - let runtime = context.runtime else { return } let runtimeChapter = try self.loadFirstRenderableRuntimeChapter( prioritizedSpineIndices: prioritizedCandidates, - runtime: runtime + runtime: runtime, + layoutSnapshot: layoutSnapshot ) let initialChapters = self.loadInitialInteractiveRuntimeChapters( anchorChapter: runtimeChapter, publication: publication, - runtime: runtime + runtime: runtime, + layoutSnapshot: layoutSnapshot ) DispatchQueue.main.async { @@ -238,14 +234,16 @@ final class RDEPUBReaderPaginationCoordinator { private func loadFirstRenderableRuntimeChapter( prioritizedSpineIndices: [Int], - runtime: RDEPUBReaderRuntime + runtime: RDEPUBReaderRuntime, + layoutSnapshot: RDEPUBLayoutSnapshot ) throws -> RDEPUBRuntimeChapter { var lastError: Error? for spineIndex in prioritizedSpineIndices { do { return try runtime.chapterLoader.loadChapterSynchronouslyForMigration( spineIndex: spineIndex, - store: runtime.chapterRuntimeStore + store: runtime.chapterRuntimeStore, + layoutSnapshot: layoutSnapshot ) } catch { lastError = error @@ -257,7 +255,8 @@ final class RDEPUBReaderPaginationCoordinator { private func loadInitialInteractiveRuntimeChapters( anchorChapter: RDEPUBRuntimeChapter, publication: RDEPUBPublication, - runtime: RDEPUBReaderRuntime + runtime: RDEPUBReaderRuntime, + layoutSnapshot: RDEPUBLayoutSnapshot ) -> [RDEPUBRuntimeChapter] { let minimumInteractivePageCount = 2 let maximumAdditionalChapters = 1 @@ -283,10 +282,14 @@ final class RDEPUBReaderPaginationCoordinator { do { let chapter = try runtime.chapterLoader.loadChapterSynchronouslyForMigration( spineIndex: spineIndex, - store: runtime.chapterRuntimeStore + store: runtime.chapterRuntimeStore, + layoutSnapshot: layoutSnapshot ) selectedChapters.append(chapter) } catch { + #if DEBUG + print("[RDEPUBReaderPaginationCoordinator] ⚠️ Failed to load chapter at spineIndex \(spineIndex): \(error)") + #endif } } diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderRuntime.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderRuntime.swift index 4c15023..847ff22 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderRuntime.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderRuntime.swift @@ -601,7 +601,6 @@ final class RDEPUBReaderRuntime { backgroundPriorityManager.reset() backgroundCoverageStore.clearAll() chapterWarmupOrchestrator.clear() - presentationRuntime.clear() } func handleMemoryWarning() { @@ -618,6 +617,7 @@ final class RDEPUBReaderRuntime { activeWindowSpineIndices: activeWindowIndices, protectedSpineIndices: protectedIndices ) + chapterRuntimeStore.handleMemoryWarning() } private func makePartialPageMap(from chapters: [RDEPUBRuntimeChapter]) -> RDEPUBBookPageMap { diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderSearchCoordinator.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderSearchCoordinator.swift index 212b34f..e489428 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderSearchCoordinator.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderSearchCoordinator.swift @@ -4,6 +4,24 @@ final class RDEPUBReaderSearchCoordinator { private unowned let context: RDEPUBReaderContext + private let searchQueue = DispatchQueue(label: "com.ssreaderview.epub.search", qos: .userInitiated) + + private let tokenLock = NSLock() + private var _currentSearchToken: UUID = UUID() + + private var currentSearchToken: UUID { + get { + tokenLock.lock() + defer { tokenLock.unlock() } + return _currentSearchToken + } + set { + tokenLock.lock() + _currentSearchToken = newValue + tokenLock.unlock() + } + } + init(context: RDEPUBReaderContext) { self.context = context } @@ -20,18 +38,31 @@ final class RDEPUBReaderSearchCoordinator { return } - let matches = resolvedSearchMatches(for: normalizedKeyword) - controller.searchState = RDEPUBSearchState( - keyword: normalizedKeyword, - matches: matches, - currentMatchIndex: matches.isEmpty ? nil : 0 - ) - notifySearchStateChanged() + let token = UUID() + currentSearchToken = token - if matches.isEmpty { - controller.refreshVisibleContentPreservingLocation() - } else { - _ = navigateToCurrentSearchMatch(animated: false) + let searchEngine = makeSearchEngine() + let layoutSnapshot = context.makeLayoutSnapshot() + + searchQueue.async { [weak self] in + guard let self, self.currentSearchToken == token else { return } + let matches = self.performSearch(using: searchEngine, keyword: normalizedKeyword, layoutSnapshot: layoutSnapshot) + + DispatchQueue.main.async { [weak self] in + guard let self, self.currentSearchToken == token else { return } + guard let controller = self.context.controller else { return } + controller.searchState = RDEPUBSearchState( + keyword: normalizedKeyword, + matches: matches, + currentMatchIndex: matches.isEmpty ? nil : 0 + ) + self.notifySearchStateChanged() + if matches.isEmpty { + controller.refreshVisibleContentPreservingLocation() + } else { + _ = self.navigateToCurrentSearchMatch(animated: false) + } + } } } @@ -52,7 +83,6 @@ final class RDEPUBReaderSearchCoordinator { searchState.matches.indices.contains(index) else { return false } - searchState.currentMatchIndex = index controller.searchState = searchState notifySearchStateChanged() @@ -60,6 +90,7 @@ final class RDEPUBReaderSearchCoordinator { } func clearSearch() { + currentSearchToken = UUID() guard let controller else { return } controller.searchState = nil notifySearchStateChanged() @@ -105,29 +136,43 @@ final class RDEPUBReaderSearchCoordinator { return RDEPUBSearchPresentation(keyword: searchState.keyword, resources: resources) } - private func resolvedSearchMatches(for keyword: String) -> [RDEPUBSearchMatch] { - guard let controller else { return [] } - if let textBook = controller.textBook { - if let publication = controller.publication { - return RDEPUBTextSearchEngine(textBook: textBook, publication: publication).search(keyword: keyword) - } - return RDEPUBTextSearchEngine.searchWithoutPublication(textBook: textBook, keyword: keyword) + // MARK: - Private + + private func makeSearchEngine() -> SearchEngineSnapshot? { + guard let controller else { return nil } + if let textBook = controller.textBook, let publication = controller.publication { + return .textBook(textBook, publication) } - if controller.readerContext.bookPageMap != nil, controller.publication != nil { - return resolvedOnDemandSearchMatches(for: keyword) + if controller.readerContext.bookPageMap != nil, let publication = controller.publication { + return .onDemand(publication) } if let parser = controller.parser, let publication = controller.publication { - return RDEPUBHTMLSearchEngine(parser: parser, publication: publication).search(keyword: keyword) + return .html(parser, publication) } - return [] + return nil } - private func resolvedOnDemandSearchMatches(for keyword: String) -> [RDEPUBSearchMatch] { - guard let controller, - let publication = controller.publication else { - return [] + private func performSearch(using engine: SearchEngineSnapshot?, keyword: String, layoutSnapshot: RDEPUBLayoutSnapshot?) -> [RDEPUBSearchMatch] { + guard let engine else { return [] } + switch engine { + case .textBook(let textBook, let publication): + return RDEPUBTextSearchEngine(textBook: textBook, publication: publication).search(keyword: keyword) + case .onDemand(let publication): + return resolvedOnDemandSearchMatches(for: keyword, publication: publication, layoutSnapshot: layoutSnapshot) + case .html(let parser, let publication): + return RDEPUBHTMLSearchEngine(parser: parser, publication: publication).search(keyword: keyword) } + } + private enum SearchEngineSnapshot { + case textBook(RDEPUBTextBook, RDEPUBPublication) + case onDemand(RDEPUBPublication) + case html(RDEPUBParser, RDEPUBPublication) + } + + // H-09: Each chapter iteration is wrapped in autoreleasepool to release + // the chapter's typesetAttributedString memory between iterations. + private func resolvedOnDemandSearchMatches(for keyword: String, publication: RDEPUBPublication, layoutSnapshot: RDEPUBLayoutSnapshot?) -> [RDEPUBSearchMatch] { let normalizedKeyword = keyword.trimmingCharacters(in: .whitespacesAndNewlines) guard !normalizedKeyword.isEmpty else { return [] @@ -140,52 +185,58 @@ final class RDEPUBReaderSearchCoordinator { var matches: [RDEPUBSearchMatch] = [] for spineIndex in buildableSpineIndices { - guard let chapter = try? controller.runtime.chapterLoader.loadChapterSynchronouslyForMigration( - spineIndex: spineIndex, - store: controller.runtime.chapterRuntimeStore - ) else { - continue - } - - let chapterData = makeChapterData(from: chapter, chapterIndex: chapter.pages.first?.chapterIndex ?? 0) - let source = chapter.typesetAttributedString.string as NSString - let fullLength = source.length - guard fullLength > 0 else { continue } - - let normalizedHref = publication.resourceResolver.normalizedHref(chapter.href) ?? chapter.href - var localMatchIndex = 0 - var searchRange = NSRange(location: 0, length: fullLength) - - while searchRange.length > 0 { - let foundRange = source.range(of: normalizedKeyword, options: [.caseInsensitive], range: searchRange) - guard foundRange.location != NSNotFound else { - break + let chapterMatches: [RDEPUBSearchMatch] = autoreleasepool { + guard let chapter = try? context.runtime?.chapterLoader.loadChapterSynchronouslyForMigration( + spineIndex: spineIndex, + store: context.runtime?.chapterRuntimeStore ?? RDEPUBChapterRuntimeStore(), + layoutSnapshot: layoutSnapshot + ) else { + return [] } - let progressionDenominator = max(fullLength - 1, 1) - let progression = Double(foundRange.location) / Double(progressionDenominator) - let rangeAnchor = chapterData.rangeAnchor(for: foundRange) - matches.append( - RDEPUBSearchMatch( - href: normalizedHref, - progression: progression, - previewText: previewText(in: source, matchRange: foundRange), - localMatchIndex: localMatchIndex, - rangeLocation: foundRange.location, - rangeLength: foundRange.length, - rangeAnchor: rangeAnchor, - cfi: chapterData.indexTable.cfi(for: rangeAnchor.start)?.rawValue, - rangeCFI: chapterData.indexTable.cfiRange(for: rangeAnchor)?.rawValue + let chapterData = makeChapterData(from: chapter, chapterIndex: chapter.pages.first?.chapterIndex ?? 0) + let source = chapter.typesetAttributedString.string as NSString + let fullLength = source.length + guard fullLength > 0 else { return [] } + + let normalizedHref = publication.resourceResolver.normalizedHref(chapter.href) ?? chapter.href + var localMatches: [RDEPUBSearchMatch] = [] + var localMatchIndex = 0 + var searchRange = NSRange(location: 0, length: fullLength) + + while searchRange.length > 0 { + let foundRange = source.range(of: normalizedKeyword, options: [.caseInsensitive], range: searchRange) + guard foundRange.location != NSNotFound else { + break + } + + let progressionDenominator = max(fullLength - 1, 1) + let progression = Double(foundRange.location) / Double(progressionDenominator) + let rangeAnchor = chapterData.rangeAnchor(for: foundRange) + localMatches.append( + RDEPUBSearchMatch( + href: normalizedHref, + progression: progression, + previewText: previewText(in: source, matchRange: foundRange), + localMatchIndex: localMatchIndex, + rangeLocation: foundRange.location, + rangeLength: max(foundRange.length, 1), + rangeAnchor: rangeAnchor, + cfi: chapterData.indexTable.cfi(for: rangeAnchor.start)?.rawValue, + rangeCFI: chapterData.indexTable.cfiRange(for: rangeAnchor)?.rawValue + ) ) - ) - localMatchIndex += 1 - let nextLocation = foundRange.location + max(foundRange.length, 1) - if nextLocation >= fullLength { - break + localMatchIndex += 1 + let nextLocation = foundRange.location + max(foundRange.length, 1) + if nextLocation >= fullLength { + break + } + searchRange = NSRange(location: nextLocation, length: fullLength - nextLocation) } - searchRange = NSRange(location: nextLocation, length: fullLength - nextLocation) - } + return localMatches + } // end autoreleasepool + matches.append(contentsOf: chapterMatches) } return matches @@ -236,8 +287,9 @@ final class RDEPUBReaderSearchCoordinator { private func notifySearchStateChanged() { guard let controller else { return } - controller.delegate?.epubReader(controller, didUpdateSearchResult: controller.searchState?.result) - controller.delegate?.epubReader(controller, didChangeCurrentSearchMatch: controller.searchState?.currentMatch) + let state = controller.searchState + controller.delegate?.epubReader(controller, didUpdateSearchResult: state?.result) + controller.delegate?.epubReader(controller, didChangeCurrentSearchMatch: state?.currentMatch) } private func navigateToCurrentSearchMatch(animated: Bool) -> Bool { @@ -346,4 +398,4 @@ final class RDEPUBReaderSearchCoordinator { return nil } -} +} \ No newline at end of file diff --git a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift index 1c0a338..eefa79e 100644 --- a/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift +++ b/Sources/RDReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift @@ -1,5 +1,9 @@ import UIKit +/// M-01: All properties must be accessed exclusively from the main thread. +/// This is currently enforced by convention — all verified access paths are main-thread-only. +/// Adding @MainActor would formalize this but requires iOS 15+ and Swift concurrency throughout. +/// For now, rely on the audit-verified access patterns and consider @MainActor in a future refactor. final class RDEPUBReaderState { var parser: RDEPUBParser? @@ -20,8 +24,6 @@ final class RDEPUBReaderState { var paginationToken = UUID() - var paginator: RDEPUBPaginator? - var searchState: RDEPUBSearchState? var pendingPageMapUpdates: [RDEPUBPendingPageMapUpdate] = [] diff --git a/Sources/RDReaderView/EPUBUI/Settings/RDEPUBReaderConfiguration.swift b/Sources/RDReaderView/EPUBUI/Settings/RDEPUBReaderConfiguration.swift index 6e97753..e111175 100644 --- a/Sources/RDReaderView/EPUBUI/Settings/RDEPUBReaderConfiguration.swift +++ b/Sources/RDReaderView/EPUBUI/Settings/RDEPUBReaderConfiguration.swift @@ -169,11 +169,19 @@ extension RDEPUBReaderConfiguration { extension RDEPUBReaderConfiguration { - func makePreferences() -> RDEPUBPreferences { - RDEPUBPreferences( + func makePreferences(safeAreaInsets: UIEdgeInsets = .zero) -> RDEPUBPreferences { + // Use the larger of reflowableContentInsets and safeAreaInsets for each edge + // to prevent content from being hidden under Dynamic Island / home indicator. + let safeInsets = UIEdgeInsets( + top: max(reflowableContentInsets.top, safeAreaInsets.top), + left: max(reflowableContentInsets.left, safeAreaInsets.left), + bottom: max(reflowableContentInsets.bottom, safeAreaInsets.bottom), + right: max(reflowableContentInsets.right, safeAreaInsets.right) + ) + return RDEPUBPreferences( fontSize: fontSize, lineHeightMultiple: lineHeightMultiple, - reflowableContentInsets: reflowableContentInsets, + reflowableContentInsets: safeInsets, fixedContentInset: fixedContentInset, numberOfColumns: numberOfColumns, columnGap: columnGap, diff --git a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBDarkImageAdjuster.swift b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBDarkImageAdjuster.swift index 89b4cbc..9f6935c 100644 --- a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBDarkImageAdjuster.swift +++ b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBDarkImageAdjuster.swift @@ -6,7 +6,20 @@ import DTCoreText enum RDEPUBDarkImageAdjuster { - private static let imageCache = NSCache() + private static let imageCache: NSCache = { + let cache = NSCache() + cache.countLimit = 100 + cache.totalCostLimit = 52_428_800 // 50 MB + return cache + }() + + private static func imageCost(of image: UIImage) -> Int { + let scale = image.scale + let width = Int(image.size.width * scale) + let height = Int(image.size.height * scale) + // 4 bytes per pixel (RGBA) + return width * height * 4 + } #if canImport(DTCoreText) @@ -84,7 +97,7 @@ enum RDEPUBDarkImageAdjuster { context.cgContext.setBlendMode(.sourceAtop) context.fill(CGRect(origin: .zero, size: image.size)) } - imageCache.setObject(adjusted, forKey: cacheKey) + imageCache.setObject(adjusted, forKey: cacheKey, cost: imageCost(of: adjusted)) return adjusted } diff --git a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextContentView.swift b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextContentView.swift index bdffae8..45d9e44 100644 --- a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextContentView.swift +++ b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextContentView.swift @@ -46,6 +46,10 @@ extension RDEPUBTextContentViewDelegate { final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReaderCachePolicyProviding { + private static let pageNumberTrailingPadding: CGFloat = 4 + private static let pageNumberFooterPadding: CGFloat = 8 + private static let pageNumberReservedHeight = ceil(UIFont.systemFont(ofSize: 13).lineHeight) + pageNumberFooterPadding + private var contentInsets: UIEdgeInsets = .zero private var currentPage: RDEPUBTextPage? @@ -56,6 +60,10 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader private var menuSelection: RDEPUBSelection? + // M-15: Backing store for UIEditMenuInteraction (iOS 16+). + // Stored as Any? to avoid @available on stored property restriction. + private var _editMenuInteraction: Any? + private let selectionLoupeView = RDEPUBSelectionLoupeView() private var currentHighlights: [RDEPUBHighlight] = [] @@ -241,6 +249,13 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader tapGestureRecognizer.require(toFail: longPressGestureRecognizer) selectionLoupeView.isHidden = true + // M-15: Use UIEditMenuInteraction on iOS 16+ to replace deprecated UIMenuController + if #available(iOS 16.0, *) { + let interaction = UIEditMenuInteraction(delegate: self) + addInteraction(interaction) + self._editMenuInteraction = interaction + } + selectionController.onSelectionChanged = { [weak self] selection in guard let self else { return } self.currentSelection = selection @@ -322,10 +337,15 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader overlayView.frame = bounds.inset(by: contentInsets) coverImageView.frame = bounds.inset(by: contentInsets) - let labelSize = pageNumberLabel.sizeThatFits(CGSize(width: bounds.width, height: 20)) + let contentRect = bounds.inset(by: contentInsets) + let labelSize = pageNumberLabel.sizeThatFits( + CGSize(width: contentRect.width, height: Self.pageNumberReservedHeight) + ) + let footerOriginY = bounds.maxY - contentInsets.bottom + let footerVerticalInset = max((contentInsets.bottom - labelSize.height) / 2, 0) pageNumberLabel.frame = CGRect( - x: bounds.width - labelSize.width - 24, - y: bounds.height - labelSize.height - 20, + x: bounds.maxX - contentInsets.right - labelSize.width - Self.pageNumberTrailingPadding, + y: footerOriginY + footerVerticalInset, width: labelSize.width, height: labelSize.height ) @@ -352,7 +372,10 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader currentHighlights = highlights currentSearchState = searchState selectionController.clearSelection(renderView: coreTextRenderView) - contentInsets = configuration.reflowableContentInsets + contentInsets = Self.safeContentInsets( + configuration: configuration, + safeAreaInsets: safeAreaInsets + ) backgroundColor = configuration.theme.contentBackgroundColor pageNumberLabel.textColor = configuration.theme.contentTextColor pageNumberLabel.text = "\(pageNumber) / \(totalPages)" @@ -434,7 +457,10 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader currentHighlights = [] currentSearchState = nil selectionController.clearSelection(renderView: coreTextRenderView) - contentInsets = configuration.reflowableContentInsets + contentInsets = Self.safeContentInsets( + configuration: configuration, + safeAreaInsets: safeAreaInsets + ) backgroundColor = configuration.theme.contentBackgroundColor pageNumberLabel.textColor = configuration.theme.contentTextColor pageNumberLabel.text = "\(pageNumber) / \(totalPages)" @@ -471,7 +497,7 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader updateSelectionPanAvailability() updateViewInteractionAvailability() updateAccessibilityDecorationSummary() - UIMenuController.shared.setMenuVisible(false, animated: true) + hideSelectionMenu() } private func performSelectionAction(_ action: RDEPUBAnnotationMenuAction) { @@ -562,25 +588,47 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader private func normalizedPageContent(from page: RDEPUBTextPage) -> NSMutableAttributedString { let content = NSMutableAttributedString(attributedString: page.content) - guard shouldNormalizeContinuationParagraph(for: page) else { return content } - + guard content.length > 0 else { return content } let text = content.string as NSString let firstParagraphRange = text.paragraphRange(for: NSRange(location: 0, length: 0)) guard firstParagraphRange.length > 0 else { return content } - guard !firstParagraphUsesNonLeadingAlignment(in: content, range: firstParagraphRange) else { + + if shouldNormalizeLeadingParagraphSpacing(for: page) { + let leadingRange = firstNonWhitespaceParagraphRange(in: content) ?? firstParagraphRange + updateParagraphStyle(in: content, range: leadingRange) { style in + style.paragraphSpacingBefore = 0 + } + } + + guard shouldNormalizeContinuationParagraph(for: page), + !firstParagraphUsesNonLeadingAlignment(in: content, range: firstParagraphRange) else { return content } - content.enumerateAttribute(.paragraphStyle, in: firstParagraphRange) { value, range, _ in - guard let style = value as? NSParagraphStyle else { return } - let mutableStyle = (style.mutableCopy() as? NSMutableParagraphStyle) ?? NSMutableParagraphStyle() - mutableStyle.firstLineHeadIndent = mutableStyle.headIndent - mutableStyle.paragraphSpacingBefore = 0 - content.addAttribute(.paragraphStyle, value: mutableStyle.copy() as Any, range: range) + updateParagraphStyle(in: content, range: firstParagraphRange) { style in + style.firstLineHeadIndent = style.headIndent + style.paragraphSpacingBefore = 0 } return content } + private func shouldNormalizeLeadingParagraphSpacing(for page: RDEPUBTextPage) -> Bool { + page.pageStartOffset == 0 + } + + private func firstNonWhitespaceParagraphRange(in content: NSAttributedString) -> NSRange? { + let text = content.string as NSString + var index = 0 + while index < text.length { + guard let scalar = UnicodeScalar(text.character(at: index)) else { break } + if !CharacterSet.whitespacesAndNewlines.contains(scalar) { + return text.paragraphRange(for: NSRange(location: index, length: 0)) + } + index += 1 + } + return nil + } + private func shouldNormalizeContinuationParagraph(for page: RDEPUBTextPage) -> Bool { let pageStart = page.pageStartOffset guard pageStart > 0, pageStart < page.chapterContent.length else { return false } @@ -589,6 +637,20 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader return !CharacterSet.newlines.contains(previousScalar) } + private func updateParagraphStyle( + in content: NSMutableAttributedString, + range: NSRange, + transform: (NSMutableParagraphStyle) -> Void + ) { + content.enumerateAttribute(.paragraphStyle, in: range) { value, attributeRange, _ in + guard let style = value as? NSParagraphStyle else { return } + let mutableStyle = (style.mutableCopy() as? NSMutableParagraphStyle) ?? NSMutableParagraphStyle() + transform(mutableStyle) + content.addAttribute(.paragraphStyle, value: mutableStyle.copy() as Any, range: attributeRange) + } + } + + private func firstParagraphUsesNonLeadingAlignment( in content: NSAttributedString, range: NSRange @@ -743,19 +805,29 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader !targetRect.isEmpty else { return } - becomeFirstResponder() - let menuController = UIMenuController.shared - menuController.menuItems = [ - UIMenuItem(title: "拷贝", action: #selector(rd_copy(_:))), - UIMenuItem(title: "高亮", action: #selector(rd_highlight(_:))), - UIMenuItem(title: "批注", action: #selector(rd_annotate(_:))) - ] - menuController.setTargetRect(targetRect, in: coreTextRenderView ?? self) - menuController.setMenuVisible(true, animated: true) + if #available(iOS 16.0, *), let interaction = _editMenuInteraction as? UIEditMenuInteraction { + let anchor = CGPoint(x: targetRect.midX, y: targetRect.midY) + let config = UIEditMenuConfiguration(identifier: "SelectionMenu", sourcePoint: anchor) + interaction.presentEditMenu(with: config) + } else { + becomeFirstResponder() + let menuController = UIMenuController.shared + menuController.menuItems = [ + UIMenuItem(title: "拷贝", action: #selector(rd_copy(_:))), + UIMenuItem(title: "高亮", action: #selector(rd_highlight(_:))), + UIMenuItem(title: "批注", action: #selector(rd_annotate(_:))) + ] + menuController.setTargetRect(targetRect, in: coreTextRenderView ?? self) + menuController.setMenuVisible(true, animated: true) + } } private func hideSelectionMenu() { - UIMenuController.shared.setMenuVisible(false, animated: true) + if #available(iOS 16.0, *), let interaction = _editMenuInteraction as? UIEditMenuInteraction { + interaction.dismissMenu() + } else { + UIMenuController.shared.setMenuVisible(false, animated: true) + } } private func updateSelectionLoupe(for point: CGPoint) { @@ -954,3 +1026,51 @@ final class RDEPUBTextContentView: UIView, UIGestureRecognizerDelegate, RDReader ) } } + +// MARK: - UIEditMenuInteractionDelegate (iOS 16+) + +@available(iOS 16.0, *) +extension RDEPUBTextContentView: UIEditMenuInteractionDelegate { + func editMenuInteraction( + _ interaction: UIEditMenuInteraction, + menuFor configuration: UIEditMenuConfiguration + ) -> UIMenu { + UIMenu(children: [ + UICommand(title: "拷贝", action: #selector(rd_copy(_:))), + UICommand(title: "高亮", action: #selector(rd_highlight(_:))), + UICommand(title: "批注", action: #selector(rd_annotate(_:))) + ]) + } + + func editMenuInteraction( + _ interaction: UIEditMenuInteraction, + targetRectFor configuration: UIEditMenuConfiguration + ) -> CGRect { + if let targetRect = selectionController.menuAnchorRect(interactionController: interactionController), + !targetRect.isEmpty { + return targetRect + } + return bounds + } +} + +// MARK: - Safe Content Insets + +extension RDEPUBTextContentView { + + /// Computes content insets that account for safe areas (Dynamic Island, home indicator). + /// Uses the larger of safeAreaInsets and reflowableContentInsets for each edge, + /// ensuring content is never hidden under the Dynamic Island or home indicator area. + private static func safeContentInsets( + configuration: RDEPUBReaderConfiguration, + safeAreaInsets: UIEdgeInsets + ) -> UIEdgeInsets { + let configInsets = configuration.reflowableContentInsets + return UIEdgeInsets( + top: max(configInsets.top, safeAreaInsets.top), + left: max(configInsets.left, safeAreaInsets.left), + bottom: max(configInsets.bottom, safeAreaInsets.bottom) + pageNumberReservedHeight, + right: max(configInsets.right, safeAreaInsets.right) + ) + } +} diff --git a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextSelectionController.swift b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextSelectionController.swift index 973bf31..c732c3b 100644 --- a/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextSelectionController.swift +++ b/Sources/RDReaderView/EPUBUI/TextPage/RDEPUBTextSelectionController.swift @@ -148,7 +148,6 @@ final class RDEPUBTextSelectionController: NSObject { selectionEndIndex = NSNotFound setInteractionState(.idle) renderView?.selectionRects = [] - UIMenuController.shared.setMenuVisible(false, animated: true) onSelectionChanged?(nil) }